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.
138 lines
4.6 KiB
Python
138 lines
4.6 KiB
Python
"""JupyterLab Server Application"""
|
|
|
|
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
from glob import glob
|
|
from os.path import relpath
|
|
from typing import Any
|
|
|
|
from jupyter_server.extension.application import ExtensionApp, ExtensionAppJinjaMixin
|
|
from jupyter_server.utils import url_path_join as ujoin
|
|
from traitlets import Dict, Integer, Unicode, observe
|
|
|
|
from ._version import __version__
|
|
from .handlers import LabConfig, add_handlers
|
|
|
|
|
|
class LabServerApp(ExtensionAppJinjaMixin, LabConfig, ExtensionApp):
|
|
"""A Lab Server Application that runs out-of-the-box"""
|
|
|
|
name = "jupyterlab_server"
|
|
extension_url = "/lab"
|
|
app_name = "JupyterLab Server Application" # type:ignore[assignment]
|
|
file_url_prefix = "/lab/tree" # type:ignore[assignment]
|
|
|
|
@property
|
|
def app_namespace(self) -> str: # type:ignore[override]
|
|
return self.name
|
|
|
|
default_url = Unicode("/lab", help="The default URL to redirect to from `/`")
|
|
|
|
# Should your extension expose other server extensions when launched directly?
|
|
load_other_extensions = True
|
|
|
|
app_version = Unicode("", help="The version of the application.").tag(default=__version__)
|
|
|
|
blacklist_uris = Unicode(
|
|
"", config=True, help="Deprecated, use `LabServerApp.blocked_extensions_uris`"
|
|
)
|
|
|
|
blocked_extensions_uris = Unicode(
|
|
"",
|
|
config=True,
|
|
help="""
|
|
A list of comma-separated URIs to get the blocked extensions list
|
|
|
|
.. versionchanged:: 2.0.0
|
|
`LabServerApp.blacklist_uris` renamed to `blocked_extensions_uris`
|
|
""",
|
|
)
|
|
|
|
whitelist_uris = Unicode(
|
|
"", config=True, help="Deprecated, use `LabServerApp.allowed_extensions_uris`"
|
|
)
|
|
|
|
allowed_extensions_uris = Unicode(
|
|
"",
|
|
config=True,
|
|
help="""
|
|
"A list of comma-separated URIs to get the allowed extensions list
|
|
|
|
.. versionchanged:: 2.0.0
|
|
`LabServerApp.whitetlist_uris` renamed to `allowed_extensions_uris`
|
|
""",
|
|
)
|
|
|
|
listings_refresh_seconds = Integer(
|
|
60 * 60, config=True, help="The interval delay in seconds to refresh the lists"
|
|
)
|
|
|
|
listings_request_options = Dict(
|
|
{},
|
|
config=True,
|
|
help="The optional kwargs to use for the listings HTTP requests \
|
|
as described on https://2.python-requests.org/en/v2.7.0/api/#requests.request",
|
|
)
|
|
|
|
_deprecated_aliases = {
|
|
"blacklist_uris": ("blocked_extensions_uris", "1.2"),
|
|
"whitelist_uris": ("allowed_extensions_uris", "1.2"),
|
|
}
|
|
|
|
# Method copied from
|
|
# https://github.com/jupyterhub/jupyterhub/blob/d1a85e53dccfc7b1dd81b0c1985d158cc6b61820/jupyterhub/auth.py#L143-L161
|
|
@observe(*list(_deprecated_aliases))
|
|
def _deprecated_trait(self, change: Any) -> None:
|
|
"""observer for deprecated traits"""
|
|
old_attr = change.name
|
|
new_attr, version = self._deprecated_aliases.get(old_attr) # type:ignore[misc]
|
|
new_value = getattr(self, new_attr)
|
|
if new_value != change.new:
|
|
# only warn if different
|
|
# protects backward-compatible config from warnings
|
|
# if they set the same value under both names
|
|
self.log.warning(
|
|
"%s.%s is deprecated in JupyterLab %s, use %s.%s instead",
|
|
self.__class__.__name__,
|
|
old_attr,
|
|
version,
|
|
self.__class__.__name__,
|
|
new_attr,
|
|
)
|
|
|
|
setattr(self, new_attr, change.new)
|
|
|
|
def initialize_settings(self) -> None:
|
|
"""Initialize the settings:
|
|
|
|
set the static files as immutable, since they should have all hashed name.
|
|
"""
|
|
immutable_cache = set(self.settings.get("static_immutable_cache", []))
|
|
|
|
# Set lab static files as immutables
|
|
immutable_cache.add(self.static_url_prefix)
|
|
|
|
# Set extensions static files as immutables
|
|
for extension_path in self.labextensions_path + self.extra_labextensions_path:
|
|
extensions_url = [
|
|
ujoin(self.labextensions_url, relpath(path, extension_path))
|
|
for path in glob(f"{extension_path}/**/static", recursive=True)
|
|
]
|
|
|
|
immutable_cache.update(extensions_url)
|
|
|
|
self.settings.update({"static_immutable_cache": list(immutable_cache)})
|
|
|
|
def initialize_templates(self) -> None:
|
|
"""Initialize templates."""
|
|
self.static_paths = [self.static_dir]
|
|
self.template_paths = [self.templates_dir]
|
|
|
|
def initialize_handlers(self) -> None:
|
|
"""Initialize handlers."""
|
|
add_handlers(self.handlers, self)
|
|
|
|
|
|
main = launch_new_instance = LabServerApp.launch_instance
|