You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.1 KiB
Python
160 lines
5.1 KiB
Python
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
import json
|
|
import os.path as osp
|
|
from itertools import filterfalse
|
|
|
|
from .jlpmapp import HERE
|
|
|
|
|
|
def pjoin(*args):
|
|
"""Join paths to create a real path."""
|
|
return osp.abspath(osp.join(*args))
|
|
|
|
|
|
def _get_default_core_data():
|
|
"""Get the data for the app template."""
|
|
with open(pjoin(HERE, "staging", "package.json")) as fid:
|
|
return json.load(fid)
|
|
|
|
|
|
def _is_lab_package(name):
|
|
"""Whether a package name is in the lab namespace"""
|
|
return name.startswith("@jupyterlab/")
|
|
|
|
|
|
def _only_nonlab(collection):
|
|
"""Filter a dict/sequence to remove all lab packages
|
|
|
|
This is useful to take the default values of e.g. singletons and filter
|
|
away the '@jupyterlab/' namespace packages, but leave any others (e.g.
|
|
lumino and react).
|
|
"""
|
|
if isinstance(collection, dict):
|
|
return {k: v for (k, v) in collection.items() if not _is_lab_package(k)}
|
|
elif isinstance(collection, (list, tuple)):
|
|
return list(filterfalse(_is_lab_package, collection))
|
|
msg = "collection arg should be either dict or list/tuple"
|
|
raise TypeError(msg)
|
|
|
|
|
|
class CoreConfig:
|
|
"""An object representing a core config.
|
|
|
|
This enables custom lab application to override some parts of the core
|
|
configuration of the build system.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self._data = _get_default_core_data()
|
|
|
|
def add(self, name, semver, extension=False, mime_extension=False):
|
|
"""Remove an extension/singleton.
|
|
|
|
If neither extension or mimeExtension is True (the default)
|
|
the package is added as a singleton dependency.
|
|
|
|
name: string
|
|
The npm package name
|
|
semver: string
|
|
The semver range for the package
|
|
extension: bool
|
|
Whether the package is an extension
|
|
mime_extension: bool
|
|
Whether the package is a MIME extension
|
|
"""
|
|
data = self._data
|
|
if not name:
|
|
msg = "Missing package name"
|
|
raise ValueError(msg)
|
|
if not semver:
|
|
msg = "Missing package semver"
|
|
raise ValueError(msg)
|
|
if name in data["resolutions"]:
|
|
msg = f"Package already present: {name!r}"
|
|
raise ValueError(msg)
|
|
data["resolutions"][name] = semver
|
|
|
|
# If both mimeExtension and extensions are True, treat
|
|
# as mime extension
|
|
if mime_extension:
|
|
data["jupyterlab"]["mimeExtensions"][name] = ""
|
|
data["dependencies"][name] = semver
|
|
elif extension:
|
|
data["jupyterlab"]["extensions"][name] = ""
|
|
data["dependencies"][name] = semver
|
|
else:
|
|
data["jupyterlab"]["singletonPackages"].append(name)
|
|
|
|
def remove(self, name):
|
|
"""Remove a package/extension.
|
|
|
|
name: string
|
|
The npm package name
|
|
"""
|
|
data = self._data
|
|
maps = (
|
|
data["dependencies"],
|
|
data["resolutions"],
|
|
data["jupyterlab"]["extensions"],
|
|
data["jupyterlab"]["mimeExtensions"],
|
|
)
|
|
for m in maps:
|
|
try:
|
|
del m[name]
|
|
except KeyError:
|
|
pass
|
|
|
|
data["jupyterlab"]["singletonPackages"].remove(name)
|
|
|
|
def clear_packages(self, lab_only=True):
|
|
"""Clear the packages/extensions."""
|
|
data = self._data
|
|
# Clear all dependencies
|
|
if lab_only:
|
|
# Clear all "@jupyterlab/" dependencies
|
|
data["dependencies"] = _only_nonlab(data["dependencies"])
|
|
data["resolutions"] = _only_nonlab(data["resolutions"])
|
|
data["jupyterlab"]["extensions"] = _only_nonlab(data["jupyterlab"]["extensions"])
|
|
data["jupyterlab"]["mimeExtensions"] = _only_nonlab(
|
|
data["jupyterlab"]["mimeExtensions"]
|
|
)
|
|
data["jupyterlab"]["singletonPackages"] = _only_nonlab(
|
|
data["jupyterlab"]["singletonPackages"]
|
|
)
|
|
else:
|
|
data["dependencies"] = {}
|
|
data["resolutions"] = {}
|
|
data["jupyterlab"]["extensions"] = {}
|
|
data["jupyterlab"]["mimeExtensions"] = {}
|
|
data["jupyterlab"]["singletonPackages"] = []
|
|
|
|
@property
|
|
def extensions(self):
|
|
"""A dict mapping all extension names to their semver"""
|
|
data = self._data
|
|
return {k: data["resolutions"][k] for k in data["jupyterlab"]["extensions"]}
|
|
|
|
@property
|
|
def mime_extensions(self):
|
|
"""A dict mapping all MIME extension names to their semver"""
|
|
data = self._data
|
|
return {k: data["resolutions"][k] for k in data["jupyterlab"]["mimeExtensions"]}
|
|
|
|
@property
|
|
def singletons(self):
|
|
"""A dict mapping all singleton names to their semver"""
|
|
data = self._data
|
|
return {
|
|
k: data["resolutions"].get(k, None) for k in data["jupyterlab"]["singletonPackages"]
|
|
}
|
|
|
|
@property
|
|
def static_dir(self):
|
|
return self._data["jupyterlab"]["staticDir"]
|
|
|
|
@static_dir.setter
|
|
def static_dir(self, static_dir):
|
|
self._data["jupyterlab"]["staticDir"] = static_dir
|