mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-07 10:04:07 +00:00
198 lines
5.7 KiB
Python
Executable File
198 lines
5.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# coding: utf-8
|
|
|
|
# Copyright (c) Juptyer Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Minimal Python version sanity check (from IPython)
|
|
#-----------------------------------------------------------------------------
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import sys
|
|
|
|
v = sys.version_info
|
|
if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):
|
|
error = "ERROR: IPython requires Python version 2.7 or 3.3 or above."
|
|
print(error, file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
PY3 = (sys.version_info[0] >= 3)
|
|
|
|
if os.name in ('nt', 'dos'):
|
|
error = "ERROR: Windows is not supported"
|
|
print(error, file=sys.stderr)
|
|
|
|
# At least we're on the python version we need, move on.
|
|
|
|
import os
|
|
|
|
from glob import glob
|
|
|
|
from distutils.core import setup
|
|
from subprocess import check_call
|
|
|
|
try:
|
|
execfile
|
|
except NameError:
|
|
# py3
|
|
def execfile(fname, globs, locs=None):
|
|
locs = locs or globs
|
|
exec(compile(open(fname).read(), fname, "exec"), globs, locs)
|
|
|
|
pjoin = os.path.join
|
|
|
|
here = os.path.abspath(os.path.dirname(__file__))
|
|
share_jupyter = pjoin(here, 'share', 'jupyter')
|
|
static = pjoin(share_jupyter, 'static')
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Build basic package data, etc.
|
|
#---------------------------------------------------------------------------
|
|
|
|
def get_data_files():
|
|
"""Get data files in share/jupyter"""
|
|
|
|
data_files = []
|
|
ntrim = len(here) + 1
|
|
|
|
for (d, dirs, filenames) in os.walk(share_jupyter):
|
|
data_files.append((
|
|
d[ntrim:],
|
|
[ pjoin(d, f) for f in filenames ]
|
|
))
|
|
return data_files
|
|
|
|
|
|
ns = {}
|
|
execfile(pjoin(here, 'jupyterhub', 'version.py'), ns)
|
|
|
|
setup_args = dict(
|
|
name = 'jupyterhub',
|
|
scripts = glob(pjoin('scripts', '*')),
|
|
packages = ['jupyterhub'],
|
|
package_data = {'jupyterhub' : ['templates/*']},
|
|
# dummy, so that install_data doesn't get skipped
|
|
# this will be overridden when bower is run anyway
|
|
data_files = get_data_files() or ['dummy'],
|
|
version = ns['__version__'],
|
|
description = """JupyterHub: A multi-user server for Jupyter notebooks""",
|
|
long_description = "",
|
|
author = "Jupyter Development Team",
|
|
author_email = "ipython-dev@scipy.org",
|
|
url = "http://jupyter.org",
|
|
license = "BSD",
|
|
platforms = "Linux, Mac OS X",
|
|
keywords = ['Interactive', 'Interpreter', 'Shell', 'Web'],
|
|
classifiers = [
|
|
'Intended Audience :: Developers',
|
|
'Intended Audience :: Science/Research',
|
|
'License :: OSI Approved :: BSD License',
|
|
'Programming Language :: Python',
|
|
'Programming Language :: Python :: 2',
|
|
'Programming Language :: Python :: 2.7',
|
|
'Programming Language :: Python :: 3',
|
|
'Topic :: System :: Shells',
|
|
],
|
|
)
|
|
|
|
#---------------------------------------------------------------------------
|
|
# custom distutils commands
|
|
#---------------------------------------------------------------------------
|
|
|
|
# imports here, so they are after setuptools import if there was one
|
|
from distutils.cmd import Command
|
|
from distutils.command.install import install
|
|
|
|
class BaseCommand(Command):
|
|
"""Dumb empty command because Command needs subclasses to override too much"""
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def get_inputs(self):
|
|
return []
|
|
|
|
def get_outputs(self):
|
|
return []
|
|
|
|
|
|
class Bower(BaseCommand):
|
|
description = "fetch static components with bower"
|
|
|
|
user_options = []
|
|
|
|
def run(self):
|
|
check_call(['bower', 'install', '--allow-root'])
|
|
# update data-files in case this created new files
|
|
self.distribution.data_files = get_data_files()
|
|
|
|
class CSS(BaseCommand):
|
|
description = "compile CSS from LESS"
|
|
|
|
user_options = []
|
|
|
|
def initialize_options(self):
|
|
pass
|
|
|
|
def finalize_options(self):
|
|
pass
|
|
|
|
def run(self):
|
|
style_less = pjoin(static, 'less', 'style.less')
|
|
style_css = pjoin(static, 'css', 'style.min.css')
|
|
sourcemap = style_css + '.map'
|
|
check_call([
|
|
'lessc', '-x', '--verbose',
|
|
'--source-map-basepath={}'.format(static),
|
|
'--source-map={}'.format(sourcemap),
|
|
'--source-map-rootpath=../',
|
|
style_less, style_css,
|
|
])
|
|
# update data-files in case this created new files
|
|
self.distribution.data_files = get_data_files()
|
|
|
|
# ensure bower is run as part of install
|
|
install.sub_commands.insert(0, ('bower', None))
|
|
install.sub_commands.insert(1, ('css', None))
|
|
|
|
setup_args['cmdclass'] = {
|
|
'bower': Bower,
|
|
'css': CSS,
|
|
}
|
|
|
|
|
|
# setuptools requirements
|
|
|
|
if 'setuptools' in sys.modules:
|
|
setup_args['zip_safe'] = False
|
|
from setuptools.command.develop import develop
|
|
class develop_js_css(develop):
|
|
def run(self):
|
|
if not self.uninstall:
|
|
self.distribution.run_command('bower')
|
|
self.distribution.run_command('css')
|
|
develop.run(self)
|
|
setup_args['cmdclass']['develop'] = develop_js_css
|
|
|
|
|
|
with open('requirements.txt') as f:
|
|
install_requires = [ line.strip() for line in f.readlines() ]
|
|
setup_args['install_requires'] = install_requires
|
|
|
|
#---------------------------------------------------------------------------
|
|
# setup
|
|
#---------------------------------------------------------------------------
|
|
|
|
def main():
|
|
setup(**setup_args)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|