Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-jupyter-server for 
openSUSE:Factory checked in at 2022-01-19 00:35:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyter-server (Old)
 and      /work/SRC/openSUSE:Factory/.python-jupyter-server.new.1892 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-jupyter-server"

Wed Jan 19 00:35:03 2022 rev:21 rq:946720 version:1.13.3

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-jupyter-server/python-jupyter-server.changes  
    2022-01-04 19:37:48.933955647 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-jupyter-server.new.1892/python-jupyter-server.changes
    2022-01-19 00:35:04.666285440 +0100
@@ -1,0 +2,20 @@
+Sat Jan 15 19:52:09 UTC 2022 - Ben Greiner <[email protected]>
+
+- Update to 1.13.3
+  * More updates to unit tests for pending kernels work #662
+    (@Zsailer)
+  * bump traitlets dependency #663 (@Zsailer)
+- Update to 1.13.2
+  * Don't block the event loop when exporting with nbconvert #655
+    (@davidbrochart)
+  * Add more awaits for pending kernel in unit tests #654
+    (@Zsailer)
+  * Print IPv6 url as hostname or enclosed in brackets #652 (@op3)
+  * Run pre_save_hook before model check #643 (@davidbrochart)
+  * handle KeyError when get session #641 (@ccw630)
+  * Clean up deprecations #650 (@blink1073)
+  * Update branch references #646 (@blink1073)
+  * pyproject.toml: clarify build system version #634
+    (@adamjstewart)
+
+-------------------------------------------------------------------

Old:
----
  jupyter_server-1.13.1.tar.gz

New:
----
  jupyter_server-1.13.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-jupyter-server.spec ++++++
--- /var/tmp/diff_new_pack.3c0KpI/_old  2022-01-19 00:35:05.362285937 +0100
+++ /var/tmp/diff_new_pack.3c0KpI/_new  2022-01-19 00:35:05.366285940 +0100
@@ -1,7 +1,7 @@
 #
 # spec file
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -35,7 +35,7 @@
 %{?!python_module:%define python_module() python3-%{**}}
 %define         skip_python2 1
 Name:           python-jupyter-server%{psuffix}
-Version:        1.13.1
+Version:        1.13.3
 Release:        0
 Summary:        The backend to Jupyter web applications
 License:        BSD-3-Clause
@@ -43,27 +43,35 @@
 URL:            https://github.com/jupyter-server/jupyter_server
 # need the release tarball for the static stylesheets
 Source:         
https://github.com/jupyter-server/jupyter_server/releases/download/v%{version}/jupyter_server-%{version}.tar.gz
+BuildRequires:  %{python_module base >= 3.7}
 BuildRequires:  %{python_module jupyter_packaging}
 BuildRequires:  %{python_module setuptools}
-
 # We need the full stdlib
 BuildRequires:  %{pythons}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros >= 20210929
+%if %{with test}
+BuildRequires:  %{python_module jupyter-server-test = %{version}}
+# https://github.com/jupyter-server/jupyter_server/issues/666
+BuildRequires:  %{python_module jupyter-client >= 7.1.1}
+BuildRequires:  %{python_module pytest-timeout}
+%endif
+Requires:       python >= 3.7
 Requires:       python-Jinja2
 Requires:       python-Send2Trash
 Requires:       python-anyio >= 3.1.0
 Requires:       python-argon2-cffi
 Requires:       python-ipython_genutils
 Requires:       python-jupyter-client >= 6.1.1
-Requires:       python-jupyter-core >= 4.4.0
+Requires:       python-jupyter-core >= 4.6.0
 Requires:       python-nbconvert
 Requires:       python-nbformat
+Requires:       python-packaging
 Requires:       python-prometheus_client
 Requires:       python-pyzmq >= 17
 Requires:       python-terminado >= 0.8.3
 Requires:       python-tornado >= 6.1
-Requires:       python-traitlets >= 4.2.1
+Requires:       python-traitlets >= 5
 Requires:       python-websocket-client
 %if %{with libalternatives}
 Requires:       alts
@@ -74,9 +82,6 @@
 %endif
 Provides:       python-jupyter_server = %{version}-%{release}
 Obsoletes:      python-jupyter_server < %{version}-%{release}
-%if %{with test}
-BuildRequires:  %{python_module jupyter-server-test = %{version}}
-%endif
 %if "%{python_flavor}" == "python3" || "%{python_provides}" == "python3"
 Provides:       jupyter-jupyter-server = %{version}-%{release}
 Obsoletes:      jupyter-jupyter-server < %{version}-%{release}
@@ -141,7 +146,7 @@
     echo "WARNING: Not a clean test environment."
     echo "You might need to delete ~/.local/share/jupyter in order to avoid 
test failures."
 fi
-%pytest jupyter_server
+%pytest jupyter_server --timeout 60 -p no:threadexception -p 
no:unraisableexception
 %endif
 
 %if ! %{with test}

++++++ jupyter_server-1.13.1.tar.gz -> jupyter_server-1.13.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/CHANGELOG.md 
new/jupyter_server-1.13.3/CHANGELOG.md
--- old/jupyter_server-1.13.1/CHANGELOG.md      2021-12-09 20:36:05.000000000 
+0100
+++ new/jupyter_server-1.13.3/CHANGELOG.md      2022-01-14 19:51:53.000000000 
+0100
@@ -4,6 +4,53 @@
 
 <!-- <START NEW CHANGELOG ENTRY> -->
 
