Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-qtconsole for
openSUSE:Factory checked in at 2023-04-24 22:31:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-qtconsole (Old)
and /work/SRC/openSUSE:Factory/.python-qtconsole.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-qtconsole"
Mon Apr 24 22:31:26 2023 rev:28 rq:1082300 version:5.4.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-qtconsole/python-qtconsole.changes
2023-03-21 17:42:57.206239314 +0100
+++
/work/SRC/openSUSE:Factory/.python-qtconsole.new.1533/python-qtconsole.changes
2023-04-24 22:31:37.475657346 +0200
@@ -1,0 +2,7 @@
+Sun Apr 23 17:22:41 UTC 2023 - Ben Greiner <[email protected]>
+
+- Update to 5.4.2
+ * Check if the iopub channel is not closed before flushing it
+ * Fix kernel autorestart after it's killed for Jupyter-client 8+
+
+-------------------------------------------------------------------
Old:
----
qtconsole-5.4.1.tar.gz
New:
----
qtconsole-5.4.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-qtconsole.spec ++++++
--- /var/tmp/diff_new_pack.zvr2Wo/_old 2023-04-24 22:31:38.043660722 +0200
+++ /var/tmp/diff_new_pack.zvr2Wo/_new 2023-04-24 22:31:38.047660746 +0200
@@ -22,7 +22,7 @@
%bcond_with libalternatives
%endif
Name: python-qtconsole
-Version: 5.4.1
+Version: 5.4.2
Release: 0
Summary: Jupyter Qt console
License: BSD-3-Clause
++++++ qtconsole-5.4.1.tar.gz -> qtconsole-5.4.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/PKG-INFO new/qtconsole-5.4.2/PKG-INFO
--- old/qtconsole-5.4.1/PKG-INFO 2023-03-11 21:43:33.672649100 +0100
+++ new/qtconsole-5.4.2/PKG-INFO 2023-04-02 23:18:07.629845400 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: qtconsole
-Version: 5.4.1
+Version: 5.4.2
Summary: Jupyter Qt console
Home-page: http://jupyter.org
Author: Jupyter Development Team
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/docs/source/changelog.rst
new/qtconsole-5.4.2/docs/source/changelog.rst
--- old/qtconsole-5.4.1/docs/source/changelog.rst 2023-03-11
21:39:59.000000000 +0100
+++ new/qtconsole-5.4.2/docs/source/changelog.rst 2023-04-02
23:15:37.000000000 +0200
@@ -8,6 +8,14 @@
5.4
~~~
+5.4.2
+-----
+
+`5.4.2 on GitHub <https://github.com/jupyter/qtconsole/milestones/5.4.2>`__
+
+* Check if the iopub channel is not closed before flushing it.
+* Fix kernel autorestart after it's killed for Jupyter-client 8+.
+
5.4.1
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/qtconsole/_version.py
new/qtconsole-5.4.2/qtconsole/_version.py
--- old/qtconsole-5.4.1/qtconsole/_version.py 2023-03-11 21:42:36.000000000
+0100
+++ new/qtconsole-5.4.2/qtconsole/_version.py 2023-04-02 23:17:22.000000000
+0200
@@ -1,2 +1,2 @@
-version_info = (5, 4, 1)
+version_info = (5, 4, 2)
__version__ = '.'.join(map(str, version_info))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/qtconsole/client.py
new/qtconsole-5.4.2/qtconsole/client.py
--- old/qtconsole-5.4.1/qtconsole/client.py 2021-04-07 20:40:30.000000000
+0200
+++ new/qtconsole-5.4.2/qtconsole/client.py 2023-03-30 17:34:17.000000000
+0200
@@ -1,28 +1,17 @@
""" Defines a KernelClient that provides signals and slots.
"""
-import atexit
-import errno
-from threading import Thread
-import time
-
-import zmq
-# import ZMQError in top-level namespace, to avoid ugly attribute-error
messages
-# during garbage collection of threads at exit:
-from zmq import ZMQError
-from zmq.eventloop import ioloop, zmqstream
-from qtpy import QtCore
-
-# Local imports
-from traitlets import Type, Instance
+# Third-party imports
from jupyter_client.channels import HBChannel
-from jupyter_client import KernelClient
-from jupyter_client.channels import InvalidPortNumber
from jupyter_client.threaded import ThreadedKernelClient,
ThreadedZMQSocketChannel
+from qtpy import QtCore
+from traitlets import Type
+# Local imports
from .kernel_mixins import QtKernelClientMixin
from .util import SuperQObject
+
class QtHBChannel(SuperQObject, HBChannel):
# A longer timeout than the base class
time_to_dead = 3.0
@@ -36,11 +25,8 @@
# Emit the generic signal.
self.kernel_died.emit(since_last_heartbeat)
-from jupyter_client import protocol_version_info
-
-major_protocol_version = protocol_version_info[0]
-class QtZMQSocketChannel(ThreadedZMQSocketChannel,SuperQObject):
+class QtZMQSocketChannel(ThreadedZMQSocketChannel, SuperQObject):
"""A ZMQ socket emitting a Qt signal when a message is received."""
message_received = QtCore.Signal(object)
@@ -49,7 +35,6 @@
"""
QtCore.QCoreApplication.instance().processEvents()
-
def call_handlers(self, msg):
"""This method is called in the ioloop thread when a message arrives.
@@ -60,11 +45,14 @@
# Emit the generic signal.
self.message_received.emit(msg)
+ def closed(self):
+ """Check if the channel is closed."""
+ return self.stream is None or self.stream.closed()
+
class QtKernelClient(QtKernelClientMixin, ThreadedKernelClient):
""" A KernelClient that provides signals and slots.
"""
-
iopub_channel_class = Type(QtZMQSocketChannel)
shell_channel_class = Type(QtZMQSocketChannel)
stdin_channel_class = Type(QtZMQSocketChannel)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/qtconsole/frontend_widget.py
new/qtconsole-5.4.2/qtconsole/frontend_widget.py
--- old/qtconsole-5.4.1/qtconsole/frontend_widget.py 2022-11-02
01:49:56.000000000 +0100
+++ new/qtconsole-5.4.2/qtconsole/frontend_widget.py 2023-03-30
17:34:17.000000000 +0200
@@ -465,7 +465,8 @@
if info.kind == 'user':
# Make sure that all output from the SUB channel has been processed
# before writing a new prompt.
- self.kernel_client.iopub_channel.flush()
+ if not self.kernel_client.iopub_channel.closed():
+ self.kernel_client.iopub_channel.flush()
# Reset the ANSI style information to prevent bad text in stdout
# from messing up our colors. We're not a true terminal so we're
@@ -505,7 +506,8 @@
# Make sure that all output from the SUB channel has been processed
# before entering readline mode.
- self.kernel_client.iopub_channel.flush()
+ if not self.kernel_client.iopub_channel.closed():
+ self.kernel_client.iopub_channel.flush()
def callback(line):
self._finalize_input_request()
@@ -538,6 +540,12 @@
"""
self.log.warning("kernel restarted")
self._kernel_restarted_message(died=died)
+
+ # This resets the autorestart counter so that the kernel can be
+ # auto-restarted before the next time it's polled to see if it's alive.
+ if self.kernel_manager:
+ self.kernel_manager.reset_autorestart_count()
+
self.reset()
def _handle_inspect_reply(self, rep):
@@ -831,8 +839,6 @@
"""
# Calculate where the cursor should be *after* the change:
position += added
-
- document = self._control.document()
if position == self._get_cursor().position():
self._auto_call_tip()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/qtconsole/jupyter_widget.py
new/qtconsole-5.4.2/qtconsole/jupyter_widget.py
--- old/qtconsole-5.4.1/qtconsole/jupyter_widget.py 2021-11-14
19:48:23.000000000 +0100
+++ new/qtconsole-5.4.2/qtconsole/jupyter_widget.py 2023-03-28
23:52:03.000000000 +0200
@@ -7,12 +7,9 @@
# Distributed under the terms of the Modified BSD License.
from collections import namedtuple
-import os.path
-import re
from subprocess import Popen
import sys
import time
-from textwrap import dedent
from warnings import warn
from qtpy import QtCore, QtGui
@@ -287,7 +284,6 @@
if self.include_output(msg):
self.flush_clearoutput()
data = msg['content']['data']
- metadata = msg['content']['metadata']
# In the regular JupyterWidget, we simply print the plain text
# representation.
if 'text/plain' in data:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/qtconsole/manager.py
new/qtconsole-5.4.2/qtconsole/manager.py
--- old/qtconsole-5.4.1/qtconsole/manager.py 2021-03-17 02:07:09.000000000
+0100
+++ new/qtconsole-5.4.2/qtconsole/manager.py 2023-03-28 23:52:03.000000000
+0200
@@ -26,6 +26,9 @@
def poll(self):
super().poll()
+ def reset_count(self):
+ self._restart_count = 0
+
class QtKernelManager(KernelManager, QtKernelManagerMixin):
"""A KernelManager with Qt signals for restart"""
@@ -61,6 +64,21 @@
if self._is_restarting:
self.kernel_restarted.emit()
self._is_restarting = False
+
+ def reset_autorestart_count(self):
+ """Reset autorestart count."""
+ if self._restarter:
+ self._restarter.reset_count()
+
+ async def _async_post_start_kernel(self, **kw):
+ """
+ This is necessary for Jupyter-client 8+ because `start_kernel` doesn't
+ call `post_start_kernel` directly.
+ """
+ await super()._async_post_start_kernel(**kw)
+ if self._is_restarting:
+ self.kernel_restarted.emit()
+ self._is_restarting = False
def _handle_kernel_restarting(self):
"""Kernel has died, and will be restarted."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtconsole-5.4.1/qtconsole/tests/test_00_console_widget.py
new/qtconsole-5.4.2/qtconsole/tests/test_00_console_widget.py
--- old/qtconsole-5.4.1/qtconsole/tests/test_00_console_widget.py
2022-11-02 01:49:56.000000000 +0100
+++ new/qtconsole-5.4.2/qtconsole/tests/test_00_console_widget.py
2023-03-28 23:52:03.000000000 +0200
@@ -1,3 +1,4 @@
+import os
import unittest
import sys
@@ -259,6 +260,49 @@
assert output in control.toPlainText()
+@flaky(max_runs=5)
[email protected](os.name == 'nt', reason="no SIGTERM on Windows")
+def test_restart_after_kill(qtconsole, qtbot):
+ """
+ Test that the kernel correctly restarts after a kill.
+ """
+ window = qtconsole.window
+ shell = window.active_frontend
+ control = shell._control
+
+ def wait_for_restart():
+ qtbot.waitUntil(
+ lambda: 'Kernel died, restarting' in control.toPlainText()
+ )
+
+ # Wait until the console is fully up
+ qtbot.waitUntil(lambda: shell._prompt_html is not None,
+ timeout=SHELL_TIMEOUT)
+
+ # This checks that we are able to restart the kernel even after the number
+ # of consecutive auto-restarts is reached (which by default is five).
+ for _ in range(10):
+ # Clear console
+ with qtbot.waitSignal(shell.executed):
+ shell.execute('%clear')
+ qtbot.wait(500)
+
+ # Run some code that kills the kernel
+ code = "import os, signal; os.kill(os.getpid(), signal.SIGTERM)"
+ shell.execute(code)
+
+ # Check that the restart message is printed
+ qtbot.waitUntil(
+ lambda: 'Kernel died, restarting' in control.toPlainText()
+ )
+
+ # Check that a new prompt is available after the restart
+ qtbot.waitUntil(
+ lambda: control.toPlainText().splitlines()[-1] == 'In [1]: '
+ )
+ qtbot.wait(500)
+
+
@pytest.mark.skipif(no_display, reason="Doesn't work without a display")
class TestConsoleWidget(unittest.TestCase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtconsole-5.4.1/qtconsole.egg-info/PKG-INFO
new/qtconsole-5.4.2/qtconsole.egg-info/PKG-INFO
--- old/qtconsole-5.4.1/qtconsole.egg-info/PKG-INFO 2023-03-11
21:43:33.000000000 +0100
+++ new/qtconsole-5.4.2/qtconsole.egg-info/PKG-INFO 2023-04-02
23:18:07.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: qtconsole
-Version: 5.4.1
+Version: 5.4.2
Summary: Jupyter Qt console
Home-page: http://jupyter.org
Author: Jupyter Development Team