Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-jupyter-client for 
openSUSE:Factory checked in at 2022-12-31 11:22:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyter-client (Old)
 and      /work/SRC/openSUSE:Factory/.python-jupyter-client.new.1563 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-jupyter-client"

Sat Dec 31 11:22:49 2022 rev:13 rq:1045755 version:7.4.8

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-jupyter-client/python-jupyter-client.changes  
    2022-12-12 18:59:15.396002251 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-jupyter-client.new.1563/python-jupyter-client.changes
    2022-12-31 11:22:51.448433913 +0100
@@ -1,0 +2,26 @@
+Wed Dec 14 21:10:50 UTC 2022 - Ben Greiner <c...@bnavigator.de>
+
+- Update to 7.4.8
+  * Make sure loop is marked with nest_asyncio #893 (@impact27)
+- Release 7.4.7
+  * Fix connection reconciliation to handle restarts #882
+    (@kevin-bates)
+- Release 7.4.6
+  * Reconcile connection information #879 (@kevin-bates)
+- Release 7.4.5
+  * [7.x] Handle Jupyter Core Warning #875 (@blink1073)
+- Release 7.4.4
+  * Workaround for launch bug #861 (@blink1073)
+- Release 7.4.3
+  * Defer creation of ready future #858 (@blink1073)
+- Release 7.4.2
+  * Fix ready promise and session send #852 (@blink1073)
+  * Fix pending kernels backported and reverted: #848 #851
+- Release 7.3.5
+  * add AsyncKernelClient to doc/api/client.rst #819 (@helioz11)
+  * Use tornado 6.2's PeriodicCallback in restarter #822 (@vidartf)
+  * Make _stdin_hook_default async #814 (@davidbrochart)
+- Replace py3109-compat.patch by py310-ignore-deprecation.patch
+  gh#jupyter/jupyter_client#713
+
+-------------------------------------------------------------------

Old:
----
  jupyter_client-7.3.4.tar.gz
  py3109-compat.patch

New:
----
  jupyter_client-7.4.8.tar.gz
  py310-ignore-deprecation.patch

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

Other differences:
------------------
++++++ python-jupyter-client.spec ++++++
--- /var/tmp/diff_new_pack.eFrnKk/_old  2022-12-31 11:22:52.100437817 +0100
+++ /var/tmp/diff_new_pack.eFrnKk/_new  2022-12-31 11:22:52.104437841 +0100
@@ -24,18 +24,18 @@
 %define psuffix %{nil}
 %bcond_with test
 %endif
-%{?!python_module:%define python_module() python3-%{**}}
-%define skip_python2 1
+
 Name:           python-jupyter-client%{psuffix}
-Version:        7.3.4
+Version:        7.4.8
 Release:        0
 Summary:        Jupyter protocol implementation and client libraries
 License:        BSD-3-Clause
 Group:          Development/Languages/Python
 URL:            https://github.com/jupyter/jupyter_client
 Source:         
https://files.pythonhosted.org/packages/source/j/jupyter_client/jupyter_client-%{version}.tar.gz
-# PATCH-FIX-OPENSUSE py3109-compat.patch
-Patch0:         py3109-compat.patch
+# PATCH-FIX-UPSTREAM py310-ignore-deprecation.patch 
gh#jupyter/jupyter_client#713
+Patch0:         py310-ignore-deprecation.patch
+BuildRequires:  %{python_module base >= 3.7}
 BuildRequires:  %{python_module hatchling}
 BuildRequires:  %{python_module pip}
 BuildRequires:  fdupes
@@ -46,7 +46,7 @@
 Requires:       python-nest-asyncio >= 1.5.4
 Requires:       python-python-dateutil >= 2.8.2
 Requires:       python-pyzmq >= 23.0
-Requires:       python-tornado >= 6.0
+Requires:       python-tornado >= 6.2
 Requires:       python-traitlets
 Provides:       python-jupyter_client = %{version}
 Obsoletes:      python-jupyter_client < %{version}

++++++ jupyter_client-7.3.4.tar.gz -> jupyter_client-7.4.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_client-7.3.4/.github/workflows/check-release.yml 
new/jupyter_client-7.4.8/.github/workflows/check-release.yml
--- old/jupyter_client-7.3.4/.github/workflows/check-release.yml        
2020-02-02 01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/.github/workflows/check-release.yml        
2020-02-02 01:00:00.000000000 +0100
@@ -1,7 +1,7 @@
 name: Check Release
 on:
   push:
-    branches: ["main"]
+    branches: ["7.x"]
   pull_request:
 
 concurrency:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_client-7.3.4/.github/workflows/downstream.yml 
new/jupyter_client-7.4.8/.github/workflows/downstream.yml
--- old/jupyter_client-7.3.4/.github/workflows/downstream.yml   2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/.github/workflows/downstream.yml   2020-02-02 
01:00:00.000000000 +0100
@@ -2,7 +2,7 @@
 
 on:
   push:
