Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-jupyterlab-server for
openSUSE:Factory checked in at 2026-10-18 19:25:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyterlab-server (Old)
and /work/SRC/openSUSE:Factory/.python-jupyterlab-server.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-jupyterlab-server"
Sun Oct 18 19:25:31 2026 rev:18 rq:1385852 version:2.28.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-jupyterlab-server/python-jupyterlab-server.changes
2026-03-23 17:13:22.601695681 +0100
+++
/work/SRC/openSUSE:Factory/.python-jupyterlab-server.new.3698736/python-jupyterlab-server.changes
2026-10-18 19:25:47.798965254 +0200
@@ -1,0 +2,8 @@
+Sat Oct 17 15:17:15 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 2.28.1:
+ * Fix develop-extensions feature with Tornado 6.5.9 and newer
+ * Require Python 3.10 and newer
+ * Add regression test for serving symlinked labextensions
+
+-------------------------------------------------------------------
Old:
----
jupyterlab_server-2.28.0.tar.gz
New:
----
jupyterlab_server-2.28.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-jupyterlab-server.spec ++++++
--- /var/tmp/diff_new_pack.rRn2ma/_old 2026-10-18 19:25:48.488993961 +0200
+++ /var/tmp/diff_new_pack.rRn2ma/_new 2026-10-18 19:25:48.492994127 +0200
@@ -26,10 +26,9 @@
%endif
# Disabled because openapi move to 0.19
%bcond_with openapi
-
%{?sle15_python_module_pythons}
Name: python-jupyterlab-server%{psuffix}
-Version: 2.28.0
+Version: 2.28.1
Release: 0
Summary: Server components for JupyterLab and JupyterLab-like
applications
License: BSD-3-Clause
@@ -37,7 +36,7 @@
Source:
https://files.pythonhosted.org/packages/source/j/jupyterlab_server/jupyterlab_server-%{version}.tar.gz
Source100: python-jupyterlab-server-rpmlintrc
Patch1: openapi-remove-cap.patch
-BuildRequires: %{python_module base >= 3.8}
+BuildRequires: %{python_module base >= 3.10}
BuildRequires: %{python_module hatchling >= 1.7}
BuildRequires: %{python_module pip}
BuildRequires: fdupes
@@ -49,9 +48,6 @@
Requires: python-packaging >= 21.3
Requires: python-requests >= 2.31
Requires: (python-jupyter-server >= 1.21 with python-jupyter-server < 3)
-%if 0%{?python_version_nodots} < 310
-Requires: python-importlib-metadata >= 4.8.3
-%endif
Provides: python-jupyterlab_server = %{version}-%{release}
Obsoletes: python-jupyterlab_server < %{version}-%{release}
Provides: python-jupyter-jupyterlab-server = %{version}-%{release}
@@ -61,6 +57,9 @@
Provides: python-jupyter_jupyterlab_launcher = %{version}-%{release}
Obsoletes: python-jupyter_jupyterlab_launcher < %{version}-%{release}
BuildArch: noarch
+%if 0%{?python_version_nodots} < 310
+Requires: python-importlib-metadata >= 4.8.3
+%endif
%if "%{python_flavor}" == "python3" || "%{python_provides}" == "python3"
Provides: jupyter-jupyterlab-launcher = %{version}-%{release}
Obsoletes: jupyter-jupyterlab-launcher < %{version}-%{release}
@@ -89,17 +88,17 @@
Summary: The jupyterlab_server[test] requirements
Requires: python-Werkzeug
Requires: python-ipykernel
+Requires: python-jupyterlab-server = %{version}
+# upper limit removed to allow newer versions than what upstream permits
+Requires: python-openapi-spec-validator >= 0.6
Requires: python-pytest >= 7
Requires: python-pytest-console-scripts
Requires: python-pytest-jupyter-server >= 0.6.2
Requires: python-pytest-timeout
Requires: python-requests-mock
-# upper limit removed to allow newer versions than what upstream permits
-Requires: python-openapi-spec-validator >= 0.6
+Requires: python-ruamel.yaml
#Requires: python-sphinxcontrib-spelling
Requires: python-strict-rfc3339
-Requires: python-jupyterlab-server = %{version}
-Requires: python-ruamel.yaml
%if %{with openapi}
Requires: (python-openapi-core >= 0.18 with python-openapi-core < 0.19)
%endif
++++++ jupyterlab_server-2.28.0.tar.gz -> jupyterlab_server-2.28.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/jupyterlab_server-2.28.0/.github/workflows/tests.yml
new/jupyterlab_server-2.28.1/.github/workflows/tests.yml
--- old/jupyterlab_server-2.28.0/.github/workflows/tests.yml 2020-02-02
01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/.github/workflows/tests.yml 2020-02-02
01:00:00.000000000 +0100
@@ -19,16 +19,16 @@
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
- python-version: ["3.9", "3.12"]
+ python-version: ["3.10", "3.14"]
include:
- - os: windows-latest
- python-version: "3.9"
- os: ubuntu-latest
- python-version: "pypy-3.9"
+ python-version: "pypy-3.11"
- os: ubuntu-latest
- python-version: "3.10"
- - os: macos-latest
python-version: "3.11"
+ - os: windows-latest
+ python-version: "3.13"
+ - os: macos-latest
+ python-version: "3.12"
steps:
- name: Checkout
uses: actions/checkout@v4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/jupyterlab_server-2.28.0/.pre-commit-config.yaml
new/jupyterlab_server-2.28.1/.pre-commit-config.yaml
--- old/jupyterlab_server-2.28.0/.pre-commit-config.yaml 2020-02-02
01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/.pre-commit-config.yaml 2020-02-02
01:00:00.000000000 +0100
@@ -64,16 +64,15 @@
files: "^jupyterlab_server"
stages: [manual]
args: ["--install-types", "--non-interactive"]
- additional_dependencies:
- [
+ additional_dependencies: [
"traitlets>=5.3",
"jupyter_server>=2.10.1",
- "openapi_core",
+ # same range as the test extra: 0.20 removed
openapi_core.spec.paths
+ "openapi_core~=0.18.0",
"json5",
"pytest",
"werkzeug",
"ruamel.yaml",
- "importlib_metadata",
]
- repo: https://github.com/astral-sh/ruff-pre-commit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/jupyterlab_server-2.28.0/CHANGELOG.md
new/jupyterlab_server-2.28.1/CHANGELOG.md
--- old/jupyterlab_server-2.28.0/CHANGELOG.md 2020-02-02 01:00:00.000000000
+0100
+++ new/jupyterlab_server-2.28.1/CHANGELOG.md 2020-02-02 01:00:00.000000000
+0100
@@ -2,6 +2,27 @@
<!-- <START NEW CHANGELOG ENTRY> -->
+## 2.28.1
+
+([Full
Changelog](https://github.com/jupyterlab/jupyterlab_server/compare/v2.28.0...490fe78389b2f8e36b21d6759f07e3ef09cd8d8b))
+
+### Maintenance and upkeep improvements
+
+- Fix CI, bump min Python version to 3.10
[#481](https://github.com/jupyterlab/jupyterlab_server/pull/481)
([@krassowski](https://github.com/krassowski),
[@andrii-i](https://github.com/andrii-i))
+- Add regression test for serving symlinked labextensions
[#480](https://github.com/jupyterlab/jupyterlab_server/pull/480)
([@andrii-i](https://github.com/andrii-i),
[@krassowski](https://github.com/krassowski))
+- Fix develop extensions feature with tornado 6.5.9+
[#479](https://github.com/jupyterlab/jupyterlab_server/pull/479)
([@krassowski](https://github.com/krassowski),
[@andrii-i](https://github.com/andrii-i))
+
+### Contributors to this release
+
+The following people contributed discussions, new ideas, code and
documentation contributions, and review.
+See [our definition of
contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports).
+
+([GitHub contributors page for this
release](https://github.com/jupyterlab/jupyterlab_server/graphs/contributors?from=2025-10-22&to=2026-09-15&type=c))
+
+@andrii-i
([activity](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab_server+involves%3Aandrii-i+updated%3A2025-10-22..2026-09-15&type=Issues))
| @krassowski
([activity](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab_server+involves%3Akrassowski+updated%3A2025-10-22..2026-09-15&type=Issues))
+
+<!-- <END NEW CHANGELOG ENTRY> -->
+
## 2.28.0
([Full
Changelog](https://github.com/jupyterlab/jupyterlab_server/compare/v2.27.3...0cc8ebb4371cc481be90532d1486f1c4d7d2ebdc))
@@ -29,8 +50,6 @@
[@Darshan808](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab_server+involves%3ADarshan808+updated%3A2024-07-16..2025-10-22&type=Issues)
|
[@jtpio](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab_server+involves%3Ajtpio+updated%3A2024-07-16..2025-10-22&type=Issues)
|
[@krassowski](https://github.com/search?q=repo%3Ajupyterlab%2Fjupyterlab_server+involves%3Akrassowski+updated%3A2024-07-16..2025-10-22&type=Issues)
-<!-- <END NEW CHANGELOG ENTRY> -->
-
## 2.27.3
([Full
Changelog](https://github.com/jupyterlab/jupyterlab_server/compare/v2.27.2...cac303a64815e1f373acb518c783bd25787c4d40))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/jupyterlab_server-2.28.0/PKG-INFO
new/jupyterlab_server-2.28.1/PKG-INFO
--- old/jupyterlab_server-2.28.0/PKG-INFO 2020-02-02 01:00:00.000000000
+0100
+++ new/jupyterlab_server-2.28.1/PKG-INFO 2020-02-02 01:00:00.000000000
+0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.4
+Metadata-Version: 2.5
Name: jupyterlab_server
-Version: 2.28.0
+Version: 2.28.1
Summary: A set of server components for JupyterLab and JupyterLab like
applications.
Project-URL: Homepage, https://jupyterlab-server.readthedocs.io
Project-URL: Documentation, https://jupyterlab-server.readthedocs.io
@@ -45,15 +45,14 @@
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Classifier: Typing :: Typed
-Requires-Python: >=3.8
+Requires-Python: >=3.10
Requires-Dist: babel>=2.10
-Requires-Dist: importlib-metadata>=4.8.3; python_version < '3.10'
Requires-Dist: jinja2>=3.0.3
Requires-Dist: json5>=0.9.0
Requires-Dist: jsonschema>=4.18.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/_version.py
new/jupyterlab_server-2.28.1/jupyterlab_server/_version.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/_version.py 2020-02-02
01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/_version.py 2020-02-02
01:00:00.000000000 +0100
@@ -7,7 +7,7 @@
"""
import re
-__version__ = "2.28.0"
+__version__ = "2.28.1"
# Build up version_info tuple for backwards compatibility
pattern = r"(?P<major>\d+).(?P<minor>\d+).(?P<patch>\d+)(?P<rest>.*)"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/handlers.py
new/jupyterlab_server-2.28.1/jupyterlab_server/handlers.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/handlers.py 2020-02-02
01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/handlers.py 2020-02-02
01:00:00.000000000 +0100
@@ -218,13 +218,17 @@
# Handle federated lab extensions.
labextensions_path = extension_app.extra_labextensions_path +
extension_app.labextensions_path
labextensions_url = ujoin(extension_app.labextensions_url, "(.*)")
- handlers.append(
- (
- labextensions_url,
- FileFindHandler,
- {"path": labextensions_path, "no_cache_paths": no_cache_paths},
- )
- )
+ labextensions_kwargs: dict[str, Any] = {
+ "path": labextensions_path,
+ "no_cache_paths": no_cache_paths,
+ }
+ if hasattr(FileFindHandler, "follow_dir_symlinks"):
+ # `jupyter labextension develop` links the extension in from its
source tree,
+ # and tornado >= 6.5.9 will not serve through such a link unless the
handler
+ # asks for it. Only this route asks; /static/ and /custom/ stay strict.
+ # Older jupyter_server has no such option and leaves this out.
+ labextensions_kwargs["follow_dir_symlinks"] = True
+ handlers.append((labextensions_url, FileFindHandler, labextensions_kwargs))
# Handle local settings.
if extension_app.schemas_dir:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/process.py
new/jupyterlab_server-2.28.1/jupyterlab_server/process.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/process.py 2020-02-02
01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/process.py 2020-02-02
01:00:00.000000000 +0100
@@ -95,7 +95,7 @@
quiet: bool, optional
Whether to suppress output.
"""
- if not isinstance(cmd, (list, tuple)):
+ if not isinstance(cmd, list | tuple):
msg = "Command must be given as a list" # type:ignore[unreachable]
raise ValueError(msg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/pytest_plugin.py
new/jupyterlab_server-2.28.1/jupyterlab_server/pytest_plugin.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/pytest_plugin.py
2020-02-02 01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/pytest_plugin.py
2020-02-02 01:00:00.000000000 +0100
@@ -8,9 +8,10 @@
import os
import os.path as osp
import shutil
+from collections.abc import Callable
from os.path import join as pjoin
from pathlib import Path
-from typing import Any, Callable
+from typing import Any
import pytest
from jupyter_server.serverapp import ServerApp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/test_utils.py
new/jupyterlab_server-2.28.1/jupyterlab_server/test_utils.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/test_utils.py
2020-02-02 01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/test_utils.py
2020-02-02 01:00:00.000000000 +0100
@@ -154,11 +154,14 @@
"""Validate an API request"""
openapi_spec = get_openapi_spec()
+ # openapi_core 0.18 declares body, data and headers as str and Mapping in
its
+ # Request and Response protocols. Tornado hands over bytes and a Headers
object,
+ # and the validators read both, so the adapters above return what tornado
gives.
request = TornadoOpenAPIRequest(response.request, openapi_spec)
- V30RequestValidator(openapi_spec).validate(request)
+ V30RequestValidator(openapi_spec).validate(request) # type:
ignore[arg-type]
torn_response = TornadoOpenAPIResponse(response)
- V30ResponseValidator(openapi_spec).validate(request, torn_response)
+ V30ResponseValidator(openapi_spec).validate(request, torn_response) #
type: ignore[arg-type]
def maybe_patch_ioloop() -> None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/themes_handler.py
new/jupyterlab_server-2.28.1/jupyterlab_server/themes_handler.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/themes_handler.py
2020-02-02 01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/themes_handler.py
2020-02-02 01:00:00.000000000 +0100
@@ -18,7 +18,12 @@
class ThemesHandler(FileFindHandler):
"""A file handler that mangles local urls in CSS files."""
- def initialize(
+ # tornado 6.5.9 took argument 3 of StaticFileHandler.initialize for
+ # allowed_symlink_directory; this handler, like FileFindHandler under it,
has had
+ # no_cache_paths there for far longer. Harmless in practice: tornado binds
these by
+ # name from the route kwargs (self.initialize(**kwargs)), so neither is
ever passed
+ # positionally.
+ def initialize( # type: ignore[override]
self,
path: str | list[str],
default_filename: str | None = None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/jupyterlab_server-2.28.0/jupyterlab_server/translation_utils.py
new/jupyterlab_server-2.28.1/jupyterlab_server/translation_utils.py
--- old/jupyterlab_server-2.28.0/jupyterlab_server/translation_utils.py
2020-02-02 01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/jupyterlab_server/translation_utils.py
2020-02-02 01:00:00.000000000 +0100
@@ -17,18 +17,13 @@
import sys
import traceback
from functools import lru_cache
+from importlib.metadata import entry_points
from re import Pattern
from typing import Any
import babel
from packaging.version import parse as parse_version
-# See compatibility note on `group` keyword in
https://docs.python.org/3/library/importlib.metadata.html#entry-points
-if sys.version_info < (3, 10): # pragma: no cover
- from importlib_metadata import entry_points
-else: # pragma: no cover
- from importlib.metadata import entry_points
-
# Entry points
JUPYTERLAB_LANGUAGEPACK_ENTRY = "jupyterlab.languagepack"
JUPYTERLAB_LOCALE_ENTRY = "jupyterlab.locale"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/jupyterlab_server-2.28.0/pyproject.toml
new/jupyterlab_server-2.28.1/pyproject.toml
--- old/jupyterlab_server-2.28.0/pyproject.toml 2020-02-02 01:00:00.000000000
+0100
+++ new/jupyterlab_server-2.28.1/pyproject.toml 2020-02-02 01:00:00.000000000
+0100
@@ -20,16 +20,15 @@
"License :: OSI Approved :: BSD License",
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"Typing :: Typed"]
-requires-python = ">=3.8"
+requires-python = ">=3.10"
dependencies = [
"babel>=2.10",
- "importlib_metadata>=4.8.3;python_version<\"3.10\"",
"jinja2>=3.0.3",
"json5>=0.9.0",
"jsonschema>=4.18.0",
@@ -146,6 +145,12 @@
"module:unclosed <socket.socket:ResourceWarning",
# From jupyter_client
"module:datetime.datetime.utc:DeprecationWarning",
+ # From ServerApp._init_asyncio_patch on Windows, where Python 3.14
deprecated the
+ # event loop policy API. pytest-jupyter filters the same four for its own
fixtures.
+ "ignore:'asyncio.WindowsProactorEventLoopPolicy' is
deprecated:DeprecationWarning",
+ "ignore:'asyncio.WindowsSelectorEventLoopPolicy' is
deprecated:DeprecationWarning",
+ "ignore:'asyncio.get_event_loop_policy' is deprecated:DeprecationWarning",
+ "ignore:'asyncio.set_event_loop_policy' is deprecated:DeprecationWarning",
]
[tool.coverage.report]
@@ -164,9 +169,10 @@
[tool.mypy]
files = "jupyterlab_server"
-python_version = "3.8"
+python_version = "3.10"
strict = true
disallow_any_generics = false
+disable_error_code = ["unused-ignore"]
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
no_implicit_reexport = false
pretty = true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/jupyterlab_server-2.28.0/tests/test_labapp.py
new/jupyterlab_server-2.28.1/tests/test_labapp.py
--- old/jupyterlab_server-2.28.0/tests/test_labapp.py 2020-02-02
01:00:00.000000000 +0100
+++ new/jupyterlab_server-2.28.1/tests/test_labapp.py 2020-02-02
01:00:00.000000000 +0100
@@ -5,11 +5,13 @@
"""
import json
+import os
import re
from pathlib import Path
import pytest
import tornado.httpclient
+from jupyter_server.base.handlers import FileFindHandler
from jupyterlab_server.test_utils import expected_http_error
@@ -153,3 +155,19 @@
with pytest.raises(tornado.httpclient.HTTPClientError) as e:
await jp_fetch("foo")
assert expected_http_error(e, 404)
+
+
[email protected](os.name == "nt", reason="symlinks need extra permissions
on Windows")
[email protected](
+ tornado.version_info >= (6, 5, 9) and not hasattr(FileFindHandler,
"follow_dir_symlinks"),
+ reason="tornado >= 6.5.9 serves a symlinked extension only with
follow_dir_symlinks support",
+)
+async def test_symlinked_labextension(labserverapp, labextensions_dir,
tmp_path, jp_fetch):
+ # `jupyter labextension develop` links the extension in from its source
tree
+ src = tmp_path / "ext-src" / "dev-ext"
+ (src / "static").mkdir(parents=True)
+ (src / "static" / "remoteEntry.abc123.js").write_text("entry")
+ os.symlink(src, labextensions_dir / "dev-ext")
+
+ r = await jp_fetch("lab", "extensions", "dev-ext", "static",
"remoteEntry.abc123.js")
+ assert r.code == 200