From 65530351d7695978c81a348570be6cf5b6cc7a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Collonval?= Date: Thu, 11 Feb 2021 17:32:35 +0100 Subject: [PATCH 1/8] Update entry points --- advanced/server-extension/jlab_ext_example/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/server-extension/jlab_ext_example/__init__.py b/advanced/server-extension/jlab_ext_example/__init__.py index c6bf4615..fa37cb4e 100644 --- a/advanced/server-extension/jlab_ext_example/__init__.py +++ b/advanced/server-extension/jlab_ext_example/__init__.py @@ -16,7 +16,7 @@ def _jupyter_labextension_paths(): }] -def _jupyter_server_extension_paths(): +def _jupyter_server_extension_points(): return [{"module": "jlab_ext_example"}] From c2213cc78cd47647c84c0cba91c41bc775af9b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Collonval?= Date: Thu, 11 Feb 2021 17:34:27 +0100 Subject: [PATCH 2/8] Correct load_jupyter_server_extension entry point --- advanced/server-extension/jlab_ext_example/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/server-extension/jlab_ext_example/__init__.py b/advanced/server-extension/jlab_ext_example/__init__.py index fa37cb4e..d7ec7415 100644 --- a/advanced/server-extension/jlab_ext_example/__init__.py +++ b/advanced/server-extension/jlab_ext_example/__init__.py @@ -20,7 +20,7 @@ def _jupyter_server_extension_points(): return [{"module": "jlab_ext_example"}] -def load_jupyter_server_extension(lab_app): +def _load_jupyter_server_extension(lab_app): """Registers the API handler to receive HTTP requests from the frontend extension. Parameters ---------- From c2bf0711f0d53eff55b62c96735e71efd0279c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Collonval?= Date: Thu, 11 Feb 2021 17:50:14 +0100 Subject: [PATCH 3/8] Update server-extension README --- advanced/server-extension/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/advanced/server-extension/README.md b/advanced/server-extension/README.md index cdf17043..2fdf7ef2 100644 --- a/advanced/server-extension/README.md +++ b/advanced/server-extension/README.md @@ -348,11 +348,11 @@ def _jupyter_labextension_paths(): }] -def _jupyter_server_extension_paths(): +def _jupyter_server_extension_points(): return [{"module": "jlab_ext_example"}] -def load_jupyter_server_extension(lab_app): +def _load_jupyter_server_extension(lab_app): """Registers the API handler to receive HTTP requests from the frontend extension. Parameters ---------- @@ -368,8 +368,8 @@ def load_jupyter_server_extension(lab_app): ``` -The `_jupyter_server_extension_paths` provides the Python package name -to the server. But the most important one is `load_jupyter_server_extension` +The `_jupyter_server_extension_points` provides the Python package name +to the server. But the most important one is `_load_jupyter_server_extension` that register new handlers. ```py @@ -632,8 +632,9 @@ It will copy the NPM package in the Python package and force it to be copied in JupyterLab is looking for frontend extensions when the Python package is installed: ```py +# setup.py#L38-L38 -("share/jupyter/labextensions/%s" % labext_name, lab_path, "*.*") + ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), ``` The last piece of configuration needed is the enabling of the server extension. This is @@ -655,9 +656,9 @@ done by copying the following JSON file: in the appropriate jupyter folder (`etc/jupyter/jupyter_server_config.d`): ```py +# setup.py#L40-L40 - ("etc/jupyter/jupyter_server_config.d", - "jupyter-config", "jlab_ext_example.json"), + ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ``` ### JupyterLab Extension Manager From 98d77334c3de748b05ab028ef37b881d863aaa7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Collonval?= Date: Thu, 11 Feb 2021 17:51:00 +0100 Subject: [PATCH 4/8] Improve setup.py format --- advanced/server-extension/setup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/advanced/server-extension/setup.py b/advanced/server-extension/setup.py index c59b9ae7..bae69ca4 100644 --- a/advanced/server-extension/setup.py +++ b/advanced/server-extension/setup.py @@ -36,9 +36,8 @@ data_files_spec = [ ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), - ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"),("etc/jupyter/jupyter_server_config.d", - "jupyter-config", "jlab_ext_example.json"), - + ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"), + ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ] cmdclass = create_cmdclass("jsdeps", From b9cdb3a4e0bd0d3a892da85342126d905f4edac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Collonval?= Date: Thu, 11 Feb 2021 17:52:34 +0100 Subject: [PATCH 5/8] Align README and setup.py --- advanced/server-extension/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/advanced/server-extension/README.md b/advanced/server-extension/README.md index 2fdf7ef2..a84c6cc9 100644 --- a/advanced/server-extension/README.md +++ b/advanced/server-extension/README.md @@ -530,9 +530,8 @@ labext_name = "@jupyterlab-examples/server-extension" data_files_spec = [ ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), - ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"),("etc/jupyter/jupyter_server_config.d", - "jupyter-config", "jlab_ext_example.json"), - + ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"), + ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ] cmdclass = create_cmdclass("jsdeps", From c4902be7e868d7208d3e5ed02aee2cd0ad76e1a7 Mon Sep 17 00:00:00 2001 From: Frederic COLLONVAL Date: Thu, 11 Feb 2021 18:23:52 +0100 Subject: [PATCH 6/8] Run embedme --- advanced/server-extension/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/advanced/server-extension/README.md b/advanced/server-extension/README.md index a84c6cc9..b324f599 100644 --- a/advanced/server-extension/README.md +++ b/advanced/server-extension/README.md @@ -595,7 +595,7 @@ the frontend NPM package needs to be built and inserted in the Python package. T done using a special `cmdclass`: ```py -# setup.py#L44-L52 +# setup.py#L43-L51 cmdclass = create_cmdclass("jsdeps", package_data_spec=package_data_spec, @@ -611,7 +611,7 @@ js_command = combine_commands( Basically it will build the frontend NPM package: ```py -# setup.py#L50-L50 +# setup.py#L49-L49 install_npm(HERE, build_cmd="build:prod", npm=["jlpm"]), ``` @@ -633,7 +633,7 @@ JupyterLab is looking for frontend extensions when the Python package is install ```py # setup.py#L38-L38 - ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), +("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), ``` The last piece of configuration needed is the enabling of the server extension. This is @@ -657,7 +657,7 @@ in the appropriate jupyter folder (`etc/jupyter/jupyter_server_config.d`): ```py # setup.py#L40-L40 - ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), +("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ``` ### JupyterLab Extension Manager From 9bb07c049f9c0ad899eac3af0f2375622b1223fb Mon Sep 17 00:00:00 2001 From: Frederic COLLONVAL Date: Fri, 12 Feb 2021 08:50:34 +0100 Subject: [PATCH 7/8] Align more server example with template --- advanced/server-extension/README.md | 107 ++++++++---------- .../jlab_ext_example/__init__.py | 22 ++-- .../jlab_ext_example/_version.py | 20 +++- advanced/server-extension/setup.py | 61 +++++----- 4 files changed, 107 insertions(+), 103 deletions(-) diff --git a/advanced/server-extension/README.md b/advanced/server-extension/README.md index b324f599..5e046f22 100644 --- a/advanced/server-extension/README.md +++ b/advanced/server-extension/README.md @@ -331,41 +331,38 @@ your extension needs to be defined as a proper Python package with some hook fun # jlab_ext_example/__init__.py import json -import os.path as osp +from pathlib import Path from .handlers import setup_handlers from ._version import __version__ -HERE = osp.abspath(osp.dirname(__file__)) +HERE = Path(__file__).parent.resolve() -with open(osp.join(HERE, 'labextension', 'package.json')) as fid: +with (HERE / "labextension" / "package.json").open() as fid: data = json.load(fid) + def _jupyter_labextension_paths(): - return [{ - 'src': 'labextension', - 'dest': data['name'] - }] + return [{"src": "labextension", "dest": data["name"]}] def _jupyter_server_extension_points(): return [{"module": "jlab_ext_example"}] -def _load_jupyter_server_extension(lab_app): +def _load_jupyter_server_extension(server_app): """Registers the API handler to receive HTTP requests from the frontend extension. Parameters ---------- - lab_app: jupyterlab.labapp.LabApp + server_app: jupyterlab.labapp.LabApp JupyterLab application instance """ url_path = "jlab-ext-example" - setup_handlers(lab_app.web_app, url_path) - lab_app.log.info( - "Registered jlab_ext_example extension at URL path /{}".format(url_path) + setup_handlers(server_app.web_app, url_path) + server_app.log.info( + f"Registered jlab_ext_example extension at URL path /{url_path}" ) - ``` The `_jupyter_server_extension_points` provides the Python package name @@ -373,9 +370,9 @@ to the server. But the most important one is `_load_jupyter_server_extension` that register new handlers. ```py -# jlab_ext_example/__init__.py#L31-L31 +# jlab_ext_example/__init__.py#L29-L29 -setup_handlers(lab_app.web_app, url_path) +setup_handlers(server_app.web_app, url_path) ``` A handler is registered in the web application by linking an url to a class. In this @@ -496,47 +493,41 @@ The `setup.py` file is the entry point to describe package metadata: jlab_ext_example setup """ import json -import os +from pathlib import Path from jupyter_packaging import ( - create_cmdclass, install_npm, ensure_targets, - combine_commands, skip_if_exists + create_cmdclass, + install_npm, + ensure_targets, + combine_commands, + skip_if_exists, ) import setuptools -HERE = os.path.abspath(os.path.dirname(__file__)) +HERE = Path(__file__).parent.resolve() # The name of the project -name="jlab_ext_example" - -# Get our version -with open(os.path.join(HERE, 'package.json')) as f: - version = json.load(f)['version'] +name = "jlab_ext_example" -lab_path = os.path.join(HERE, name, "labextension") +lab_path = HERE / name / "labextension" # Representative files that should exist after a successful build jstargets = [ - os.path.join(lab_path, "package.json"), + str(lab_path / "package.json"), ] -package_data_spec = { - name: [ - "*" - ] -} +package_data_spec = {name: ["*"]} labext_name = "@jupyterlab-examples/server-extension" data_files_spec = [ - ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), - ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"), + ("share/jupyter/labextensions/%s" % labext_name, str(lab_path), "**"), + ("share/jupyter/labextensions/%s" % labext_name, str(HERE), "install.json"), ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ] -cmdclass = create_cmdclass("jsdeps", - package_data_spec=package_data_spec, - data_files_spec=data_files_spec +cmdclass = create_cmdclass( + "jsdeps", package_data_spec=package_data_spec, data_files_spec=data_files_spec ) js_command = combine_commands( @@ -544,32 +535,34 @@ js_command = combine_commands( ensure_targets(jstargets), ) -is_repo = os.path.exists(os.path.join(HERE, ".git")) +is_repo = (HERE / ".git").exists() if is_repo: cmdclass["jsdeps"] = js_command else: cmdclass["jsdeps"] = skip_if_exists(jstargets, js_command) -with open("README.md", "r") as fh: - long_description = fh.read() +long_description = (HERE / "README.md").read_text() + +# Get the package info from package.json +pkg_json = json.loads((HERE / "package.json").read_bytes()) setup_args = dict( name=name, - version=version, - url="https://github.com/jupyterlab/extension-examples.git", - author="Project Jupyter Contributors", - description="A minimal JupyterLab extension with backend and frontend parts.", - long_description= long_description, + version=pkg_json["version"], + url=pkg_json["homepage"], + author=pkg_json["author"], + description=pkg_json["description"], + license=pkg_json["license"], + long_description=long_description, long_description_content_type="text/markdown", - cmdclass= cmdclass, + cmdclass=cmdclass, packages=setuptools.find_packages(), install_requires=[ - "jupyterlab>=3.0.0rc15,==3.*", + "jupyterlab~=3.0", ], zip_safe=False, include_package_data=True, python_requires=">=3.6", - license="BSD-3-Clause", platforms="Linux, Mac OS X, Windows", keywords=["Jupyter", "JupyterLab", "JupyterLab3"], classifiers=[ @@ -579,6 +572,7 @@ setup_args = dict( "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", "Framework :: Jupyter", ], ) @@ -595,11 +589,10 @@ the frontend NPM package needs to be built and inserted in the Python package. T done using a special `cmdclass`: ```py -# setup.py#L43-L51 +# setup.py#L38-L45 -cmdclass = create_cmdclass("jsdeps", - package_data_spec=package_data_spec, - data_files_spec=data_files_spec +cmdclass = create_cmdclass( + "jsdeps", package_data_spec=package_data_spec, data_files_spec=data_files_spec ) js_command = combine_commands( @@ -611,7 +604,7 @@ js_command = combine_commands( Basically it will build the frontend NPM package: ```py -# setup.py#L49-L49 +# setup.py#L43-L43 install_npm(HERE, build_cmd="build:prod", npm=["jlpm"]), ``` @@ -619,11 +612,11 @@ install_npm(HERE, build_cmd="build:prod", npm=["jlpm"]), It will ensure one of the generated files is `jlab_ext_example/labextension/package.json`: ```py -# setup.py#L24-L27 +# setup.py#L23-L26 # Representative files that should exist after a successful build jstargets = [ - os.path.join(lab_path, "package.json"), + str(lab_path / "package.json"), ] ``` @@ -631,9 +624,9 @@ It will copy the NPM package in the Python package and force it to be copied in JupyterLab is looking for frontend extensions when the Python package is installed: ```py -# setup.py#L38-L38 +# setup.py#L33-L33 -("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), +("share/jupyter/labextensions/%s" % labext_name, str(lab_path), "**"), ``` The last piece of configuration needed is the enabling of the server extension. This is @@ -655,7 +648,7 @@ done by copying the following JSON file: in the appropriate jupyter folder (`etc/jupyter/jupyter_server_config.d`): ```py -# setup.py#L40-L40 +# setup.py#L35-L35 ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ``` diff --git a/advanced/server-extension/jlab_ext_example/__init__.py b/advanced/server-extension/jlab_ext_example/__init__.py index d7ec7415..363ba295 100644 --- a/advanced/server-extension/jlab_ext_example/__init__.py +++ b/advanced/server-extension/jlab_ext_example/__init__.py @@ -1,34 +1,32 @@ import json -import os.path as osp +from pathlib import Path from .handlers import setup_handlers from ._version import __version__ -HERE = osp.abspath(osp.dirname(__file__)) +HERE = Path(__file__).parent.resolve() -with open(osp.join(HERE, 'labextension', 'package.json')) as fid: +with (HERE / "labextension" / "package.json").open() as fid: data = json.load(fid) + def _jupyter_labextension_paths(): - return [{ - 'src': 'labextension', - 'dest': data['name'] - }] + return [{"src": "labextension", "dest": data["name"]}] def _jupyter_server_extension_points(): return [{"module": "jlab_ext_example"}] -def _load_jupyter_server_extension(lab_app): +def _load_jupyter_server_extension(server_app): """Registers the API handler to receive HTTP requests from the frontend extension. Parameters ---------- - lab_app: jupyterlab.labapp.LabApp + server_app: jupyterlab.labapp.LabApp JupyterLab application instance """ url_path = "jlab-ext-example" - setup_handlers(lab_app.web_app, url_path) - lab_app.log.info( - "Registered jlab_ext_example extension at URL path /{}".format(url_path) + setup_handlers(server_app.web_app, url_path) + server_app.log.info( + f"Registered jlab_ext_example extension at URL path /{url_path}" ) diff --git a/advanced/server-extension/jlab_ext_example/_version.py b/advanced/server-extension/jlab_ext_example/_version.py index ee864fc9..351fbde5 100644 --- a/advanced/server-extension/jlab_ext_example/_version.py +++ b/advanced/server-extension/jlab_ext_example/_version.py @@ -1,2 +1,18 @@ -version_info = (0, 1, 0) -__version__ = ".".join(map(str, version_info)) +import json +from pathlib import Path + +__all__ = ["__version__"] + +def _fetchVersion(): + HERE = Path(__file__).parent.resolve() + + for settings in HERE.rglob("package.json"): + try: + with settings.open() as f: + return json.load(f)["version"] + except FileNotFoundError: + pass + + raise FileNotFoundError(f"Could not find package.json under dir {HERE!s}") + +__version__ = _fetchVersion() diff --git a/advanced/server-extension/setup.py b/advanced/server-extension/setup.py index bae69ca4..0aef8f91 100644 --- a/advanced/server-extension/setup.py +++ b/advanced/server-extension/setup.py @@ -2,47 +2,41 @@ jlab_ext_example setup """ import json -import os +from pathlib import Path from jupyter_packaging import ( - create_cmdclass, install_npm, ensure_targets, - combine_commands, skip_if_exists + create_cmdclass, + install_npm, + ensure_targets, + combine_commands, + skip_if_exists, ) import setuptools -HERE = os.path.abspath(os.path.dirname(__file__)) +HERE = Path(__file__).parent.resolve() # The name of the project -name="jlab_ext_example" +name = "jlab_ext_example" -# Get our version -with open(os.path.join(HERE, 'package.json')) as f: - version = json.load(f)['version'] - -lab_path = os.path.join(HERE, name, "labextension") +lab_path = HERE / name / "labextension" # Representative files that should exist after a successful build jstargets = [ - os.path.join(lab_path, "package.json"), + str(lab_path / "package.json"), ] -package_data_spec = { - name: [ - "*" - ] -} +package_data_spec = {name: ["*"]} labext_name = "@jupyterlab-examples/server-extension" data_files_spec = [ - ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), - ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"), + ("share/jupyter/labextensions/%s" % labext_name, str(lab_path), "**"), + ("share/jupyter/labextensions/%s" % labext_name, str(HERE), "install.json"), ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), ] -cmdclass = create_cmdclass("jsdeps", - package_data_spec=package_data_spec, - data_files_spec=data_files_spec +cmdclass = create_cmdclass( + "jsdeps", package_data_spec=package_data_spec, data_files_spec=data_files_spec ) js_command = combine_commands( @@ -50,32 +44,34 @@ ensure_targets(jstargets), ) -is_repo = os.path.exists(os.path.join(HERE, ".git")) +is_repo = (HERE / ".git").exists() if is_repo: cmdclass["jsdeps"] = js_command else: cmdclass["jsdeps"] = skip_if_exists(jstargets, js_command) -with open("README.md", "r") as fh: - long_description = fh.read() +long_description = (HERE / "README.md").read_text() + +# Get the package info from package.json +pkg_json = json.loads((HERE / "package.json").read_bytes()) setup_args = dict( name=name, - version=version, - url="https://github.com/jupyterlab/extension-examples.git", - author="Project Jupyter Contributors", - description="A minimal JupyterLab extension with backend and frontend parts.", - long_description= long_description, + version=pkg_json["version"], + url=pkg_json["homepage"], + author=pkg_json["author"], + description=pkg_json["description"], + license=pkg_json["license"], + long_description=long_description, long_description_content_type="text/markdown", - cmdclass= cmdclass, + cmdclass=cmdclass, packages=setuptools.find_packages(), install_requires=[ - "jupyterlab>=3.0.0rc15,==3.*", + "jupyterlab~=3.0", ], zip_safe=False, include_package_data=True, python_requires=">=3.6", - license="BSD-3-Clause", platforms="Linux, Mac OS X, Windows", keywords=["Jupyter", "JupyterLab", "JupyterLab3"], classifiers=[ @@ -85,6 +81,7 @@ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", "Framework :: Jupyter", ], ) From dcea63ba7c9fb849b19bdaf158422793cc8a86bf Mon Sep 17 00:00:00 2001 From: Frederic COLLONVAL Date: Mon, 15 Feb 2021 19:05:47 +0100 Subject: [PATCH 8/8] quick note for compatibility with the old Notebook --- advanced/server-extension/README.md | 21 +++++++++++++++---- .../jlab_ext_example/__init__.py | 3 +++ .../jlab_ext_example.json | 7 +++++++ .../jlab_ext_example.json | 0 advanced/server-extension/setup.py | 3 ++- 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 advanced/server-extension/jupyter-config/jupyter_notebook_config.d/jlab_ext_example.json rename advanced/server-extension/jupyter-config/{ => jupyter_server_config.d}/jlab_ext_example.json (100%) diff --git a/advanced/server-extension/README.md b/advanced/server-extension/README.md index 5e046f22..f533d632 100644 --- a/advanced/server-extension/README.md +++ b/advanced/server-extension/README.md @@ -363,6 +363,9 @@ def _load_jupyter_server_extension(server_app): f"Registered jlab_ext_example extension at URL path /{url_path}" ) +# For backward compatibility with the classical notebook +load_jupyter_server_extension = _load_jupyter_server_extension + ``` The `_jupyter_server_extension_points` provides the Python package name @@ -523,7 +526,8 @@ labext_name = "@jupyterlab-examples/server-extension" data_files_spec = [ ("share/jupyter/labextensions/%s" % labext_name, str(lab_path), "**"), ("share/jupyter/labextensions/%s" % labext_name, str(HERE), "install.json"), - ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), + ("etc/jupyter/jupyter_notebook_config.d", "jupyter-config/jupyter_notebook_config.d", "jlab_ext_example.json"), + ("etc/jupyter/jupyter_server_config.d", "jupyter-config/jupyter_server_config.d", "jlab_ext_example.json"), ] cmdclass = create_cmdclass( @@ -589,7 +593,7 @@ the frontend NPM package needs to be built and inserted in the Python package. T done using a special `cmdclass`: ```py -# setup.py#L38-L45 +# setup.py#L39-L46 cmdclass = create_cmdclass( "jsdeps", package_data_spec=package_data_spec, data_files_spec=data_files_spec @@ -604,7 +608,7 @@ js_command = combine_commands( Basically it will build the frontend NPM package: ```py -# setup.py#L43-L43 +# setup.py#L44-L44 install_npm(HERE, build_cmd="build:prod", npm=["jlpm"]), ``` @@ -647,10 +651,19 @@ done by copying the following JSON file: in the appropriate jupyter folder (`etc/jupyter/jupyter_server_config.d`): +```py +# setup.py#L36-L36 + +("etc/jupyter/jupyter_server_config.d", "jupyter-config/jupyter_server_config.d", "jlab_ext_example.json"), +``` + +For backward compatibility with the classical notebook, the old version of that file is copied in + (`etc/jupyter/jupyter_notebook_config.d`): + ```py # setup.py#L35-L35 -("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), +("etc/jupyter/jupyter_notebook_config.d", "jupyter-config/jupyter_notebook_config.d", "jlab_ext_example.json"), ``` ### JupyterLab Extension Manager diff --git a/advanced/server-extension/jlab_ext_example/__init__.py b/advanced/server-extension/jlab_ext_example/__init__.py index 363ba295..f63305e4 100644 --- a/advanced/server-extension/jlab_ext_example/__init__.py +++ b/advanced/server-extension/jlab_ext_example/__init__.py @@ -30,3 +30,6 @@ def _load_jupyter_server_extension(server_app): server_app.log.info( f"Registered jlab_ext_example extension at URL path /{url_path}" ) + +# For backward compatibility with the classical notebook +load_jupyter_server_extension = _load_jupyter_server_extension diff --git a/advanced/server-extension/jupyter-config/jupyter_notebook_config.d/jlab_ext_example.json b/advanced/server-extension/jupyter-config/jupyter_notebook_config.d/jlab_ext_example.json new file mode 100644 index 00000000..26b21bd8 --- /dev/null +++ b/advanced/server-extension/jupyter-config/jupyter_notebook_config.d/jlab_ext_example.json @@ -0,0 +1,7 @@ +{ + "NotebookApp": { + "nbserver_extensions": { + "jlab_ext_example": true + } + } +} diff --git a/advanced/server-extension/jupyter-config/jlab_ext_example.json b/advanced/server-extension/jupyter-config/jupyter_server_config.d/jlab_ext_example.json similarity index 100% rename from advanced/server-extension/jupyter-config/jlab_ext_example.json rename to advanced/server-extension/jupyter-config/jupyter_server_config.d/jlab_ext_example.json diff --git a/advanced/server-extension/setup.py b/advanced/server-extension/setup.py index 0aef8f91..7dff67e0 100644 --- a/advanced/server-extension/setup.py +++ b/advanced/server-extension/setup.py @@ -32,7 +32,8 @@ data_files_spec = [ ("share/jupyter/labextensions/%s" % labext_name, str(lab_path), "**"), ("share/jupyter/labextensions/%s" % labext_name, str(HERE), "install.json"), - ("etc/jupyter/jupyter_server_config.d", "jupyter-config", "jlab_ext_example.json"), + ("etc/jupyter/jupyter_notebook_config.d", "jupyter-config/jupyter_notebook_config.d", "jlab_ext_example.json"), + ("etc/jupyter/jupyter_server_config.d", "jupyter-config/jupyter_server_config.d", "jlab_ext_example.json"), ] cmdclass = create_cmdclass(