-    branches: ["main"]
+    branches: ["7.x"]
   pull_request:
 
 concurrency:
@@ -76,7 +76,6 @@
           git clone https://github.com/jupyter/jupyter_kernel_test.git
           cd jupyter_kernel_test
           conda env update --name jupyter_kernel_test --file environment.yml
-          conda install -c conda-forge xeus-cling
           pip install -e ".[test]"
           python -m unittest -v
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/.github/workflows/main.yml 
new/jupyter_client-7.4.8/.github/workflows/main.yml
--- old/jupyter_client-7.3.4/.github/workflows/main.yml 2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/.github/workflows/main.yml 2020-02-02 
01:00:00.000000000 +0100
@@ -2,7 +2,7 @@
 
 on:
   push:
-    branches: ["main"]
+    branches: ["7.x"]
   pull_request:
 
 concurrency:
@@ -50,6 +50,8 @@
             python-version: "3.9"
           - os: ubuntu-latest
             python-version: "pypy-3.8"
+          - os: ubuntu-latest
+            python-version: "3.11"
           - os: macos-latest
             python-version: "3.8"
 
@@ -130,7 +132,7 @@
           pip check
       - name: Run the tests
         run: |
-          pytest -vv jupyter_client || pytest -vv jupyter_client --lf
+          pytest -vv -W default jupyter_client || pytest -vv -W default 
jupyter_client --lf
 
   make_sdist:
     name: Make SDist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/.pre-commit-config.yaml 
new/jupyter_client-7.4.8/.pre-commit-config.yaml
--- old/jupyter_client-7.3.4/.pre-commit-config.yaml    2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/.pre-commit-config.yaml    2020-02-02 
01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.2.0
+    rev: v4.3.0
     hooks:
       - id: end-of-file-fixer
       - id: check-case-conflict
@@ -16,42 +16,38 @@
       - id: trailing-whitespace
 
   - repo: https://github.com/asottile/reorder_python_imports
-    rev: v3.1.0
+    rev: v3.8.2
     hooks:
       - id: reorder-python-imports
 
   - repo: https://github.com/psf/black
-    rev: 22.3.0
+    rev: 22.6.0
     hooks:
       - id: black
         args: ["--line-length", "100"]
 
   - repo: https://github.com/pre-commit/mirrors-prettier
-    rev: v2.6.2
+    rev: v3.0.0-alpha.0
     hooks:
       - id: prettier
 
   - repo: https://github.com/PyCQA/doc8
-    rev: 0.11.2
+    rev: v1.0.0
     hooks:
       - id: doc8
         args: [--max-line-length=200]
         stages: [manual]
 
   - repo: https://github.com/pycqa/flake8
-    rev: 4.0.1
+    rev: 5.0.4
     hooks:
       - id: flake8
         additional_dependencies:
-          [
-            "flake8-bugbear==20.1.4",
-            "flake8-logging-format==0.6.0",
-            "flake8-implicit-str-concat==0.2.0",
-          ]
+          ["flake8-bugbear==22.6.22", "flake8-implicit-str-concat==0.2.0"]
         stages: [manual]
 
   - repo: https://github.com/pre-commit/mirrors-mypy
-    rev: v0.960
+    rev: v0.971
     hooks:
       - id: mypy
         exclude: jupyter_client/tests
@@ -60,13 +56,13 @@
         stages: [manual]
 
   - repo: https://github.com/PyCQA/doc8
-    rev: 0.11.2
+    rev: v1.0.0
     hooks:
       - id: doc8
         args: [--max-line-length=100]
 
   - repo: https://github.com/sirosen/check-jsonschema
-    rev: 0.16.0
+    rev: 0.17.1
     hooks:
       - id: check-jsonschema
         name: "Check GitHub Workflows"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/CHANGELOG.md 
new/jupyter_client-7.4.8/CHANGELOG.md
--- old/jupyter_client-7.3.4/CHANGELOG.md       2020-02-02 01:00:00.000000000 
+0100
+++ new/jupyter_client-7.4.8/CHANGELOG.md       2020-02-02 01:00:00.000000000 
+0100
@@ -2,6 +2,167 @@
 
 <!-- <START NEW CHANGELOG ENTRY> -->
 
