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", ]