import json import os import os.path as osp import shutil from os.path import join as pjoin import pytest from jupyterlab_server import LabServerApp from jupyterlab_server.app import LabServerApp 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_labserver_extension_app( jp_root_dir, jp_template_dir, app_settings_dir, user_settings_dir, schemas_dir, workspaces_dir, labextensions_dir ): def _make_labserver_extension_app(**kwargs): return LabServerApp( static_dir = str(jp_root_dir), templates_dir = str(jp_template_dir), app_url = '/lab', 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. src = pjoin( os.path.abspath(os.path.dirname(__file__)), 'tests', '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( os.path.abspath(os.path.dirname(__file__)), 'tests', '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( os.path.abspath(os.path.dirname(__file__)), 'tests', '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( os.path.abspath(os.path.dirname(__file__)), 'tests', '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_labserver_extension_app @pytest.fixture def labserverapp(jp_serverapp, make_labserver_extension_app): app = make_labserver_extension_app() app._link_jupyter_server_extension(jp_serverapp) app.initialize() return app