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