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

Reply via email to