d6fbb4c25f43464d8309b31ca230ab2619fcf9ad
[pithos-web-client] / snf-pithos-webclient / setup.py
1 #!/usr/bin/env python
2
3 # Copyright 2011-2012 GRNET S.A. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or
6 # without modification, are permitted provided that the following
7 # conditions are met:
8 #
9 #   1. Redistributions of source code must retain the above
10 #      copyright notice, this list of conditions and the following
11 #      disclaimer.
12 #
13 #   2. Redistributions in binary form must reproduce the above
14 #      copyright notice, this list of conditions and the following
15 #      disclaimer in the documentation and/or other materials
16 #      provided with the distribution.
17 #
18 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
30 #
31 # The views and conclusions contained in the software and
32 # documentation are those of the authors and should not be
33 # interpreted as representing official policies, either expressed
34 # or implied, of GRNET S.A.
35 import distribute_setup
36 distribute_setup.use_setuptools()
37
38 import os
39 import sys
40
41 from fnmatch import fnmatchcase
42 from distutils.util import convert_path
43
44 from setuptools import setup, find_packages
45
46
47 HERE = os.path.abspath(os.path.normpath(os.path.dirname(__file__)))
48
49 from pithos_webclient.version import __version__
50
51 # Package info
52 VERSION = __version__
53 README = open(os.path.join(HERE, 'README')).read()
54 CHANGES = open(os.path.join(HERE, 'Changelog')).read()
55 SHORT_DESCRIPTION = 'Package short description'
56
57 PACKAGES_ROOT = '.'
58 PACKAGES = find_packages(PACKAGES_ROOT)
59
60 # Package meta
61 CLASSIFIERS = [
62         'Development Status :: 3 - Alpha',
63         'Operating System :: OS Independent',
64         'Programming Language :: Python',
65         'Topic :: Utilities',
66         'License :: OSI Approved :: BSD License',
67 ]
68
69 # Package requirements
70 INSTALL_REQUIRES = [
71     'Django>=1.2, <1.3',
72     'snf-branding',
73     'snf-common>=0.9.0rc'
74 ]
75
76 EXTRAS_REQUIRES = {
77 }
78
79 TESTS_REQUIRES = [
80 ]
81
82 # Provided as an attribute, so you can append to these instead
83 # of replicating them:
84 standard_exclude = ["*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak"]
85 standard_exclude_directories = [
86     ".*", "CVS", "_darcs", "./build", "./dist", "EGG-INFO", "*.egg-info", "snf-0.7"
87 ]
88
89 # (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
90 # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
91 # Note: you may want to copy this into your setup.py file verbatim, as
92 # you can't import this from another package, when you don't know if
93 # that package is installed yet.
94 def find_package_data(
95     where=".",
96     package="",
97     exclude=standard_exclude,
98     exclude_directories=standard_exclude_directories,
99     only_in_packages=True,
100     show_ignored=False):
101     """
102     Return a dictionary suitable for use in ``package_data``
103     in a distutils ``setup.py`` file.
104
105     The dictionary looks like::
106
107         {"package": [files]}
108
109     Where ``files`` is a list of all the files in that package that
110     don"t match anything in ``exclude``.
111
112     If ``only_in_packages`` is true, then top-level directories that
113     are not packages won"t be included (but directories under packages
114     will).
115
116     Directories matching any pattern in ``exclude_directories`` will
117     be ignored; by default directories with leading ``.``, ``CVS``,
118     and ``_darcs`` will be ignored.
119
120     If ``show_ignored`` is true, then all the files that aren"t
121     included in package data are shown on stderr (for debugging
122     purposes).
123
124     Note patterns use wildcards, or can be exact paths (including
125     leading ``./``), and all searching is case-insensitive.
126     """
127     out = {}
128     stack = [(convert_path(where), "", package, only_in_packages)]
129     while stack:
130         where, prefix, package, only_in_packages = stack.pop(0)
131         for name in os.listdir(where):
132             fn = os.path.join(where, name)
133             if os.path.isdir(fn):
134                 bad_name = False
135                 for pattern in exclude_directories:
136                     if (fnmatchcase(name, pattern)
137                         or fn.lower() == pattern.lower()):
138                         bad_name = True
139                         if show_ignored:
140                             print >> sys.stderr, (
141                                 "Directory %s ignored by pattern %s"
142                                 % (fn, pattern))
143                         break
144                 if bad_name:
145                     continue
146                 if (os.path.isfile(os.path.join(fn, "__init__.py"))
147                     and not prefix):
148                     if not package:
149                         new_package = name
150                     else:
151                         new_package = package + "." + name
152                     stack.append((fn, "", new_package, False))
153                 else:
154                     stack.append((fn, prefix + name + "/", package, only_in_packages))
155             elif package or not only_in_packages:
156                 # is a file
157                 bad_name = False
158                 for pattern in exclude:
159                     if (fnmatchcase(name, pattern)
160                         or fn.lower() == pattern.lower()):
161                         bad_name = True
162                         if show_ignored:
163                             print >> sys.stderr, (
164                                 "File %s ignored by pattern %s"
165                                 % (fn, pattern))
166                         break
167                 if bad_name:
168                     continue
169                 out.setdefault(package, []).append(prefix+name)
170     return out
171
172
173 """
174 Gwt clea/build helpers
175 """
176 import subprocess as sp
177 import glob
178
179 def clean_gwt(root="../", public_dir="bin/www/gr.grnet.pithos.web.Pithos/"):
180     # skip if no build.xml found (debian build process)
181     if not os.path.exists(os.path.join(root, "build.xml")):
182         return
183
184     curdir = os.getcwd()
185     os.chdir(root)
186     rcode = sp.call(["ant", "clean"])
187     if rcode == 1:
188         raise Exception("GWT clean failed")
189     os.chdir(curdir)
190     pub_dir = os.path.abspath(os.path.join(root, public_dir))
191     static_dir = os.path.abspath(os.path.join("pithos_webclient", "static", \
192         "pithos_webclient"))
193     templates_dir = os.path.abspath(os.path.join("pithos_webclient", \
194         "templates", "pithos_webclient"))
195     clean_static = ["rm", "-r"] + glob.glob(os.path.join(static_dir, "*"))
196     clean_templates = ["rm", "-r"] + glob.glob(os.path.join(templates_dir, "*"))
197
198     # clean dirs
199     if len(clean_static) > 2:
200         sp.call(clean_static)
201     if len(clean_static) > 2:
202         sp.call(clean_templates)
203
204
205 def build_gwt(root="../", public_dir="bin/www/gr.grnet.pithos.web.Pithos/"):
206     # skip if no build.xml found (debian build process)
207     if not os.path.exists(os.path.join(root, "build.xml")):
208         return
209
210     curdir = os.getcwd()
211     os.chdir(root)
212     # run ant on root dir
213     rcode = sp.call(["ant"])
214     if rcode == 1:
215         raise Exception("GWT build failed")
216     os.chdir(curdir)
217
218
219     pub_dir = os.path.abspath(os.path.join(root, public_dir))
220     static_dir = os.path.abspath(os.path.join("pithos_webclient", "static", \
221         "pithos_webclient"))
222     templates_dir = os.path.abspath(os.path.join("pithos_webclient", \
223         "templates", "pithos_webclient"))
224
225     clean_static = ["rm", "-r"] + glob.glob(os.path.join(static_dir, "*"))
226     clean_templates = ["rm", "-r"] + glob.glob(os.path.join(templates_dir, "*"))
227
228     # clean dirs
229     if len(clean_static) > 2:
230         sp.call(clean_static)
231     if len(clean_static) > 2:
232         sp.call(clean_templates)
233
234     copy_static = ["cp", "-r"] + glob.glob(os.path.join(pub_dir, "*")) + [static_dir]
235     copy_index = ["cp", os.path.join(pub_dir, "index.html"), templates_dir]
236     sp.call(copy_static)
237     sp.call(copy_index)
238
239     index = os.path.join(templates_dir, "index.html")
240     index_data = file(index).read()
241     index_data = index_data.replace('href="', 'href="{{ MEDIA_URL }}pithos_webclient/')
242     index_data = index_data.replace('" src="', '" src="{{ MEDIA_URL }}pithos_webclient/')
243     index_data = index_data.replace('\' src=\'', '\' src=\'{{ MEDIA_URL }}pithos_webclient/')
244     index_data = index_data.replace('url(', 'url({{ MEDIA_URL }}pithos_webclient/')
245
246     index_data = index_data.replace("{{ CLOUDBAR_CODE }}", """
247             {{ CLOUDBAR_CODE }}
248             <script>
249             var CLOUDBAR_ACTIVE_SERVICE = "{{ PITHOS_UI_CLOUDBAR_ACTIVE_SERVICE }}"
250             </script>
251     """)
252
253     index_data = index_data.replace("{{ EXTEND_OTHER_PROPERTIES }}", """
254         {% for key, value in branding_settings.items %}
255             otherProperties.{{ key }} = "{{ value }}";
256         {% endfor %}
257     """)
258
259     ifile = file(index, "w+")
260     ifile.write(index_data)
261     ifile.close()
262
263
264 # do we need to run ant ???
265 if any(x in ''.join(sys.argv) for x in ["sdist", "build", "develop", "install"]):
266     build_gwt()
267
268 if any(x in ''.join(sys.argv) for x in ["clean"]):
269     clean_gwt()
270
271
272 setup(
273     name='snf-pithos-webclient',
274     version=VERSION,
275     license='BSD',
276     url='http://code.grnet.gr/projects/pithos-web-client',
277     description = SHORT_DESCRIPTION,
278     long_description=README + '\n\n' +  CHANGES,
279     classifiers = CLASSIFIERS,
280     author='GRNET',
281     author_email='pithos@grnet.gr',
282
283     packages=find_packages(),
284     include_package_data=True,
285     package_data=find_package_data('.'),
286     zip_safe=False,
287
288     install_requires = INSTALL_REQUIRES,
289
290     dependency_links = ['http://docs.dev.grnet.gr/pypi'],
291
292     entry_points={
293         'synnefo': [
294              'web_apps = pithos_webclient.synnefo_settings:installed_apps',
295              'urls = pithos_webclient.synnefo_settings:urlpatterns',
296              'web_static = pithos_webclient.synnefo_settings:static_files',
297              'web_context_processors = pithos_webclient.synnefo_settings:context_processors'
298         ]
299     }
300 )
301