From ba7cbb8b741148faa338cb99020a3e5100625092 Mon Sep 17 00:00:00 2001 From: Jeremy Tuloup Date: Mon, 10 May 2021 15:28:35 +0200 Subject: [PATCH] [3.0.x] Remove Dependency on Jupyter Packaging (#10218) --- MANIFEST.in | 15 +++- pyproject.toml | 20 +++-- scripts/ci_install.sh | 3 +- setup.cfg | 51 +++++++++++ setup.py | 192 +++++++----------------------------------- 5 files changed, 110 insertions(+), 171 deletions(-) create mode 100644 setup.cfg diff --git a/MANIFEST.in b/MANIFEST.in index 036d125df5a5..fcf0e0239b3d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,13 +1,16 @@ include package.json include LICENSE -include CONTRIBUTING.md -include README.md +include *.md include pyproject.toml include setup.py +include setup.cfg +include conftest.py # Documentation graft docs exclude docs/\#* +prune docs/api +prune docs/build # We must include the package_data files since include_package_data=True # See https://github.com/pypa/setuptools/issues/1461 @@ -15,10 +18,16 @@ include jupyterlab/staging/* include jupyterlab/staging/templates/* include jupyterlab/staging/.yarnrc graft jupyterlab/static +graft jupyterlab +graft jupyterlab/tests graft jupyterlab/tests/mock_packages graft jupyterlab/themes graft jupyterlab/schemas +graft jupyter-config recursive-include jupyterlab *.js -prune jupyterlab/staging/node_modules +prune jupyterlab/**/node_modules prune jupyterlab/staging/build + +recursive-exclude jupyterlab *.pyc +recursive-exclude jupyterlab *.js.map diff --git a/pyproject.toml b/pyproject.toml index 9841fe9a3d82..947db1a7beea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,22 @@ [build-system] -requires=["setuptools", "wheel", "jupyter_packaging~=0.7.3"] -build-backend = "setuptools.build_meta" +requires=["jupyter_packaging~=0.9,<2"] +build-backend = "jupyter_packaging.build_api" + +[license] +file="LICENSE" + +[tool.jupyter-packaging.builder] +factory = "jupyter_packaging.npm_builder" + +[tool.jupyter-packaging.build-args] +build_cmd = "build:prod:minimize" +path = "jupyterlab/staging" +source_dir= "jupyterlab/staging" +build_dir = "jupyterlab/static" +npm = ["node", "yarn.js"] [tool.pytest.ini_options] testpaths="jupyterlab/tests" norecursedirs="node_modules .git _build" addopts="--pdbcls=IPython.terminal.debugger:Pdb -v --junitxml=junit.xml" ignore="tests examples" - -[license] -file="LICENSE" diff --git a/scripts/ci_install.sh b/scripts/ci_install.sh index a66738a3474a..ec4087dd9070 100755 --- a/scripts/ci_install.sh +++ b/scripts/ci_install.sh @@ -42,7 +42,8 @@ fi if [[ $GROUP == nonode ]]; then # Build the wheel - python setup.py bdist_wheel sdist + pip install Build + python -m build . # Remove NodeJS, twice to take care of system and locally installed node versions. sudo rm -rf $(which node) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000000..b94ee5f9b999 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,51 @@ +[metadata] +name = jupyterlab +version = attr: jupyterlab._version.__version__ +description = JupyterLab computational environment +long_description = file: README.md +long_description_content_type = text/markdown +license_file = LICENSE +author = Jupyter Development Team +author_email = jupyter@googlegroups.com +url = https://jupyter.org +platforms = Linux, Mac OS X, Windows +keywords = ipython, jupyter +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.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + +[options] +zip_safe = False +include_package_data = True +packages = find: +python_requires = >=3.6 +install_requires = + ipython + packaging + tornado>=6.1.0 + jupyter_core + jupyterlab_server~=2.3 + jupyter_server~=1.4 + nbclassic~=0.2 + jinja2>=2.1 + +[options.extras_require] +test = coverage; pytest>=6.0; pytest-cov; pytest-console-scripts; pytest-check-links>=0.5; jupyterlab_server[test]~=2.2; requests; requests_cache; virtualenv; check-manifest + +[options.entry_points] +console_scripts = + jupyter-lab = jupyterlab.labapp:main + jupyter-labextension = jupyterlab.labextensions:main + jupyter-labhub = jupyterlab.labhubapp:main + jlpm = jupyterlab.jlpmapp:main + +[options.packages.find] +exclude = ['docs*', 'examples*'] diff --git a/setup.py b/setup.py index 4392edc9a6ac..a247a0fd872e 100644 --- a/setup.py +++ b/setup.py @@ -6,190 +6,58 @@ 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 -from setuptools import setup, find_packages -from setuptools.command.develop import develop - - -HERE = os.path.abspath(os.path.dirname(__file__)) - - -NAME = 'jupyterlab' -DESCRIPTION = 'The JupyterLab server extension.' - -with open(pjoin(HERE, 'README.md')) as fid: - LONG_DESCRIPTION = fid.read() +NAME = "jupyterlab" +HERE = osp.dirname(osp.abspath(__file__)) +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] data_files_spec = [ - ('share/jupyter/lab/static', '%s/static' % NAME, '**'), - ('share/jupyter/lab/schemas', '%s/schemas' % NAME, '**'), - ('share/jupyter/lab/themes', '%s/themes' % NAME, '**'), + ('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', 'jupyterlab.json'), + 'jupyter-config/jupyter_server_config.d', f'{NAME}.json'), ('etc/jupyter/jupyter_notebook_config.d', - 'jupyter-config/jupyter_notebook_config.d', 'jupyterlab.json'), -] - -package_data_spec = dict() -package_data_spec[NAME] = [ - 'staging/*', 'staging/templates/*', 'staging/.yarnrc', - 'static/**', 'tests/mock_packages/**', 'themes/**', 'schemas/**', '*.js' + 'jupyter-config/jupyter_notebook_config.d', f'{NAME}.json'), ] - -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(): +def post_dist(): 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 + from jupyter_packaging import get_version 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 - - -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', - ], -) - - -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', - 'jupyterlab_server[test]~=2.0', - 'requests', - 'wheel', - 'virtualenv' - ], - 'test:sys_platform == "win32"': ['nose-exclude'], - 'docs': [ - 'jsx-lexer', - 'recommonmark', - 'sphinx', - 'sphinx_rtd_theme', - 'sphinx-copybutton' - ], -} +try: + from jupyter_packaging import wrap_installers, npm_builder, get_data_files + 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) -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', - ] -} + setup_args = dict( + cmdclass=cmdclass, + data_files=get_data_files(data_files_spec) + ) +except ImportError: + setup_args = dict() if __name__ == '__main__':