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