##// END OF EJS Templates
remove appnope from external...
remove appnope from external make it a dependency on OS X

File last commit:

r20814:8cb79127
r20814:8cb79127
Show More
setupbase.py
769 lines | 26.9 KiB | text/x-python | PythonLexer
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 # encoding: utf-8
Brian E Granger
Adding documentation to setup* files.
r1239 """
This module defines the things that are used in setup.py for building IPython
This includes:
* The basic arguments to setup
* Functions for finding things like packages, package data, etc.
* A function for checking dependencies.
"""
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
MinRK
add ipython[terminal] dependency group...
r16386 # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
from __future__ import print_function
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 import errno
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 import os
import sys
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
MinRK
add strict arg to css_js setup decorator...
r17343 from distutils import log
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 from distutils.command.build_py import build_py
Thomas Kluyver
Fix renaming scripts with 3 suffix on Python 3
r13368 from distutils.command.build_scripts import build_scripts
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 from distutils.command.install import install
from distutils.command.install_scripts import install_scripts
MinRK
ensure submodules exist prior to doing anything...
r10484 from distutils.cmd import Command
Min RK
friendlier error messages when invoke/lessc are missing...
r19731 from distutils.errors import DistutilsExecError
MinRK
do not install less sources...
r15830 from fnmatch import fnmatch
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 from glob import glob
Min RK
friendlier error messages when invoke/lessc are missing...
r19731 from subprocess import Popen, PIPE
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
from setupext import install_data_ext
#-------------------------------------------------------------------------------
# Useful globals and utility functions
#-------------------------------------------------------------------------------
# A few handy globals
isfile = os.path.isfile
pjoin = os.path.join
Takafumi Arakaki
Fix: "python ABS/PATH/TO/ipython.py" fails...
r10610 repo_root = os.path.dirname(os.path.abspath(__file__))
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
def oscmd(s):
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 print(">", s)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 os.system(s)
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Emergency fix for py3 breakage introduced in 576f6f (merge of #1538)...
r6446 # Py3 compatibility hacks, without assuming IPython itself is installed with
# the full py3compat machinery.
Thomas Kluyver
Make installation with Python 3 possible.
r4750 try:
execfile
except NameError:
def execfile(fname, globs, locs=None):
locs = locs or globs
exec(compile(open(fname).read(), fname, "exec"), globs, locs)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
# A little utility we'll need below, since glob() does NOT allow you to do
# exclusion on multiple endings!
def file_doesnt_endwith(test,endings):
"""Return true if test is a file and its name does NOT end with any
of the strings listed in endings."""
if not isfile(test):
return False
for e in endings:
if test.endswith(e):
return False
return True
#---------------------------------------------------------------------------
# Basic project information
#---------------------------------------------------------------------------
Brian Granger
Merging -r 1192 from lp:ipython.
r2146 # release.py contains version, authors, license, url, keywords, etc.
Takafumi Arakaki
Fix: "python ABS/PATH/TO/ipython.py" fails...
r10610 execfile(pjoin(repo_root, 'IPython','core','release.py'), globals())
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
# Create a dict with the basic information
# This dict is eventually passed to setup after additional keys are added.
setup_args = dict(
name = name,
version = version,
description = description,
long_description = long_description,
author = author,
author_email = author_email,
url = url,
download_url = download_url,
license = license,
platforms = platforms,
keywords = keywords,
Thomas Kluyver
Add Trove classifiers for PyPI.
r4771 classifiers = classifiers,
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 cmdclass = {'install_data': install_data_ext},
)
#---------------------------------------------------------------------------
# Find packages
#---------------------------------------------------------------------------
def find_packages():
Brian E Granger
Adding documentation to setup* files.
r1239 """
Find all of IPython's packages.
"""
Thomas Kluyver
Exclude IPython.quarantine from installation.
r6492 excludes = ['deathrow', 'quarantine']
MinRK
Generate package list automatically in find_packages...
r4466 packages = []
for dir,subdirs,files in os.walk('IPython'):
package = dir.replace(os.path.sep, '.')
Thomas Kluyver
Exclude IPython.quarantine from installation.
r6492 if any(package.startswith('IPython.'+exc) for exc in excludes):
MinRK
Generate package list automatically in find_packages...
r4466 # package is to be excluded (e.g. deathrow)
continue
if '__init__.py' not in files:
# not a package
continue
packages.append(package)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 return packages
#---------------------------------------------------------------------------
# Find package data
#---------------------------------------------------------------------------
def find_package_data():
Brian E Granger
Adding documentation to setup* files.
r1239 """
Find IPython's package_data.
"""
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 # This is not enough for these things to appear in an sdist.
# We need to muck with the MANIFEST to get this to work
MinRK
exclude mathjax from notebook package_data...
r5625
MinRK
do not install less sources...
r15830 # exclude components and less from the walk;
MinRK
whitelist installed components...
r15031 # we will build the components separately
MinRK
do not install less sources...
r15830 excludes = [
pjoin('static', 'components'),
pjoin('static', '*', 'less'),
]
MinRK
exclude mathjax from notebook package_data...
r5625
MinRK
include html frontend in packages/package_data...
r4322 # walk notebook resources:
cwd = os.getcwd()
MinRK
update references for IPython.html
r11035 os.chdir(os.path.join('IPython', 'html'))
MinRK
include html frontend in packages/package_data...
r4322 static_data = []
MinRK
whitelist installed components...
r15031 for parent, dirs, files in os.walk('static'):
MinRK
do not install less sources...
r15830 if any(fnmatch(parent, pat) for pat in excludes):
# prevent descending into subdirs
dirs[:] = []
MinRK
exclude mathjax from notebook package_data...
r5625 continue
MinRK
include html frontend in packages/package_data...
r4322 for f in files:
MinRK
whitelist installed components...
r15031 static_data.append(pjoin(parent, f))
MinRK
do not install less sources...
r15830
MinRK
whitelist installed components...
r15031 components = pjoin("static", "components")
# select the components we actually need to install
# (there are lots of resources we bundle for sdist-reasons that we don't actually use)
static_data.extend([
pjoin(components, "backbone", "backbone-min.js"),
Thomas Kluyver
Fix bootstrap location in package_data
r16985 pjoin(components, "bootstrap", "js", "bootstrap.min.js"),
MinRK
install bootstrap-tour css
r15815 pjoin(components, "bootstrap-tour", "build", "css", "bootstrap-tour.min.css"),
MinRK
install bootstrap-tour component
r15578 pjoin(components, "bootstrap-tour", "build", "js", "bootstrap-tour.min.js"),
Thomas Kluyver
Add es6-promise to package_data
r18828 pjoin(components, "es6-promise", "*.js"),
Thomas Spura
fontawesome-4 renamed font folder to fonts
r17410 pjoin(components, "font-awesome", "fonts", "*.*"),
MinRK
don't forget to install caja
r15659 pjoin(components, "google-caja", "html-css-sanitizer-minified.js"),
MinRK
whitelist installed components...
r15031 pjoin(components, "jquery", "jquery.min.js"),
pjoin(components, "jquery-ui", "ui", "minified", "jquery-ui.min.js"),
pjoin(components, "jquery-ui", "themes", "smoothness", "jquery-ui.min.css"),
cgohlke
Install jquery-ui theme images
r16014 pjoin(components, "jquery-ui", "themes", "smoothness", "images", "*"),
MinRK
whitelist installed components...
r15031 pjoin(components, "marked", "lib", "marked.js"),
MinRK
validate package_data...
r15035 pjoin(components, "requirejs", "require.js"),
MinRK
whitelist installed components...
r15031 pjoin(components, "underscore", "underscore-min.js"),
Matthias BUSSONNIER
use momentjs for nice dates
r17474 pjoin(components, "moment", "moment.js"),
MinRK
install text-encoding polyfill
r18334 pjoin(components, "moment", "min", "moment.min.js"),
Kyle Kelley
Add term.js to package data for installation.
r18488 pjoin(components, "term.js", "src", "term.js"),
MinRK
install text-encoding polyfill
r18334 pjoin(components, "text-encoding", "lib", "encoding.js"),
MinRK
whitelist installed components...
r15031 ])
# Ship all of Codemirror's CSS and JS
for parent, dirs, files in os.walk(pjoin(components, 'codemirror')):
for f in files:
if f.endswith(('.js', '.css')):
static_data.append(pjoin(parent, f))
Paul Ivanov
include js tests in package_data
r13276 os.chdir(os.path.join('tests',))
Jonathan Frederic
Fixed setup base so it requires the correct files
r15203 js_tests = glob('*.js') + glob('*/*.js')
Thomas Kluyver
Walk nbconvert templates directory for package data files
r14052
os.chdir(os.path.join(cwd, 'IPython', 'nbconvert'))
Thomas Kluyver
Fix glob pattern for nbconvert template files
r14059 nbconvert_templates = [os.path.join(dirpath, '*.*')
Thomas Kluyver
Walk nbconvert templates directory for package data files
r14052 for dirpath, _, _ in os.walk('templates')]
Paul Ivanov
include js tests in package_data
r13276 os.chdir(cwd)
Brian E Granger
package_data was missing the .txt files in the testing directories. This was causing ...
r1317 package_data = {
MinRK
add README to startup dir
r5247 'IPython.config.profile' : ['README*', '*/*.py'],
MinRK
make sure test files are installed
r10805 'IPython.core.tests' : ['*.png', '*.jpg'],
Thomas Kluyver
Add sample wav file to package_data
r13550 'IPython.lib.tests' : ['*.wav'],
MinRK
add missing plugin .txt to package_data
r7774 'IPython.testing.plugin' : ['*.txt'],
MinRK
update references for IPython.html
r11035 'IPython.html' : ['templates/*'] + static_data,
Paul Ivanov
include js tests in package_data
r13276 'IPython.html.tests' : js_tests,
MinRK
remove a few dangling frontends from setupbase
r11029 'IPython.qt.console' : ['resources/icon/*.svg'],
Thomas Kluyver
Walk nbconvert templates directory for package data files
r14052 'IPython.nbconvert' : nbconvert_templates +
Julia Evans
Add preprocessor test inputs to find_package_data()
r17085 [
'tests/files/*.*',
'exporters/tests/files/*.*',
MinRK
merge separate input/expected notebooks for execute preprocessor
r17101 'preprocessors/tests/files/*.*',
Julia Evans
Add preprocessor test inputs to find_package_data()
r17085 ],
MinRK
include marked.js in package_data
r14212 'IPython.nbconvert.filters' : ['marked.js'],
MinRK
Use Draft4 JSON Schema for both v3 and v4...
r18243 'IPython.nbformat' : [
'tests/*.ipynb',
'v3/nbformat.v3.schema.json',
MinRK
Use Draft4 JSON Schema for v4
r18574 'v4/nbformat.v4.schema.json',
Thomas Kluyver
Add kernel resources directory to package_data
r19534 ],
'IPython.kernel': ['resources/*.*'],
Brian E Granger
package_data was missing the .txt files in the testing directories. This was causing ...
r1317 }
MinRK
validate package_data...
r15035
MinRK
only validate package_data when it might be used...
r15114 return package_data
MinRK
run check_package_data as part of build_py...
r15165
MinRK
only validate package_data when it might be used...
r15114 def check_package_data(package_data):
"""verify that package_data globs make sense"""
print("checking package data")
MinRK
validate package_data...
r15035 for pkg, data in package_data.items():
pkg_root = pjoin(*pkg.split('.'))
for d in data:
path = pjoin(pkg_root, d)
if '*' in path:
assert len(glob(path)) > 0, "No files match pattern %s" % path
else:
assert os.path.exists(path), "Missing package data: %s" % path
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
MinRK
run check_package_data as part of build_py...
r15165 def check_package_data_first(command):
"""decorator for checking package_data before running a given command
Probably only needs to wrap build_py
"""
class DecoratedCommand(command):
def run(self):
check_package_data(self.package_data)
command.run(self)
return DecoratedCommand
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
#---------------------------------------------------------------------------
# Find data files
#---------------------------------------------------------------------------
Fernando Perez
Fixes to build/setup machinery....
r1525 def make_dir_struct(tag,base,out_base):
"""Make the directory structure of all files below a starting dir.
This is just a convenience routine to help build a nested directory
hierarchy because distutils is too stupid to do this by itself.
XXX - this needs a proper docstring!
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 # we'll use these a lot below
lbase = len(base)
pathsep = os.path.sep
lpathsep = len(pathsep)
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 out = []
for (dirpath,dirnames,filenames) in os.walk(base):
# we need to strip out the dirpath from the base to map it to the
# output (installation) path. This requires possibly stripping the
# path separator, because otherwise pjoin will not work correctly
# (pjoin('foo/','/bar') returns '/bar').
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 dp_eff = dirpath[lbase:]
if dp_eff.startswith(pathsep):
dp_eff = dp_eff[lpathsep:]
Bernardo B. Marques
remove all trailling spaces
r4872 # The output path must be anchored at the out_base marker
Fernando Perez
Fixes to build/setup machinery....
r1525 out_path = pjoin(out_base,dp_eff)
# Now we can generate the final filenames. Since os.walk only produces
# filenames, we must join back with the dirpath to get full valid file
# paths:
pfiles = [pjoin(dirpath,f) for f in filenames]
Fernando Perez
Fix bug in our specification of data_files....
r3205 # Finally, generate the entry we need, which is a pari of (output
Fernando Perez
Fixes to build/setup machinery....
r1525 # path, files) for use as a data_files parameter in install_data.
Fernando Perez
Fix bug in our specification of data_files....
r3205 out.append((out_path, pfiles))
Fernando Perez
Fixes to build/setup machinery....
r1525
return out
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 def find_data_files():
Brian E Granger
Adding documentation to setup* files.
r1239 """
Find IPython's data_files.
Fernando Perez
Fixes to build/setup machinery....
r1525
MinRK
we only install man pages to usr/share...
r15032 Just man pages at this point.
Brian E Granger
Adding documentation to setup* files.
r1239 """
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Fixing installation related issues.
r2058 manpagebase = pjoin('share', 'man', 'man1')
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 # Simple file lists can be made by hand
Thomas Robitaille
Fix a bug that caused man pages to not be installed in Python 3 when running from the source tree.
r8454 manpages = [f for f in glob(pjoin('docs','man','*.1.gz')) if isfile(f)]
Fernando Perez
Fix installation of manpages.
r4420 if not manpages:
# When running from a source tree, the manpages aren't gzipped
Thomas Robitaille
Fix a bug that caused man pages to not be installed in Python 3 when running from the source tree.
r8454 manpages = [f for f in glob(pjoin('docs','man','*.1')) if isfile(f)]
Fernando Perez
Fixes to build/setup machinery....
r1525 # And assemble the entire output list
MinRK
we only install man pages to usr/share...
r15032 data_files = [ (manpagebase, manpages) ]
Brian Granger
Lots of work on the display system, focused on pylab stuff....
r3280
Fernando Perez
Fixes to build system.
r1522 return data_files
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
Fernando Perez
Update setup and support tools to include new man pages.
r2100
def make_man_update_target(manpage):
"""Return a target_update-compliant tuple for the given manpage.
Parameters
----------
manpage : string
Name of the manpage, must include the section number (trailing number).
Example
-------
>>> make_man_update_target('ipython.1') #doctest: +NORMALIZE_WHITESPACE
('docs/man/ipython.1.gz',
['docs/man/ipython.1'],
'cd docs/man && gzip -9c ipython.1 > ipython.1.gz')
"""
man_dir = pjoin('docs', 'man')
manpage_gz = manpage + '.gz'
manpath = pjoin(man_dir, manpage)
manpath_gz = pjoin(man_dir, manpage_gz)
gz_cmd = ( "cd %(man_dir)s && gzip -9c %(manpage)s > %(manpage_gz)s" %
locals() )
return (manpath_gz, [manpath], gz_cmd)
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Make single setup script work on Python 2 and Python 3.
r5828 # The two functions below are copied from IPython.utils.path, so we don't need
# to import IPython during setup, which fails on Python 3.
def target_outdated(target,deps):
"""Determine whether a target is out of date.
target_outdated(target,deps) -> 1/0
deps: list of filenames which MUST exist.
target: single filename which may or may not exist.
If target doesn't exist or is older than any file listed in deps, return
true, otherwise return false.
"""
try:
target_time = os.path.getmtime(target)
except os.error:
return 1
for dep in deps:
dep_time = os.path.getmtime(dep)
if dep_time > target_time:
#print "For target",target,"Dep failed:",dep # dbg
#print "times (dep,tar):",dep_time,target_time # dbg
return 1
return 0
def target_update(target,deps,cmd):
"""Update a target with a given command given a list of dependencies.
target_update(target,deps,cmd) -> runs cmd if target is outdated.
This is just a wrapper around target_outdated() which calls the given
command if target is outdated."""
if target_outdated(target,deps):
MinRK
fix system->os.system typo...
r6144 os.system(cmd)
Thomas Kluyver
Make single setup script work on Python 2 and Python 3.
r5828
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 #---------------------------------------------------------------------------
# Find scripts
#---------------------------------------------------------------------------
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 def find_entry_points():
Thomas Kluyver
Update some docstrings
r18769 """Defines the command line entry points for IPython
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Update some docstrings
r18769 This always uses setuptools-style entry points. When setuptools is not in
use, our own build_scripts_entrypt class below parses these and builds
command line scripts.
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Update some docstrings
r18769 Each of our entry points gets both a plain name, e.g. ipython, and one
suffixed with the Python major version number, e.g. ipython3.
Brian E Granger
Adding documentation to setup* files.
r1239 """
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 ep = [
MinRK
use start_ipython in entry points...
r11177 'ipython%s = IPython:start_ipython',
Thomas Kluyver
Allow 'python setup.py install' to work correctly for either Python 2 or 3.
r4765 'ipcontroller%s = IPython.parallel.apps.ipcontrollerapp:launch_new_instance',
'ipengine%s = IPython.parallel.apps.ipengineapp:launch_new_instance',
'ipcluster%s = IPython.parallel.apps.ipclusterapp:launch_new_instance',
Thomas Kluyver
Fix iptest setuptools entry point
r12618 'iptest%s = IPython.testing.iptestcontroller:main',
Evan Patterson
Make ipython-qtconsole a GUI script in setuptools.
r3838 ]
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 suffix = str(sys.version_info[0])
return [e % '' for e in ep] + [e % suffix for e in ep]
script_src = """#!{executable}
Thomas Kluyver
Add comment to automatically generated scripts.
r13497 # This script was automatically generated by setup.py
MinRK
use if main block in entry points...
r13845 if __name__ == '__main__':
MinRK
move import into ifmain block
r13861 from {mod} import {func}
MinRK
use if main block in entry points...
r13845 {func}()
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 """
class build_scripts_entrypt(build_scripts):
Thomas Kluyver
Update some docstrings
r18769 """Build the command line scripts
Parse setuptools style entry points and write simple scripts to run the
target functions.
On Windows, this also creates .cmd wrappers for the scripts so that you can
easily launch them from a command line.
"""
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 def run(self):
self.mkpath(self.build_dir)
outfiles = []
for script in find_entry_points():
name, entrypt = script.split('=')
name = name.strip()
entrypt = entrypt.strip()
outfile = os.path.join(self.build_dir, name)
outfiles.append(outfile)
print('Writing script to', outfile)
mod, func = entrypt.split(':')
with open(outfile, 'w') as f:
f.write(script_src.format(executable=sys.executable,
mod=mod, func=func))
Thomas Kluyver
Install on Windows without using setuptools...
r18768
if sys.platform == 'win32':
# Write .cmd wrappers for Windows so 'ipython' etc. work at the
# command line
cmd_file = os.path.join(self.build_dir, name + '.cmd')
cmd = '@"{python}" "%~dp0\{script}" %*\r\n'.format(
python=sys.executable, script=name)
log.info("Writing %s wrapper script" % cmd_file)
with open(cmd_file, 'w') as f:
f.write(cmd)
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452
return outfiles, outfiles
class install_lib_symlink(Command):
user_options = [
('install-dir=', 'd', "directory to install to"),
]
Evan Patterson
Make ipython-qtconsole a GUI script in setuptools.
r3838
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 def initialize_options(self):
self.install_dir = None
def finalize_options(self):
self.set_undefined_options('symlink',
('install_lib', 'install_dir'),
)
def run(self):
if sys.platform == 'win32':
raise Exception("This doesn't work on Windows.")
pkg = os.path.join(os.getcwd(), 'IPython')
dest = os.path.join(self.install_dir, 'IPython')
Thomas Kluyver
If symlink already exists, clobber it with current one
r13857 if os.path.islink(dest):
print('removing existing symlink at %s' % dest)
os.unlink(dest)
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 print('symlinking %s -> %s' % (pkg, dest))
Thomas Kluyver
If symlink already exists, clobber it with current one
r13857 os.symlink(pkg, dest)
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452
Thomas Kluyver
Add 'unsymlink command to remove the symlink
r13862 class unsymlink(install):
def run(self):
dest = os.path.join(self.install_lib, 'IPython')
if os.path.islink(dest):
print('removing symlink at %s' % dest)
os.unlink(dest)
else:
print('No symlink exists at %s' % dest)
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452
class install_symlinked(install):
def run(self):
if sys.platform == 'win32':
raise Exception("This doesn't work on Windows.")
Thomas Kluyver
Don't build Python modules unnecessarily before symlinking to site-packages
r13840
# Run all sub-commands (at least those that need to be run)
for cmd_name in self.get_sub_commands():
self.run_command(cmd_name)
Thomas Kluyver
Fix renaming scripts with 3 suffix on Python 3
r13368
Thomas Kluyver
Rework setup to allow installing on Python 2 and 3....
r13452 # 'sub_commands': a list of commands this command might have to run to
# get its work done. See cmd.py for more info.
sub_commands = [('install_lib_symlink', lambda self:True),
('install_scripts_sym', lambda self:True),
]
class install_scripts_for_symlink(install_scripts):
"""Redefined to get options from 'symlink' instead of 'install'.
I love distutils almost as much as I love setuptools.
"""
def finalize_options(self):
self.set_undefined_options('build', ('build_scripts', 'build_dir'))
self.set_undefined_options('symlink',
('install_scripts', 'install_dir'),
('force', 'force'),
('skip_build', 'skip_build'),
)
Thomas Kluyver
Fix renaming scripts with 3 suffix on Python 3
r13368
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 #---------------------------------------------------------------------------
Fernando Perez
Fixes to build/setup machinery....
r1525 # Verify all dependencies
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 #---------------------------------------------------------------------------
def check_for_dependencies():
Brian E Granger
Adding documentation to setup* files.
r1239 """Check for IPython's dependencies.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
Adding documentation to setup* files.
r1239 This function should NOT be called if running under setuptools!
"""
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 from setupext.setupext import (
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 print_line, print_raw, print_status,
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 check_for_sphinx, check_for_pygments,
MinRK
add scripts for non-setuptools install of zmq.parallel
r3634 check_for_nose, check_for_pexpect,
Brian E. Granger
Fixing imports in setupbase.py.
r11094 check_for_pyzmq, check_for_readline,
Paul Ivanov
added check_for_tornado, closes #3916...
r12000 check_for_jinja2, check_for_tornado
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 )
print_line()
print_raw("BUILDING IPYTHON")
print_status('python', sys.version)
print_status('platform', sys.platform)
if sys.platform == 'win32':
print_status('Windows version', sys.getwindowsversion())
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 print_raw("")
print_raw("OPTIONAL DEPENDENCIES")
check_for_sphinx()
check_for_pygments()
check_for_nose()
MinRK
mention that pexpect ships in IPython.external...
r15026 if os.name == 'posix':
check_for_pexpect()
MinRK
add scripts for non-setuptools install of zmq.parallel
r3634 check_for_pyzmq()
Paul Ivanov
added check_for_tornado, closes #3916...
r12000 check_for_tornado()
MinRK
make readline a dependency on OSX and pyreadline on Windows...
r3699 check_for_readline()
Brian E. Granger
Fixing install logic for nbconvert.
r11090 check_for_jinja2()
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198
MinRK
ensure submodules exist prior to doing anything...
r10484 #---------------------------------------------------------------------------
# VCS related
#---------------------------------------------------------------------------
MinRK
use utils/submodule in setup.py...
r10556 # utils.submodule has checks for submodule status
execfile(pjoin('IPython','utils','submodule.py'), globals())
MinRK
ensure submodules exist prior to doing anything...
r10484
class UpdateSubmodules(Command):
"""Update git submodules
IPython's external javascript dependencies live in a separate repo.
"""
description = "Update git submodules"
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
failure = False
try:
self.spawn('git submodule init'.split())
self.spawn('git submodule update --recursive'.split())
except Exception as e:
failure = e
print(e)
Takafumi Arakaki
Fix: "python ABS/PATH/TO/ipython.py" fails...
r10610 if not check_submodule_status(repo_root) == 'clean':
MinRK
ensure submodules exist prior to doing anything...
r10484 print("submodules could not be checked out")
sys.exit(1)
MinRK
use utils/submodule in setup.py...
r10556
MinRK
ensure submodules exist prior to doing anything...
r10484
def git_prebuild(pkg_dir, build_cmd=build_py):
"""Return extended build or sdist command class for recording commit
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315
records git commit in IPython.utils._sysinfo.commit
for use in IPython.utils.sysinfo.sys_info() calls after installation.
MinRK
ensure submodules exist prior to doing anything...
r10484
Also ensures that submodules exist prior to running
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 """
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 class MyBuildPy(build_cmd):
''' Subclass to write commit data into installation tree '''
def run(self):
Thomas Kluyver
Fix IPython.utils.sysinfo for Python 3.
r4900 build_cmd.run(self)
MinRK
record sysinfo in sdist...
r7794 # this one will only fire for build commands
if hasattr(self, 'build_lib'):
self._record_commit(self.build_lib)
def make_release_tree(self, base_dir, files):
# this one will fire for sdist
build_cmd.make_release_tree(self, base_dir, files)
self._record_commit(base_dir)
def _record_commit(self, base_dir):
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 import subprocess
proc = subprocess.Popen('git rev-parse --short HEAD',
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
repo_commit, _ = proc.communicate()
MinRK
record sysinfo in sdist...
r7794 repo_commit = repo_commit.strip().decode("ascii")
out_pth = pjoin(base_dir, pkg_dir, 'utils', '_sysinfo.py')
if os.path.isfile(out_pth) and not repo_commit:
# nothing to write, don't clobber
return
print("writing git commit '%s' to %s" % (repo_commit, out_pth))
# remove to avoid overwriting original via hard link
try:
os.remove(out_pth)
except (IOError, OSError):
pass
Thomas Kluyver
Fix writing git commit ID to a file on build with Python 3.
r6449 with open(out_pth, 'w') as out_file:
out_file.writelines([
Fernando Perez
Emergency fix for py3 breakage introduced in 576f6f (merge of #1538)...
r6446 '# GENERATED BY setup.py\n',
Matthias Bussonnier
cast unicode to allow json dump
r18039 'commit = u"%s"\n' % repo_commit,
Thomas Kluyver
Fix writing git commit ID to a file on build with Python 3.
r6449 ])
MinRK
use utils/submodule in setup.py...
r10556 return require_submodules(MyBuildPy)
MinRK
ensure submodules exist prior to doing anything...
r10484
def require_submodules(command):
"""decorator for instructing a command to check for submodules before running"""
class DecoratedCommand(command):
def run(self):
Takafumi Arakaki
Fix: "python ABS/PATH/TO/ipython.py" fails...
r10610 if not check_submodule_status(repo_root) == 'clean':
MinRK
ensure submodules exist prior to doing anything...
r10484 print("submodules missing! Run `setup.py submodule` and try again")
sys.exit(1)
command.run(self)
return DecoratedCommand
MinRK
add `setup.py css` command...
r12531
#---------------------------------------------------------------------------
MinRK
only put Python major version in wheel tags...
r15027 # bdist related
#---------------------------------------------------------------------------
def get_bdist_wheel():
"""Construct bdist_wheel command for building wheels
Constructs py2-none-any tag, instead of py2.7-none-any
"""
class RequiresWheel(Command):
MinRK
fix missing-wheel command...
r15034 description = "Dummy command for missing bdist_wheel"
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
MinRK
only put Python major version in wheel tags...
r15027 def run(self):
print("bdist_wheel requires the wheel package")
MinRK
fix missing-wheel command...
r15034 sys.exit(1)
MinRK
only put Python major version in wheel tags...
r15027 if 'setuptools' not in sys.modules:
return RequiresWheel
else:
try:
MinRK
platform-dependent requirements...
r15029 from wheel.bdist_wheel import bdist_wheel, read_pkg_info, write_pkg_info
MinRK
only put Python major version in wheel tags...
r15027 except ImportError:
return RequiresWheel
MinRK
platform-dependent requirements...
r15029
MinRK
only put Python major version in wheel tags...
r15027 class bdist_wheel_tag(bdist_wheel):
MinRK
platform-dependent requirements...
r15029
def add_requirements(self, metadata_path):
"""transform platform-dependent requirements"""
pkg_info = read_pkg_info(metadata_path)
# pkg_info is an email.Message object (?!)
# we have to remove the unconditional 'readline' and/or 'pyreadline' entries
# and transform them to conditionals
requires = pkg_info.get_all('Requires-Dist')
del pkg_info['Requires-Dist']
def _remove_startswith(lis, prefix):
"""like list.remove, but with startswith instead of =="""
found = False
for idx, item in enumerate(lis):
if item.startswith(prefix):
found = True
break
if found:
lis.pop(idx)
MinRK
remove appnope from external...
r20814 for pkg in ("gnureadline", "pyreadline", "mock", "appnope", "terminado"):
MinRK
platform-dependent requirements...
r15029 _remove_startswith(requires, pkg)
MinRK
only depend on readline package in CPython...
r15414 requires.append("gnureadline; sys.platform == 'darwin' and platform.python_implementation == 'CPython'")
Min RK
add terminado to wheel dependencies
r20322 requires.append("terminado (>=0.3.3); extra == 'notebook' and sys.platform != 'win32'")
requires.append("terminado (>=0.3.3); extra == 'all' and sys.platform != 'win32'")
MinRK
add ipython[terminal] dependency group...
r16386 requires.append("pyreadline (>=2.0); extra == 'terminal' and sys.platform == 'win32' and platform.python_implementation == 'CPython'")
requires.append("pyreadline (>=2.0); extra == 'all' and sys.platform == 'win32' and platform.python_implementation == 'CPython'")
Thomas Kluyver
Fix wheel dependency specification
r15666 requires.append("mock; extra == 'test' and python_version < '3.3'")
MinRK
remove appnope from external...
r20814 requires.append("appnope; sys.platform == 'darwin'")
MinRK
platform-dependent requirements...
r15029 for r in requires:
pkg_info['Requires-Dist'] = r
write_pkg_info(metadata_path, pkg_info)
MinRK
only put Python major version in wheel tags...
r15027 return bdist_wheel_tag
#---------------------------------------------------------------------------
MinRK
add `setup.py css` command...
r12531 # Notebook related
#---------------------------------------------------------------------------
class CompileCSS(Command):
"""Recompile Notebook CSS
Regenerate the compiled CSS from LESS sources.
MinRK
use invoke instead of fabric...
r18351 Requires various dev dependencies, such as invoke and lessc.
MinRK
add `setup.py css` command...
r12531 """
description = "Recompile Notebook CSS"
MinRK
don’t store minified css in development...
r17333 user_options = [
('minify', 'x', "minify CSS"),
MinRK
`fab css` checks whether it needs to do anything...
r17344 ('force', 'f', "force recompilation of CSS"),
]
MinRK
add `setup.py css` command...
r12531
def initialize_options(self):
MinRK
don’t store minified css in development...
r17333 self.minify = False
MinRK
`fab css` checks whether it needs to do anything...
r17344 self.force = False
MinRK
add `setup.py css` command...
r12531
def finalize_options(self):
MinRK
don’t store minified css in development...
r17333 self.minify = bool(self.minify)
MinRK
`fab css` checks whether it needs to do anything...
r17344 self.force = bool(self.force)
MinRK
add `setup.py css` command...
r12531
def run(self):
MinRK
use invoke instead of fabric...
r18351 cmd = ['invoke', 'css']
if self.minify:
cmd.append('--minify')
if self.force:
cmd.append('--force')
Min RK
friendlier error messages when invoke/lessc are missing...
r19731 try:
p = Popen(cmd, cwd=pjoin(repo_root, "IPython", "html"), stderr=PIPE)
except OSError:
raise DistutilsExecError("invoke is required to rebuild css (pip install invoke)")
out, err = p.communicate()
if p.returncode:
if sys.version_info[0] >= 3:
err = err.decode('utf8', 'replace')
raise DistutilsExecError(err.strip())
MinRK
don’t store minified css in development...
r17333
MinRK
add `setup.py jsversion`...
r13536
class JavascriptVersion(Command):
"""write the javascript version to notebook javascript"""
description = "Write IPython version to javascript"
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
nsfile = pjoin(repo_root, "IPython", "html", "static", "base", "js", "namespace.js")
with open(nsfile) as f:
lines = f.readlines()
with open(nsfile, 'w') as f:
Min RK
verify that `setup.py jsversion` did something
r20280 found = False
MinRK
add `setup.py jsversion`...
r13536 for line in lines:
Min RK
verify that `setup.py jsversion` did something
r20280 if line.strip().startswith("IPython.version"):
line = ' IPython.version = "{0}";\n'.format(version)
found = True
MinRK
add `setup.py jsversion`...
r13536 f.write(line)
Min RK
verify that `setup.py jsversion` did something
r20280 if not found:
raise RuntimeError("Didn't find IPython.version line in %s" % nsfile)
MinRK
don’t store minified css in development...
r17333
Min RK
remove strict arg from css_js_prerelease
r19853 def css_js_prerelease(command):
MinRK
don’t store minified css in development...
r17333 """decorator for building js/minified css prior to a release"""
class DecoratedCommand(command):
def run(self):
self.distribution.run_command('jsversion')
css = self.distribution.get_command_obj('css')
css.minify = True
MinRK
add strict arg to css_js setup decorator...
r17343 try:
self.distribution.run_command('css')
except Exception as e:
Min RK
remove strict arg from css_js_prerelease
r19853 log.warn("rebuilding css and sourcemaps failed (not a problem)")
log.warn(str(e))
MinRK
don’t store minified css in development...
r17333 command.run(self)
return DecoratedCommand