Skip to content

Commit 348c8ea

Browse files
authored
Load overrides once, rather than in each settings handler (#452)
* Load overrides once, rather than in each settings handler * Add back the overrides loading at handler level as a fallback To make the change non-breaking in case if other apps used this handler which is a part of the public API * Fix tests
1 parent 1e0367f commit 348c8ea

File tree

4 files changed

+23
-3
lines changed

4 files changed

+23
-3
lines changed

jupyterlab_server/handlers.py

+9
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from .licenses_handler import LicensesHandler, LicensesManager
2121
from .listings_handler import ListingsHandler, fetch_listings
2222
from .settings_handler import SettingsHandler
23+
from .settings_utils import _get_overrides
2324
from .themes_handler import ThemesHandler
2425
from .translations_handler import TranslationsHandler
2526
from .workspaces_handler import WorkspacesHandler, WorkspacesManager
@@ -227,11 +228,19 @@ def add_handlers(handlers: list[Any], extension_app: LabServerApp) -> None:
227228

228229
# Handle local settings.
229230
if extension_app.schemas_dir:
231+
# Load overrides once, rather than in each copy of the settings handler
232+
overrides, error = _get_overrides(extension_app.app_settings_dir)
233+
234+
if error:
235+
overrides_warning = "Failed loading overrides: %s"
236+
extension_app.log.warning(overrides_warning, error)
237+
230238
settings_config: dict[str, Any] = {
231239
"app_settings_dir": extension_app.app_settings_dir,
232240
"schemas_dir": extension_app.schemas_dir,
233241
"settings_dir": extension_app.user_settings_dir,
234242
"labextensions_path": labextensions_path,
243+
"overrides": overrides,
235244
}
236245

237246
# Handle requests for the list of settings. Make slash optional.

jupyterlab_server/settings_handler.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ def initialize( # type:ignore[override]
2525
schemas_dir: str,
2626
settings_dir: str,
2727
labextensions_path: list[str],
28+
overrides: dict[str, Any] | None = None,
2829
**kwargs: Any, # noqa: ARG002
2930
) -> None:
3031
"""Initialize the handler."""
3132
SchemaHandler.initialize(
32-
self, app_settings_dir, schemas_dir, settings_dir, labextensions_path
33+
self, app_settings_dir, schemas_dir, settings_dir, labextensions_path, overrides
3334
)
3435
ExtensionHandlerMixin.initialize(self, name)
3536

jupyterlab_server/settings_utils.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -448,11 +448,15 @@ def initialize(
448448
schemas_dir: str,
449449
settings_dir: str,
450450
labextensions_path: list[str] | None,
451+
overrides: dict[str, Any] | None = None,
451452
**kwargs: Any,
452453
) -> None:
453454
"""Initialize the handler."""
454455
super().initialize(**kwargs)
455-
self.overrides, error = _get_overrides(app_settings_dir)
456+
error = None
457+
if not overrides:
458+
overrides, error = _get_overrides(app_settings_dir)
459+
self.overrides = overrides
456460
self.app_settings_dir = app_settings_dir
457461
self.schemas_dir = schemas_dir
458462
self.settings_dir = settings_dir

tests/test_settings_api.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,13 @@ async def test_get_settings_overrides_dicts(jp_fetch, labserverapp):
3030

3131

3232
@pytest.mark.parametrize("ext", ["json", "json5"])
33-
async def test_get_settings_overrides_d_dicts(jp_fetch, labserverapp, ext):
33+
async def test_get_settings_overrides_d_dicts(
34+
jp_fetch, jp_serverapp, make_labserver_extension_app, ext
35+
):
3436
# Check that values that are dictionaries in overrides.d/*.json are
3537
# merged with the schema.
38+
labserverapp = make_labserver_extension_app()
39+
labserverapp._link_jupyter_server_extension(jp_serverapp)
3640
id = "@jupyterlab/apputils-extension:themes"
3741
overrides_d = Path(labserverapp.app_settings_dir) / "overrides.d"
3842
overrides_d.mkdir(exist_ok=True, parents=True)
@@ -41,6 +45,8 @@ async def test_get_settings_overrides_d_dicts(jp_fetch, labserverapp, ext):
4145
if ext == "json5":
4246
text += "\n// a comment"
4347
(overrides_d / f"foo-{i}.{ext}").write_text(text, encoding="utf-8")
48+
# Initialize labserverapp only after the overrides were created
49+
labserverapp.initialize()
4450
r = await jp_fetch("lab", "api", "settings", id)
4551
validate_request(r)
4652
res = r.body.decode()

0 commit comments

Comments
 (0)