+## 1.13.3
+
+([Full 
Changelog](https://github.com/jupyter-server/jupyter_server/compare/v1.13.2...ee01e1955c8881b46075c78f1fbc932fa234bc72))
+
+### Enhancements made
+
+- More updates to unit tests for pending kernels work 
[#662](https://github.com/jupyter-server/jupyter_server/pull/662) 
([@Zsailer](https://github.com/Zsailer))
+
+### Bugs fixed
+
+- bump traitlets dependency 
[#663](https://github.com/jupyter-server/jupyter_server/pull/663) 
([@Zsailer](https://github.com/Zsailer))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter-server/jupyter_server/graphs/contributors?from=2022-01-12&to=2022-01-14&type=c))
+
+[@Zsailer](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3AZsailer+updated%3A2022-01-12..2022-01-14&type=Issues)
+
+<!-- <END NEW CHANGELOG ENTRY> -->
+
+## 1.13.2
+
+([Full 
Changelog](https://github.com/jupyter-server/jupyter_server/compare/v1.13.1...362d100ff24c1da7ef4cbd171c213e9570e8c289))
+
+### Enhancements made
+
+- Don't block the event loop when exporting with nbconvert 
[#655](https://github.com/jupyter-server/jupyter_server/pull/655) 
([@davidbrochart](https://github.com/davidbrochart))
+- Add more awaits for pending kernel in unit tests 
[#654](https://github.com/jupyter-server/jupyter_server/pull/654) 
([@Zsailer](https://github.com/Zsailer))
+- Print IPv6 url as hostname or enclosed in brackets 
[#652](https://github.com/jupyter-server/jupyter_server/pull/652) 
([@op3](https://github.com/op3))
+
+### Bugs fixed
+
+- Run pre_save_hook before model check 
[#643](https://github.com/jupyter-server/jupyter_server/pull/643) 
([@davidbrochart](https://github.com/davidbrochart))
+- handle KeyError when get session 
[#641](https://github.com/jupyter-server/jupyter_server/pull/641) 
([@ccw630](https://github.com/ccw630))
+
+### Maintenance and upkeep improvements
+
+- Clean up deprecations 
[#650](https://github.com/jupyter-server/jupyter_server/pull/650) 
([@blink1073](https://github.com/blink1073))
+- Update branch references 
[#646](https://github.com/jupyter-server/jupyter_server/pull/646) 
([@blink1073](https://github.com/blink1073))
+- pyproject.toml: clarify build system version 
[#634](https://github.com/jupyter-server/jupyter_server/pull/634) 
([@adamjstewart](https://github.com/adamjstewart))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter-server/jupyter_server/graphs/contributors?from=2021-12-09&to=2022-01-12&type=c))
+
+[@adamjstewart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Aadamjstewart+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@blink1073](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Ablink1073+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@ccw630](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Accw630+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@codecov-commenter](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Acodecov-commenter+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Adavidbrochart+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@echarles](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Aecharles+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@fcollonval](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+
 involves%3Afcollonval+updated%3A2021-12-09..2022-01-12&type=Issues) | 
[@kevin-bates](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Akevin-bates+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@op3](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Aop3+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@welcome](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Awelcome+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@Wh1isper](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3AWh1isper+updated%3A2021-12-09..2022-01-12&type=Issues)
 | 
[@Zsailer](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3AZsailer+updated%3A2021-12-09..2022-01-12&type=Issues)
+
 ## 1.13.1
 
 ([Full 
Changelog](https://github.com/jupyter-server/jupyter_server/compare/v1.13.0...affd5d9a2e6d718baa2185518256f51921fd4484))
@@ -22,8 +69,6 @@
 
 
[@blink1073](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Ablink1073+updated%3A2021-12-06..2021-12-09&type=Issues)
 | 
[@codecov-commenter](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3Acodecov-commenter+updated%3A2021-12-06..2021-12-09&type=Issues)
 | 
[@Zsailer](https://github.com/search?q=repo%3Ajupyter-server%2Fjupyter_server+involves%3AZsailer+updated%3A2021-12-06..2021-12-09&type=Issues)
 
-<!-- <END NEW CHANGELOG ENTRY> -->
-
 ## 1.13.0
 
 ([Full 
Changelog](https://github.com/jupyter-server/jupyter_server/compare/v1.12.1...b51969f16f04375d52cb029d72f90174141c760d))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/CONTRIBUTING.rst 
new/jupyter_server-1.13.3/CONTRIBUTING.rst
--- old/jupyter_server-1.13.1/CONTRIBUTING.rst  2021-12-09 20:36:05.000000000 
+0100
+++ new/jupyter_server-1.13.3/CONTRIBUTING.rst  2022-01-14 19:51:53.000000000 
+0100
@@ -32,7 +32,7 @@
 If you are using a system-wide Python installation and you only want to 
install the server for you,
 you can add ``--user`` to the install commands.
 
-Once you have done this, you can launch the master branch of Jupyter server
+Once you have done this, you can launch the main branch of Jupyter server
 from any directory in your system with::
 
     jupyter server
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/PKG-INFO 
new/jupyter_server-1.13.3/PKG-INFO
--- old/jupyter_server-1.13.1/PKG-INFO  2021-12-09 20:36:35.956748700 +0100
+++ new/jupyter_server-1.13.3/PKG-INFO  2022-01-14 19:52:27.960275700 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: jupyter_server
-Version: 1.13.1
+Version: 1.13.3
 Summary: The backend???i.e. core services, APIs, and REST endpoints???to 
Jupyter web applications.
 Home-page: https://jupyter.org
 Author: Jupyter Development Team
@@ -15,18 +15,18 @@
 Classifier: Intended Audience :: Science/Research
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
-Requires-Python: >=3.6
+Classifier: Programming Language :: Python :: 3.10
+Requires-Python: >=3.7
 Description-Content-Type: text/markdown
 Provides-Extra: test
 License-File: COPYING.md
 
 # Jupyter Server
 
-[![Build 
Status](https://github.com/jupyter/jupyter_server/workflows/CI/badge.svg?query=branch%3Amaster++)](https://github.com/jupyter-server/jupyter_server/actions?query=branch%3Amaster++)
+[![Build 
Status](https://github.com/jupyter/jupyter_server/workflows/CI/badge.svg?query=branch%3Amain++)](https://github.com/jupyter-server/jupyter_server/actions?query=branch%3Amain++)
 [![Documentation 
Status](https://readthedocs.org/projects/jupyter-server/badge/?version=latest)](http://jupyter-server.readthedocs.io/en/latest/?badge=latest)
 
 The Jupyter Server provides the backend (i.e. the core services, APIs, and 
REST endpoints) for Jupyter web applications like Jupyter notebook, JupyterLab, 
and Voila.
@@ -46,9 +46,9 @@
 
 If Jupyter Server is a dependency of your project/application, it is important 
that you pin it to a version that works for your application. Currently, 
Jupyter Server only has minor and patch versions. Different minor versions 
likely include API-changes while patch versions do not change API.
 
-When a new minor version is released on PyPI, a branch for that version will 
be created in this repository, and the version of the master branch will be 
bumped to the next minor version number. That way, the master branch always 
reflects the latest un-released version.
+When a new minor version is released on PyPI, a branch for that version will 
be created in this repository, and the version of the main branch will be 
bumped to the next minor version number. That way, the main branch always 
reflects the latest un-released version.
 
-To see the changes between releases, checkout the 
[CHANGELOG](https://github.com/jupyter/jupyter_server/blob/master/CHANGELOG.md).
+To see the changes between releases, checkout the 
[CHANGELOG](https://github.com/jupyter/jupyter_server/blob/main/CHANGELOG.md).
 
 ## Usage - Running Jupyter Server
 
@@ -60,7 +60,7 @@
 
 ### Testing
 
-See 
[CONTRIBUTING](https://github.com/jupyter-server/jupyter_server/blob/master/CONTRIBUTING.rst#running-tests).
+See 
[CONTRIBUTING](https://github.com/jupyter-server/jupyter_server/blob/main/CONTRIBUTING.rst#running-tests).
 
 ## Contributing
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/README.md 
new/jupyter_server-1.13.3/README.md
--- old/jupyter_server-1.13.1/README.md 2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/README.md 2022-01-14 19:51:53.000000000 +0100
@@ -1,6 +1,6 @@
 # Jupyter Server
 
-[![Build 
Status](https://github.com/jupyter/jupyter_server/workflows/CI/badge.svg?query=branch%3Amaster++)](https://github.com/jupyter-server/jupyter_server/actions?query=branch%3Amaster++)
+[![Build 
Status](https://github.com/jupyter/jupyter_server/workflows/CI/badge.svg?query=branch%3Amain++)](https://github.com/jupyter-server/jupyter_server/actions?query=branch%3Amain++)
 [![Documentation 
Status](https://readthedocs.org/projects/jupyter-server/badge/?version=latest)](http://jupyter-server.readthedocs.io/en/latest/?badge=latest)
 
 The Jupyter Server provides the backend (i.e. the core services, APIs, and 
REST endpoints) for Jupyter web applications like Jupyter notebook, JupyterLab, 
and Voila.
@@ -20,9 +20,9 @@
 
 If Jupyter Server is a dependency of your project/application, it is important 
that you pin it to a version that works for your application. Currently, 
Jupyter Server only has minor and patch versions. Different minor versions 
likely include API-changes while patch versions do not change API.
 
-When a new minor version is released on PyPI, a branch for that version will 
be created in this repository, and the version of the master branch will be 
bumped to the next minor version number. That way, the master branch always 
reflects the latest un-released version.
+When a new minor version is released on PyPI, a branch for that version will 
be created in this repository, and the version of the main branch will be 
bumped to the next minor version number. That way, the main branch always 
reflects the latest un-released version.
 
-To see the changes between releases, checkout the 
[CHANGELOG](https://github.com/jupyter/jupyter_server/blob/master/CHANGELOG.md).
+To see the changes between releases, checkout the 
[CHANGELOG](https://github.com/jupyter/jupyter_server/blob/main/CHANGELOG.md).
 
 ## Usage - Running Jupyter Server
 
@@ -34,7 +34,7 @@
 
 ### Testing
 
-See 
[CONTRIBUTING](https://github.com/jupyter-server/jupyter_server/blob/master/CONTRIBUTING.rst#running-tests).
+See 
[CONTRIBUTING](https://github.com/jupyter-server/jupyter_server/blob/main/CONTRIBUTING.rst#running-tests).
 
 ## Contributing
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/docs/environment.yml 
new/jupyter_server-1.13.3/docs/environment.yml
--- old/jupyter_server-1.13.1/docs/environment.yml      2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/docs/environment.yml      2022-01-14 
19:51:53.000000000 +0100
@@ -1,7 +1,7 @@
 name: jupyter_server_docs
 dependencies:
-  - nodejs=14
-  - python=3.8
+  - nodejs
+  - python
   - pip
   - pip:
       - -r doc-requirements.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/docs/source/conf.py 
new/jupyter_server-1.13.3/docs/source/conf.py
--- old/jupyter_server-1.13.1/docs/source/conf.py       2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/docs/source/conf.py       2022-01-14 
19:51:53.000000000 +0100
@@ -17,6 +17,9 @@
 import shutil
 import sys
 
+from pkg_resources import parse_version
+
+
 HERE = osp.abspath(osp.dirname(__file__))
 
 
@@ -106,13 +109,10 @@
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
-_version_py = "../../jupyter_server/_version.py"
-version_ns = {}
-exec(compile(open(_version_py).read(), _version_py, "exec"), version_ns)
+__version__ = "1.14.0.dev0"
 # The short X.Y version.
-version = "%i.%i" % version_ns["version_info"][:2]
-# The full version, including alpha/beta/rc tags.
-release = version_ns["__version__"]
+version_parsed = parse_version(__version__)
+version = f"{version_parsed.major}.{version_parsed.minor}"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -336,7 +336,7 @@
 
 # -- Options for link checks ----------------------------------------------
 
-linkcheck_ignore = ["http://127\.0\.0\.1/*";]
+linkcheck_ignore = [r"http://127\.0\.0\.1/*";]
 
 
 # -- Options for Texinfo output -------------------------------------------
@@ -379,7 +379,7 @@
 spelling_word_list_filename = "spelling_wordlist.txt"
 
 # import before any doc is built, so _ is guaranteed to be injected
-import jupyter_server.transutils  # pylint: disable=unused-import
+import jupyter_server.transutils  # noqa: F401
 
 
 def setup(app):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/docs/source/developers/extensions.rst 
new/jupyter_server-1.13.3/docs/source/developers/extensions.rst
--- old/jupyter_server-1.13.1/docs/source/developers/extensions.rst     
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/docs/source/developers/extensions.rst     
2022-01-14 19:51:53.000000000 +0100
@@ -5,7 +5,7 @@
 A Jupyter Server extension is typically a module or package that extends to 
Server???s REST API/endpoints???i.e. adds extra request handlers to Server???s 
Tornado Web Application.
 
 You can check some simple examples on the `examples folder
-<https://github.com/jupyter/jupyter_server/tree/master/examples/simple>`_ in 
the GitHub jupyter_server repository.
+<https://github.com/jupyter/jupyter_server/tree/main/examples/simple>`_ in the 
GitHub jupyter_server repository.
 
 Authoring a basic server extension
 ==================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/docs/source/index.rst 
new/jupyter_server-1.13.3/docs/source/index.rst
--- old/jupyter_server-1.13.1/docs/source/index.rst     2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/docs/source/index.rst     2022-01-14 
19:51:53.000000000 +0100
@@ -19,7 +19,7 @@
 
 .. _Tornado: https://www.tornadoweb.org/en/stable/
 .. _Jupyter Notebook: https://github.com/jupyter/notebook
-.. _REST endpoints: 
https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyter_server/master/jupyter_server/services/api/api.yaml
+.. _REST endpoints: 
https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyter_server/main/jupyter_server/services/api/api.yaml
 
 Who's this for?
 ---------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/examples/simple/conftest.py 
new/jupyter_server-1.13.3/examples/simple/conftest.py
--- old/jupyter_server-1.13.1/examples/simple/conftest.py       2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/examples/simple/conftest.py       2022-01-14 
19:51:53.000000000 +0100
@@ -1 +1 @@
-from jupyter_server.conftest import *
+from jupyter_server.conftest import *  # noqa
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/examples/simple/setup.py 
new/jupyter_server-1.13.3/examples/simple/setup.py
--- old/jupyter_server-1.13.1/examples/simple/setup.py  2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/examples/simple/setup.py  2022-01-14 
19:51:53.000000000 +0100
@@ -34,7 +34,7 @@
     version=VERSION,
     description="Jupyter Server Example",
     long_description=open("README.md").read(),
-    python_requires=">=3.6",
+    python_requires=">=3.7",
     install_requires=[
         "jupyter_server",
         "jinja2",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/jupyter_server/__init__.py 
new/jupyter_server-1.13.3/jupyter_server/__init__.py
--- old/jupyter_server-1.13.1/jupyter_server/__init__.py        2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/__init__.py        2022-01-14 
19:51:53.000000000 +0100
@@ -13,7 +13,7 @@
 
 del os
 
-from ._version import version_info, __version__
+from ._version import version_info, __version__  # noqa
 
 
 def _cleanup():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/jupyter_server/_version.py 
new/jupyter_server-1.13.3/jupyter_server/_version.py
--- old/jupyter_server-1.13.1/jupyter_server/_version.py        2021-12-09 
20:36:21.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/_version.py        2022-01-14 
19:52:13.000000000 +0100
@@ -2,5 +2,5 @@
 store the current version info of the server.
 
 """
-version_info = (1, 13, 1, "", "")
+version_info = (1, 13, 3, "", "")
 __version__ = ".".join(map(str, version_info[:3])) + "".join(version_info[3:])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/auth/__init__.py 
new/jupyter_server-1.13.3/jupyter_server/auth/__init__.py
--- old/jupyter_server-1.13.1/jupyter_server/auth/__init__.py   2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/auth/__init__.py   2022-01-14 
19:51:53.000000000 +0100
@@ -1 +1 @@
-from .security import passwd
+from .security import passwd  # noqa
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/gateway/gateway_client.py 
new/jupyter_server-1.13.3/jupyter_server/gateway/gateway_client.py
--- old/jupyter_server-1.13.1/jupyter_server/gateway/gateway_client.py  
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/gateway/gateway_client.py  
2022-01-14 19:51:53.000000000 +0100
@@ -232,7 +232,7 @@
         default_value=None,
         allow_none=True,
         config=True,
-        help="""The authorization token used in the HTTP headers. The header 
will be formatted as:
+        help="""The authorization token used in the HTTP headers. The header 
will be formatted as::
 
             {
                 'Authorization': '{auth_scheme} {auth_token}'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/nbconvert/handlers.py 
new/jupyter_server-1.13.3/jupyter_server/nbconvert/handlers.py
--- old/jupyter_server-1.13.1/jupyter_server/nbconvert/handlers.py      
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/nbconvert/handlers.py      
2022-01-14 19:51:53.000000000 +0100
@@ -5,6 +5,7 @@
 import os
 import zipfile
 
+from anyio.to_thread import run_sync
 from ipython_genutils import text
 from ipython_genutils.py3compat import cast_bytes
 from nbformat import from_dict
@@ -115,8 +116,11 @@
         if ext_resources_dir:
             resource_dict["metadata"]["path"] = ext_resources_dir
 
+        # Exporting can take a while, delegate to a thread so we don't block 
the event loop
         try:
-            output, resources = exporter.from_notebook_node(nb, 
resources=resource_dict)
+            output, resources = await run_sync(
+                exporter.from_notebook_node(nb, resources=resource_dict)
+            )
         except Exception as e:
             self.log.exception("nbconvert failed: %s", e)
             raise web.HTTPError(500, "nbconvert failed: %s" % e) from e
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/prometheus/metrics.py 
new/jupyter_server-1.13.3/jupyter_server/prometheus/metrics.py
--- old/jupyter_server-1.13.1/jupyter_server/prometheus/metrics.py      
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/prometheus/metrics.py      
2022-01-14 19:51:53.000000000 +0100
@@ -9,7 +9,6 @@
     # Jupyter Notebook also defines these metrics.  Re-defining them results 
in a ValueError.
     # Try to de-duplicate by using the ones in Notebook if available.
     # See https://github.com/jupyter/jupyter_server/issues/209
-    # pylint: disable=unused-import
     from notebook.prometheus.metrics import (
         HTTP_REQUEST_DURATION_SECONDS,
         TERMINAL_CURRENTLY_RUNNING_TOTAL,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/jupyter_server/serverapp.py 
new/jupyter_server-1.13.3/jupyter_server/serverapp.py
--- old/jupyter_server-1.13.1/jupyter_server/serverapp.py       2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/serverapp.py       2022-01-14 
19:51:53.000000000 +0100
@@ -285,7 +285,7 @@
         env.install_gettext_translations(nbui, newstyle=False)
 
         if sys_info["commit_source"] == "repository":
-            # don't cache (rely on 304) when working from master
+            # don't cache (rely on 304) when working from default branch
             version_hash = ""
         else:
             # reset the cache on server restart
@@ -486,7 +486,6 @@
     Returns True if the server was stopped by any means, False if stopping it
     failed (on Windows).
     """
-    from tornado.httpclient import HTTPClient, HTTPRequest
 
     url = server_info["url"]
     pid = server_info["pid"]
@@ -1901,10 +1900,10 @@
             netloc = urlencode_unix_socket_path(self.sock)
         else:
             # Handle nonexplicit hostname.
-            if self.ip in ("", "0.0.0.0"):
+            if self.ip in ("", "0.0.0.0", "::"):
                 ip = "%s" % socket.gethostname()
             else:
-                ip = self.ip
+                ip = "[{}]".format(self.ip) if ":" in self.ip else self.ip
             netloc = "{ip}:{port}".format(ip=ip, port=self.port)
             if self.certfile:
                 scheme = "https"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/services/config/__init__.py 
new/jupyter_server-1.13.3/jupyter_server/services/config/__init__.py
--- old/jupyter_server-1.13.1/jupyter_server/services/config/__init__.py        
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/services/config/__init__.py        
2022-01-14 19:51:53.000000000 +0100
@@ -1 +1 @@
-from .manager import ConfigManager
+from .manager import ConfigManager  # noqa
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/services/contents/filemanager.py 
new/jupyter_server-1.13.3/jupyter_server/services/contents/filemanager.py
--- old/jupyter_server-1.13.1/jupyter_server/services/contents/filemanager.py   
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/services/contents/filemanager.py   
2022-01-14 19:51:53.000000000 +0100
@@ -433,6 +433,8 @@
         """Save the file model and return the model with no content."""
         path = path.strip("/")
 
+        self.run_pre_save_hook(model=model, path=path)
+
         if "type" not in model:
             raise web.HTTPError(400, u"No file type provided")
         if "content" not in model and model["type"] != "directory":
@@ -441,8 +443,6 @@
         os_path = self._get_os_path(path)
         self.log.debug("Saving %s", os_path)
 
-        self.run_pre_save_hook(model=model, path=path)
-
         try:
             if model["type"] == "notebook":
                 nb = nbformat.from_dict(model["content"])
@@ -757,16 +757,15 @@
         """Save the file model and return the model with no content."""
         path = path.strip("/")
 
+        os_path = self._get_os_path(path)
+        self.log.debug("Saving %s", os_path)
+        self.run_pre_save_hook(model=model, path=path)
+
         if "type" not in model:
             raise web.HTTPError(400, u"No file type provided")
         if "content" not in model and model["type"] != "directory":
             raise web.HTTPError(400, u"No file content provided")
 
-        os_path = self._get_os_path(path)
-        self.log.debug("Saving %s", os_path)
-
-        self.run_pre_save_hook(model=model, path=path)
-
         try:
             if model["type"] == "notebook":
                 nb = nbformat.from_dict(model["content"])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/services/contents/largefilemanager.py 
new/jupyter_server-1.13.3/jupyter_server/services/contents/largefilemanager.py
--- 
old/jupyter_server-1.13.1/jupyter_server/services/contents/largefilemanager.py  
    2021-12-09 20:36:05.000000000 +0100
+++ 
new/jupyter_server-1.13.3/jupyter_server/services/contents/largefilemanager.py  
    2022-01-14 19:51:53.000000000 +0100
@@ -18,6 +18,8 @@
         if chunk is not None:
             path = path.strip("/")
 
+            self.run_pre_save_hook(model=model, path=path)
+
             if "type" not in model:
                 raise web.HTTPError(400, u"No file type provided")
             if model["type"] != "file":
@@ -31,11 +33,10 @@
                 raise web.HTTPError(400, u"No file content provided")
 
             os_path = self._get_os_path(path)
+            self.log.debug("Saving %s", os_path)
 
             try:
                 if chunk == 1:
-                    self.log.debug("Saving %s", os_path)
-                    self.run_pre_save_hook(model=model, path=path)
                     super(LargeFileManager, self)._save_file(
                         os_path, model["content"], model.get("format")
                     )
@@ -90,6 +91,10 @@
         if chunk is not None:
             path = path.strip("/")
 
+            os_path = self._get_os_path(path)
+            self.log.debug("Saving %s", os_path)
+            self.run_pre_save_hook(model=model, path=path)
+
             if "type" not in model:
                 raise web.HTTPError(400, u"No file type provided")
             if model["type"] != "file":
@@ -102,12 +107,8 @@
             if "content" not in model and model["type"] != "directory":
                 raise web.HTTPError(400, u"No file content provided")
 
-            os_path = self._get_os_path(path)
-
             try:
                 if chunk == 1:
-                    self.log.debug("Saving %s", os_path)
-                    self.run_pre_save_hook(model=model, path=path)
                     await super(AsyncLargeFileManager, self)._save_file(
                         os_path, model["content"], model.get("format")
                     )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/services/sessions/sessionmanager.py 
new/jupyter_server-1.13.3/jupyter_server/services/sessions/sessionmanager.py
--- 
old/jupyter_server-1.13.1/jupyter_server/services/sessions/sessionmanager.py    
    2021-12-09 20:36:05.000000000 +0100
+++ 
new/jupyter_server-1.13.3/jupyter_server/services/sessions/sessionmanager.py    
    2022-01-14 19:51:53.000000000 +0100
@@ -216,7 +216,10 @@
 
             raise web.HTTPError(404, u"Session not found: %s" % (", ".join(q)))
 
-        model = await self.row_to_model(row)
+        try:
+            model = await self.row_to_model(row)
+        except KeyError as e:
+            raise web.HTTPError(404, u"Session not found: %s" % str(e))
         return model
 
     async def update_session(self, session_id, **kwargs):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/tests/services/kernels/test_api.py 
new/jupyter_server-1.13.3/jupyter_server/tests/services/kernels/test_api.py
--- old/jupyter_server-1.13.1/jupyter_server/tests/services/kernels/test_api.py 
2021-12-09 20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/tests/services/kernels/test_api.py 
2022-01-14 19:51:53.000000000 +0100
@@ -11,15 +11,27 @@
 from jupyter_server.utils import url_path_join
 
 
-class TestMappingKernelManager(AsyncMappingKernelManager):
+class DummyMappingKernelManager(AsyncMappingKernelManager):
     """A no-op subclass to use in a fixture"""
 
 
[email protected]
+def pending_kernel_is_ready(jp_serverapp):
+    async def _(kernel_id):
+        km = jp_serverapp.kernel_manager
+        if getattr(km, "use_pending_kernels", False):
+            kernel = km.get_kernel(kernel_id)
+            if getattr(kernel, "ready"):
+                await kernel.ready
+
+    return _
+
+
 @pytest.fixture(
-    params=["MappingKernelManager", "AsyncMappingKernelManager", 
"TestMappingKernelManager"]
+    params=["MappingKernelManager", "AsyncMappingKernelManager", 
"DummyMappingKernelManager"]
 )
 def jp_argv(request):
-    if request.param == "TestMappingKernelManager":
+    if request.param == "DummyMappingKernelManager":
         extra = []
         if hasattr(AsyncMappingKernelManager, "use_pending_kernels"):
             extra = ["--AsyncMappingKernelManager.use_pending_kernels=True"]
@@ -54,7 +66,9 @@
     await jp_cleanup_subprocesses()
 
 
-async def test_main_kernel_handler(jp_fetch, jp_base_url, 
jp_cleanup_subprocesses, jp_serverapp):
+async def test_main_kernel_handler(
+    jp_fetch, jp_base_url, jp_cleanup_subprocesses, jp_serverapp, 
pending_kernel_is_ready
+):
     # Start the first kernel
     r = await jp_fetch(
         "api", "kernels", method="POST", body=json.dumps({"name": 
NATIVE_KERNEL_NAME})
@@ -93,16 +107,14 @@
     assert len(kernel_list) == 2
 
     # Interrupt a kernel
+    await pending_kernel_is_ready(kernel2["id"])
     r = await jp_fetch(
         "api", "kernels", kernel2["id"], "interrupt", method="POST", 
allow_nonstandard_methods=True
     )
     assert r.code == 204
 
     # Restart a kernel
-    kernel = jp_serverapp.kernel_manager.get_kernel(kernel2["id"])
-    if hasattr(kernel, "ready"):
-        await kernel.ready
-
+    await pending_kernel_is_ready(kernel2["id"])
     r = await jp_fetch(
         "api", "kernels", kernel2["id"], "restart", method="POST", 
allow_nonstandard_methods=True
     )
@@ -122,7 +134,7 @@
     await jp_cleanup_subprocesses()
 
 
-async def test_kernel_handler(jp_fetch, jp_cleanup_subprocesses):
+async def test_kernel_handler(jp_fetch, jp_cleanup_subprocesses, 
pending_kernel_is_ready):
     # Create a kernel
     r = await jp_fetch(
         "api", "kernels", method="POST", body=json.dumps({"name": 
NATIVE_KERNEL_NAME})
@@ -142,6 +154,7 @@
     assert expected_http_error(e, 404)
 
     # Delete kernel with id.
+    await pending_kernel_is_ready(kernel_id)
     r = await jp_fetch(
         "api",
         "kernels",
@@ -151,6 +164,11 @@
     assert r.code == 204
 
     # Get list of kernels
+    try:
+        await pending_kernel_is_ready(kernel_id)
+    # If the kernel is already deleted, no need to await.
+    except tornado.web.HTTPError:
+        pass
     r = await jp_fetch("api", "kernels", method="GET")
     kernel_list = json.loads(r.body.decode())
     assert kernel_list == []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/tests/services/sessions/test_api.py 
new/jupyter_server-1.13.3/jupyter_server/tests/services/sessions/test_api.py
--- 
old/jupyter_server-1.13.1/jupyter_server/tests/services/sessions/test_api.py    
    2021-12-09 20:36:05.000000000 +0100
+++ 
new/jupyter_server-1.13.3/jupyter_server/tests/services/sessions/test_api.py    
    2022-01-14 19:51:53.000000000 +0100
@@ -114,6 +114,24 @@
 
 
 @pytest.fixture
+def session_is_ready(jp_serverapp):
+    """Wait for the kernel started by a session to be ready.
+
+    This is useful when working with pending kernels.
+    """
+
+    async def _(session_id):
+        sm = jp_serverapp.session_manager
+        mkm = jp_serverapp.kernel_manager
+        session = await sm.get_session(session_id=session_id)
+        kernel_id = session["kernel"]["id"]
+        kernel = mkm.get_kernel(kernel_id)
+        await kernel.ready
+
+    return _
+
+
[email protected]
 def session_client(jp_root_dir, jp_fetch):
     subdir = jp_root_dir.joinpath("foo")
     subdir.mkdir()
@@ -156,7 +174,9 @@
     assert_kernel_equality(actual["kernel"], expected["kernel"])
 
 
-async def test_create(session_client, jp_base_url, jp_cleanup_subprocesses, 
jp_serverapp):
+async def test_create(
+    session_client, jp_base_url, jp_cleanup_subprocesses, jp_serverapp, 
session_is_ready
+):
     # Make sure no sessions exist.
     resp = await session_client.list()
     sessions = j(resp)
@@ -197,7 +217,6 @@
     assert_session_equality(got, new_session)
 
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -218,7 +237,6 @@
         await session_client.create("foo/nb1.ipynb")
 
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -251,7 +269,6 @@
         assert "non_existent_path" in session["kernel"]["reason"]
 
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -261,7 +278,6 @@
     newsession = j(resp)
     assert newsession["path"] == "foo/nb1.py"
     assert newsession["type"] == "file"
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -272,7 +288,6 @@
     assert newsession["path"] == "foo/abc123"
     assert newsession["type"] == "console"
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -284,7 +299,6 @@
     assert newsession["type"] == "notebook"
     assert newsession["notebook"]["path"] == "foo/nb1.ipynb"
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -316,7 +330,6 @@
     got = j(resp)
     assert_session_equality(got, new_session)
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -327,14 +340,15 @@
     # TODO
     assert newsession["path"] == "foo/nb1.py"
     assert newsession["type"] == "file"
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
-async def test_delete(session_client, jp_cleanup_subprocesses, jp_serverapp):
+async def test_delete(session_client, jp_cleanup_subprocesses, jp_serverapp, 
session_is_ready):
     resp = await session_client.create("foo/nb1.ipynb")
+
     newsession = j(resp)
     sid = newsession["id"]
+    await session_is_ready(sid)
 
     resp = await session_client.delete(sid)
     assert resp.code == 204
@@ -347,7 +361,6 @@
         await session_client.get(sid)
     assert expected_http_error(e, 404)
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -361,7 +374,6 @@
     assert changed["id"] == sid
     assert changed["path"] == "nb2.ipynb"
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -375,7 +387,6 @@
     assert changed["id"] == sid
     assert changed["notebook"]["path"] == "nb2.ipynb"
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -389,7 +400,6 @@
     assert changed["id"] == sid
     assert changed["type"] == "console"
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -414,7 +424,6 @@
         assert kernel_list == [after["kernel"]]
 
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -446,7 +455,6 @@
         assert kernel_list == [kernel]
 
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
 
 
@@ -509,5 +517,4 @@
     assert model["connections"] == 1
 
     # Need to find a better solution to this.
-    await session_client.cleanup()
     await jp_cleanup_subprocesses()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server/tests/services/sessions/test_manager.py
 
new/jupyter_server-1.13.3/jupyter_server/tests/services/sessions/test_manager.py
--- 
old/jupyter_server-1.13.1/jupyter_server/tests/services/sessions/test_manager.py
    2021-12-09 20:36:05.000000000 +0100
+++ 
new/jupyter_server-1.13.3/jupyter_server/tests/services/sessions/test_manager.py
    2022-01-14 19:51:53.000000000 +0100
@@ -91,7 +91,7 @@
     )
     # Kill the kernel
     await 
session_manager.kernel_manager.shutdown_kernel(session["kernel"]["id"])
-    with pytest.raises(KeyError):
+    with pytest.raises(web.HTTPError):
         await session_manager.get_session(session_id=session["id"])
     # no session left
     listed = await session_manager.list_sessions()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/jupyter_server/traittypes.py 
new/jupyter_server-1.13.3/jupyter_server/traittypes.py
--- old/jupyter_server-1.13.1/jupyter_server/traittypes.py      2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/traittypes.py      2022-01-14 
19:51:53.000000000 +0100
@@ -4,153 +4,7 @@
 from traitlets import ClassBasedTraitType
 from traitlets import TraitError
 from traitlets import Undefined
-
-# Traitlet's 5.x includes a set of utilities for building
-# description strings for objects. Traitlets 5.x does not
-# support Python 3.6, but jupyter_server does; instead
-# jupyter_server uses traitlets 4.3.x which doesn't have
-# this `descriptions` submodule. This chunk in the except
-# clause is a copy-and-paste from traitlets 5.0.5.
-try:
-    from traitlets.utils.descriptions import describe
-except ImportError:
-    import re
-    import types
-
-    def describe(article, value, name=None, verbose=False, capital=False):
-        """Return string that describes a value
-        Parameters
-        ----------
-        article : str or None
-            A definite or indefinite article. If the article is
-            indefinite (i.e. "a" or "an") the appropriate one
-            will be infered. Thus, the arguments of ``describe``
-            can themselves represent what the resulting string
-            will actually look like. If None, then no article
-            will be prepended to the result. For non-articled
-            description, values that are instances are treated
-            definitely, while classes are handled indefinitely.
-        value : any
-            The value which will be named.
-        name : str or None (default: None)
-            Only applies when ``article`` is "the" - this
-            ``name`` is a definite reference to the value.
-            By default one will be infered from the value's
-            type and repr methods.
-        verbose : bool (default: False)
-            Whether the name should be concise or verbose. When
-            possible, verbose names include the module, and/or
-            class name where an object was defined.
-        capital : bool (default: False)
-            Whether the first letter of the article should
-            be capitalized or not. By default it is not.
-        Examples
-        --------
-        Indefinite description:
-        >>> describe("a", object())
-        'an object'
-        >>> describe("a", object)
-        'an object'
-        >>> describe("a", type(object))
-        'a type'
-
-        Definite description:
-        >>> describe("the", object())  # doctest: +ELLIPSIS
-        "the object at '0x...'"
-        >>> describe("the", object)
-        'the object object'
-        >>> describe("the", type(object))
-        'the type type'
-
-        Definitely named description:
-        >>> describe("the", object(), "I made")
-        'the object I made'
-        >>> describe("the", object, "I will use")
-        'the object I will use'
-        """
-        if isinstance(article, str):
-            article = article.lower()
-
-        if not inspect.isclass(value):
-            typename = type(value).__name__
-        else:
-            typename = value.__name__
-        if verbose:
-            typename = _prefix(value) + typename
-
-        if article == "the" or (article is None and not 
inspect.isclass(value)):
-            if name is not None:
-                result = "{} {}".format(typename, name)
-                if article is not None:
-                    return add_article(result, True, capital)
-                else:
-                    return result
-            else:
-                tick_wrap = False
-                if inspect.isclass(value):
-                    name = value.__name__
-                elif isinstance(value, types.FunctionType):
-                    name = value.__name__
-                    tick_wrap = True
-                elif isinstance(value, types.MethodType):
-                    name = value.__func__.__name__
-                    tick_wrap = True
-                elif type(value).__repr__ in (object.__repr__, type.__repr__):
-                    name = "at '%s'" % hex(id(value))
-                    verbose = False
-                else:
-                    name = repr(value)
-                    verbose = False
-                if verbose:
-                    name = _prefix(value) + name
-                if tick_wrap:
-                    name = name.join("''")
-                return describe(article, value, name=name, verbose=verbose, 
capital=capital)
-        elif article in ("a", "an") or article is None:
-            if article is None:
-                return typename
-            return add_article(typename, False, capital)
-        else:
-            raise ValueError(
-                "The 'article' argument should " "be 'the', 'a', 'an', or None 
not %r" % article
-            )
-
-    def add_article(name, definite=False, capital=False):
-        """Returns the string with a prepended article.
-        The input does not need to begin with a charater.
-        Parameters
-        ----------
-        definite : bool (default: False)
-            Whether the article is definite or not.
-            Indefinite articles being 'a' and 'an',
-            while 'the' is definite.
-        capital : bool (default: False)
-            Whether the added article should have
-            its first letter capitalized or not.
-        """
-        if definite:
-            result = "the " + name
-        else:
-            first_letters = re.compile(r"[\W_]+").sub("", name)
-            if first_letters[:1].lower() in "aeiou":
-                result = "an " + name
-            else:
-                result = "a " + name
-        if capital:
-            return result[0].upper() + result[1:]
-        else:
-            return result
-
-    def _prefix(value):
-        if isinstance(value, types.MethodType):
-            name = describe(None, value.__self__, verbose=True) + "."
-        else:
-            module = inspect.getmodule(value)
-            if module is not None and module.__name__ != "builtins":
-                name = module.__name__ + "."
-            else:
-                name = ""
-        return name
+from traitlets.utils.descriptions import describe
 
 
 class TypeFromClasses(ClassBasedTraitType):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/jupyter_server/utils.py 
new/jupyter_server-1.13.3/jupyter_server/utils.py
--- old/jupyter_server-1.13.1/jupyter_server/utils.py   2021-12-09 
20:36:05.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server/utils.py   2022-01-14 
19:51:53.000000000 +0100
@@ -10,16 +10,16 @@
 import sys
 from _frozen_importlib_external import _NamespacePath
 from contextlib import contextmanager
-from distutils.version import LooseVersion
 from urllib.parse import quote
 from urllib.parse import SplitResult
 from urllib.parse import unquote
-from urllib.parse import urljoin  # pylint: disable=unused-import
+from urllib.parse import urljoin  # noqa: F401
 from urllib.parse import urlparse
 from urllib.parse import urlsplit
 from urllib.parse import urlunsplit
-from urllib.request import pathname2url  # pylint: disable=unused-import
+from urllib.request import pathname2url  # noqa: F401
 
+from packaging.version import Version
 from tornado.httpclient import AsyncHTTPClient
 from tornado.httpclient import HTTPClient
 from tornado.httpclient import HTTPRequest
@@ -143,7 +143,7 @@
     Users on dev branches are responsible for keeping their own packages up to 
date.
     """
     try:
-        return LooseVersion(v) >= LooseVersion(check)
+        return Version(v) >= Version(check)
     except TypeError:
         return True
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server.egg-info/PKG-INFO 
new/jupyter_server-1.13.3/jupyter_server.egg-info/PKG-INFO
--- old/jupyter_server-1.13.1/jupyter_server.egg-info/PKG-INFO  2021-12-09 
20:36:35.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server.egg-info/PKG-INFO  2022-01-14 
19:52:27.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: jupyter-server
-Version: 1.13.1
+Version: 1.13.3
 Summary: The backend???i.e. core services, APIs, and REST endpoints???to 
Jupyter web applications.
 Home-page: https://jupyter.org
 Author: Jupyter Development Team
@@ -15,18 +15,18 @@
 Classifier: Intended Audience :: Science/Research
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
-Requires-Python: >=3.6
+Classifier: Programming Language :: Python :: 3.10
+Requires-Python: >=3.7
 Description-Content-Type: text/markdown
 Provides-Extra: test
 License-File: COPYING.md
 
 # Jupyter Server
 
-[![Build 
Status](https://github.com/jupyter/jupyter_server/workflows/CI/badge.svg?query=branch%3Amaster++)](https://github.com/jupyter-server/jupyter_server/actions?query=branch%3Amaster++)
+[![Build 
Status](https://github.com/jupyter/jupyter_server/workflows/CI/badge.svg?query=branch%3Amain++)](https://github.com/jupyter-server/jupyter_server/actions?query=branch%3Amain++)
 [![Documentation 
Status](https://readthedocs.org/projects/jupyter-server/badge/?version=latest)](http://jupyter-server.readthedocs.io/en/latest/?badge=latest)
 
 The Jupyter Server provides the backend (i.e. the core services, APIs, and 
REST endpoints) for Jupyter web applications like Jupyter notebook, JupyterLab, 
and Voila.
@@ -46,9 +46,9 @@
 
 If Jupyter Server is a dependency of your project/application, it is important 
that you pin it to a version that works for your application. Currently, 
Jupyter Server only has minor and patch versions. Different minor versions 
likely include API-changes while patch versions do not change API.
 
-When a new minor version is released on PyPI, a branch for that version will 
be created in this repository, and the version of the master branch will be 
bumped to the next minor version number. That way, the master branch always 
reflects the latest un-released version.
+When a new minor version is released on PyPI, a branch for that version will 
be created in this repository, and the version of the main branch will be 
bumped to the next minor version number. That way, the main branch always 
reflects the latest un-released version.
 
-To see the changes between releases, checkout the 
[CHANGELOG](https://github.com/jupyter/jupyter_server/blob/master/CHANGELOG.md).
+To see the changes between releases, checkout the 
[CHANGELOG](https://github.com/jupyter/jupyter_server/blob/main/CHANGELOG.md).
 
 ## Usage - Running Jupyter Server
 
@@ -60,7 +60,7 @@
 
 ### Testing
 
-See 
[CONTRIBUTING](https://github.com/jupyter-server/jupyter_server/blob/master/CONTRIBUTING.rst#running-tests).
+See 
[CONTRIBUTING](https://github.com/jupyter-server/jupyter_server/blob/main/CONTRIBUTING.rst#running-tests).
 
 ## Contributing
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_server-1.13.1/jupyter_server.egg-info/requires.txt 
new/jupyter_server-1.13.3/jupyter_server.egg-info/requires.txt
--- old/jupyter_server-1.13.1/jupyter_server.egg-info/requires.txt      
2021-12-09 20:36:35.000000000 +0100
+++ new/jupyter_server-1.13.3/jupyter_server.egg-info/requires.txt      
2022-01-14 19:52:27.000000000 +0100
@@ -3,7 +3,7 @@
 pyzmq>=17
 argon2-cffi
 ipython_genutils
-traitlets>=4.2.1
+traitlets>=5
 jupyter_core>=4.6.0
 jupyter_client>=6.1.1
 nbformat
@@ -13,6 +13,7 @@
 prometheus_client
 anyio<4,>=3.1.0
 websocket-client
+packaging
 
 [test]
 coverage
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/pyproject.toml 
new/jupyter_server-1.13.3/pyproject.toml
--- old/jupyter_server-1.13.1/pyproject.toml    2021-12-09 20:36:21.000000000 
+0100
+++ new/jupyter_server-1.13.3/pyproject.toml    2022-01-14 19:52:13.000000000 
+0100
@@ -1,5 +1,5 @@
 [build-system]
-requires = ["jupyter_packaging~=0.9,<2"]
+requires = ["jupyter_packaging~=0.9"]
 build-backend = "jupyter_packaging.build_api"
 
 [tool.jupyter-packaging.builder]
@@ -18,7 +18,7 @@
 skip = ["check-links"]
 
 [tool.tbump.version]
-current = "1.13.1"
+current = "1.13.3"
 regex = '''
   (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
   ((?P<channel>a|b|rc|.dev)(?P<release>\d+))?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_server-1.13.1/setup.cfg 
new/jupyter_server-1.13.3/setup.cfg
--- old/jupyter_server-1.13.1/setup.cfg 2021-12-09 20:36:35.956748700 +0100
+++ new/jupyter_server-1.13.3/setup.cfg 2022-01-14 19:52:27.960275700 +0100
@@ -4,7 +4,7 @@
 description = The backend???i.e. core services, APIs, and REST endpoints???to 
Jupyter web applications.
 long_description = file: README.md
 long_description_content_type = text/markdown
-license_file = COPYING.md
+license_files = COPYING.md
 author = Jupyter Development Team
 author_email = [email protected]
 url = https://jupyter.org
@@ -16,23 +16,23 @@
        Intended Audience :: Science/Research
        License :: OSI Approved :: BSD License
        Programming Language :: Python
-       Programming Language :: Python :: 3.6
        Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
        Programming Language :: Python :: 3.9
+       Programming Language :: Python :: 3.10
 
 [options]
 zip_safe = False
 include_package_data = True
 packages = find:
-python_requires = >=3.6
+python_requires = >=3.7
 install_requires = 
        jinja2
        tornado>=6.1.0
        pyzmq>=17
        argon2-cffi
        ipython_genutils
-       traitlets>=4.2.1
+       traitlets>=5
        jupyter_core>=4.6.0
        jupyter_client>=6.1.1
        nbformat
@@ -42,6 +42,7 @@
        prometheus_client
        anyio>=3.1.0,<4
        websocket-client
+       packaging
 
 [options.extras_require]
 test = 
@@ -62,7 +63,7 @@
 exclude = ['docs*', 'examples*']
 
 [flake8]
-ignore = E, C, W, F401, F403, F811, F841, E402, I100, I101, D400
+ignore = E, C, W, F403, F811, F841, E402, I100, I101, D400
 builtins = c, get_config
 exclude = 
        .cache,

Reply via email to