import json import os import os.path as osp import shutil from importlib.resources import path from os.path import join as pjoin import pytest from notebook.app import JupyterNotebookApp pytest_plugins = ["jupyter_server.pytest_plugin"] def mkdir(tmp_path, *parts): path = tmp_path.joinpath(*parts) if not path.exists(): path.mkdir(parents=True) return path app_settings_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "app_settings")) user_settings_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "user_settings")) schemas_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "schemas")) workspaces_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "workspaces")) labextensions_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "labextensions_dir")) @pytest.fixture def make_notebook_app( jp_root_dir, jp_template_dir, app_settings_dir, user_settings_dir, schemas_dir, workspaces_dir, labextensions_dir, ): def _make_notebook_app(**kwargs): return JupyterNotebookApp( static_dir=str(jp_root_dir), templates_dir=str(jp_template_dir), app_url="/", app_settings_dir=str(app_settings_dir), user_settings_dir=str(user_settings_dir), schemas_dir=str(schemas_dir), workspaces_dir=str(workspaces_dir), extra_labextensions_path=[str(labextensions_dir)], ) # Create the index files. index = jp_template_dir.joinpath("index.html") index.write_text( """ {{page_config['appName'] | e}} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} """ ) # Copy the schema files. test_data = str(path("jupyterlab_server", "test_data")) src = pjoin(test_data, "schemas", "@jupyterlab") dst = pjoin(str(schemas_dir), "@jupyterlab") if os.path.exists(dst): shutil.rmtree(dst) shutil.copytree(src, dst) # Create the federated extensions for name in ["apputils-extension", "codemirror-extension"]: target_name = name + "-federated" target = pjoin(str(labextensions_dir), "@jupyterlab", target_name) src = pjoin(test_data, "schemas", "@jupyterlab", name) dst = pjoin(target, "schemas", "@jupyterlab", target_name) if osp.exists(dst): shutil.rmtree(dst) shutil.copytree(src, dst) with open(pjoin(target, "package.orig.json"), "w") as fid: data = dict(name=target_name, jupyterlab=dict(extension=True)) json.dump(data, fid) # Copy the overrides file. src = pjoin(test_data, "app-settings", "overrides.json") dst = pjoin(str(app_settings_dir), "overrides.json") if os.path.exists(dst): os.remove(dst) shutil.copyfile(src, dst) # Copy workspaces. data = pjoin(test_data, "workspaces") for item in os.listdir(data): src = pjoin(data, item) dst = pjoin(str(workspaces_dir), item) if os.path.exists(dst): os.remove(dst) shutil.copy(src, str(workspaces_dir)) return _make_notebook_app @pytest.fixture def notebookapp(jp_serverapp, make_notebook_app): app = make_notebook_app() app._link_jupyter_server_extension(jp_serverapp) app.initialize() return app