Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.0.x] Remove Dependency on Jupyter Packaging #10218

Merged
merged 1 commit into from May 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 12 additions & 3 deletions MANIFEST.in
@@ -1,24 +1,33 @@
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
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
20 changes: 15 additions & 5 deletions 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"
3 changes: 2 additions & 1 deletion scripts/ci_install.sh
Expand Up @@ -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)
Expand Down
51 changes: 51 additions & 0 deletions 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*']
192 changes: 30 additions & 162 deletions setup.py
Expand Up @@ -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__':
Expand Down