##// END OF EJS Templates
Merge pull request #10277 from Carreau/typing-dependency...
Thomas Kluyver -
r23349:4007befa merge
parent child Browse files
Show More
@@ -1,297 +1,297
1 1 #!/usr/bin/env python
2 2 # -*- coding: utf-8 -*-
3 3 """Setup script for IPython.
4 4
5 5 Under Posix environments it works like a typical setup.py script.
6 6 Under Windows, the command sdist is not supported, since IPython
7 7 requires utilities which are not available under Windows."""
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (c) 2008-2011, IPython Development Team.
11 11 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
12 12 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
13 13 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
14 14 #
15 15 # Distributed under the terms of the Modified BSD License.
16 16 #
17 17 # The full license is in the file COPYING.rst, distributed with this software.
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Minimal Python version sanity check
22 22 #-----------------------------------------------------------------------------
23 23 from __future__ import print_function
24 24
25 25 import sys
26 26
27 27 # This check is also made in IPython/__init__, don't forget to update both when
28 28 # changing Python version requirements.
29 29 if sys.version_info < (3,3):
30 30 error = """
31 31 IPython 6.0+ does not support Python 2.6, 2.7, 3.0, 3.1, or 3.2.
32 32 When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
33 33 Beginning with IPython 6.0, Python 3.3 and above is required.
34 34
35 35 See IPython `README.rst` file for more information:
36 36
37 37 https://github.com/ipython/ipython/blob/master/README.rst
38 38
39 39 Python {} detected.
40 40
41 41 """.format(sys.version_info)
42 42
43 43 print(error, file=sys.stderr)
44 44 sys.exit(1)
45 45
46 46 # At least we're on the python version we need, move on.
47 47
48 48 #-------------------------------------------------------------------------------
49 49 # Imports
50 50 #-------------------------------------------------------------------------------
51 51
52 52 # Stdlib imports
53 53 import os
54 54
55 55 from glob import glob
56 56
57 57 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
58 58 # update it when the contents of directories change.
59 59 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
60 60
61 61 from distutils.core import setup
62 62
63 63 # Our own imports
64 64 from setupbase import target_update
65 65
66 66 from setupbase import (
67 67 setup_args,
68 68 find_packages,
69 69 find_package_data,
70 70 check_package_data_first,
71 71 find_entry_points,
72 72 build_scripts_entrypt,
73 73 find_data_files,
74 74 git_prebuild,
75 75 install_symlinked,
76 76 install_lib_symlink,
77 77 install_scripts_for_symlink,
78 78 unsymlink,
79 79 )
80 80
81 81 isfile = os.path.isfile
82 82 pjoin = os.path.join
83 83
84 84 #-------------------------------------------------------------------------------
85 85 # Handle OS specific things
86 86 #-------------------------------------------------------------------------------
87 87
88 88 if os.name in ('nt','dos'):
89 89 os_name = 'windows'
90 90 else:
91 91 os_name = os.name
92 92
93 93 # Under Windows, 'sdist' has not been supported. Now that the docs build with
94 94 # Sphinx it might work, but let's not turn it on until someone confirms that it
95 95 # actually works.
96 96 if os_name == 'windows' and 'sdist' in sys.argv:
97 97 print('The sdist command is not available under Windows. Exiting.')
98 98 sys.exit(1)
99 99
100 100
101 101 #-------------------------------------------------------------------------------
102 102 # Things related to the IPython documentation
103 103 #-------------------------------------------------------------------------------
104 104
105 105 # update the manuals when building a source dist
106 106 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
107 107
108 108 # List of things to be updated. Each entry is a triplet of args for
109 109 # target_update()
110 110 to_update = [
111 111 ('docs/man/ipython.1.gz',
112 112 ['docs/man/ipython.1'],
113 113 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
114 114 ]
115 115
116 116
117 117 [ target_update(*t) for t in to_update ]
118 118
119 119 #---------------------------------------------------------------------------
120 120 # Find all the packages, package data, and data_files
121 121 #---------------------------------------------------------------------------
122 122
123 123 packages = find_packages()
124 124 package_data = find_package_data()
125 125
126 126 data_files = find_data_files()
127 127
128 128 setup_args['packages'] = packages
129 129 setup_args['package_data'] = package_data
130 130 setup_args['data_files'] = data_files
131 131
132 132 #---------------------------------------------------------------------------
133 133 # custom distutils commands
134 134 #---------------------------------------------------------------------------
135 135 # imports here, so they are after setuptools import if there was one
136 136 from distutils.command.sdist import sdist
137 137 from distutils.command.upload import upload
138 138
139 139 class UploadWindowsInstallers(upload):
140 140
141 141 description = "Upload Windows installers to PyPI (only used from tools/release_windows.py)"
142 142 user_options = upload.user_options + [
143 143 ('files=', 'f', 'exe file (or glob) to upload')
144 144 ]
145 145 def initialize_options(self):
146 146 upload.initialize_options(self)
147 147 meta = self.distribution.metadata
148 148 base = '{name}-{version}'.format(
149 149 name=meta.get_name(),
150 150 version=meta.get_version()
151 151 )
152 152 self.files = os.path.join('dist', '%s.*.exe' % base)
153 153
154 154 def run(self):
155 155 for dist_file in glob(self.files):
156 156 self.upload_file('bdist_wininst', 'any', dist_file)
157 157
158 158 setup_args['cmdclass'] = {
159 159 'build_py': \
160 160 check_package_data_first(git_prebuild('IPython')),
161 161 'sdist' : git_prebuild('IPython', sdist),
162 162 'upload_wininst' : UploadWindowsInstallers,
163 163 'symlink': install_symlinked,
164 164 'install_lib_symlink': install_lib_symlink,
165 165 'install_scripts_sym': install_scripts_for_symlink,
166 166 'unsymlink': unsymlink,
167 167 }
168 168
169 169
170 170 #---------------------------------------------------------------------------
171 171 # Handle scripts, dependencies, and setuptools specific things
172 172 #---------------------------------------------------------------------------
173 173
174 174 # For some commands, use setuptools. Note that we do NOT list install here!
175 175 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
176 176 needs_setuptools = set(('develop', 'release', 'bdist_egg', 'bdist_rpm',
177 177 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
178 178 'egg_info', 'easy_install', 'upload', 'install_egg_info',
179 179 ))
180 180
181 181 if len(needs_setuptools.intersection(sys.argv)) > 0:
182 182 import setuptools
183 183
184 184 # This dict is used for passing extra arguments that are setuptools
185 185 # specific to setup
186 186 setuptools_extra_args = {}
187 187
188 188 # setuptools requirements
189 189
190 190 extras_require = dict(
191 191 parallel = ['ipyparallel'],
192 192 qtconsole = ['qtconsole'],
193 193 doc = ['Sphinx>=1.3'],
194 194 test = ['nose>=0.10.1', 'requests', 'testpath', 'pygments', 'nbformat', 'ipykernel'],
195 195 terminal = [],
196 196 kernel = ['ipykernel'],
197 197 nbformat = ['nbformat'],
198 198 notebook = ['notebook', 'ipywidgets'],
199 199 nbconvert = ['nbconvert'],
200 200 )
201 201
202 202 install_requires = [
203 203 'setuptools>=18.5',
204 204 'jedi>=0.10',
205 'typing',
206 205 'decorator',
207 206 'pickleshare',
208 207 'simplegeneric>0.8',
209 208 'traitlets>=4.2',
210 209 'prompt_toolkit>=1.0.4,<2.0.0',
211 210 'pygments',
212 211 ]
213 212
214 213 # Platform-specific dependencies:
215 214 # This is the correct way to specify these,
216 215 # but requires pip >= 6. pip < 6 ignores these.
217 216
218 217 extras_require.update({
219 218 'test:python_version >= "3.4"': ['numpy'],
220 219 ':python_version == "3.3"': ['pathlib2'],
220 ':python_version <= "3.4"': ['typing'],
221 221 ':sys_platform != "win32"': ['pexpect'],
222 222 ':sys_platform == "darwin"': ['appnope'],
223 223 ':sys_platform == "win32"': ['colorama'],
224 224 ':sys_platform == "win32" and python_version < "3.6"': ['win_unicode_console>=0.5'],
225 225 })
226 226 # FIXME: re-specify above platform dependencies for pip < 6
227 227 # These would result in non-portable bdists.
228 228 if not any(arg.startswith('bdist') for arg in sys.argv):
229 229 if sys.platform == 'darwin':
230 230 install_requires.extend(['appnope'])
231 231
232 232 if not sys.platform.startswith('win'):
233 233 install_requires.append('pexpect')
234 234
235 235 # workaround pypa/setuptools#147, where setuptools misspells
236 236 # platform_python_implementation as python_implementation
237 237 if 'setuptools' in sys.modules:
238 238 for key in list(extras_require):
239 239 if 'platform_python_implementation' in key:
240 240 new_key = key.replace('platform_python_implementation', 'python_implementation')
241 241 extras_require[new_key] = extras_require.pop(key)
242 242
243 243 everything = set()
244 244 for key, deps in extras_require.items():
245 245 if ':' not in key:
246 246 everything.update(deps)
247 247 extras_require['all'] = everything
248 248
249 249 if 'setuptools' in sys.modules:
250 250 setuptools_extra_args['python_requires'] = '>=3.3'
251 251 setuptools_extra_args['zip_safe'] = False
252 252 setuptools_extra_args['entry_points'] = {
253 253 'console_scripts': find_entry_points(),
254 254 'pygments.lexers': [
255 255 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
256 256 'ipython = IPython.lib.lexers:IPythonLexer',
257 257 'ipython3 = IPython.lib.lexers:IPython3Lexer',
258 258 ],
259 259 }
260 260 setup_args['extras_require'] = extras_require
261 261 requires = setup_args['install_requires'] = install_requires
262 262
263 263 # Script to be run by the windows binary installer after the default setup
264 264 # routine, to add shortcuts and similar windows-only things. Windows
265 265 # post-install scripts MUST reside in the scripts/ dir, otherwise distutils
266 266 # doesn't find them.
267 267 if 'bdist_wininst' in sys.argv:
268 268 if len(sys.argv) > 2 and \
269 269 ('sdist' in sys.argv or 'bdist_rpm' in sys.argv):
270 270 print("ERROR: bdist_wininst must be run alone. Exiting.", file=sys.stderr)
271 271 sys.exit(1)
272 272 setup_args['data_files'].append(
273 273 ['Scripts', ('scripts/ipython.ico', 'scripts/ipython_nb.ico')])
274 274 setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')]
275 275 setup_args['options'] = {"bdist_wininst":
276 276 {"install_script":
277 277 "ipython_win_post_install.py"}}
278 278
279 279 else:
280 280 # scripts has to be a non-empty list, or install_scripts isn't called
281 281 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
282 282
283 283 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
284 284
285 285 #---------------------------------------------------------------------------
286 286 # Do the actual setup now
287 287 #---------------------------------------------------------------------------
288 288
289 289 setup_args.update(setuptools_extra_args)
290 290
291 291
292 292
293 293 def main():
294 294 setup(**setup_args)
295 295
296 296 if __name__ == '__main__':
297 297 main()
General Comments 0
You need to be logged in to leave comments. Login now