Handle language codes according to BCP 47
[docutils.git] / setup.py
blob2401381ffdef6e871d369ff79819574a5dc4f461
1 #!/usr/bin/env python
2 # $Id$
3 # Copyright: This file has been placed in the public domain.
5 import sys
6 import os
7 import glob
8 try:
9 from distutils.core import setup, Command
10 from distutils.command.build import build
11 from distutils.command.build_py import build_py
12 if sys.version_info >= (3,):
13 from distutils.command.build_py import build_py_2to3
14 from distutils.util import copydir_run_2to3
15 from distutils.command.install_data import install_data
16 from distutils.util import convert_path
17 from distutils import log
18 except ImportError:
19 print ('Error: The "distutils" standard module, which is required for the ')
20 print ('installation of Docutils, could not be found. You may need to ')
21 print ('install a package called "python-devel" (or similar) on your ')
22 print ('system using your package manager.')
23 sys.exit(1)
26 if sys.version_info >= (3,):
27 # copy-convert auxiliary python sources
28 class copy_build_py_2to3(build_py_2to3):
29 """Copy/convert Python source files in given directories recursively.
31 Build py3k versions of the modules and packages. Also copy
32 'tools/' and 'test/' dirs and run 2to3 on *.py files.
33 """
34 manifest_in = """\
35 exclude *.pyc *~ .DS_Store
36 recursive-exclude * *.pyc *~ .DS_Store
37 recursive-exclude functional/output *
38 include functional/output/README.txt
39 prune .svn
40 prune */.svn
41 prune */*/.svn
42 prune */*/*/.svn
43 prune */*/*/*/.svn
44 prune */*/*/*/*/.svn
45 """
46 def run(self):
47 build_py_2to3.run(self)
48 print("copying aux dirs")
49 loglevel = log.set_threshold(log.ERROR)
50 for source in ['tools', 'test']:
51 dest = os.path.join(self.build_lib, source)
52 copydir_run_2to3(source, dest, template=self.manifest_in)
53 log.set_threshold(loglevel)
56 class smart_install_data(install_data):
57 # From <http://wiki.python.org/moin/DistutilsInstallDataScattered>,
58 # by Pete Shinners.
60 def run(self):
61 #need to change self.install_dir to the library dir
62 install_cmd = self.get_finalized_command('install')
63 self.install_dir = getattr(install_cmd, 'install_lib')
64 return install_data.run(self)
66 class build_data(Command):
68 def initialize_options(self):
69 pass
71 def finalize_options(self):
72 pass
74 def run(self):
75 build_py = self.get_finalized_command('build_py')
76 data_files = self.distribution.data_files
77 for f in data_files:
78 dir = convert_path(f[0])
79 dir = os.path.join(build_py.build_lib, dir)
80 self.mkpath(dir)
81 for data in f[1]:
82 data = convert_path(data)
83 self.copy_file(data, dir)
85 # let our build_data run
86 build.sub_commands.append(('build_data', lambda *a: True))
89 def do_setup():
90 kwargs = package_data.copy()
91 extras = get_extras()
92 if extras:
93 kwargs['py_modules'] = extras
94 kwargs['classifiers'] = classifiers
95 # Install data files properly.
96 kwargs['cmdclass'] = {'build_data': build_data,
97 'install_data': smart_install_data}
98 # Auto-convert surce code for Python 3
99 if sys.version_info >= (3,):
100 kwargs['cmdclass']['build_py'] = copy_build_py_2to3
101 else:
102 kwargs['cmdclass']['build_py'] = build_py
103 dist = setup(**kwargs)
104 return dist
106 s5_theme_files = []
107 for dir in glob.glob('docutils/writers/s5_html/themes/*'):
108 if os.path.isdir(dir):
109 theme_files = glob.glob('%s/*' % dir)
110 s5_theme_files.append((dir, theme_files))
112 package_data = {
113 'name': 'docutils',
114 'description': 'Docutils -- Python Documentation Utilities',
115 'long_description': """\
116 Docutils is a modular system for processing documentation
117 into useful formats, such as HTML, XML, and LaTeX. For
118 input Docutils supports reStructuredText, an easy-to-read,
119 what-you-see-is-what-you-get plaintext markup syntax.""", # wrap at col 60
120 'url': 'http://docutils.sourceforge.net/',
121 'version': '0.8',
122 'author': 'David Goodger',
123 'author_email': 'goodger@python.org',
124 'license': 'public domain, Python, BSD, GPL (see COPYING.txt)',
125 'platforms': 'OS-independent',
126 'package_dir': {'docutils': 'docutils',
127 '': 'extras',
128 'docutils.tools': 'tools'},
129 'packages': ['docutils',
130 'docutils.languages',
131 'docutils.parsers',
132 'docutils.parsers.rst',
133 'docutils.parsers.rst.directives',
134 'docutils.parsers.rst.languages',
135 'docutils.readers',
136 'docutils.readers.python',
137 'docutils.transforms',
138 'docutils.writers',
139 'docutils.writers.html4css1',
140 'docutils.writers.pep_html',
141 'docutils.writers.s5_html',
142 'docutils.writers.latex2e',
143 'docutils.writers.newlatex2e',
144 'docutils.writers.odf_odt',
146 'data_files': ([('docutils/parsers/rst/include',
147 glob.glob('docutils/parsers/rst/include/*.txt')),
148 ('docutils/writers/html4css1',
149 ['docutils/writers/html4css1/html4css1.css',
150 'docutils/writers/html4css1/template.txt']),
151 ('docutils/writers/latex2e',
152 ['docutils/writers/latex2e/default.tex',
153 'docutils/writers/latex2e/titlepage.tex',]),
154 ('docutils/writers/newlatex2e',
155 ['docutils/writers/newlatex2e/base.tex']),
156 ('docutils/writers/pep_html',
157 ['docutils/writers/pep_html/pep.css',
158 'docutils/writers/pep_html/template.txt']),
159 ('docutils/writers/s5_html/themes',
160 ['docutils/writers/s5_html/themes/README.txt']),
161 ('docutils/writers/odf_odt',
162 ['docutils/writers/odf_odt/styles.odt']),
164 + s5_theme_files),
165 'scripts' : ['tools/rst2html.py',
166 'tools/rst2s5.py',
167 'tools/rst2latex.py',
168 'tools/rst2newlatex.py',
169 'tools/rst2man.py',
170 'tools/rst2xml.py',
171 'tools/rst2pseudoxml.py',
172 'tools/rstpep2html.py',
173 'tools/rst2odt.py',
174 'tools/rst2odt_prepstyles.py',
176 """Distutils setup parameters."""
178 classifiers = [
179 'Development Status :: 4 - Beta',
180 'Environment :: Console',
181 'Intended Audience :: End Users/Desktop',
182 'Intended Audience :: Other Audience',
183 'Intended Audience :: Developers',
184 'Intended Audience :: System Administrators',
185 'License :: Public Domain',
186 'License :: OSI Approved :: Python Software Foundation License',
187 'License :: OSI Approved :: BSD License',
188 'License :: OSI Approved :: GNU General Public License (GPL)',
189 'Operating System :: OS Independent',
190 'Programming Language :: Python',
191 'Topic :: Documentation',
192 'Topic :: Software Development :: Documentation',
193 'Topic :: Text Processing',
194 'Natural Language :: English', # main/default language, keep first
195 'Natural Language :: Afrikaans',
196 'Natural Language :: Esperanto',
197 'Natural Language :: French',
198 'Natural Language :: German',
199 'Natural Language :: Italian',
200 'Natural Language :: Russian',
201 'Natural Language :: Slovak',
202 'Natural Language :: Spanish',
203 'Natural Language :: Swedish',]
204 """Trove classifiers for the Distutils "register" command;
205 Python 2.3 and up."""
207 extra_modules = [('roman', '1.4', ['toRoman', 'fromRoman',
208 'InvalidRomanNumeralError'])]
209 """Third-party modules to install if they're not already present.
210 List of (module name, minimum __version__ string, [attribute names])."""
212 def get_extras():
213 extras = []
214 for module_name, version, attributes in extra_modules:
215 try:
216 module = __import__(module_name)
217 if version and module.__version__ < version:
218 raise ValueError
219 for attribute in attributes or []:
220 getattr(module, attribute)
221 print ('"%s" module already present; ignoring extras/%s.py.'
222 % (module_name, module_name))
223 except (ImportError, AttributeError, ValueError):
224 extras.append(module_name)
225 return extras
228 if __name__ == '__main__' :
229 do_setup()