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