Hello community,

here is the log from the commit of package python-qtconsole for 
openSUSE:Factory checked in at 2019-06-13 23:03:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-qtconsole (Old)
 and      /work/SRC/openSUSE:Factory/.python-qtconsole.new.4811 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-qtconsole"

Thu Jun 13 23:03:40 2019 rev:2 rq:709553 version:4.5.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-qtconsole/python-qtconsole.changes        
2019-05-22 11:13:54.826557198 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-qtconsole.new.4811/python-qtconsole.changes  
    2019-06-13 23:03:40.943375905 +0200
@@ -1,0 +2,12 @@
+Wed Jun 12 19:55:58 UTC 2019 - Todd R <[email protected]>
+
+- Update to version 4.5.1
+  * Only use setuptools in setup.py to fix uploading tarballs to PyPI.
+- Update to version 4.5
+  + Additions
+    * Add Comms to qtconsole.
+    * Add kernel language name as an attribute of JupyterWidget.
+  + Changes
+    * Use new traitlets API with decorators.
+
+-------------------------------------------------------------------

Old:
----
  qtconsole-4.4.4.tar.gz

New:
----
  qtconsole-4.5.1.tar.gz

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

Other differences:
------------------
++++++ python-qtconsole.spec ++++++
--- /var/tmp/diff_new_pack.PF44Nb/_old  2019-06-13 23:03:42.531374524 +0200
+++ /var/tmp/diff_new_pack.PF44Nb/_new  2019-06-13 23:03:42.531374524 +0200
@@ -18,8 +18,8 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-qtconsole
-Version:        4.4.4
-%define doc_ver 4.4.3
+Version:        4.5.1
+%define doc_ver 4.5.1
 Release:        0
 Summary:        Jupyter Qt console
 License:        BSD-3-Clause
@@ -88,7 +88,7 @@
 Provides:       python-qtconsole-doc = %{version}
 Provides:       %{python_module qtconsole-doc = %{version}}
 Provides:       %{python_module jupyter_qtconsole-doc = %{version}}
-Obsoletes:      %{python_module jupyter_qtconsole-doc <= %{version}}
+Obsoletes:      %{python_module jupyter_qtconsole-doc < %{version}}
 
 %description -n jupyter-qtconsole-doc
 Documentation and help files for Jupyter's Qt console.

++++++ qtconsole-4.4.4.tar.gz -> qtconsole-4.5.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/MANIFEST.in 
new/qtconsole-4.5.1/MANIFEST.in
--- old/qtconsole-4.4.4/MANIFEST.in     1970-01-01 01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/MANIFEST.in     2018-08-12 00:38:18.000000000 +0200
@@ -0,0 +1,22 @@
+include LICENSE
+include CONTRIBUTING.md
+include README.md
+
+# Documentation
+graft docs
+exclude docs/\#*
+
+# Examples
+graft examples
+
+# docs subdirs we want to skip
+prune docs/build
+prune docs/gh-pages
+prune docs/dist
+
+# Patterns to exclude from any directory
+global-exclude *~
+global-exclude *.pyc
+global-exclude *.pyo
+global-exclude .git
+global-exclude .ipynb_checkpoints
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/PKG-INFO new/qtconsole-4.5.1/PKG-INFO
--- old/qtconsole-4.4.4/PKG-INFO        2019-05-03 11:31:58.000000000 +0200
+++ new/qtconsole-4.5.1/PKG-INFO        2019-05-27 15:10:45.000000000 +0200
@@ -1,12 +1,86 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: qtconsole
-Version: 4.4.4
+Version: 4.5.1
 Summary: Jupyter Qt console
 Home-page: http://jupyter.org
 Author: Jupyter Development Team
 Author-email: [email protected]
+Maintainer: Spyder Development Team
 License: BSD