+## 7.4.8
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.7...beac94baac163015e8165fde5661aaf026e92364))
+
+### Bugs fixed
+
+- Make sure loop is marked with nest_asyncio 
[#893](https://github.com/jupyter/jupyter_client/pull/893) 
([@impact27](https://github.com/impact27))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-11-16&to=2022-12-05&type=c))
+
+[@arogozhnikov](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Aarogozhnikov+updated%3A2022-11-16..2022-12-05&type=Issues)
 | 
[@impact27](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Aimpact27+updated%3A2022-11-16..2022-12-05&type=Issues)
 | 
[@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Akevin-bates+updated%3A2022-11-16..2022-12-05&type=Issues)
+
+<!-- <END NEW CHANGELOG ENTRY> -->
+
+## 7.4.7
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.6...56df36b535710d2c247a2749deec456c75191af5))
+
+### Bugs fixed
+
+- Fix connection reconciliation to handle restarts 
[#882](https://github.com/jupyter/jupyter_client/pull/882) 
([@kevin-bates](https://github.com/kevin-bates))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-11-15&to=2022-11-16&type=c))
+
+[@meeseeksmachine](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ameeseeksmachine+updated%3A2022-11-15..2022-11-16&type=Issues)
+
+## 7.4.6
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.5...3394591f161be4a19f9e61c66ba510d7e29afd59))
+
+### Bugs fixed
+
+- Reconcile connection information 
[#879](https://github.com/jupyter/jupyter_client/pull/879) 
([@kevin-bates](https://github.com/kevin-bates))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-11-10&to=2022-11-15&type=c))
+
+[@meeseeksmachine](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ameeseeksmachine+updated%3A2022-11-10..2022-11-15&type=Issues)
+
+## 7.4.5
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.4...d27c8a497c6cbb1a232fbbe75cb1fd0f53faa9b0))
+
+### Maintenance and upkeep improvements
+
+- \[7.x\] Handle Jupyter Core Warning 
[#875](https://github.com/jupyter/jupyter_client/pull/875) 
([@blink1073](https://github.com/blink1073))
+- Clean up 7.x workflows 
[#865](https://github.com/jupyter/jupyter_client/pull/865) 
([@blink1073](https://github.com/blink1073))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-10-25&to=2022-11-10&type=c))
+
+[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ablink1073+updated%3A2022-10-25..2022-11-10&type=Issues)
+
+## 7.4.4
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.3...4029f6cad9223b1287980a1f0e966ff66557386e))
+
+### Bugs fixed
+
+- Workaround for launch bug 
[#861](https://github.com/jupyter/jupyter_client/pull/861) 
([@blink1073](https://github.com/blink1073))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-10-19&to=2022-10-25&type=c))
+
+[@meeseeksmachine](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ameeseeksmachine+updated%3A2022-10-19..2022-10-25&type=Issues)
+
+## 7.4.3
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.2...aa549b27d3622b1c381275777785f84dd3d5253d))
+
+### Bugs fixed
+
+- Defer creation of ready future 
[#858](https://github.com/jupyter/jupyter_client/pull/858) 
([@blink1073](https://github.com/blink1073))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-10-11&to=2022-10-19&type=c))
+
+[@meeseeksmachine](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ameeseeksmachine+updated%3A2022-10-11..2022-10-19&type=Issues)
+
+## 7.4.2
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.1...0a45cc41e4ce73911e4367eddc1f0001a8431fc0))
+
+### Bugs fixed
+
+- Fix ready promise and session send 
[#852](https://github.com/jupyter/jupyter_client/pull/852) 
([@blink1073](https://github.com/blink1073))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-10-11&to=2022-10-11&type=c))
+
+[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ablink1073+updated%3A2022-10-11..2022-10-11&type=Issues)
+
+## 7.4.1
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.4.0...0d87835d82d485aa3e870a63e76768bf439c3fe4))
+
+### Bugs fixed
+
+- Revert "Backport PR #845: Fix pending kernels again" 
[#851](https://github.com/jupyter/jupyter_client/pull/851) 
([@blink1073](https://github.com/blink1073))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-10-11&to=2022-10-11&type=c))
+
+[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ablink1073+updated%3A2022-10-11..2022-10-11&type=Issues)
+
+## 7.4.0
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.3.5...3c0107f72e65363e8dfc99d7801a7de048e5f071))
+
+### Bugs fixed
+
+- Backport PR #845: Fix pending kernels again 
[#848](https://github.com/jupyter/jupyter_client/pull/848) 
([@blink1073](https://github.com/blink1073))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-08-25&to=2022-10-11&type=c))
+
+[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ablink1073+updated%3A2022-08-25..2022-10-11&type=Issues)
 | 
[@ccordoba12](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Accordoba12+updated%3A2022-08-25..2022-10-11&type=Issues)
 | 
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Adavidbrochart+updated%3A2022-08-25..2022-10-11&type=Issues)
 | 
[@minrk](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Aminrk+updated%3A2022-08-25..2022-10-11&type=Issues)
 | 
[@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3AZsailer+updated%3A2022-08-25..2022-10-11&type=Issues)
+
+## 7.3.5
+
+([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.3.4...bc5ded5439ca55bd6740885eb3a44ca6bc3e2243))
+
+### Enhancements made
+
+- add `AsyncKernelClient` to `doc/api/client.rst` 
[#819](https://github.com/jupyter/jupyter_client/pull/819) 
([@helioz11](https://github.com/helioz11))
+
+### Bugs fixed
+
+- Use tornado 6.2's PeriodicCallback in restarter 
[#822](https://github.com/jupyter/jupyter_client/pull/822) 
([@vidartf](https://github.com/vidartf))
+- Make \_stdin_hook_default async 
[#814](https://github.com/jupyter/jupyter_client/pull/814) 
([@davidbrochart](https://github.com/davidbrochart))
+
+### Maintenance and upkeep improvements
+
+- [pre-commit.ci] pre-commit autoupdate 
[#824](https://github.com/jupyter/jupyter_client/pull/824) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#821](https://github.com/jupyter/jupyter_client/pull/821) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#820](https://github.com/jupyter/jupyter_client/pull/820) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#818](https://github.com/jupyter/jupyter_client/pull/818) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#816](https://github.com/jupyter/jupyter_client/pull/816) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#815](https://github.com/jupyter/jupyter_client/pull/815) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#812](https://github.com/jupyter/jupyter_client/pull/812) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#810](https://github.com/jupyter/jupyter_client/pull/810) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#809](https://github.com/jupyter/jupyter_client/pull/809) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+- [pre-commit.ci] pre-commit autoupdate 
[#807](https://github.com/jupyter/jupyter_client/pull/807) 
([@pre-commit-ci](https://github.com/pre-commit-ci))
+
+### Contributors to this release
+
+([GitHub contributors page for this 
release](https://github.com/jupyter/jupyter_client/graphs/contributors?from=2022-06-08&to=2022-08-25&type=c))
+
+[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ablink1073+updated%3A2022-06-08..2022-08-25&type=Issues)
 | 
[@davidbrochart](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Adavidbrochart+updated%3A2022-06-08..2022-08-25&type=Issues)
 | 
[@helioz11](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ahelioz11+updated%3A2022-06-08..2022-08-25&type=Issues)
 | 
[@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Apre-commit-ci+updated%3A2022-06-08..2022-08-25&type=Issues)
 | 
[@vidartf](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Avidartf+updated%3A2022-06-08..2022-08-25&type=Issues)
+
 ## 7.3.4
 
 ([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.3.3...ca4cb2d6a4b95a6925de85a47b323d2235032c74))
@@ -21,8 +182,6 @@
 
 
[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Ablink1073+updated%3A2022-06-07..2022-06-08&type=Issues)
 | 
[@ccordoba12](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Accordoba12+updated%3A2022-06-07..2022-06-08&type=Issues)
 | 
[@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fjupyter_client+involves%3Apre-commit-ci+updated%3A2022-06-07..2022-06-08&type=Issues)
 
-<!-- <END NEW CHANGELOG ENTRY> -->
-
 ## 7.3.3
 
 ([Full 
Changelog](https://github.com/jupyter/jupyter_client/compare/v7.3.2...37ca37d865db260e7da6fa85339be450d6fd3c3c))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/PKG-INFO 
new/jupyter_client-7.4.8/PKG-INFO
--- old/jupyter_client-7.3.4/PKG-INFO   2020-02-02 01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/PKG-INFO   2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
-Name: jupyter-client
-Version: 7.3.4
+Name: jupyter_client
+Version: 7.4.8
 Summary: Jupyter protocol implementation and client libraries
 Project-URL: Homepage, https://jupyter.org
 Author-email: Jupyter Development Team <jupy...@googlegroups.com>
@@ -64,6 +64,7 @@
         
             # Copyright (c) Jupyter Development Team.
             # Distributed under the terms of the Modified BSD License.
+License-File: COPYING.md
 Keywords: Interactive,Interpreter,Shell,Web
 Classifier: Framework :: Jupyter
 Classifier: Intended Audience :: Developers
@@ -74,17 +75,17 @@
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Requires-Python: >=3.7
 Requires-Dist: entrypoints
 Requires-Dist: jupyter-core>=4.9.2
 Requires-Dist: nest-asyncio>=1.5.4
 Requires-Dist: python-dateutil>=2.8.2
 Requires-Dist: pyzmq>=23.0
-Requires-Dist: tornado>=6.0
+Requires-Dist: tornado>=6.2
 Requires-Dist: traitlets
 Provides-Extra: doc
 Requires-Dist: ipykernel; extra == 'doc'
@@ -95,7 +96,7 @@
 Provides-Extra: test
 Requires-Dist: codecov; extra == 'test'
 Requires-Dist: coverage; extra == 'test'
-Requires-Dist: ipykernel>=6.5; extra == 'test'
+Requires-Dist: ipykernel>=6.12; extra == 'test'
 Requires-Dist: ipython; extra == 'test'
 Requires-Dist: mypy; extra == 'test'
 Requires-Dist: pre-commit; extra == 'test'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/docs/api/client.rst 
new/jupyter_client-7.4.8/docs/api/client.rst
--- old/jupyter_client-7.3.4/docs/api/client.rst        2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/docs/api/client.rst        2020-02-02 
01:00:00.000000000 +0100
@@ -35,3 +35,19 @@
 .. autoclass:: BlockingKernelClient
 
    .. automethod:: execute_interactive
+
+   .. automethod:: get_shell_msg
+
+   .. automethod:: get_iopub_msg
+
+   .. automethod:: get_stdin_msg
+
+   .. automethod:: get_control_msg
+
+   .. automethod:: wait_for_ready
+
+   .. automethod:: is_alive
+
+.. autoclass:: AsyncKernelClient
+
+   :class:`AsyncKernelClient` is identical to :class:`BlockingKernelClient` 
but the methods described above are async.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/jupyter_client/_version.py 
new/jupyter_client-7.4.8/jupyter_client/_version.py
--- old/jupyter_client-7.3.4/jupyter_client/_version.py 2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/_version.py 2020-02-02 
01:00:00.000000000 +0100
@@ -2,7 +2,7 @@
 from typing import List
 from typing import Union
 
-__version__ = "7.3.4"
+__version__ = "7.4.8"
 
 # 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/jupyter_client-7.3.4/jupyter_client/client.py 
new/jupyter_client-7.4.8/jupyter_client/client.py
--- old/jupyter_client-7.3.4/jupyter_client/client.py   2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/client.py   2020-02-02 
01:00:00.000000000 +0100
@@ -2,6 +2,7 @@
 # Copyright (c) Jupyter Development Team.
 # Distributed under the terms of the Modified BSD License.
 import asyncio
+import inspect
 import sys
 import time
 import typing as t
@@ -232,7 +233,7 @@
                 continue
             return reply
 
-    def _stdin_hook_default(self, msg: t.Dict[str, t.Any]) -> None:
+    async def _stdin_hook_default(self, msg: t.Dict[str, t.Any]) -> None:
         """Handle an input request"""
         content = msg["content"]
         if content.get("password", False):
@@ -251,7 +252,7 @@
 
         # only send stdin reply if there *was not* another request
         # or execution finished while we were reading.
-        if not (self.stdin_channel.msg_ready() or 
self.shell_channel.msg_ready()):
+        if not (await self.stdin_channel.msg_ready() or await 
self.shell_channel.msg_ready()):
             self.input(raw_data)
 
     def _output_hook_default(self, msg: t.Dict[str, t.Any]) -> None:
@@ -469,7 +470,7 @@
             If not specified, output will be redisplayed.
 
         stdin_hook: callable(msg)
-            Function to be called with stdin_request messages.
+            Function or awaitable to be called with stdin_request messages.
             If not specified, input/getpass will be called.
 
         Returns
@@ -536,7 +537,9 @@
                 raise TimeoutError("Timeout waiting for output")
             if stdin_socket in events:
                 req = await self.stdin_channel.get_msg(timeout=0)
-                stdin_hook(req)
+                res = stdin_hook(req)
+                if inspect.isawaitable(res):
+                    await res
                 continue
             if iopub_socket not in events:
                 continue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/jupyter_client/connect.py 
new/jupyter_client-7.4.8/jupyter_client/connect.py
--- old/jupyter_client-7.3.4/jupyter_client/connect.py  2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/connect.py  2020-02-02 
01:00:00.000000000 +0100
@@ -160,7 +160,7 @@
 
     # Only ever write this file as user read/writeable
     # This would otherwise introduce a vulnerability as a file has secrets
-    # which would let others execute arbitrarily code as you
+    # which would let others execute arbitrary code as you
     with secure_write(fname) as f:
         f.write(json.dumps(cfg, indent=2))
 
@@ -567,18 +567,71 @@
         if "signature_scheme" in info:
             self.session.signature_scheme = info["signature_scheme"]
 
-    def _force_connection_info(self, info: KernelConnectionInfo) -> None:
-        """Unconditionally loads connection info from a dict containing 
connection info.
+    def _reconcile_connection_info(self, info: KernelConnectionInfo) -> None:
+        """Reconciles the connection information returned from the Provisioner.
 
-        Overwrites connection info-based attributes, regardless of their 
current values
-        and writes this information to the connection file.
+        Because some provisioners (like derivations of LocalProvisioner) may 
have already
+        written the connection file, this method needs to ensure that, if the 
connection
+        file exists, its contents match that of what was returned by the 
provisioner.  If
+        the file does exist and its contents do not match, the file will be 
replaced with
+        the provisioner information (which is considered the truth).
+
+        If the file does not exist, the connection information in 'info' is 
loaded into the
+        KernelManager and written to the file.
         """
-        # Reset current ports to 0 and indicate file has not been written to 
enable override
-        self._connection_file_written = False
-        for name in port_names:
-            setattr(self, name, 0)
-        self.load_connection_info(info)
-        self.write_connection_file()
+        # Prevent over-writing a file that has already been written with the 
same
+        # info.  This is to prevent a race condition where the process has
+        # already been launched but has not yet read the connection file - as 
is
+        # the case with LocalProvisioners.
+        file_exists: bool = False
+        if os.path.exists(self.connection_file):
+            with open(self.connection_file) as f:
+                file_info = json.load(f)
+            # Prior to the following comparison, we need to adjust the value 
of "key" to
+            # be bytes, otherwise the comparison below will fail.
+            file_info["key"] = file_info["key"].encode()
+            if not self._equal_connections(info, file_info):
+                os.remove(self.connection_file)  # Contents mismatch - remove 
the file
+                self._connection_file_written = False
+            else:
+                file_exists = True
+
+        if not file_exists:
+            # Load the connection info and write out file, clearing existing
+            # port-based attributes so they will be reloaded
+            for name in port_names:
+                setattr(self, name, 0)
+            self.load_connection_info(info)
+            self.write_connection_file()
+
+        # Ensure what is in KernelManager is what we expect.
+        km_info = self.get_connection_info()
+        if not self._equal_connections(info, km_info):
+            raise ValueError(
+                "KernelManager's connection information already exists and 
does not match "
+                "the expected values returned from provisioner!"
+            )
+
+    @staticmethod
+    def _equal_connections(conn1: KernelConnectionInfo, conn2: 
KernelConnectionInfo) -> bool:
+        """Compares pertinent keys of connection info data. Returns True if 
equivalent, False otherwise."""
+
+        pertinent_keys = [
+            "key",
+            "ip",
+            "stdin_port",
+            "iopub_port",
+            "shell_port",
+            "control_port",
+            "hb_port",
+            "transport",
+            "signature_scheme",
+        ]
+
+        for key in pertinent_keys:
+            if conn1.get(key) != conn2.get(key):
+                return False
+        return True
 
     # 
--------------------------------------------------------------------------
     # Creating connected sockets
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_client-7.3.4/jupyter_client/ioloop/restarter.py 
new/jupyter_client-7.4.8/jupyter_client/ioloop/restarter.py
--- old/jupyter_client-7.3.4/jupyter_client/ioloop/restarter.py 2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/ioloop/restarter.py 2020-02-02 
01:00:00.000000000 +0100
@@ -5,15 +5,12 @@
 """
 # Copyright (c) Jupyter Development Team.
 # Distributed under the terms of the Modified BSD License.
-import asyncio
 import time
 import warnings
 
 from traitlets import Instance
-from zmq.eventloop import ioloop
 
 from jupyter_client.restarter import KernelRestarter
-from jupyter_client.utils import run_sync
 
 
 class IOLoopKernelRestarter(KernelRestarter):
@@ -27,6 +24,8 @@
             DeprecationWarning,
             stacklevel=4,
         )
+        from zmq.eventloop import ioloop
+
         return ioloop.IOLoop.current()
 
     _pcallback = None
@@ -34,12 +33,10 @@
     def start(self):
         """Start the polling of the kernel."""
         if self._pcallback is None:
-            if asyncio.iscoroutinefunction(self.poll):
-                cb = run_sync(self.poll)
-            else:
-                cb = self.poll
-            self._pcallback = ioloop.PeriodicCallback(
-                cb,
+            from tornado.ioloop import PeriodicCallback
+
+            self._pcallback = PeriodicCallback(
+                self.poll,
                 1000 * self.time_to_dead,
             )
             self._pcallback.start()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/jupyter_client/manager.py 
new/jupyter_client-7.4.8/jupyter_client/manager.py
--- old/jupyter_client-7.3.4/jupyter_client/manager.py  2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/manager.py  2020-02-02 
01:00:00.000000000 +0100
@@ -55,6 +55,16 @@
 F = t.TypeVar('F', bound=t.Callable[..., t.Any])
 
 
+def _get_future() -> t.Union[Future, CFuture]:
+    """Get an appropriate Future object"""
+    try:
+        asyncio.get_running_loop()
+        return Future()
+    except RuntimeError:
+        # No event loop running, use concurrent future
+        return CFuture()
+
+
 def in_pending_state(method: F) -> F:
     """Sets the kernel to a pending state by
     creating a fresh Future for the KernelManager's `ready`
@@ -65,11 +75,8 @@
     @functools.wraps(method)
     async def wrapper(self, *args, **kwargs):
         # Create a future for the decorated method
-        try:
-            self._ready = Future()
-        except RuntimeError:
-            # No event loop running, use concurrent future
-            self._ready = CFuture()
+        if self._attempted_start or not self._ready:
+            self._ready = _get_future()
         try:
             # call wrapped method, await, and set the result or exception.
             out = await method(self, *args, **kwargs)
@@ -91,18 +98,13 @@
     This version starts kernels with Popen.
     """
 
-    _ready: t.Union[Future, CFuture]
+    _ready: t.Optional[t.Union[Future, CFuture]]
 
     def __init__(self, *args, **kwargs):
         super().__init__(**kwargs)
         self._shutdown_status = _ShutdownStatus.Unset
-        # Create a place holder future.
-        try:
-            asyncio.get_running_loop()
-            self._ready = Future()
-        except RuntimeError:
-            # No event loop running, use concurrent future
-            self._ready = CFuture()
+        self._attempted_start = False
+        self._ready = None
 
     _created_context: Bool = Bool(False)
 
@@ -187,6 +189,8 @@
     @property
     def ready(self) -> t.Union[CFuture, Future]:
         """A future that resolves when the kernel process has started for the 
first time"""
+        if not self._ready:
+            self._ready = _get_future()
         return self._ready
 
     @property
@@ -306,8 +310,9 @@
         assert self.provisioner is not None
         connection_info = await self.provisioner.launch_kernel(kernel_cmd, 
**kw)
         assert self.provisioner.has_process
-        # Provisioner provides the connection information.  Load into kernel 
manager and write file.
-        self._force_connection_info(connection_info)
+        # Provisioner provides the connection information.  Load into kernel 
manager
+        # and write the connection file, if not already done.
+        self._reconcile_connection_info(connection_info)
 
     _launch_kernel = run_sync(_async_launch_kernel)
 
@@ -382,6 +387,7 @@
              keyword arguments that are passed down to build the kernel_cmd
              and launching the kernel (e.g. Popen kwargs).
         """
+        self._attempted_start = True
         kernel_cmd, kw = await ensure_async(self.pre_start_kernel(**kw))
 
         # launch the kernel subprocess
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/jupyter_client/session.py 
new/jupyter_client-7.4.8/jupyter_client/session.py
--- old/jupyter_client-7.3.4/jupyter_client/session.py  2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/session.py  2020-02-02 
01:00:00.000000000 +0100
@@ -29,7 +29,7 @@
 from typing import Optional
 from typing import Union
 
-import zmq
+import zmq.asyncio
 from traitlets import Any
 from traitlets import Bool
 from traitlets import CBytes
@@ -807,6 +807,10 @@
             # ZMQStreams and dummy sockets do not support tracking.
             track = False
 
+        if isinstance(stream, zmq.asyncio.Socket):
+            assert stream is not None
+            stream = zmq.Socket.shadow(stream.underlying)
+
         if isinstance(msg_or_type, (Message, dict)):
             # We got a Message or message dict, not a msg_type so don't
             # build a new Message.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jupyter_client-7.3.4/jupyter_client/tests/test_connect.py 
new/jupyter_client-7.4.8/jupyter_client/tests/test_connect.py
--- old/jupyter_client-7.3.4/jupyter_client/tests/test_connect.py       
2020-02-02 01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/tests/test_connect.py       
2020-02-02 01:00:00.000000000 +0100
@@ -5,11 +5,13 @@
 import os
 from tempfile import TemporaryDirectory
 
+import pytest
 from jupyter_core.application import JupyterApp
 from jupyter_core.paths import jupyter_runtime_dir
 
 from jupyter_client import connect
 from jupyter_client import KernelClient
+from jupyter_client import KernelManager
 from jupyter_client.consoleapp import JupyterConsoleApp
 from jupyter_client.session import Session
 
@@ -235,3 +237,59 @@
         assert not os.path.exists(filename)
         for name in dc._random_port_names:
             assert getattr(dc, name) == 0
+
+
+param_values = [
+    (True, True),
+    (True, False),
+    (False, True),
+    (False, False),
+]
+
+
+@pytest.mark.parametrize("file_exists, km_matches", param_values)
+def test_reconcile_connection_info(file_exists, km_matches):
+
+    expected_info = sample_info
+    mismatched_info = sample_info.copy()
+    mismatched_info["key"] = b"def456"
+    mismatched_info["shell_port"] = expected_info["shell_port"] + 42
+    mismatched_info["control_port"] = expected_info["control_port"] + 42
+
+    with TemporaryDirectory() as connection_dir:
+
+        cf = os.path.join(connection_dir, "kernel.json")
+        km = KernelManager()
+        km.connection_file = cf
+
+        if file_exists:
+            _, info = connect.write_connection_file(cf, **expected_info)
+            info["key"] = info["key"].encode()  # set 'key' back to bytes
+
+            if km_matches:
+                # Let this be the case where the connection file exists, and 
the KM has matching
+                # values prior to reconciliation.  This is the 
LocalProvisioner case.
+                provisioner_info = info
+                km.load_connection_info(provisioner_info)
+            else:
+                # Let this be the case where the connection file exists, and 
the KM has those values
+                # that differ from the ones returned by the provisioner.  This 
is the restart-with-
+                # changed-ports case (typical for remote provisioners).
+                km.load_connection_info(expected_info)
+                provisioner_info = mismatched_info
+        else:  # connection file does not exist
+            if km_matches:
+                # Let this be the case where the connection file does not 
exist, NOR does the KM
+                # have any values of its own and reconciliation sets those 
values. This is the
+                # non-LocalProvisioner case.
+                provisioner_info = expected_info
+            else:
+                # Let this be the case where the connection file does not 
exist, yet the KM
+                # has values that do not match those returned from the 
provisioner.  This case
+                # is probably not practical and is equivalent to the True, 
False case.
+                km.load_connection_info(expected_info)
+                provisioner_info = mismatched_info
+
+        km._reconcile_connection_info(provisioner_info)
+        km_info = km.get_connection_info()
+        assert km._equal_connections(km_info, provisioner_info)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/jupyter_client/threaded.py 
new/jupyter_client-7.4.8/jupyter_client/threaded.py
--- old/jupyter_client-7.3.4/jupyter_client/threaded.py 2020-02-02 
01:00:00.000000000 +0100
+++ new/jupyter_client-7.4.8/jupyter_client/threaded.py 2020-02-02 
01:00:00.000000000 +0100
@@ -14,6 +14,7 @@
 from typing import Optional
 from typing import Union
 
+import nest_asyncio  # type:ignore
 import zmq
 from traitlets import Instance
 from traitlets import Type
@@ -211,6 +212,7 @@
         """Run my loop, ignoring EINTR events in the poller"""
         loop = asyncio.new_event_loop()
         asyncio.set_event_loop(loop)
+        nest_asyncio.apply(loop)
         self.ioloop = ioloop.IOLoop()
         self.ioloop._asyncio_event_loop = loop
         # signal that self.ioloop is defined
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jupyter_client-7.3.4/pyproject.toml 
new/jupyter_client-7.4.8/pyproject.toml
--- old/jupyter_client-7.3.4/pyproject.toml     2020-02-02 01:00:00.000000000 
+0100
+++ new/jupyter_client-7.4.8/pyproject.toml     2020-02-02 01:00:00.000000000 
+0100
@@ -4,7 +4,7 @@
 
 [project]
 name = "jupyter_client"
-version = "7.3.4"
+version = "7.4.8"
 description = "Jupyter protocol implementation and client libraries"
 keywords = [ "Interactive", "Interpreter", "Shell", "Web",]
 classifiers = [
@@ -29,7 +29,7 @@
     "nest-asyncio>=1.5.4",
     "python-dateutil>=2.8.2",
     "pyzmq>=23.0",
-    "tornado>=6.0",
+    "tornado>=6.2",
     "traitlets",
 ]
 
@@ -51,7 +51,7 @@
 test = [
     "codecov",
     "coverage",
-    "ipykernel>=6.5",
+    "ipykernel>=6.12",
     "ipython",
     "mypy",
     "pre-commit",
@@ -93,7 +93,7 @@
 ignore = [".mailmap", "*.yml", "*.yaml"]
 
 [tool.tbump.version]
-current = "7.3.4"
+current = "7.4.8"
 regex = '''
   (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
   ((?P<channel>a|b|rc|.dev)(?P<release>\d+))?
@@ -135,6 +135,9 @@
   # We could eventually find a way to make sure these are only created
   # when there is a running event loop.
   "ignore:There is no current event loop:DeprecationWarning:zmq",
+
+  # Workaround for jupyter_core warning.
+  "module:Jupyter is migrating its paths to use standard 
platformdirs:DeprecationWarning",
 ]
 
 [tool.mypy]

++++++ py310-ignore-deprecation.patch ++++++
Index: jupyter_client-7.4.8/pyproject.toml
===================================================================
--- jupyter_client-7.4.8.orig/pyproject.toml
+++ jupyter_client-7.4.8/pyproject.toml
@@ -136,6 +136,9 @@ filterwarnings= [
   # when there is a running event loop.
   "ignore:There is no current event loop:DeprecationWarning:zmq",
 
+  # https://github.com/jupyter/jupyter_client/issues/713
+  "ignore:There is no current event loop:DeprecationWarning",
+
   # Workaround for jupyter_core warning.
   "module:Jupyter is migrating its paths to use standard 
platformdirs:DeprecationWarning",
 ]

Reply via email to