Merge remote-tracking branch 'origin/master' into newstyles
[snf-cloudcms] / setup.py
1 # Copyright 2012 GRNET S.A. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
5 # conditions are met:
6 #
7 #   1. Redistributions of source code must retain the above
8 #      copyright notice, this list of conditions and the following
9 #      disclaimer.
10 #
11 #   2. Redistributions in binary form must reproduce the above
12 #      copyright notice, this list of conditions and the following
13 #      disclaimer in the documentation and/or other materials
14 #      provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
28 #
29 # The views and conclusions contained in the software and
30 # documentation are those of the authors and should not be
31 # interpreted as representing official policies, either expressed
32 # or implied, of GRNET S.A.
33
34
35 import os
36 import sys
37
38 from fnmatch import fnmatchcase
39 from distutils.util import convert_path
40 from setuptools import setup, find_packages
41
42 HERE = os.path.abspath(os.path.normpath(os.path.dirname(__file__)))
43 try:
44     # try to update the version file
45     from synnefo.util import version
46     version.update_version('cloudcms', 'version', HERE)
47 except ImportError:
48     pass
49
50 from cloudcms.version import __version__
51
52 # Package info
53 VERSION = __version__
54
55
56 INSTALL_REQUIRES = [
57     'snf-common>0.9',
58     'Django >=1.2.3, <1.3',
59     'South>=0.7',
60     'feincms >=1.4.2, <1.4.9',
61     'django-pagination >=1.0.5',
62     'django-mptt >= 0.5.2, <0.6',
63     'lxml',
64     'docutils',
65     'PIL'
66 ]
67
68 CLASSIFIERS = []
69
70
71 # Provided as an attribute, so you can append to these instead
72 # of replicating them:
73 standard_exclude = ('*.py', '*.pyc', '*$py.class', '*~', '.*', '*.bak')
74 standard_exclude_directories = ('.*', 'CVS', '_darcs', './build',
75                                 './dist', 'EGG-INFO', '*.egg-info')
76
77 def find_package_data(
78     where='.', package='',
79     exclude=standard_exclude,
80     exclude_directories=standard_exclude_directories,
81     only_in_packages=True,
82     show_ignored=False):
83     """
84     Return a dictionary suitable for use in ``package_data``
85     in a distutils ``setup.py`` file.
86
87     The dictionary looks like::
88
89         {'package': [files]}
90
91     Where ``files`` is a list of all the files in that package that
92     don't match anything in ``exclude``.
93
94     If ``only_in_packages`` is true, then top-level directories that
95     are not packages won't be included (but directories under packages
96     will).
97
98     Directories matching any pattern in ``exclude_directories`` will
99     be ignored; by default directories with leading ``.``, ``CVS``,
100     and ``_darcs`` will be ignored.
101
102     If ``show_ignored`` is true, then all the files that aren't
103     included in package data are shown on stderr (for debugging
104     purposes).
105
106     Note patterns use wildcards, or can be exact paths (including
107     leading ``./``), and all searching is case-insensitive.
108     """
109
110     out = {}
111     stack = [(convert_path(where), '', package, only_in_packages)]
112     while stack:
113         where, prefix, package, only_in_packages = stack.pop(0)
114         for name in os.listdir(where):
115             fn = os.path.join(where, name)
116             if os.path.isdir(fn):
117                 bad_name = False
118                 for pattern in exclude_directories:
119                     if (fnmatchcase(name, pattern)
120                         or fn.lower() == pattern.lower()):
121                         bad_name = True
122                         if show_ignored:
123                             print >> sys.stderr, (
124                                 "Directory %s ignored by pattern %s"
125                                 % (fn, pattern))
126                         break
127                 if bad_name:
128                     continue
129                 if (os.path.isfile(os.path.join(fn, '__init__.py'))
130                     and not prefix):
131                     if not package:
132                         new_package = name
133                     else:
134                         new_package = package + '.' + name
135                     stack.append((fn, '', new_package, False))
136                 else:
137                     stack.append((fn, prefix + name + '/', package, only_in_packages))
138             elif package or not only_in_packages:
139                 # is a file
140                 bad_name = False
141                 for pattern in exclude:
142                     if (fnmatchcase(name, pattern)
143                         or fn.lower() == pattern.lower()):
144                         bad_name = True
145                         if show_ignored:
146                             print >> sys.stderr, (
147                                 "File %s ignored by pattern %s"
148                                 % (fn, pattern))
149                         break
150                 if bad_name:
151                     continue
152                 out.setdefault(package, []).append(prefix+name)
153     return out
154
155 setup(
156     name = 'snf-cloudcms',
157     version = VERSION,
158     license = 'BSD',
159     url = 'http://code.grnet.gr/',
160     classifiers = CLASSIFIERS,
161
162     author = 'Package author',
163     author_email = 'author@grnet.gr',
164     maintainer = 'Package maintainer',
165     maintainer_email = 'maintainer@grnet.gr',
166
167     packages = find_packages('.'),
168     package_dir= {'': '.'},
169     include_package_data = True,
170     package_data=find_package_data('.'),
171     zip_safe = False,
172
173     install_requires = INSTALL_REQUIRES,
174
175     dependency_links = ['http://docs.dev.grnet.gr/pypi'],
176
177     entry_points = {
178      'synnefo': [
179          'default_settings = cloudcms.synnefo_settings',
180          'web_apps = cloudcms.synnefo_settings:cloudcms_apps',
181          'web_middleware = cloudcms.synnefo_settings:cloudcms_middlewares',
182          'web_context_processors = cloudcms.synnefo_settings:cloudcms_context_processors',
183          'urls = cloudcms.urls:urlpatterns',
184          'web_static = cloudcms.synnefo_settings:cloudcms_staticfiles',
185          'loggers = cloudcms.synnefo_settings:loggers'
186          ]
187     },
188
189 )
190