osv: Improve the translation logic for the osv.check wrapper
[odoo/odoo.git] / setup.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 ##############################################################################
4 #
5 #    OpenERP, Open Source Management Solution
6 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU Affero General Public License as
10 #    published by the Free Software Foundation, either version 3 of the
11 #    License, or (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU Affero General Public License for more details.
17 #
18 #    You should have received a copy of the GNU Affero General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22
23 # setup from TinERP
24 #   taken from straw http://www.nongnu.org/straw/index.html
25 #   taken from gnomolicious http://www.nongnu.org/gnomolicious/
26 #   adapted by Nicolas Évrard <nicoe@altern.org>
27 #
28
29 import sys
30 import os
31 from os.path import join, isfile, basename
32 import glob
33
34 from pprint import pprint as pp
35
36 from setuptools import setup as official_setup, find_packages
37 from setuptools.command.install import install
38 from distutils.sysconfig import get_python_lib
39
40 has_py2exe = False
41 if os.name == 'nt':
42     import py2exe
43     has_py2exe = True
44
45 sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin"))
46
47 execfile(join('bin', 'release.py'))
48
49 if 'bdist_rpm' in sys.argv:
50     version = version.split('-')[0]
51
52 # get python short version
53 py_short_version = '%s.%s' % sys.version_info[:2]
54
55 # backports os.walk with followlinks from python 2.6
56 def walk_followlinks(top, topdown=True, onerror=None, followlinks=False):
57     from os.path import join, isdir, islink
58     from os import listdir, error
59
60     try:
61         names = listdir(top)
62     except error, err:
63         if onerror is not None:
64             onerror(err)
65         return
66
67     dirs, nondirs = [], []
68     for name in names:
69         if isdir(join(top, name)):
70             dirs.append(name)
71         else:
72             nondirs.append(name)
73
74     if topdown:
75         yield top, dirs, nondirs
76     for name in dirs:
77         path = join(top, name)
78         if followlinks or not islink(path):
79             for x in walk_followlinks(path, topdown, onerror, followlinks):
80                 yield x
81     if not topdown:
82         yield top, dirs, nondirs
83
84 if sys.version_info < (2, 6):
85     os.walk = walk_followlinks
86
87 def find_addons():
88     for root, _, names in os.walk(join('bin', 'addons'), followlinks=True):
89         if '__openerp__.py' in names or '__terp__.py' in names:
90             yield basename(root), root
91
92 def data_files():
93     '''Build list of data files to be installed'''
94     files = []
95     if os.name == 'nt':
96         os.chdir('bin')
97         for (dp, dn, names) in os.walk('addons'):
98             files.append((dp, map(lambda x: join('bin', dp, x), names)))
99         os.chdir('..')
100         #for root, _, names in os.walk(join('bin','addons')):
101         #    files.append((root, [join(root, name) for name in names]))
102         for root, _, names in os.walk('doc'):
103             files.append((root, [join(root, name) for name in names]))
104         #for root, _, names in os.walk('pixmaps'):
105         #    files.append((root, [join(root, name) for name in names]))
106         files.append(('.', [join('bin', 'import_xml.rng'),
107                             join('bin', 'server.pkey'),
108                             join('bin', 'server.cert')]))
109     else:
110         man_directory = join('share', 'man')
111         files.append((join(man_directory, 'man1'), ['man/openerp-server.1']))
112         files.append((join(man_directory, 'man5'), ['man/openerp_serverrc.5']))
113
114         doc_directory = join('share', 'doc', 'openerp-server-%s' % version)
115         files.append((doc_directory, filter(isfile, glob.glob('doc/*'))))
116         files.append((join(doc_directory, 'migrate', '3.3.0-3.4.0'),
117                       filter(isfile, glob.glob('doc/migrate/3.3.0-3.4.0/*'))))
118         files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'),
119                       filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*'))))
120
121         openerp_site_packages = join(get_python_lib(prefix=''), 'openerp-server')
122
123         files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),
124                                               join('bin', 'server.pkey'),
125                                               join('bin', 'server.cert')]))
126
127         if sys.version_info[0:2] == (2,5):
128             files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'),
129                                                    join('python25-compat','SimpleXMLRPCServer.py'),
130                                                    join('python25-compat','SocketServer.py')]))
131
132         for addonname, add_path in find_addons():
133             addon_path = join(get_python_lib(prefix=''), 'openerp-server','addons', addonname)
134             for root, dirs, innerfiles in os.walk(add_path):
135                 innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles)
136                 if innerfiles:
137                     res = os.path.normpath(join(addon_path, root.replace(join(add_path), '.')))
138                     files.extend(((res, map(lambda fil: join(root, fil),
139                                             innerfiles)),))
140
141     return files
142
143 f = file('openerp-server','w')
144 f.write("""#!/bin/sh
145 echo "Error: the content of this file should have been replaced during "
146 echo "installation\n"
147 exit 1
148 """)
149 f.close()
150
151 def find_package_dirs():
152     package_dirs = {'openerp-server': 'bin'}
153     for mod, path in find_addons():
154         package_dirs['openerp-server.addons.' + mod] = path
155     return package_dirs
156
157 class openerp_server_install(install):
158     def run(self):
159         # create startup script
160         start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\
161             % (join(self.install_libbase, "openerp-server"), sys.executable)
162         # write script
163         f = open('openerp-server', 'w')
164         f.write(start_script)
165         f.close()
166         install.run(self)
167
168
169
170 options = {
171     "py2exe": {
172         "compressed": 1,
173         "optimize": 2,
174         "dist_dir": 'dist',
175         "packages": [
176                  "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
177                  "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath",
178                  "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing",
179                  "pydot", "asyncore","asynchat", "reportlab", "vobject",
180                  "HTMLParser", "select", "mako", "poplib",
181                  "imaplib", "smtplib", "email", "yaml", "DAV",
182                  ],
183         "excludes" : ["Tkconstants","Tkinter","tcl"],
184     }
185 }
186
187 def setup(**kwargs):
188     #pp(kwargs)
189     return official_setup(**kwargs)
190
191 setup(name             = name,
192       version          = version,
193       description      = description,
194       long_description = long_desc,
195       url              = url,
196       author           = author,
197       author_email     = author_email,
198       classifiers      = filter(None, classifiers.split("\n")),
199       license          = license,
200       data_files       = data_files(),
201       cmdclass         = {
202           'install' : openerp_server_install,
203       },
204       scripts          = ['openerp-server'],
205       packages = [
206           '.'.join(['openerp-server'] + package.split('.')[1:])
207           for package in find_packages()
208       ],
209       include_package_data = True,
210       package_data = {
211           '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'],
212       },
213       package_dir      = find_package_dirs(),
214       console = [
215           {
216               "script": join("bin", "openerp-server.py"),
217               "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))]
218           }
219       ],
220       options = options,
221       install_requires = [
222           'lxml',
223           'mako',
224           'python-dateutil',
225           'psycopg2',
226           'pychart',
227           'pydot',
228           'pytz',
229           'reportlab',
230           'caldav',
231           'pyyaml',
232           #'django',
233           'pywebdav'
234           #'cx_Oracle',
235           #'mysqldb',
236           'feedparser',
237           #'bsddb3',
238           'egenix-mx-base'
239       ],
240       extras_require={
241           'SSL' : ['pyopenssl'],
242       }
243 )
244