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