##// END OF EJS Templates
Don't allow Jedi to go to v1.18.0...
Dan Green -
Show More
@@ -1,263 +1,263 b''
1 #!/usr/bin/env python3
1 #!/usr/bin/env python3
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 import os
20 import os
21 import sys
21 import sys
22 from pathlib import Path
22 from pathlib import Path
23
23
24 # **Python version check**
24 # **Python version check**
25 #
25 #
26 # 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
27 # changing Python version requirements.
27 # changing Python version requirements.
28 if sys.version_info < (3, 7):
28 if sys.version_info < (3, 7):
29 pip_message = 'This may be due to an out of date pip. Make sure you have pip >= 9.0.1.'
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 import pip
31 import pip
32 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]])
33 if pip_version < (9, 0, 1) :
33 if pip_version < (9, 0, 1) :
34 pip_message = 'Your 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. '\
35 'pip {} detected.'.format(pip.__version__)
35 'pip {} detected.'.format(pip.__version__)
36 else:
36 else:
37 # pip is new enough - it must be something else
37 # pip is new enough - it must be something else
38 pip_message = ''
38 pip_message = ''
39 except Exception:
39 except Exception:
40 pass
40 pass
41
41
42
42
43 error = """
43 error = """
44 IPython 7.17+ supports Python 3.7 and above, following NEP 29.
44 IPython 7.17+ supports Python 3.7 and above, following NEP 29.
45 When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
45 When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
46 Python 3.3 and 3.4 were supported up to IPython 6.x.
46 Python 3.3 and 3.4 were supported up to IPython 6.x.
47 Python 3.5 was supported with IPython 7.0 to 7.9.
47 Python 3.5 was supported with IPython 7.0 to 7.9.
48 Python 3.6 was supported with IPython up to 7.16.
48 Python 3.6 was supported with IPython up to 7.16.
49
49
50 See IPython `README.rst` file for more information:
50 See IPython `README.rst` file for more information:
51
51
52 https://github.com/ipython/ipython/blob/master/README.rst
52 https://github.com/ipython/ipython/blob/master/README.rst
53
53
54 Python {py} detected.
54 Python {py} detected.
55 {pip}
55 {pip}
56 """.format(py=sys.version_info, pip=pip_message )
56 """.format(py=sys.version_info, pip=pip_message )
57
57
58 print(error, file=sys.stderr)
58 print(error, file=sys.stderr)
59 sys.exit(1)
59 sys.exit(1)
60
60
61 # At least we're on the python version we need, move on.
61 # At least we're on the python version we need, move on.
62
62
63 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
63 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
64 # update it when the contents of directories change.
64 # update it when the contents of directories change.
65 if Path("MANIFEST").exists():
65 if Path("MANIFEST").exists():
66 Path("MANIFEST").unlink()
66 Path("MANIFEST").unlink()
67
67
68 from distutils.core import setup
68 from distutils.core import setup
69
69
70 # Our own imports
70 # Our own imports
71 from setupbase import target_update
71 from setupbase import target_update
72
72
73 from setupbase import (
73 from setupbase import (
74 setup_args,
74 setup_args,
75 find_packages,
75 find_packages,
76 find_package_data,
76 find_package_data,
77 check_package_data_first,
77 check_package_data_first,
78 find_entry_points,
78 find_entry_points,
79 build_scripts_entrypt,
79 build_scripts_entrypt,
80 find_data_files,
80 find_data_files,
81 git_prebuild,
81 git_prebuild,
82 install_symlinked,
82 install_symlinked,
83 install_lib_symlink,
83 install_lib_symlink,
84 install_scripts_for_symlink,
84 install_scripts_for_symlink,
85 unsymlink,
85 unsymlink,
86 )
86 )
87
87
88 #-------------------------------------------------------------------------------
88 #-------------------------------------------------------------------------------
89 # Handle OS specific things
89 # Handle OS specific things
90 #-------------------------------------------------------------------------------
90 #-------------------------------------------------------------------------------
91
91
92 if os.name in ('nt','dos'):
92 if os.name in ('nt','dos'):
93 os_name = 'windows'
93 os_name = 'windows'
94 else:
94 else:
95 os_name = os.name
95 os_name = os.name
96
96
97 # Under Windows, 'sdist' has not been supported. Now that the docs build with
97 # Under Windows, 'sdist' has not been supported. Now that the docs build with
98 # Sphinx it might work, but let's not turn it on until someone confirms that it
98 # Sphinx it might work, but let's not turn it on until someone confirms that it
99 # actually works.
99 # actually works.
100 if os_name == 'windows' and 'sdist' in sys.argv:
100 if os_name == 'windows' and 'sdist' in sys.argv:
101 print('The sdist command is not available under Windows. Exiting.')
101 print('The sdist command is not available under Windows. Exiting.')
102 sys.exit(1)
102 sys.exit(1)
103
103
104
104
105 #-------------------------------------------------------------------------------
105 #-------------------------------------------------------------------------------
106 # Things related to the IPython documentation
106 # Things related to the IPython documentation
107 #-------------------------------------------------------------------------------
107 #-------------------------------------------------------------------------------
108
108
109 # update the manuals when building a source dist
109 # update the manuals when building a source dist
110 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
110 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
111
111
112 # List of things to be updated. Each entry is a triplet of args for
112 # List of things to be updated. Each entry is a triplet of args for
113 # target_update()
113 # target_update()
114 to_update = [
114 to_update = [
115 ('docs/man/ipython.1.gz',
115 ('docs/man/ipython.1.gz',
116 ['docs/man/ipython.1'],
116 ['docs/man/ipython.1'],
117 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
117 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
118 ]
118 ]
119
119
120
120
121 [ target_update(*t) for t in to_update ]
121 [ target_update(*t) for t in to_update ]
122
122
123 #---------------------------------------------------------------------------
123 #---------------------------------------------------------------------------
124 # Find all the packages, package data, and data_files
124 # Find all the packages, package data, and data_files
125 #---------------------------------------------------------------------------
125 #---------------------------------------------------------------------------
126
126
127 packages = find_packages()
127 packages = find_packages()
128 package_data = find_package_data()
128 package_data = find_package_data()
129
129
130 data_files = find_data_files()
130 data_files = find_data_files()
131
131
132 setup_args['packages'] = packages
132 setup_args['packages'] = packages
133 setup_args['package_data'] = package_data
133 setup_args['package_data'] = package_data
134 setup_args['data_files'] = data_files
134 setup_args['data_files'] = data_files
135
135
136 #---------------------------------------------------------------------------
136 #---------------------------------------------------------------------------
137 # custom distutils commands
137 # custom distutils commands
138 #---------------------------------------------------------------------------
138 #---------------------------------------------------------------------------
139 # imports here, so they are after setuptools import if there was one
139 # imports here, so they are after setuptools import if there was one
140 from distutils.command.sdist import sdist
140 from distutils.command.sdist import sdist
141
141
142 setup_args['cmdclass'] = {
142 setup_args['cmdclass'] = {
143 'build_py': \
143 'build_py': \
144 check_package_data_first(git_prebuild('IPython')),
144 check_package_data_first(git_prebuild('IPython')),
145 'sdist' : git_prebuild('IPython', sdist),
145 'sdist' : git_prebuild('IPython', sdist),
146 'symlink': install_symlinked,
146 'symlink': install_symlinked,
147 'install_lib_symlink': install_lib_symlink,
147 'install_lib_symlink': install_lib_symlink,
148 'install_scripts_sym': install_scripts_for_symlink,
148 'install_scripts_sym': install_scripts_for_symlink,
149 'unsymlink': unsymlink,
149 'unsymlink': unsymlink,
150 }
150 }
151
151
152
152
153 #---------------------------------------------------------------------------
153 #---------------------------------------------------------------------------
154 # Handle scripts, dependencies, and setuptools specific things
154 # Handle scripts, dependencies, and setuptools specific things
155 #---------------------------------------------------------------------------
155 #---------------------------------------------------------------------------
156
156
157 # For some commands, use setuptools. Note that we do NOT list install here!
157 # For some commands, use setuptools. Note that we do NOT list install here!
158 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
158 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
159 needs_setuptools = {'develop', 'release', 'bdist_egg', 'bdist_rpm',
159 needs_setuptools = {'develop', 'release', 'bdist_egg', 'bdist_rpm',
160 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
160 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
161 'egg_info', 'easy_install', 'upload', 'install_egg_info',
161 'egg_info', 'easy_install', 'upload', 'install_egg_info',
162 }
162 }
163
163
164 if len(needs_setuptools.intersection(sys.argv)) > 0:
164 if len(needs_setuptools.intersection(sys.argv)) > 0:
165 import setuptools
165 import setuptools
166
166
167 # This dict is used for passing extra arguments that are setuptools
167 # This dict is used for passing extra arguments that are setuptools
168 # specific to setup
168 # specific to setup
169 setuptools_extra_args = {}
169 setuptools_extra_args = {}
170
170
171 # setuptools requirements
171 # setuptools requirements
172
172
173 extras_require = dict(
173 extras_require = dict(
174 parallel = ['ipyparallel'],
174 parallel = ['ipyparallel'],
175 qtconsole = ['qtconsole'],
175 qtconsole = ['qtconsole'],
176 doc = ['Sphinx>=1.3'],
176 doc = ['Sphinx>=1.3'],
177 test = ['nose>=0.10.1', 'requests', 'testpath', 'pygments', 'nbformat', 'ipykernel', 'numpy>=1.14'],
177 test = ['nose>=0.10.1', 'requests', 'testpath', 'pygments', 'nbformat', 'ipykernel', 'numpy>=1.14'],
178 terminal = [],
178 terminal = [],
179 kernel = ['ipykernel'],
179 kernel = ['ipykernel'],
180 nbformat = ['nbformat'],
180 nbformat = ['nbformat'],
181 notebook = ['notebook', 'ipywidgets'],
181 notebook = ['notebook', 'ipywidgets'],
182 nbconvert = ['nbconvert'],
182 nbconvert = ['nbconvert'],
183 )
183 )
184
184
185 install_requires = [
185 install_requires = [
186 'setuptools>=18.5',
186 'setuptools>=18.5',
187 'jedi>=0.16',
187 'jedi>=0.16,<0.18.0',
188 'decorator',
188 'decorator',
189 'pickleshare',
189 'pickleshare',
190 'traitlets>=4.2',
190 'traitlets>=4.2',
191 'prompt_toolkit>=2.0.0,<3.1.0,!=3.0.0,!=3.0.1',
191 'prompt_toolkit>=2.0.0,<3.1.0,!=3.0.0,!=3.0.1',
192 'pygments',
192 'pygments',
193 'backcall',
193 'backcall',
194 'stack_data',
194 'stack_data',
195 ]
195 ]
196
196
197 # Platform-specific dependencies:
197 # Platform-specific dependencies:
198 # This is the correct way to specify these,
198 # This is the correct way to specify these,
199 # but requires pip >= 6. pip < 6 ignores these.
199 # but requires pip >= 6. pip < 6 ignores these.
200
200
201 extras_require.update(
201 extras_require.update(
202 {
202 {
203 ':sys_platform != "win32"': ["pexpect>4.3"],
203 ':sys_platform != "win32"': ["pexpect>4.3"],
204 ':sys_platform == "darwin"': ["appnope"],
204 ':sys_platform == "darwin"': ["appnope"],
205 ':sys_platform == "win32"': ["colorama"],
205 ':sys_platform == "win32"': ["colorama"],
206 }
206 }
207 )
207 )
208 # FIXME: re-specify above platform dependencies for pip < 6
208 # FIXME: re-specify above platform dependencies for pip < 6
209 # These would result in non-portable bdists.
209 # These would result in non-portable bdists.
210 if not any(arg.startswith('bdist') for arg in sys.argv):
210 if not any(arg.startswith('bdist') for arg in sys.argv):
211 if sys.platform == 'darwin':
211 if sys.platform == 'darwin':
212 install_requires.extend(['appnope'])
212 install_requires.extend(['appnope'])
213
213
214 if not sys.platform.startswith("win"):
214 if not sys.platform.startswith("win"):
215 install_requires.append("pexpect>4.3")
215 install_requires.append("pexpect>4.3")
216
216
217 # workaround pypa/setuptools#147, where setuptools misspells
217 # workaround pypa/setuptools#147, where setuptools misspells
218 # platform_python_implementation as python_implementation
218 # platform_python_implementation as python_implementation
219 if 'setuptools' in sys.modules:
219 if 'setuptools' in sys.modules:
220 for key in list(extras_require):
220 for key in list(extras_require):
221 if 'platform_python_implementation' in key:
221 if 'platform_python_implementation' in key:
222 new_key = key.replace('platform_python_implementation', 'python_implementation')
222 new_key = key.replace('platform_python_implementation', 'python_implementation')
223 extras_require[new_key] = extras_require.pop(key)
223 extras_require[new_key] = extras_require.pop(key)
224
224
225 everything = set()
225 everything = set()
226 for key, deps in extras_require.items():
226 for key, deps in extras_require.items():
227 if ':' not in key:
227 if ':' not in key:
228 everything.update(deps)
228 everything.update(deps)
229 extras_require['all'] = list(sorted(everything))
229 extras_require['all'] = list(sorted(everything))
230
230
231 if 'setuptools' in sys.modules:
231 if 'setuptools' in sys.modules:
232 setuptools_extra_args['python_requires'] = '>=3.7'
232 setuptools_extra_args['python_requires'] = '>=3.7'
233 setuptools_extra_args['zip_safe'] = False
233 setuptools_extra_args['zip_safe'] = False
234 setuptools_extra_args['entry_points'] = {
234 setuptools_extra_args['entry_points'] = {
235 'console_scripts': find_entry_points(),
235 'console_scripts': find_entry_points(),
236 'pygments.lexers': [
236 'pygments.lexers': [
237 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
237 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
238 'ipython = IPython.lib.lexers:IPythonLexer',
238 'ipython = IPython.lib.lexers:IPythonLexer',
239 'ipython3 = IPython.lib.lexers:IPython3Lexer',
239 'ipython3 = IPython.lib.lexers:IPython3Lexer',
240 ],
240 ],
241 }
241 }
242 setup_args['extras_require'] = extras_require
242 setup_args['extras_require'] = extras_require
243 setup_args['install_requires'] = install_requires
243 setup_args['install_requires'] = install_requires
244
244
245 else:
245 else:
246 # scripts has to be a non-empty list, or install_scripts isn't called
246 # scripts has to be a non-empty list, or install_scripts isn't called
247 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
247 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
248
248
249 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
249 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
250
250
251 #---------------------------------------------------------------------------
251 #---------------------------------------------------------------------------
252 # Do the actual setup now
252 # Do the actual setup now
253 #---------------------------------------------------------------------------
253 #---------------------------------------------------------------------------
254
254
255 setup_args.update(setuptools_extra_args)
255 setup_args.update(setuptools_extra_args)
256
256
257
257
258
258
259 def main():
259 def main():
260 setup(**setup_args)
260 setup(**setup_args)
261
261
262 if __name__ == '__main__':
262 if __name__ == '__main__':
263 main()
263 main()
General Comments 0
You need to be logged in to leave comments. Login now