-Description: Qt-based console for Jupyter with support for rich media output
+Description: # Jupyter QtConsole
+        
+        [![Build 
Status](https://travis-ci.org/jupyter/qtconsole.svg?branch=master)](https://travis-ci.org/jupyter/qtconsole)
+        [![Coverage 
Status](https://coveralls.io/repos/github/jupyter/qtconsole/badge.svg?branch=master)](https://coveralls.io/github/jupyter/qtconsole?branch=master)
+        [![Documentation 
Status](https://readthedocs.org/projects/qtconsole/badge/?version=stable)](https://qtconsole.readthedocs.io/en/stable/)
+        [![Google 
Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter)
+        
+        A rich Qt-based console for working with Jupyter kernels,
+        supporting rich media output, session export, and more.
+        
+        The Qtconsole is a very lightweight application that largely feels 
like a terminal, but
+        provides a number of enhancements only possible in a GUI, such as 
inline
+        figures, proper multiline editing with syntax highlighting, graphical 
calltips,
+        and more.
+        
+        
![qtconsole](https://raw.githubusercontent.com/jupyter/qtconsole/master/docs/source/_images/qtconsole.png)
+        
+        ## Install Qtconsole
+        The Qtconsole requires Python bindings for Qt, such as 
[PyQt5](http://www.riverbankcomputing.com/software/pyqt/intro),
+        [PyQt4](https://www.riverbankcomputing.com/software/pyqt/download),
+        or [PySide](http://pyside.github.io/docs/pyside).
+        
+        Although [pip](https://pypi.python.org/pypi/pip) and
+        [conda](http://conda.pydata.org/docs) may be used to install the 
Qtconsole, conda
+        is simpler to use since it automatically installs PyQt5. Alternatively,
+        the Qtconsole installation with pip needs additional steps since pip 
doesn't install
+        the Qt requirement.
+        
+        ### Install using conda
+        To install:
+        
+            conda install qtconsole
+        
+        **Note:** If the Qtconsole is installed using conda, it will 
**automatically**
+        install the Qt requirement as well.
+        
+        ### Install using pip
+        To install:
+        
+            pip install qtconsole
+        
+        **Note:** Make sure that Qt is installed. Unfortunately, Qt is not
+        installed when using pip. The next section gives instructions on doing 
it.
+        
+        ### Installing Qt (if needed)
+        You can install PyQt5 with pip using the following command:
+        
+            pip install pyqt5
+        
+        or with a system package manager on Linux. For Windows, PyQt binary 
packages may be
+        used.
+        
+        **Note:** Additional information about using a system package manager 
may be
+        found in the [qtconsole 
documentation](https://qtconsole.readthedocs.io).
+        
+        More installation instructions for PyQt can be found in the [PyQt5 
documentation](http://pyqt.sourceforge.net/Docs/PyQt5/installation.html) and 
[PyQt4 documentation](http://pyqt.sourceforge.net/Docs/PyQt4/installation.html)
+        
+        Source packages for Windows/Linux/MacOS can be found here: 
[PyQt5](https://www.riverbankcomputing.com/software/pyqt/download5) and 
[PyQt4](https://riverbankcomputing.com/software/pyqt/download).
+        
+        
+        ## Usage
+        To run the Qtconsole:
+        
+            jupyter qtconsole
+        
+        ## Resources
+        - [Project Jupyter website](https://jupyter.org)
+        - Documentation for the Qtconsole
+          * [latest version](https://qtconsole.readthedocs.io/en/latest/) 
[[PDF](https://media.readthedocs.org/pdf/qtconsole/latest/qtconsole.pdf)]
+          * [stable version](https://qtconsole.readthedocs.io/en/stable/) 
[[PDF](https://media.readthedocs.org/pdf/qtconsole/stable/qtconsole.pdf)]
+        - [Documentation for Project 
Jupyter](https://jupyter.readthedocs.io/en/latest/index.html) 
[[PDF](https://media.readthedocs.org/pdf/jupyter/latest/jupyter.pdf)]
+        - [Issues](https://github.com/jupyter/qtconsole/issues)
+        - [Technical support - Jupyter Google 
Group](https://groups.google.com/forum/#!forum/jupyter)
+        
 Keywords: Interactive,Interpreter,Shell
 Platform: Linux
 Platform: Mac OS X
@@ -18,6 +92,9 @@
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Description-Content-Type: text/markdown
+Provides-Extra: test
+Provides-Extra: doc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/README.md 
new/qtconsole-4.5.1/README.md
--- old/qtconsole-4.4.4/README.md       2018-10-12 22:41:34.000000000 +0200
+++ new/qtconsole-4.5.1/README.md       2019-05-27 15:00:29.000000000 +0200
@@ -1,29 +1,29 @@
-# Jupyter Qt Console
+# Jupyter QtConsole
 
-[![Google 
Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter)
 [![Build 
Status](https://travis-ci.org/jupyter/qtconsole.svg?branch=master)](https://travis-ci.org/jupyter/qtconsole)
 [![Coverage 
Status](https://coveralls.io/repos/github/jupyter/qtconsole/badge.svg?branch=master)](https://coveralls.io/github/jupyter/qtconsole?branch=master)
 [![Documentation 
Status](https://readthedocs.org/projects/qtconsole/badge/?version=stable)](https://qtconsole.readthedocs.io/en/stable/)
+[![Google 
Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter)
 
 A rich Qt-based console for working with Jupyter kernels,
 supporting rich media output, session export, and more.
 
-The Qt console is a very lightweight application that largely feels like a 
terminal, but
+The Qtconsole is a very lightweight application that largely feels like a 
terminal, but
 provides a number of enhancements only possible in a GUI, such as inline
 figures, proper multiline editing with syntax highlighting, graphical calltips,
 and more.
 
-![qtconsole](docs/source/_images/qtconsole.png)
+![qtconsole](https://raw.githubusercontent.com/jupyter/qtconsole/master/docs/source/_images/qtconsole.png)
 
-## Install Qt console
-The Qt console requires Qt, such as 
[PyQt5](http://www.riverbankcomputing.com/software/pyqt/intro),
+## Install Qtconsole
+The Qtconsole requires Python bindings for Qt, such as 
[PyQt5](http://www.riverbankcomputing.com/software/pyqt/intro),
 [PyQt4](https://www.riverbankcomputing.com/software/pyqt/download),
 or [PySide](http://pyside.github.io/docs/pyside).
 
 Although [pip](https://pypi.python.org/pypi/pip) and
-[conda](http://conda.pydata.org/docs) may be used to install the Qt console, 
conda
-is simpler to use since it automatically installs PyQt. Alternatively,
-the Qt console installation with pip needs additional steps since pip cannot 
install
+[conda](http://conda.pydata.org/docs) may be used to install the Qtconsole, 
conda
+is simpler to use since it automatically installs PyQt5. Alternatively,
+the Qtconsole installation with pip needs additional steps since pip doesn't 
install
 the Qt requirement.
 
 ### Install using conda
@@ -31,7 +31,7 @@
 
     conda install qtconsole
 
-**Note:** If the Qt console is installed using conda, it will **automatically**
+**Note:** If the Qtconsole is installed using conda, it will **automatically**
 install the Qt requirement as well.
 
 ### Install using pip
@@ -39,33 +39,33 @@
 
     pip install qtconsole
 
-**Note:** Make sure that Qt is installed. Unfortunately, Qt cannot be
-installed using pip. The next section gives instructions on installing Qt.
+**Note:** Make sure that Qt is installed. Unfortunately, Qt is not
+installed when using pip. The next section gives instructions on doing it.
 
 ### Installing Qt (if needed)
-We recommend installing PyQt with [conda](http://conda.pydata.org/docs):
+You can install PyQt5 with pip using the following command:
 
-    conda install pyqt
+    pip install pyqt5
 
-or with a system package manager. For Windows, PyQt binary packages may be
+or with a system package manager on Linux. For Windows, PyQt binary packages 
may be
 used.
 
 **Note:** Additional information about using a system package manager may be
 found in the [qtconsole documentation](https://qtconsole.readthedocs.io).
 
-More installation instructions for PyQT can be found in the [PyQt5 
documentation](http://pyqt.sourceforge.net/Docs/PyQt5/installation.html) and 
[PyQt4 documentation](http://pyqt.sourceforge.net/Docs/PyQt4/installation.html)
+More installation instructions for PyQt can be found in the [PyQt5 
documentation](http://pyqt.sourceforge.net/Docs/PyQt5/installation.html) and 
[PyQt4 documentation](http://pyqt.sourceforge.net/Docs/PyQt4/installation.html)
 
 Source packages for Windows/Linux/MacOS can be found here: 
[PyQt5](https://www.riverbankcomputing.com/software/pyqt/download5) and 
[PyQt4](https://riverbankcomputing.com/software/pyqt/download).
 
 
 ## Usage
-To run the Qt console:
+To run the Qtconsole:
 
     jupyter qtconsole
 
 ## Resources
 - [Project Jupyter website](https://jupyter.org)
-- Documentation for the Qt console
+- Documentation for the Qtconsole
   * [latest version](https://qtconsole.readthedocs.io/en/latest/) 
[[PDF](https://media.readthedocs.org/pdf/qtconsole/latest/qtconsole.pdf)]
   * [stable version](https://qtconsole.readthedocs.io/en/stable/) 
[[PDF](https://media.readthedocs.org/pdf/qtconsole/stable/qtconsole.pdf)]
 - [Documentation for Project 
Jupyter](https://jupyter.readthedocs.io/en/latest/index.html) 
[[PDF](https://media.readthedocs.org/pdf/jupyter/latest/jupyter.pdf)]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/docs/source/changelog.rst 
new/qtconsole-4.5.1/docs/source/changelog.rst
--- old/qtconsole-4.4.4/docs/source/changelog.rst       2019-05-03 
11:21:50.000000000 +0200
+++ new/qtconsole-4.5.1/docs/source/changelog.rst       2019-05-27 
15:08:39.000000000 +0200
@@ -3,6 +3,27 @@
 Changes in Jupyter Qt console
 =============================
 
+.. _4.5.1:
+
+`4.5.1 on GitHub <https://github.com/jupyter/qtconsole/milestones/4.5.1>`__
+
+- Only use setuptools in setup.py to fix uploading tarballs to PyPI.
+
+
+.. _4.5:
+
+`4.5 on GitHub <https://github.com/jupyter/qtconsole/milestones/4.5>`__
+
+Additions
+~~~~~~~~~
+- Add Comms to qtconsole.
+- Add kernel language name as an attribute of JupyterWidget.
+
+Changes
+~~~~~~~
+- Use new traitlets API with decorators.
+
+
 .. _4.4.4:
 
 `4.4.4 on GitHub <https://github.com/jupyter/qtconsole/milestones/4.4.4>`__
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole/_version.py 
new/qtconsole-4.5.1/qtconsole/_version.py
--- old/qtconsole-4.4.4/qtconsole/_version.py   2019-05-03 11:31:07.000000000 
+0200
+++ new/qtconsole-4.5.1/qtconsole/_version.py   2019-05-27 15:09:58.000000000 
+0200
@@ -1,2 +1,2 @@
-version_info = (4, 4, 4)
+version_info = (4, 5, 1)
 __version__ = '.'.join(map(str, version_info))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole/comms.py 
new/qtconsole-4.5.1/qtconsole/comms.py
--- old/qtconsole-4.4.4/qtconsole/comms.py      1970-01-01 01:00:00.000000000 
+0100
+++ new/qtconsole-4.5.1/qtconsole/comms.py      2019-05-23 13:25:43.000000000 
+0200
@@ -0,0 +1,268 @@
+"""
+Based on
+https://github.com/jupyter/notebook/blob/master/notebook/static/services/kernels/comm.js
+https://github.com/ipython/ipykernel/blob/master/ipykernel/comm/manager.py
+https://github.com/ipython/ipykernel/blob/master/ipykernel/comm/comm.py
+
+
+Which are distributed under the terms of the Modified BSD License.
+"""
+import logging
+
+from traitlets.config import LoggingConfigurable
+
+from ipython_genutils.importstring import import_item
+from ipython_genutils.py3compat import string_types
+
+import uuid
+
+from qtconsole.qt import QtCore
+from qtconsole.util import MetaQObjectHasTraits, SuperQObject
+
+class CommManager(MetaQObjectHasTraits(
+        'NewBase', (LoggingConfigurable, SuperQObject), {})):
+    """
+    Manager for Comms in the Frontend
+    """
+    def __init__(self, kernel_client, *args, **kwargs):
+        super(CommManager, self).__init__(*args, **kwargs)
+        self.comms = {}
+        self.targets = {}
+        if kernel_client:
+            self.init_kernel_client(kernel_client)
+
+    def init_kernel_client(self, kernel_client):
+        """
+        connect the kernel, and register message handlers
+        """
+        self.kernel_client = kernel_client
+        kernel_client.iopub_channel.message_received.connect(self._dispatch)
+
+    @QtCore.Slot(object)
+    def _dispatch(self, msg):
+        """Dispatch messages"""
+        msg_type = msg['header']['msg_type']
+        handled_msg_types = ['comm_open', 'comm_msg', 'comm_close']
+        if msg_type in handled_msg_types:
+            getattr(self, msg_type)(msg)
+
+    def new_comm(self, target_name, data=None, metadata=None,
+                 comm_id=None, buffers=None):
+        """
+        Create a new Comm, register it, and open its Kernel-side counterpart
+        Mimics the auto-registration in `Comm.__init__` in the Jupyter Comm.
+        
+        argument comm_id is optional
+        """
+        comm = Comm(target_name, self.kernel_client, comm_id)
+        self.register_comm(comm)
+        try:
+            comm.open(data, metadata, buffers)
+        except:
+            self.unregister_comm(comm)
+            raise
+        return comm
+
+    def register_target(self, target_name, f):
+        """Register a callable f for a given target name
+        
+        f will be called with two arguments when a comm_open message is
+        received with `target`:
+            
+        - the Comm instance
+        - the `comm_open` message itself.
+        
+        f can be a Python callable or an import string for one.
+        """
+        if isinstance(f, string_types):
+            f = import_item(f)
+
+        self.targets[target_name] = f
+
+    def unregister_target(self, target_name, f):
+        """Unregister a callable registered with register_target"""
+        return self.targets.pop(target_name)
+
+    def register_comm(self, comm):
+        """Register a new comm"""
+        comm_id = comm.comm_id
+        comm.kernel_client = self.kernel_client
+        self.comms[comm_id] = comm
+        comm.sig_is_closing.connect(self.unregister_comm)
+        return comm_id
+
+    @QtCore.Slot(object)
+    def unregister_comm(self, comm):
+        """Unregister a comm, and close its counterpart."""
+        # unlike get_comm, this should raise a KeyError
+        comm.sig_is_closing.disconnect(self.unregister_comm)
+        self.comms.pop(comm.comm_id)
+
+    def get_comm(self, comm_id):
+        """Get a comm with a particular id
+        
+        Returns the comm if found, otherwise None.
+        
+        This will not raise an error,
+        it will log messages if the comm cannot be found.
+        """
+        try:
+            return self.comms[comm_id]
+        except KeyError:
+            self.log.warning("No such comm: %s", comm_id)
+            if self.log.isEnabledFor(logging.DEBUG):
+                # don't create the list of keys if debug messages aren't 
enabled
+                self.log.debug("Current comms: %s", list(self.comms.keys()))
+
+    # comm message handlers
+    def comm_open(self, msg):
+        """Handler for comm_open messages"""
+        content = msg['content']
+        comm_id = content['comm_id']
+        target_name = content['target_name']
+        f = self.targets.get(target_name, None)
+
+        comm = Comm(target_name, self.kernel_client, comm_id)
+        self.register_comm(comm)
+
+        if f is None:
+            self.log.error("No such comm target registered: %s", target_name)
+        else:
+            try:
+                f(comm, msg)
+                return
+            except Exception:
+                self.log.error("Exception opening comm with target: %s",
+                               target_name, exc_info=True)
+
+        # Failure.
+        try:
+            comm.close()
+        except:
+            self.log.error("""Could not close comm during `comm_open` failure
+                clean-up.  The comm may not have been opened yet.""",
+                exc_info=True)
+
+    def comm_close(self, msg):
+        """Handler for comm_close messages"""
+        content = msg['content']
+        comm_id = content['comm_id']
+        comm = self.get_comm(comm_id)
+        if comm is None:
+            return
+
+        self.unregister_comm(comm)
+
+        try:
+            comm.handle_close(msg)
+        except Exception:
+            self.log.error('Exception in comm_close for %s', comm_id,
+                           exc_info=True)
+
+    def comm_msg(self, msg):
+        """Handler for comm_msg messages"""
+        content = msg['content']
+        comm_id = content['comm_id']
+        comm = self.get_comm(comm_id)
+        if comm is None:
+            return
+        try:
+            comm.handle_msg(msg)
+        except Exception:
+            self.log.error('Exception in comm_msg for %s', comm_id,
+                           exc_info=True)
+
+class Comm(MetaQObjectHasTraits(
+        'NewBase', (LoggingConfigurable, SuperQObject), {})):
+    """
+    Comm base class
+    """
+    sig_is_closing = QtCore.Signal(object)
+
+    def __init__(self, target_name, kernel_client, comm_id=None,
+                 msg_callback=None, close_callback=None):
+        """
+        Create a new comm. Must call open to use.
+        """
+        super(Comm, self).__init__(target_name=target_name)
+        self.target_name = target_name
+        self.kernel_client = kernel_client
+        if comm_id is None:
+            comm_id = uuid.uuid1().hex
+        self.comm_id = comm_id
+        self._msg_callback = msg_callback
+        self._close_callback = close_callback
+        self._send_channel = self.kernel_client.shell_channel
+
+    def __del__(self):
+        self.close()
+
+    def _send_msg(self, msg_type, content, data, metadata, buffers):
+        """
+        Send a message on the shell channel.
+        """
+        if data is None:
+            data = {}
+        if content is None:
+            content = {}
+        content['comm_id'] = self.comm_id
+        content['data'] = data
+
+        msg = self.kernel_client.session.msg(
+            msg_type, content, metadata=metadata)
+        if buffers:
+            msg['buffers'] = buffers
+        return self._send_channel.send(msg)
+
+    # methods for sending messages
+    def open(self, data=None, metadata=None, buffers=None):
+        """Open the kernel-side version of this comm"""
+        return self._send_msg(
+            'comm_open', {'target_name': self.target_name},
+            data, metadata, buffers)
+
+    def send(self, data=None, metadata=None, buffers=None):
+        """Send a message to the kernel-side version of this comm"""
+        return self._send_msg(
+            'comm_msg', {}, data, metadata, buffers)
+
+    def close(self, data=None, metadata=None, buffers=None):
+        """Close the kernel-side version of this comm"""
+        self.sig_is_closing.emit(self)
+        return self._send_msg(
+            'comm_close', {}, data, metadata, buffers)
+
+    # methods for registering callbacks for incoming messages
+
+    def on_msg(self, callback):
+        """Register a callback for comm_msg
+        
+        Will be called with the `data` of any comm_msg messages.
+        
+        Call `on_msg(None)` to disable an existing callback.
+        """
+        self._msg_callback = callback
+
+    def on_close(self, callback):
+        """Register a callback for comm_close
+        
+        Will be called with the `data` of the close message.
+        
+        Call `on_close(None)` to disable an existing callback.
+        """
+        self._close_callback = callback
+    
+    # methods for handling incoming messages
+    def handle_msg(self, msg):
+        """Handle a comm_msg message"""
+        self.log.debug("handle_msg[%s](%s)", self.comm_id, msg)
+        if self._msg_callback:
+            return self._msg_callback(msg)
+
+    def handle_close(self, msg):
+        """Handle a comm_close message"""
+        self.log.debug("handle_close[%s](%s)", self.comm_id, msg)
+        if self._close_callback:
+            return self._close_callback(msg)
+
+__all__ = ['CommManager']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole/frontend_widget.py 
new/qtconsole-4.5.1/qtconsole/frontend_widget.py
--- old/qtconsole-4.4.4/qtconsole/frontend_widget.py    2018-11-09 
22:01:10.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole/frontend_widget.py    2019-05-24 
11:24:05.000000000 +0200
@@ -16,7 +16,7 @@
 from ipython_genutils.importstring import import_item
 
 from qtconsole.base_frontend_mixin import BaseFrontendMixin
-from traitlets import Any, Bool, Instance, Unicode, DottedObjectName
+from traitlets import Any, Bool, Instance, Unicode, DottedObjectName, default
 from .bracket_matcher import BracketMatcher
 from .call_tip_widget import CallTipWidget
 from .history_console_widget import HistoryConsoleWidget
@@ -798,6 +798,7 @@
 
     #------ Trait default initializers 
-----------------------------------------
 
+    @default('banner')
     def _banner_default(self):
         """ Returns the standard Python banner.
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole/jupyter_widget.py 
new/qtconsole-4.5.1/qtconsole/jupyter_widget.py
--- old/qtconsole-4.4.4/qtconsole/jupyter_widget.py     2018-11-09 
21:59:15.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole/jupyter_widget.py     2019-05-24 
11:24:05.000000000 +0200
@@ -21,7 +21,7 @@
 from pygments.lexers import get_lexer_by_name
 from pygments.util import ClassNotFound
 from qtconsole import __version__
-from traitlets import Bool, Unicode
+from traitlets import Bool, Unicode, observe, default
 from .frontend_widget import FrontendWidget
 from . import styles
 
@@ -133,6 +133,9 @@
         else:
             self.set_default_style()
 
+        # Initialize language name.
+        self.language_name = None
+
     
#---------------------------------------------------------------------------
     # 'BaseFrontendMixin' abstract interface
     #
@@ -288,7 +291,7 @@
     def _handle_kernel_info_reply(self, rep):
         """Handle kernel info replies."""
         content = rep['content']
-        language_name = content['language_info']['name']
+        self.language_name = content['language_info']['name']
         pygments_lexer = content['language_info'].get('pygments_lexer', '')
 
         try:
@@ -299,7 +302,7 @@
             elif pygments_lexer == 'ipython2':
                 lexer = IPythonLexer()
             else:
-                lexer = get_lexer_by_name(language_name)
+                lexer = get_lexer_by_name(self.language_name)
             self._highlighter._lexer = lexer
         except ClassNotFound:
             pass
@@ -558,7 +561,8 @@
 
     #------ Trait change handlers --------------------------------------------
 
-    def _style_sheet_changed(self):
+    @observe('style_sheet')
+    def _style_sheet_changed(self, changed=None):
         """ Set the style sheets of the underlying widgets.
         """
         self.setStyleSheet(self.style_sheet)
@@ -568,7 +572,8 @@
         if self._page_control is not None:
             
self._page_control.document().setDefaultStyleSheet(self.style_sheet)
 
-    def _syntax_style_changed(self):
+    @observe('syntax_style')
+    def _syntax_style_changed(self, changed=None):
         """ Set the style for the syntax highlighter.
         """
         if self._highlighter is None:
@@ -582,6 +587,7 @@
 
     #------ Trait default initializers 
-----------------------------------------
 
+    @default('banner')
     def _banner_default(self):
         return "Jupyter QtConsole {version}\n".format(version=__version__)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole/kernel_mixins.py 
new/qtconsole-4.5.1/qtconsole/kernel_mixins.py
--- old/qtconsole-4.4.4/qtconsole/kernel_mixins.py      2015-12-20 
15:40:14.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole/kernel_mixins.py      2019-05-23 
13:25:43.000000000 +0200
@@ -7,6 +7,7 @@
 
 from traitlets import HasTraits, Type
 from .util import MetaQObjectHasTraits, SuperQObject
+from .comms import CommManager
 
 
 class QtKernelRestarterMixin(MetaQObjectHasTraits('NewBase', (HasTraits, 
SuperQObject), {})):
@@ -35,6 +36,9 @@
     # 'KernelClient' interface
     
#---------------------------------------------------------------------------
 
+    def __init__(self, *args, **kwargs):
+        super(QtKernelClientMixin, self).__init__(*args, **kwargs)
+        self.comm_manager = None
     #------ Channel management 
-------------------------------------------------
 
     def start_channels(self, *args, **kw):
@@ -42,9 +46,11 @@
         """
         super(QtKernelClientMixin, self).start_channels(*args, **kw)
         self.started_channels.emit()
+        self.comm_manager = CommManager(parent=self, kernel_client=self)
 
     def stop_channels(self):
         """ Reimplemented to emit signal.
         """
         super(QtKernelClientMixin, self).stop_channels()
         self.stopped_channels.emit()
+        self.comm_manager = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole/tests/test_comms.py 
new/qtconsole-4.5.1/qtconsole/tests/test_comms.py
--- old/qtconsole-4.4.4/qtconsole/tests/test_comms.py   1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole/tests/test_comms.py   2019-05-23 
13:25:43.000000000 +0200
@@ -0,0 +1,154 @@
+import time
+import sys
+
+import unittest
+
+from jupyter_client.blocking.channels import Empty
+
+from qtconsole.manager import QtKernelManager
+
+PY2 = sys.version[0] == '2'
+if PY2:
+    TimeoutError = RuntimeError
+
+class Tests(unittest.TestCase):
+
+    def setUp(self):
+        """Open a kernel."""
+        self.kernel_manager = QtKernelManager()
+        self.kernel_manager.start_kernel()
+        self.kernel_client = self.kernel_manager.client()
+        self.kernel_client.start_channels(shell=True, iopub=True)
+        self.blocking_client = self.kernel_client.blocking_client()
+        self.blocking_client.start_channels(shell=True, iopub=True)
+        self.comm_manager = self.kernel_client.comm_manager
+
+        # Check if client is working
+        self.blocking_client.execute('print(0)')
+        try:
+            self._get_next_msg()
+            self._get_next_msg()
+        except TimeoutError:
+            # Maybe it works now?
+            self.blocking_client.execute('print(0)')
+            self._get_next_msg()
+            self._get_next_msg()
+
+
+    def tearDown(self):
+        """Close the kernel."""
+        if self.kernel_manager:
+            self.kernel_manager.shutdown_kernel(now=True)
+        if self.kernel_client:
+            self.kernel_client.shutdown()
+
+    def _get_next_msg(self, timeout=10):
+        # Get status messages
+        timeout_time = time.time() + timeout
+        msg_type = 'status'
+        while msg_type == 'status':
+            if timeout_time < time.time():
+                raise TimeoutError
+            try:
+                msg = self.blocking_client.get_iopub_msg(timeout=3)
+                msg_type = msg['header']['msg_type']
+            except Empty:
+                pass
+        return msg
+    
+    def test_kernel_to_frontend(self):
+        """Communicate from the kernel to the frontend."""
+        comm_manager = self.comm_manager
+        blocking_client = self.blocking_client
+
+        class DummyCommHandler():
+            def __init__(self):
+                comm_manager.register_target('test_api', self.comm_open)
+                self.last_msg = None
+        
+            def comm_open(self, comm, msg):
+                comm.on_msg(self.comm_message)
+                comm.on_close(self.comm_message)
+                self.last_msg = msg['content']['data']
+                self.comm = comm
+        
+            def comm_message(self, msg):
+                self.last_msg = msg['content']['data']
+        
+        handler = DummyCommHandler()
+        blocking_client.execute(
+        "from ipykernel.comm import Comm\n"
+        "comm = Comm(target_name='test_api', data='open')\n"
+        "comm.send('message')\n"
+        "comm.close('close')\n"
+        "del comm\n"
+        "print('Done')\n"
+        )
+        # Get input
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'execute_input'
+        # Open comm
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'comm_open'
+        comm_manager._dispatch(msg)
+        assert handler.last_msg == 'open'
+        assert handler.comm.comm_id == msg['content']['comm_id']
+        # Get message
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'comm_msg'
+        comm_manager._dispatch(msg)
+        assert handler.last_msg == 'message'
+        assert handler.comm.comm_id == msg['content']['comm_id']
+        # Get close
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'comm_close'
+        comm_manager._dispatch(msg)
+        assert handler.last_msg == 'close'
+        assert handler.comm.comm_id == msg['content']['comm_id']
+        # Get close
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'stream'
+
+    def test_frontend_to_kernel(self):
+        """Communicate from the frontend to the kernel."""
+        comm_manager = self.comm_manager
+        blocking_client = self.blocking_client
+        blocking_client.execute(
+            "class DummyCommHandler():\n"
+            "    def __init__(self):\n"
+            "        get_ipython().kernel.comm_manager.register_target(\n"
+            "            'test_api', self.comm_open)\n"
+            "    def comm_open(self, comm, msg):\n"
+            "        comm.on_msg(self.comm_message)\n"
+            "        comm.on_close(self.comm_message)\n"
+            "        print(msg['content']['data'])\n"
+            "    def comm_message(self, msg):\n"
+            "        print(msg['content']['data'])\n"
+            "dummy = DummyCommHandler()\n"
+        )
+        # Get input
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'execute_input'
+        # Open comm
+        comm = comm_manager.new_comm('test_api', data='open')
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'stream'
+        assert msg['content']['text'] == 'open\n'
+        # Get message
+        comm.send('message')
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'stream'
+        assert msg['content']['text'] == 'message\n'
+        # Get close
+        comm.close('close')
+        msg = self._get_next_msg()
+        # For some reason ipykernel notifies me that it is closing,
+        # even though I closed the comm
+        assert msg['header']['msg_type'] == 'comm_close'
+        assert comm.comm_id == msg['content']['comm_id']
+        msg = self._get_next_msg()
+        assert msg['header']['msg_type'] == 'stream'
+        assert msg['content']['text'] == 'close\n'
+
+if __name__ == "__main__":
+    unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole.egg-info/PKG-INFO 
new/qtconsole-4.5.1/qtconsole.egg-info/PKG-INFO
--- old/qtconsole-4.4.4/qtconsole.egg-info/PKG-INFO     1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole.egg-info/PKG-INFO     2019-05-27 
15:10:44.000000000 +0200
@@ -0,0 +1,100 @@
+Metadata-Version: 2.1
+Name: qtconsole
+Version: 4.5.1
+Summary: Jupyter Qt console
+Home-page: http://jupyter.org
+Author: Jupyter Development Team
+Author-email: [email protected]
+Maintainer: Spyder Development Team
+License: BSD
+Description: # Jupyter QtConsole
+        
+        [![Build 
Status](https://travis-ci.org/jupyter/qtconsole.svg?branch=master)](https://travis-ci.org/jupyter/qtconsole)
+        [![Coverage 
Status](https://coveralls.io/repos/github/jupyter/qtconsole/badge.svg?branch=master)](https://coveralls.io/github/jupyter/qtconsole?branch=master)
+        [![Documentation 
Status](https://readthedocs.org/projects/qtconsole/badge/?version=stable)](https://qtconsole.readthedocs.io/en/stable/)
+        [![Google 
Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter)
+        
+        A rich Qt-based console for working with Jupyter kernels,
+        supporting rich media output, session export, and more.
+        
+        The Qtconsole is a very lightweight application that largely feels 
like a terminal, but
+        provides a number of enhancements only possible in a GUI, such as 
inline
+        figures, proper multiline editing with syntax highlighting, graphical 
calltips,
+        and more.
+        
+        
![qtconsole](https://raw.githubusercontent.com/jupyter/qtconsole/master/docs/source/_images/qtconsole.png)
+        
+        ## Install Qtconsole
+        The Qtconsole requires Python bindings for Qt, such as 
[PyQt5](http://www.riverbankcomputing.com/software/pyqt/intro),
+        [PyQt4](https://www.riverbankcomputing.com/software/pyqt/download),
+        or [PySide](http://pyside.github.io/docs/pyside).
+        
+        Although [pip](https://pypi.python.org/pypi/pip) and
+        [conda](http://conda.pydata.org/docs) may be used to install the 
Qtconsole, conda
+        is simpler to use since it automatically installs PyQt5. Alternatively,
+        the Qtconsole installation with pip needs additional steps since pip 
doesn't install
+        the Qt requirement.
+        
+        ### Install using conda
+        To install:
+        
+            conda install qtconsole
+        
+        **Note:** If the Qtconsole is installed using conda, it will 
**automatically**
+        install the Qt requirement as well.
+        
+        ### Install using pip
+        To install:
+        
+            pip install qtconsole
+        
+        **Note:** Make sure that Qt is installed. Unfortunately, Qt is not
+        installed when using pip. The next section gives instructions on doing 
it.
+        
+        ### Installing Qt (if needed)
+        You can install PyQt5 with pip using the following command:
+        
+            pip install pyqt5
+        
+        or with a system package manager on Linux. For Windows, PyQt binary 
packages may be
+        used.
+        
+        **Note:** Additional information about using a system package manager 
may be
+        found in the [qtconsole 
documentation](https://qtconsole.readthedocs.io).
+        
+        More installation instructions for PyQt can be found in the [PyQt5 
documentation](http://pyqt.sourceforge.net/Docs/PyQt5/installation.html) and 
[PyQt4 documentation](http://pyqt.sourceforge.net/Docs/PyQt4/installation.html)
+        
+        Source packages for Windows/Linux/MacOS can be found here: 
[PyQt5](https://www.riverbankcomputing.com/software/pyqt/download5) and 
[PyQt4](https://riverbankcomputing.com/software/pyqt/download).
+        
+        
+        ## Usage
+        To run the Qtconsole:
+        
+            jupyter qtconsole
+        
+        ## Resources
+        - [Project Jupyter website](https://jupyter.org)
+        - Documentation for the Qtconsole
+          * [latest version](https://qtconsole.readthedocs.io/en/latest/) 
[[PDF](https://media.readthedocs.org/pdf/qtconsole/latest/qtconsole.pdf)]
+          * [stable version](https://qtconsole.readthedocs.io/en/stable/) 
[[PDF](https://media.readthedocs.org/pdf/qtconsole/stable/qtconsole.pdf)]
+        - [Documentation for Project 
Jupyter](https://jupyter.readthedocs.io/en/latest/index.html) 
[[PDF](https://media.readthedocs.org/pdf/jupyter/latest/jupyter.pdf)]
+        - [Issues](https://github.com/jupyter/qtconsole/issues)
+        - [Technical support - Jupyter Google 
Group](https://groups.google.com/forum/#!forum/jupyter)
+        
+Keywords: Interactive,Interpreter,Shell
+Platform: Linux
+Platform: Mac OS X
+Platform: Windows
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: System Administrators
+Classifier: Intended Audience :: Science/Research
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Description-Content-Type: text/markdown
+Provides-Extra: test
+Provides-Extra: doc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole.egg-info/SOURCES.txt 
new/qtconsole-4.5.1/qtconsole.egg-info/SOURCES.txt
--- old/qtconsole-4.4.4/qtconsole.egg-info/SOURCES.txt  1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole.egg-info/SOURCES.txt  2019-05-27 
15:10:44.000000000 +0200
@@ -0,0 +1,73 @@
+CONTRIBUTING.md
+LICENSE
+MANIFEST.in
+README.md
+setup.cfg
+setup.py
+docs/Makefile
+docs/autogen_config.py
+docs/environment.yml
+docs/gh-pages.py
+docs/source/changelog.rst
+docs/source/conf.py
+docs/source/index.rst
+docs/source/installation.rst
+docs/source/_images/qtconsole.png
+docs/source/figs/besselj.png
+docs/source/figs/colors_dark.png
+docs/source/figs/jn.html
+docs/source/figs/jn.xhtml
+examples/embed_qtconsole.py
+examples/inprocess_qtconsole.py
+examples/jupyter-qtconsole.desktop
+qtconsole/__init__.py
+qtconsole/__main__.py
+qtconsole/_version.py
+qtconsole/ansi_code_processor.py
+qtconsole/base_frontend_mixin.py
+qtconsole/bracket_matcher.py
+qtconsole/call_tip_widget.py
+qtconsole/client.py
+qtconsole/comms.py
+qtconsole/completion_html.py
+qtconsole/completion_plain.py
+qtconsole/completion_widget.py
+qtconsole/console_widget.py
+qtconsole/frontend_widget.py
+qtconsole/history_console_widget.py
+qtconsole/inprocess.py
+qtconsole/ipython_widget.py
+qtconsole/jupyter_widget.py
+qtconsole/kernel_mixins.py
+qtconsole/kill_ring.py
+qtconsole/mainwindow.py
+qtconsole/manager.py
+qtconsole/pygments_highlighter.py
+qtconsole/qt.py
+qtconsole/qt_loaders.py
+qtconsole/qtconsoleapp.py
+qtconsole/rich_ipython_widget.py
+qtconsole/rich_jupyter_widget.py
+qtconsole/rich_text.py
+qtconsole/styles.py
+qtconsole/svg.py
+qtconsole/usage.py
+qtconsole/util.py
+qtconsole.egg-info/PKG-INFO
+qtconsole.egg-info/SOURCES.txt
+qtconsole.egg-info/dependency_links.txt
+qtconsole.egg-info/entry_points.txt
+qtconsole.egg-info/requires.txt
+qtconsole.egg-info/top_level.txt
+qtconsole/resources/icon/JupyterConsole.svg
+qtconsole/tests/__init__.py
+qtconsole/tests/test_ansi_code_processor.py
+qtconsole/tests/test_app.py
+qtconsole/tests/test_comms.py
+qtconsole/tests/test_completion_widget.py
+qtconsole/tests/test_console_widget.py
+qtconsole/tests/test_frontend_widget.py
+qtconsole/tests/test_jupyter_widget.py
+qtconsole/tests/test_kill_ring.py
+qtconsole/tests/test_styles.py
+scripts/jupyter-qtconsole
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtconsole-4.4.4/qtconsole.egg-info/dependency_links.txt 
new/qtconsole-4.5.1/qtconsole.egg-info/dependency_links.txt
--- old/qtconsole-4.4.4/qtconsole.egg-info/dependency_links.txt 1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole.egg-info/dependency_links.txt 2019-05-27 
15:10:44.000000000 +0200
@@ -0,0 +1 @@
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole.egg-info/entry_points.txt 
new/qtconsole-4.5.1/qtconsole.egg-info/entry_points.txt
--- old/qtconsole-4.4.4/qtconsole.egg-info/entry_points.txt     1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole.egg-info/entry_points.txt     2019-05-27 
15:10:44.000000000 +0200
@@ -0,0 +1,3 @@
+[gui_scripts]
+jupyter-qtconsole = qtconsole.qtconsoleapp:main
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole.egg-info/requires.txt 
new/qtconsole-4.5.1/qtconsole.egg-info/requires.txt
--- old/qtconsole-4.4.4/qtconsole.egg-info/requires.txt 1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole.egg-info/requires.txt 2019-05-27 
15:10:44.000000000 +0200
@@ -0,0 +1,15 @@
+traitlets
+ipython_genutils
+jupyter_core
+jupyter_client>=4.1
+pygments
+ipykernel>=4.1
+
+[doc]
+Sphinx>=1.3
+
+[test]
+pytest
+
+[test:python_version=="2.7"]
+mock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/qtconsole.egg-info/top_level.txt 
new/qtconsole-4.5.1/qtconsole.egg-info/top_level.txt
--- old/qtconsole-4.4.4/qtconsole.egg-info/top_level.txt        1970-01-01 
01:00:00.000000000 +0100
+++ new/qtconsole-4.5.1/qtconsole.egg-info/top_level.txt        2019-05-27 
15:10:44.000000000 +0200
@@ -0,0 +1 @@
+qtconsole
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/setup.cfg 
new/qtconsole-4.5.1/setup.cfg
--- old/qtconsole-4.4.4/setup.cfg       2018-08-12 00:38:18.000000000 +0200
+++ new/qtconsole-4.5.1/setup.cfg       2019-05-27 15:10:45.000000000 +0200
@@ -1,5 +1,7 @@
 [bdist_wheel]
-universal=1
+universal = 1
+
+[egg_info]
+tag_build = 
+tag_date = 0
 
-[metadata]
-license_file = LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.4.4/setup.py new/qtconsole-4.5.1/setup.py
--- old/qtconsole-4.4.4/setup.py        2018-11-10 04:10:20.000000000 +0100
+++ new/qtconsole-4.5.1/setup.py        2019-05-26 14:11:39.000000000 +0200
@@ -27,14 +27,14 @@
 # get on with it
 #-----------------------------------------------------------------------------
 
-import os
 from glob import glob
+import io
+import os
 
-from distutils.core import setup
+from setuptools import setup
 
 pjoin = os.path.join
 here = os.path.abspath(os.path.dirname(__file__))
-pkg_root = pjoin(here, name)
 
 packages = []
 for d, _, _ in os.walk(pjoin(here, name)):
@@ -49,22 +49,45 @@
 with open(pjoin(here, name, '_version.py')) as f:
     exec(f.read(), {}, version_ns)
 
+with io.open(os.path.join(here, 'README.md'), encoding='utf-8') as f:
+    long_description = f.read()
+
 
 setup_args = dict(
-    name            = name,
-    version         = version_ns['__version__'],
-    scripts         = glob(pjoin('scripts', '*')),
-    packages        = packages,
-    package_data    = package_data,
-    description     = "Jupyter Qt console",
-    long_description= "Qt-based console for Jupyter with support for rich 
media output",
-    author          = 'Jupyter Development Team',
-    author_email    = '[email protected]',
-    url             = 'http://jupyter.org',
-    license         = 'BSD',
-    platforms       = "Linux, Mac OS X, Windows",
-    keywords        = ['Interactive', 'Interpreter', 'Shell'],
-    classifiers     = [
+    name                          = name,
+    version                       = version_ns['__version__'],
+    scripts                       = glob(pjoin('scripts', '*')),
+    packages                      = packages,
+    package_data                  = package_data,
+    description                   = "Jupyter Qt console",
+    long_description              = long_description,
+    long_description_content_type = 'text/markdown',
+    author                        = 'Jupyter Development Team',
+    author_email                  = '[email protected]',
+    maintainer                    = 'Spyder Development Team',
+    url                           = 'http://jupyter.org',
+    license                       = 'BSD',
+    platforms                     = "Linux, Mac OS X, Windows",
+    keywords                      = ['Interactive', 'Interpreter', 'Shell'],
+    install_requires = [
+        'traitlets',
+        'ipython_genutils',
+        'jupyter_core',
+        'jupyter_client>=4.1',
+        'pygments',
+        'ipykernel>=4.1', # not a real dependency, but require the reference 
kernel
+    ],
+    extras_require = {
+        'test': ['pytest'],
+        'test:python_version=="2.7"': ['mock'],
+        'doc': 'Sphinx>=1.3',
+    },
+    entry_points = {
+        'gui_scripts': [
+            'jupyter-qtconsole = qtconsole.qtconsoleapp:main',
+        ]
+    },
+    classifiers = [
         'Intended Audience :: Developers',
         'Intended Audience :: System Administrators',
         'Intended Audience :: Science/Research',
@@ -72,39 +95,11 @@
         'Programming Language :: Python',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.3',
-        'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
+        'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
     ],
 )
 
-if 'develop' in sys.argv or any(a.startswith('bdist') for a in sys.argv):
-    import setuptools
-
-setuptools_args = {}
-install_requires = setuptools_args['install_requires'] = [
-    'traitlets',
-    'ipython_genutils',
-    'jupyter_core',
-    'jupyter_client>=4.1',
-    'pygments',
-    'ipykernel>=4.1', # not a real dependency, but require the reference kernel
-]
-
-extras_require = setuptools_args['extras_require'] = {
-    'test': ['pytest'],
-    'test:python_version=="2.7"': ['mock'],
-    'doc': 'Sphinx>=1.3',
-}
-
-if 'setuptools' in sys.modules:
-    setup_args['entry_points'] = {
-        'gui_scripts': [
-            'jupyter-qtconsole = qtconsole.qtconsoleapp:main',
-        ]
-    }
-    setup_args.pop('scripts')
-    setup_args.update(setuptools_args)
-
 if __name__ == '__main__':
     setup(**setup_args)

++++++ qtconsole.pdf ++++++
(binary differes)

++++++ qtconsole.zip ++++++
Binary files /var/tmp/diff_new_pack.PF44Nb/_old and 
/var/tmp/diff_new_pack.PF44Nb/_new differ


Reply via email to