|
@@ -6,192 +6,52 @@
|
|
|
from os.path import join as pjoin
|
|
|
import json
|
|
|
import os
|
|
|
+import os.path as osp
|
|
|
import sys
|
|
|
|
|
|
-# Our own imports
|
|
|
-from jupyter_packaging import (
|
|
|
- create_cmdclass, get_version,
|
|
|
- command_for_func, combine_commands, install_npm, run,
|
|
|
- skip_npm, which, log
|
|
|
-)
|
|
|
-
|
|
|
-from setuptools import setup, find_packages
|
|
|
-from setuptools.command.develop import develop
|
|
|
-
|
|
|
-
|
|
|
-HERE = os.path.abspath(os.path.dirname(__file__))
|
|
|
-
|
|
|
+from jupyter_packaging import wrap_installers, npm_builder, get_data_files, get_version
|
|
|
+from packaging.version import Version
|
|
|
+from setuptools import setup
|
|
|
|
|
|
-NAME = 'jupyterlab'
|
|
|
-DESCRIPTION = 'The JupyterLab server extension.'
|
|
|
+NAME = "jupyterlab"
|
|
|
+HERE = osp.dirname(osp.abspath(__file__))
|
|
|
|
|
|
-with open(pjoin(HERE, 'README.md')) as fid:
|
|
|
- LONG_DESCRIPTION = fid.read()
|
|
|
-
|
|
|
-
|
|
|
-data_files_spec = [
|
|
|
- ('share/jupyter/lab/static', '%s/static' % NAME, '**'),
|
|
|
- ('share/jupyter/lab/schemas', '%s/schemas' % NAME, '**'),
|
|
|
- ('share/jupyter/lab/themes', '%s/themes' % NAME, '**'),
|
|
|
- ('etc/jupyter/jupyter_server_config.d',
|
|
|
- 'jupyter-config/jupyter_server_config.d', 'jupyterlab.json'),
|
|
|
- ('etc/jupyter/jupyter_notebook_config.d',
|
|
|
- 'jupyter-config/jupyter_notebook_config.d', 'jupyterlab.json'),
|
|
|
+ensured_targets = [
|
|
|
+ 'static/package.json',
|
|
|
+ 'schemas/@jupyterlab/shortcuts-extension/shortcuts.json',
|
|
|
+ 'themes/@jupyterlab/theme-light-extension/index.css'
|
|
|
]
|
|
|
+ensured_targets = [osp.join(HERE, NAME, t) for t in ensured_targets]
|
|
|
|
|
|
-package_data_spec = dict()
|
|
|
-package_data_spec[NAME] = [
|
|
|
- 'staging/*', 'staging/templates/*', 'staging/.yarnrc',
|
|
|
- 'static/**', 'tests/mock_packages/**', 'themes/**', 'schemas/**', '*.js'
|
|
|
-]
|
|
|
-
|
|
|
-
|
|
|
-def exclude(filename):
|
|
|
- """Exclude JavaScript map files"""
|
|
|
- return filename.endswith('.js.map')
|
|
|
-
|
|
|
-staging = pjoin(HERE, NAME, 'staging')
|
|
|
-npm = ['node', pjoin(staging, 'yarn.js')]
|
|
|
-VERSION = get_version('%s/_version.py' % NAME)
|
|
|
-
|
|
|
-
|
|
|
-def check_assets():
|
|
|
- from packaging.version import Version
|
|
|
-
|
|
|
- # Representative files that should exist after a successful build
|
|
|
- targets = [
|
|
|
- 'static/package.json',
|
|
|
- 'schemas/@jupyterlab/shortcuts-extension/shortcuts.json',
|
|
|
- 'themes/@jupyterlab/theme-light-extension/index.css'
|
|
|
- ]
|
|
|
-
|
|
|
- for t in targets:
|
|
|
- if not os.path.exists(pjoin(HERE, NAME, t)):
|
|
|
- msg = ('Missing file: %s, `build:prod` script did not complete '
|
|
|
- 'successfully' % t)
|
|
|
- raise ValueError(msg)
|
|
|
-
|
|
|
- if 'sdist' not in sys.argv and 'bdist_wheel' not in sys.argv:
|
|
|
- return
|
|
|
|
|
|
+def post_dist():
|
|
|
target = pjoin(HERE, NAME, 'static', 'package.json')
|
|
|
with open(target) as fid:
|
|
|
version = json.load(fid)['jupyterlab']['version']
|
|
|
|
|
|
- if Version(version) != Version(VERSION):
|
|
|
+ if Version(version) != Version(get_version(f'{NAME}/_version.py')):
|
|
|
raise ValueError('Version mismatch, please run `build:update`')
|
|
|
|
|
|
|
|
|
-cmdclass = create_cmdclass('jsdeps', data_files_spec=data_files_spec,
|
|
|
- package_data_spec=package_data_spec, exclude=exclude)
|
|
|
-cmdclass['jsdeps'] = combine_commands(
|
|
|
- install_npm(build_cmd='build:prod', path=staging, source_dir=staging,
|
|
|
- build_dir=pjoin(HERE, NAME, 'static'), npm=npm),
|
|
|
- command_for_func(check_assets)
|
|
|
-)
|
|
|
-
|
|
|
-
|
|
|
-class JupyterlabDevelop(develop):
|
|
|
- """A custom develop command that runs yarn"""
|
|
|
-
|
|
|
- def run(self):
|
|
|
- if not skip_npm:
|
|
|
- if not which('node'):
|
|
|
- error_message = """
|
|
|
-Please install nodejs and npm before continuing installation.
|
|
|
-nodejs may be installed using conda or directly from: https://nodejs.org/
|
|
|
-"""
|
|
|
- log.error(error_message)
|
|
|
- return
|
|
|
- run(npm, cwd=HERE)
|
|
|
- develop.run(self)
|
|
|
-
|
|
|
-
|
|
|
-# Use default develop - we can ensure core mode later if needed.
|
|
|
-cmdclass['develop'] = JupyterlabDevelop
|
|
|
+npm = ['node', pjoin(HERE, NAME, 'staging', 'yarn.js')]
|
|
|
+# In develop mode, just run yarn
|
|
|
+builder = npm_builder(build_cmd=None, npm=npm, force=True)
|
|
|
+cmdclass = wrap_installers(post_develop=builder, post_dist=post_dist, ensured_targets=ensured_targets)
|
|
|
|
|
|
+data_files_spec = [
|
|
|
+ ('share/jupyter/lab/static', f'{NAME}/static', '**'),
|
|
|
+ ('share/jupyter/lab/schemas', f'{NAME}/schemas', '**'),
|
|
|
+ ('share/jupyter/lab/themes', f'{NAME}/themes', '**'),
|
|
|
+ ('etc/jupyter/jupyter_server_config.d',
|
|
|
+ 'jupyter-config/jupyter_server_config.d', f'{NAME}.json'),
|
|
|
+ ('etc/jupyter/jupyter_notebook_config.d',
|
|
|
+ 'jupyter-config/jupyter_notebook_config.d', f'{NAME}.json'),
|
|
|
+]
|
|
|
|
|
|
setup_args = dict(
|
|
|
- name=NAME,
|
|
|
- description=DESCRIPTION,
|
|
|
- long_description=LONG_DESCRIPTION,
|
|
|
- long_description_content_type='text/markdown',
|
|
|
- version=VERSION,
|
|
|
- packages=find_packages(),
|
|
|
cmdclass=cmdclass,
|
|
|
- author='Jupyter Development Team',
|
|
|
- author_email='jupyter@googlegroups.com',
|
|
|
- url='http://jupyter.org',
|
|
|
- license='BSD',
|
|
|
- platforms='Linux, Mac OS X, Windows',
|
|
|
- keywords=['ipython', 'jupyter', 'Web'],
|
|
|
- python_requires=">=3.6",
|
|
|
- classifiers=[
|
|
|
- 'Development Status :: 5 - Production/Stable',
|
|
|
- 'Intended Audience :: Developers',
|
|
|
- 'Intended Audience :: System Administrators',
|
|
|
- 'Intended Audience :: Science/Research',
|
|
|
- 'License :: OSI Approved :: BSD License',
|
|
|
- 'Programming Language :: Python',
|
|
|
- 'Programming Language :: Python :: 3',
|
|
|
- 'Programming Language :: Python :: 3.6',
|
|
|
- 'Programming Language :: Python :: 3.7',
|
|
|
- 'Programming Language :: Python :: 3.8',
|
|
|
- ],
|
|
|
+ data_files=get_data_files(data_files_spec)
|
|
|
)
|
|
|
|
|
|
-
|
|
|
-setup_args['install_requires'] = [
|
|
|
- 'ipython',
|
|
|
- 'packaging',
|
|
|
- 'tornado>=6.1.0',
|
|
|
- 'jupyter_core',
|
|
|
- 'jupyter_packaging~=0.7',
|
|
|
- 'jupyterlab_server~=2.3',
|
|
|
- 'jupyter_server~=1.4',
|
|
|
- 'nbclassic~=0.2',
|
|
|
- 'jinja2>=2.10'
|
|
|
-]
|
|
|
-
|
|
|
-
|
|
|
-setup_args['extras_require'] = {
|
|
|
- 'test': [
|
|
|
- 'pytest>=6.0',
|
|
|
- 'pytest-cov',
|
|
|
- 'pytest-console-scripts',
|
|
|
- 'pytest-check-links>=0.5',
|
|
|
- 'jupyterlab_server[test]~=2.2',
|
|
|
- 'requests',
|
|
|
- 'requests_cache',
|
|
|
- 'wheel',
|
|
|
- 'virtualenv'
|
|
|
- ],
|
|
|
- 'test:sys_platform == "win32"': ['nose-exclude'],
|
|
|
- 'docs': [
|
|
|
- 'jsx-lexer',
|
|
|
- 'recommonmark',
|
|
|
- 'sphinx',
|
|
|
- 'sphinx_rtd_theme',
|
|
|
- 'sphinx-copybutton'
|
|
|
- ],
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-setup_args['package_data'] = package_data_spec
|
|
|
-setup_args['include_package_data'] = True
|
|
|
-setup_args['python_requires'] = '>=3.6'
|
|
|
-
|
|
|
-# Force entrypoints with setuptools (needed for Windows, unconditional
|
|
|
-# because of wheels)
|
|
|
-setup_args['entry_points'] = {
|
|
|
- 'console_scripts': [
|
|
|
- 'jupyter-lab = jupyterlab.labapp:main',
|
|
|
- 'jupyter-labextension = jupyterlab.labextensions:main',
|
|
|
- 'jupyter-labhub = jupyterlab.labhubapp:main',
|
|
|
- 'jlpm = jupyterlab.jlpmapp:main',
|
|
|
- ]
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
if __name__ == '__main__':
|
|
|
setup(**setup_args)
|