diff --git a/panel/io/jupyter_server_extension.py b/panel/io/jupyter_server_extension.py index fbbccb8ba4..4c866f4e0d 100644 --- a/panel/io/jupyter_server_extension.py +++ b/panel/io/jupyter_server_extension.py @@ -112,6 +112,7 @@ def get_server_root_dir(settings): import pathlib import sys +os.environ['BOKEH_RESOURCES'] = 'server' app = r'{{ path }}' os.chdir(str(pathlib.Path(app).parent)) sys.path = [os.getcwd()] + sys.path[1:] diff --git a/panel/tests/ui/io/test_jupyter_server_extension.py b/panel/tests/ui/io/test_jupyter_server_extension.py index bcbabc174b..d2424d85a4 100644 --- a/panel/tests/ui/io/test_jupyter_server_extension.py +++ b/panel/tests/ui/io/test_jupyter_server_extension.py @@ -1,3 +1,7 @@ +import sys + +from pathlib import Path + import pytest pytest.importorskip("playwright") @@ -49,3 +53,9 @@ def test_jupyter_server_session_arg_theme(page, jupyter_preview): page.goto(f"{jupyter_preview}/app.py?theme=dark", timeout=30000) expect(page.locator('body')).to_have_css('color', 'rgb(0, 0, 0)') + + +def test_jupyter_config(): + # If this test fails, run `pip install -e .` again + jp_files = (Path(sys.prefix) / 'etc' / 'jupyter').rglob('panel-client-jupyter.json') + assert len(list(jp_files)) == 2 diff --git a/setup.py b/setup.py index a2ee4cc78b..5472d3ef1b 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import json import os +import shutil import sys from setuptools import find_packages, setup @@ -47,12 +48,23 @@ def _build_paneljs(): fcntl.fcntl(sys.stdout, fcntl.F_SETFL, flags&~os.O_NONBLOCK) +def _install_jupyter_server_extension(): + # data_files are not copied for editable installs returning + files = setup_args['data_files'] + for dst, (src,) in files: + dst = os.path.join(sys.prefix, dst) + os.makedirs(dst, exist_ok=True) + shutil.copy2(src, dst) + print(f"Copied {src} to {dst}") + + class CustomDevelopCommand(develop): """Custom installation for development mode.""" def run(self): if not PANEL_LITE_BUILD: _build_paneljs() + _install_jupyter_server_extension() develop.run(self)