| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- # 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
|