Hello community,

here is the log from the commit of package python-qtconsole for 
openSUSE:Factory checked in at 2020-11-29 12:29:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-qtconsole (Old)
 and      /work/SRC/openSUSE:Factory/.python-qtconsole.new.5913 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-qtconsole"

Sun Nov 29 12:29:55 2020 rev:13 rq:851343 version:5.0.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-qtconsole/python-qtconsole.changes        
2020-09-17 14:52:06.083982611 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-qtconsole.new.5913/python-qtconsole.changes  
    2020-11-29 12:30:12.590110294 +0100
@@ -1,0 +2,13 @@
+Thu Nov 26 17:51:02 UTC 2020 - Arun Persaud <a...@gmx.de>
+
+- update to version 5.0.1:
+  * Add python_requires to setup.py for Python 3.6+ compatibility
+
+- changes from version 5.0.0:
+  * Additions
+    + Add option to set completion type while running.
+  * Changes
+    + Emit kernel_restarted after restarting kernel.
+    + Drop support for Python 2.7 and 3.5.
+
+-------------------------------------------------------------------

Old:
----
  qtconsole-4.7.7.tar.gz

New:
----
  qtconsole-5.0.1.tar.gz

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

Other differences:
------------------
++++++ python-qtconsole.spec ++++++
--- /var/tmp/diff_new_pack.PTZx7e/_old  2020-11-29 12:30:15.186112920 +0100
+++ /var/tmp/diff_new_pack.PTZx7e/_new  2020-11-29 12:30:15.190112923 +0100
@@ -19,7 +19,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define         skip_python2 1
 Name:           python-qtconsole
-Version:        4.7.7
+Version:        5.0.1
 Release:        0
 Summary:        Jupyter Qt console
 License:        BSD-3-Clause

++++++ qtconsole-4.7.7.tar.gz -> qtconsole-5.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/PKG-INFO new/qtconsole-5.0.1/PKG-INFO
--- old/qtconsole-4.7.7/PKG-INFO        2020-09-03 06:02:46.000000000 +0200
+++ new/qtconsole-5.0.1/PKG-INFO        2020-11-24 18:27:25.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: qtconsole
-Version: 4.7.7
+Version: 5.0.1
 Summary: Jupyter Qt console
 Home-page: http://jupyter.org
 Author: Jupyter Development Team
@@ -9,7 +9,9 @@
 License: BSD
 Description: # Jupyter QtConsole
         
-        [![Build 
Status](https://travis-ci.org/jupyter/qtconsole.svg?branch=master)](https://travis-ci.org/jupyter/qtconsole)
+        ![Windows 
tests](https://github.com/jupyter/qtconsole/workflows/Windows%20tests/badge.svg)
+        ![Macos 
tests](https://github.com/jupyter/qtconsole/workflows/Macos%20tests/badge.svg)
+        ![Linux 
tests](https://github.com/jupyter/qtconsole/workflows/Linux%20tests/badge.svg)
         [![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)
@@ -90,11 +92,12 @@
 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
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Requires-Python: >= 3.6
 Description-Content-Type: text/markdown
 Provides-Extra: test
 Provides-Extra: doc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/README.md 
new/qtconsole-5.0.1/README.md
--- old/qtconsole-4.7.7/README.md       2019-05-27 15:00:29.000000000 +0200
+++ new/qtconsole-5.0.1/README.md       2020-11-21 23:57:26.000000000 +0100
@@ -1,6 +1,8 @@
 # Jupyter QtConsole
 
-[![Build 
Status](https://travis-ci.org/jupyter/qtconsole.svg?branch=master)](https://travis-ci.org/jupyter/qtconsole)
+![Windows 
tests](https://github.com/jupyter/qtconsole/workflows/Windows%20tests/badge.svg)
+![Macos 
tests](https://github.com/jupyter/qtconsole/workflows/Macos%20tests/badge.svg)
+![Linux 
tests](https://github.com/jupyter/qtconsole/workflows/Linux%20tests/badge.svg)
 [![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)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/docs/gh-pages.py 
new/qtconsole-5.0.1/docs/gh-pages.py
--- old/qtconsole-4.7.7/docs/gh-pages.py        2015-12-20 15:40:14.000000000 
+0100
+++ new/qtconsole-5.0.1/docs/gh-pages.py        2020-11-21 05:27:38.000000000 
+0100
@@ -14,8 +14,6 @@
 #-----------------------------------------------------------------------------
 # Imports
 #-----------------------------------------------------------------------------
-from __future__ import print_function
-
 import os
 import shutil
 import sys
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/docs/source/changelog.rst 
new/qtconsole-5.0.1/docs/source/changelog.rst
--- old/qtconsole-4.7.7/docs/source/changelog.rst       2020-09-03 
05:55:38.000000000 +0200
+++ new/qtconsole-5.0.1/docs/source/changelog.rst       2020-11-24 
18:22:55.000000000 +0100
@@ -3,6 +3,35 @@
 Changes in Jupyter Qt console
 =============================
 
+.. _5.0:
+
+5.0
+~~~
+
+5.0.1
+-----
+
+`5.0.1 on GitHub <https://github.com/jupyter/qtconsole/milestones/5.0.1>`__
+
+* Add python_requires to setup.py for Python 3.6+ compatibility
+
+5.0.0
+-----
+
+`5.0.0 on GitHub <https://github.com/jupyter/qtconsole/milestones/5.0>`__
+
+Additions
++++++++++
+
+- Add option to set completion type while running.
+
+Changes
++++++++
+
+- Emit kernel_restarted after restarting kernel.
+- Drop support for Python 2.7 and 3.5.
+
+
 .. _4.7:
 
 4.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/docs/source/conf.py 
new/qtconsole-5.0.1/docs/source/conf.py
--- old/qtconsole-4.7.7/docs/source/conf.py     2017-08-12 17:49:25.000000000 
+0200
+++ new/qtconsole-5.0.1/docs/source/conf.py     2020-11-21 05:27:38.000000000 
+0100
@@ -1,5 +1,3 @@
-# -*- coding: utf-8 -*-
-#
 # Jupyter Qt Console documentation build configuration file, created by
 # sphinx-quickstart on Mon Apr 13 10:20:17 2015.
 #
@@ -251,8 +249,8 @@
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-  (master_doc, 'JupyterQtConsole.tex', u'Jupyter Qt Console Documentation',
-   u'Jupyter Development Team', 'manual'),
+  (master_doc, 'JupyterQtConsole.tex', 'Jupyter Qt Console Documentation',
+   'Jupyter Development Team', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -281,7 +279,7 @@
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    (master_doc, 'jupyterqtconsole', u'Jupyter Qt Console Documentation',
+    (master_doc, 'jupyterqtconsole', 'Jupyter Qt Console Documentation',
      [author], 1)
 ]
 
@@ -295,7 +293,7 @@
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-  (master_doc, 'JupyterQtConsole', u'Jupyter Qt Console Documentation',
+  (master_doc, 'JupyterQtConsole', 'Jupyter Qt Console Documentation',
    author, 'JupyterQtConsole', 'One line description of project.',
    'Miscellaneous'),
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/_version.py 
new/qtconsole-5.0.1/qtconsole/_version.py
--- old/qtconsole-4.7.7/qtconsole/_version.py   2020-09-03 06:01:53.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/_version.py   2020-11-24 18:26:22.000000000 
+0100
@@ -1,2 +1,2 @@
-version_info = (4, 7, 7)
+version_info = (5, 0, 1)
 __version__ = '.'.join(map(str, version_info))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/ansi_code_processor.py 
new/qtconsole-5.0.1/qtconsole/ansi_code_processor.py
--- old/qtconsole-4.7.7/qtconsole/ansi_code_processor.py        2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/ansi_code_processor.py        2020-11-21 
05:27:38.000000000 +0100
@@ -12,7 +12,6 @@
 from qtpy import QtGui
 
 # Local imports
-from ipython_genutils.py3compat import string_types
 from qtconsole.styles import dark_style
 
 #-----------------------------------------------------------------------------
@@ -335,7 +334,7 @@
         else:
             return None
 
-        if isinstance(constructor, string_types):
+        if isinstance(constructor, str):
             # If this is an X11 color name, we just hope there is a close SVG
             # color name. We could use QColor's static method
             # 'setAllowX11ColorNames()', but this is global and only available
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/bracket_matcher.py 
new/qtconsole-5.0.1/qtconsole/bracket_matcher.py
--- old/qtconsole-4.7.7/qtconsole/bracket_matcher.py    2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/bracket_matcher.py    2020-11-21 
05:27:38.000000000 +0100
@@ -23,7 +23,7 @@
             text edit widget.
         """
         assert isinstance(text_edit, (QtWidgets.QTextEdit, 
QtWidgets.QPlainTextEdit))
-        super(BracketMatcher, self).__init__()
+        super().__init__()
 
         # The format to apply to matching brackets.
         self.format = QtGui.QTextCharFormat()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/call_tip_widget.py 
new/qtconsole-5.0.1/qtconsole/call_tip_widget.py
--- old/qtconsole-4.7.7/qtconsole/call_tip_widget.py    2020-08-17 
19:19:15.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/call_tip_widget.py    2020-11-21 
05:27:38.000000000 +0100
@@ -19,7 +19,7 @@
             text edit widget.
         """
         assert isinstance(text_edit, (QtWidgets.QTextEdit, 
QtWidgets.QPlainTextEdit))
-        super(CallTipWidget, self).__init__(None, QtCore.Qt.ToolTip)
+        super().__init__(None, QtCore.Qt.ToolTip)
 
         self._hide_timer = QtCore.QBasicTimer()
         self._text_edit = text_edit
@@ -62,7 +62,7 @@
             elif etype == QtCore.QEvent.Leave:
                 self._leave_event_hide()
 
-        return super(CallTipWidget, self).eventFilter(obj, event)
+        return super().eventFilter(obj, event)
 
     def timerEvent(self, event):
         """ Reimplemented to hide the widget when the hide timer fires.
@@ -78,13 +78,13 @@
     def enterEvent(self, event):
         """ Reimplemented to cancel the hide timer.
         """
-        super(CallTipWidget, self).enterEvent(event)
+        super().enterEvent(event)
         self._hide_timer.stop()
 
     def hideEvent(self, event):
         """ Reimplemented to disconnect signal handlers and event filter.
         """
-        super(CallTipWidget, self).hideEvent(event)
+        super().hideEvent(event)
         # This fixes issue jupyter/qtconsole#383
         try:
             self._text_edit.cursorPositionChanged.disconnect(
@@ -96,7 +96,7 @@
     def leaveEvent(self, event):
         """ Reimplemented to start the hide timer.
         """
-        super(CallTipWidget, self).leaveEvent(event)
+        super().leaveEvent(event)
         self._leave_event_hide()
 
     def paintEvent(self, event):
@@ -108,17 +108,17 @@
         painter.drawPrimitive(QtWidgets.QStyle.PE_PanelTipLabel, option)
         painter.end()
 
-        super(CallTipWidget, self).paintEvent(event)
+        super().paintEvent(event)
 
     def setFont(self, font):
         """ Reimplemented to allow use of this method as a slot.
         """
-        super(CallTipWidget, self).setFont(font)
+        super().setFont(font)
 
     def showEvent(self, event):
         """ Reimplemented to connect signal handlers and event filter.
         """
-        super(CallTipWidget, self).showEvent(event)
+        super().showEvent(event)
         self._text_edit.cursorPositionChanged.connect(
             self._cursor_position_changed)
         self._text_edit.installEventFilter(self)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/comms.py 
new/qtconsole-5.0.1/qtconsole/comms.py
--- old/qtconsole-4.7.7/qtconsole/comms.py      2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/comms.py      2020-11-21 05:27:38.000000000 
+0100
@@ -12,7 +12,6 @@
 from traitlets.config import LoggingConfigurable
 
 from ipython_genutils.importstring import import_item
-from ipython_genutils.py3compat import string_types
 
 import uuid
 
@@ -27,7 +26,7 @@
     """
 
     def __init__(self, kernel_client, *args, **kwargs):
-        super(CommManager, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
         self.comms = {}
         self.targets = {}
         if kernel_client:
@@ -76,7 +75,7 @@
 
         f can be a Python callable or an import string for one.
         """
-        if isinstance(f, string_types):
+        if isinstance(f, str):
             f = import_item(f)
 
         self.targets[target_name] = f
@@ -192,7 +191,7 @@
         """
         Create a new comm. Must call open to use.
         """
-        super(Comm, self).__init__(target_name=target_name)
+        super().__init__(target_name=target_name)
         self.target_name = target_name
         self.kernel_client = kernel_client
         if comm_id is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/completion_html.py 
new/qtconsole-5.0.1/qtconsole/completion_html.py
--- old/qtconsole-4.7.7/qtconsole/completion_html.py    2020-09-03 
05:53:18.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/completion_html.py    2020-11-21 
05:27:38.000000000 +0100
@@ -1,5 +1,4 @@
 """A navigable completer for the qtconsole"""
-# coding : utf-8
 
 # Copyright (c) Jupyter Development Team.
 # Distributed under the terms of the Modified BSD License.
@@ -16,30 +15,30 @@
     if not item_matrix :
         return ''
     html_cols = []
-    tds = lambda text : u'<td>'+text+u'  </td>'
-    trs = lambda text : u'<tr>'+text+u'</tr>'
+    tds = lambda text : '<td>'+text+'  </td>'
+    trs = lambda text : '<tr>'+text+'</tr>'
     tds_items = [list(map(tds, row)) for row in item_matrix]
     if select :
         row, col = select
-        tds_items[row][col] = u'<td class="inverted">'\
+        tds_items[row][col] = '<td class="inverted">'\
                 +item_matrix[row][col]\
-                +u'  </td>'
+                +'  </td>'
     #select the right item
-    html_cols = map(trs, (u''.join(row) for row in tds_items))
+    html_cols = map(trs, (''.join(row) for row in tds_items))
     head = ''
     foot = ''
     if header :
-        head = (u'<tr>'\
-            +''.join((u'<td>'+header+u'</td>')*len(item_matrix[0]))\
+        head = ('<tr>'\
+            +''.join(('<td>'+header+'</td>')*len(item_matrix[0]))\
             +'</tr>')
 
     if footer :
-        foot = (u'<tr>'\
-            +''.join((u'<td>'+footer+u'</td>')*len(item_matrix[0]))\
+        foot = ('<tr>'\
+            +''.join(('<td>'+footer+'</td>')*len(item_matrix[0]))\
             +'</tr>')
-    html = (u'<table class="completion" style="white-space:pre"'
+    html = ('<table class="completion" style="white-space:pre"'
             'cellspacing=0>' +
-            head + (u''.join(html_cols)) + foot + u'</table>')
+            head + (''.join(html_cols)) + foot + '</table>')
     return html
 
 class SlidingInterval(object):
@@ -130,7 +129,7 @@
             text edit widget.
         """
         assert isinstance(console_widget._control, (QtWidgets.QTextEdit, 
QtWidgets.QPlainTextEdit))
-        super(CompletionHtml, self).__init__()
+        super().__init__()
 
         self._text_edit = console_widget._control
         self._console_widget = console_widget
@@ -192,7 +191,7 @@
             elif etype == QtCore.QEvent.FocusOut:
                 self.cancel_completion()
 
-        return super(CompletionHtml, self).eventFilter(obj, event)
+        return super().eventFilter(obj, event)
 
     #--------------------------------------------------------------------------
     # 'CompletionHtml' interface
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/completion_plain.py 
new/qtconsole-5.0.1/qtconsole/completion_plain.py
--- old/qtconsole-4.7.7/qtconsole/completion_plain.py   2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/completion_plain.py   2020-11-21 
05:27:38.000000000 +0100
@@ -19,7 +19,7 @@
             text edit widget.
         """
         assert isinstance(console_widget._control, (QtWidgets.QTextEdit, 
QtWidgets.QPlainTextEdit))
-        super(CompletionPlain, self).__init__()
+        super().__init__()
 
         self._text_edit = console_widget._control
         self._console_widget = console_widget
@@ -36,7 +36,7 @@
             if etype in( QtCore.QEvent.KeyPress, QtCore.QEvent.FocusOut ):
                 self.cancel_completion()
 
-        return super(CompletionPlain, self).eventFilter(obj, event)
+        return super().eventFilter(obj, event)
 
     #--------------------------------------------------------------------------
     # 'CompletionPlain' interface
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/completion_widget.py 
new/qtconsole-5.0.1/qtconsole/completion_widget.py
--- old/qtconsole-4.7.7/qtconsole/completion_widget.py  2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/completion_widget.py  2020-11-21 
05:27:38.000000000 +0100
@@ -20,7 +20,7 @@
         """
         text_edit = console_widget._control
         assert isinstance(text_edit, (QtWidgets.QTextEdit, 
QtWidgets.QPlainTextEdit))
-        super(CompletionWidget, self).__init__(parent=console_widget)
+        super().__init__(parent=console_widget)
 
         self._text_edit = text_edit
         self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
@@ -58,7 +58,7 @@
                 else:
                     self.cancel_completion()
 
-        return super(CompletionWidget, self).eventFilter(obj, event)
+        return super().eventFilter(obj, event)
 
     def keyPressEvent(self, event):
         key = event.key()
@@ -70,7 +70,7 @@
         elif key in (QtCore.Qt.Key_Up, QtCore.Qt.Key_Down,
                      QtCore.Qt.Key_PageUp, QtCore.Qt.Key_PageDown,
                      QtCore.Qt.Key_Home, QtCore.Qt.Key_End):
-            return super(CompletionWidget, self).keyPressEvent(event)
+            return super().keyPressEvent(event)
         else:
             QtWidgets.QApplication.sendEvent(self._text_edit, event)
 
@@ -81,7 +81,7 @@
     def hideEvent(self, event):
         """ Reimplemented to disconnect signal handlers and event filter.
         """
-        super(CompletionWidget, self).hideEvent(event)
+        super().hideEvent(event)
         try:
             
self._text_edit.cursorPositionChanged.disconnect(self._update_current)
         except TypeError:
@@ -91,7 +91,7 @@
     def showEvent(self, event):
         """ Reimplemented to connect signal handlers and event filter.
         """
-        super(CompletionWidget, self).showEvent(event)
+        super().showEvent(event)
         self._text_edit.cursorPositionChanged.connect(self._update_current)
         self.installEventFilter(self)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/console_widget.py 
new/qtconsole-5.0.1/qtconsole/console_widget.py
--- old/qtconsole-4.7.7/qtconsole/console_widget.py     2020-09-03 
05:53:18.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/console_widget.py     2020-11-21 
05:27:38.000000000 +0100
@@ -218,7 +218,7 @@
         parent : QWidget, optional [default None]
             The parent for this widget.
         """
-        super(ConsoleWidget, self).__init__(**kw)
+        super().__init__(**kw)
         if parent:
             self.setParent(parent)
 
@@ -467,7 +467,7 @@
             anchor = self._control.anchorAt(event.pos())
             QtWidgets.QToolTip.showText(event.globalPos(), anchor)
 
-        return super(ConsoleWidget, self).eventFilter(obj, event)
+        return super().eventFilter(obj, event)
 
     
#---------------------------------------------------------------------------
     # 'QWidget' interface
@@ -578,11 +578,11 @@
     def _handle_is_complete_reply(self, msg):
         if msg['parent_header'].get('msg_id', 0) != self._is_complete_msg_id:
             return
-        status = msg['content'].get('status', u'complete')
-        indent = msg['content'].get('indent', u'')
+        status = msg['content'].get('status', 'complete')
+        indent = msg['content'].get('indent', '')
         self._trigger_is_complete_callback(status != 'incomplete', indent)
 
-    def _trigger_is_complete_callback(self, complete=False, indent=u''):
+    def _trigger_is_complete_callback(self, complete=False, indent=''):
         if self._is_complete_msg_id is not None:
             self._is_complete_msg_id = None
             self._is_complete_callback(complete, indent)
@@ -777,6 +777,18 @@
 
     font = property(_get_font, _set_font)
 
+    def _set_completion_widget(self, gui_completion):
+        """ Set gui completion widget.
+        """
+        if gui_completion == 'ncurses':
+            self._completion_widget = CompletionHtml(self)
+        elif gui_completion == 'droplist':
+            self._completion_widget = CompletionWidget(self)
+        elif gui_completion == 'plain':
+            self._completion_widget = CompletionPlain(self)
+
+        self.gui_completion = gui_completion
+
     def open_anchor(self, anchor):
         """ Open selected anchor in the default webbrowser
         """
@@ -1952,7 +1964,7 @@
     def _indent(self, dedent=True):
         """ Indent/Dedent current line or current text selection.
         """
-        num_newlines = self._get_cursor().selectedText().count(u"\u2029")
+        num_newlines = self._get_cursor().selectedText().count("\u2029")
         save_cur = self._get_cursor()
         cur = self._get_cursor()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/frontend_widget.py 
new/qtconsole-5.0.1/qtconsole/frontend_widget.py
--- old/qtconsole-4.7.7/qtconsole/frontend_widget.py    2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/frontend_widget.py    2020-11-21 
05:27:38.000000000 +0100
@@ -3,15 +3,12 @@
 # Copyright (c) Jupyter Development Team
 # Distributed under the terms of the Modified BSD License.
 
-from __future__ import print_function
-
 from collections import namedtuple
 import sys
 import uuid
 import re
 
 from qtpy import QtCore, QtGui, QtWidgets
-from ipython_genutils import py3compat
 from ipython_genutils.importstring import import_item
 
 from qtconsole.base_frontend_mixin import BaseFrontendMixin
@@ -27,7 +24,7 @@
     """
 
     def __init__(self, frontend, lexer=None):
-        super(FrontendHighlighter, 
self).__init__(frontend._control.document(), lexer=lexer)
+        super().__init__(frontend._control.document(), lexer=lexer)
         self._current_offset = 0
         self._frontend = frontend
         self.highlighting_on = False
@@ -78,21 +75,21 @@
         diff = len(string) - len(without_prompt)
         if diff > 0:
             self._current_offset = diff
-            super(FrontendHighlighter, self).highlightBlock(without_prompt)
+            super().highlightBlock(without_prompt)
 
     def rehighlightBlock(self, block):
         """ Reimplemented to temporarily enable highlighting if disabled.
         """
         old = self.highlighting_on
         self.highlighting_on = True
-        super(FrontendHighlighter, self).rehighlightBlock(block)
+        super().rehighlightBlock(block)
         self.highlighting_on = old
 
     def setFormat(self, start, count, format):
         """ Reimplemented to highlight selectively.
         """
         start += self._current_offset
-        super(FrontendHighlighter, self).setFormat(start, count, format)
+        super().setFormat(start, count, format)
 
 
 class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):
@@ -134,10 +131,7 @@
         self.lexer = lexer_class()
 
     def _lexer_class_default(self):
-        if py3compat.PY3:
-            return 'pygments.lexers.Python3Lexer'
-        else:
-            return 'pygments.lexers.PythonLexer'
+        return 'pygments.lexers.Python3Lexer'
 
     lexer = Any()
     def _lexer_default(self):
@@ -167,7 +161,7 @@
     # -------------------------------------------------------------------------
 
     def __init__(self, local_kernel=_local_kernel, *args, **kw):
-        super(FrontendWidget, self).__init__(*args, **kw)
+        super().__init__(*args, **kw)
         # FrontendWidget protected variables.
         self._bracket_matcher = BracketMatcher(self._control)
         self._call_tip_widget = CallTipWidget(self._control)
@@ -290,7 +284,7 @@
     def _context_menu_make(self, pos):
         """ Reimplemented to add an action for raw copy.
         """
-        menu = super(FrontendWidget, self)._context_menu_make(pos)
+        menu = super()._context_menu_make(pos)
         for before_action in menu.actions():
             if before_action.shortcut().matches(QtGui.QKeySequence.Paste) == \
                     QtGui.QKeySequence.ExactMatch:
@@ -313,7 +307,11 @@
         if self._control_key_down(event.modifiers(), include_command=False):
 
             if key == QtCore.Qt.Key_C and self._executing:
-                self.request_interrupt_kernel()
+                # If text is selected, the user probably wants to copy it.
+                if self.can_copy() and event.matches(QtGui.QKeySequence.Copy):
+                    self.copy()
+                else:
+                    self.request_interrupt_kernel()
                 return True
 
             elif key == QtCore.Qt.Key_Period:
@@ -336,7 +334,7 @@
                         cursor.removeSelectedText()
                         return True
 
-        return super(FrontendWidget, 
self)._event_filter_console_keypress(event)
+        return super()._event_filter_console_keypress(event)
 
     
#---------------------------------------------------------------------------
     # 'BaseFrontendMixin' abstract interface
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/history_console_widget.py 
new/qtconsole-5.0.1/qtconsole/history_console_widget.py
--- old/qtconsole-4.7.7/qtconsole/history_console_widget.py     2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/history_console_widget.py     2020-11-21 
05:27:38.000000000 +0100
@@ -3,7 +3,6 @@
 
 from qtpy import QtGui
 
-from ipython_genutils.py3compat import unicode_type
 from traitlets import Bool
 from .console_widget import ConsoleWidget
 
@@ -25,7 +24,7 @@
     
#---------------------------------------------------------------------------
 
     def __init__(self, *args, **kw):
-        super(HistoryConsoleWidget, self).__init__(*args, **kw)
+        super().__init__(*args, **kw)
 
         # HistoryConsoleWidget protected variables.
         self._history = []
@@ -40,7 +39,7 @@
         """ Reimplemented to the store history. """
         history = self.input_buffer if source is None else source
 
-        super(HistoryConsoleWidget, self).do_execute(source, complete, indent)
+        super().do_execute(source, complete, indent)
 
         if complete:
             # Save the command unless it was an empty string or was identical
@@ -242,7 +241,7 @@
         if index in self._history_edits:
             return self._history_edits[index]
         elif index == len(self._history):
-            return unicode_type()
+            return str()
         return self._history[index]
 
     def _set_history(self, history):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/inprocess.py 
new/qtconsole-5.0.1/qtconsole/inprocess.py
--- old/qtconsole-4.7.7/qtconsole/inprocess.py  2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/inprocess.py  2020-11-21 05:27:38.000000000 
+0100
@@ -27,13 +27,13 @@
     def start(self):
         """ Reimplemented to emit signal.
         """
-        super(QtInProcessChannel, self).start()
+        super().start()
         self.started.emit()
 
     def stop(self):
         """ Reimplemented to emit signal.
         """
-        super(QtInProcessChannel, self).stop()
+        super().stop()
         self.stopped.emit()
 
     def call_handlers_later(self, *args, **kwds):
@@ -53,7 +53,7 @@
     def flush(self, timeout=1.0):
         """ Reimplemented to ensure that signals are dispatched immediately.
         """
-        super(QtInProcessChannel, self).flush()
+        super().flush()
         self.process_events()
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/jupyter_widget.py 
new/qtconsole-5.0.1/qtconsole/jupyter_widget.py
--- old/qtconsole-4.7.7/qtconsole/jupyter_widget.py     2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/jupyter_widget.py     2020-11-21 
05:27:38.000000000 +0100
@@ -115,7 +115,7 @@
     
#---------------------------------------------------------------------------
 
     def __init__(self, *args, **kw):
-        super(JupyterWidget, self).__init__(*args, **kw)
+        super().__init__(*args, **kw)
 
         # JupyterWidget protected variables.
         self._payload_handlers = {
@@ -191,7 +191,7 @@
                 self._show_interpreter_prompt(number)
             self._request_info['execute'].pop(msg_id)
         else:
-            super(JupyterWidget, self)._handle_execute_reply(msg)
+            super()._handle_execute_reply(msg)
 
     def _handle_history_reply(self, msg):
         """ Handle history tail replies, which are only supported
@@ -218,7 +218,7 @@
         history_items = content['history']
         self.log.debug("Received history reply with %i entries", 
len(history_items))
         items = []
-        last_cell = u""
+        last_cell = ""
         for _, _, cell in history_items:
             cell = cell.rstrip()
             if cell != last_cell:
@@ -292,7 +292,7 @@
                 text = data['text/plain']
                 self._append_plain_text(text, True)
             # This newline seems to be needed for text and html output.
-            self._append_plain_text(u'\n', True)
+            self._append_plain_text('\n', True)
 
     def _handle_kernel_info_reply(self, rep):
         """Handle kernel info replies."""
@@ -317,7 +317,7 @@
         if self._starting:
             # finish handling started channels
             self._starting = False
-            super(JupyterWidget, self)._started_channels()
+            super()._started_channels()
 
     def _started_channels(self):
         """Make a history request"""
@@ -612,4 +612,4 @@
     def __init__(self, *a, **kw):
         warn("IPythonWidget is deprecated; use JupyterWidget",
              DeprecationWarning)
-        super(IPythonWidget, self).__init__(*a, **kw)
+        super().__init__(*a, **kw)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/kernel_mixins.py 
new/qtconsole-5.0.1/qtconsole/kernel_mixins.py
--- old/qtconsole-4.7.7/qtconsole/kernel_mixins.py      2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/kernel_mixins.py      2020-11-21 
05:27:38.000000000 +0100
@@ -37,20 +37,20 @@
     
#---------------------------------------------------------------------------
 
     def __init__(self, *args, **kwargs):
-        super(QtKernelClientMixin, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
         self.comm_manager = None
     #------ Channel management 
-------------------------------------------------
 
     def start_channels(self, *args, **kw):
         """ Reimplemented to emit signal.
         """
-        super(QtKernelClientMixin, self).start_channels(*args, **kw)
+        super().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()
+        super().stop_channels()
         self.stopped_channels.emit()
         self.comm_manager = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/kill_ring.py 
new/qtconsole-5.0.1/qtconsole/kill_ring.py
--- old/qtconsole-4.7.7/qtconsole/kill_ring.py  2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/kill_ring.py  2020-11-21 05:27:38.000000000 
+0100
@@ -63,7 +63,7 @@
         """ Create a kill ring attached to the specified Qt text edit.
         """
         assert isinstance(text_edit, (QtWidgets.QTextEdit, 
QtWidgets.QPlainTextEdit))
-        super(QtKillRing, self).__init__()
+        super().__init__()
 
         self._ring = KillRing()
         self._prev_yank = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/mainwindow.py 
new/qtconsole-5.0.1/qtconsole/mainwindow.py
--- old/qtconsole-4.7.7/qtconsole/mainwindow.py 2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/mainwindow.py 2020-11-21 05:27:38.000000000 
+0100
@@ -53,7 +53,7 @@
             JupyterWidget instance, attached to the same kernel.
         """
 
-        super(MainWindow, self).__init__()
+        super().__init__()
         self._kernel_counter = 0
         self._external_kernel_counter = 0
         self._app = app
@@ -563,6 +563,44 @@
             triggered=self.clear_active_frontend)
         self.add_menu_action(self.view_menu, self.clear_action)
 
+        self.completion_menu = self.view_menu.addMenu("&Completion type")
+
+        completion_group = QtWidgets.QActionGroup(self)
+        active_frontend_completion = self.active_frontend.gui_completion
+        ncurses_completion_action = QtWidgets.QAction(
+            "&ncurses",
+            self,
+            triggered=lambda: self.set_completion_widget_active_frontend(
+                'ncurses'))
+        ncurses_completion_action.setCheckable(True)
+        ncurses_completion_action.setChecked(
+            active_frontend_completion == 'ncurses')
+        droplist_completion_action = QtWidgets.QAction(
+            "&droplist",
+            self,
+            triggered=lambda: self.set_completion_widget_active_frontend(
+                'droplist'))
+        droplist_completion_action.setCheckable(True)
+        droplist_completion_action.setChecked(
+            active_frontend_completion == 'droplist')
+        plain_commpletion_action = QtWidgets.QAction(
+            "&plain",
+            self,
+            triggered=lambda: self.set_completion_widget_active_frontend(
+                'plain'))
+        plain_commpletion_action.setCheckable(True)
+        plain_commpletion_action.setChecked(
+            active_frontend_completion == 'plain')
+
+        completion_group.addAction(ncurses_completion_action)
+        completion_group.addAction(droplist_completion_action)
+        completion_group.addAction(plain_commpletion_action)
+
+        self.completion_menu.addAction(ncurses_completion_action)
+        self.completion_menu.addAction(droplist_completion_action)
+        self.completion_menu.addAction(plain_commpletion_action)
+        self.completion_menu.setDefaultAction(ncurses_completion_action)
+
         self.pager_menu = self.view_menu.addMenu("&Pager")
 
         hsplit_action = QtWidgets.QAction(".. &Horizontal Split",
@@ -749,6 +787,9 @@
     def set_paging_active_frontend(self, paging):
         self.active_frontend._set_paging(paging)
 
+    def set_completion_widget_active_frontend(self, gui_completion):
+        self.active_frontend._set_completion_widget(gui_completion)
+
     def get_available_syntax_styles(self):
         """Get a list with the syntax styles available."""
         styles = list(get_all_styles())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/manager.py 
new/qtconsole-5.0.1/qtconsole/manager.py
--- old/qtconsole-4.7.7/qtconsole/manager.py    2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/manager.py    2020-11-21 05:27:38.000000000 
+0100
@@ -24,7 +24,7 @@
         self._timer.stop()
 
     def poll(self):
-        super(QtKernelRestarter, self).poll()
+        super().poll()
 
 
 class QtKernelManager(KernelManager, QtKernelManagerMixin):
@@ -33,6 +33,10 @@
     client_class = DottedObjectName('qtconsole.client.QtKernelClient')
     autorestart = Bool(True, config=True)
 
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self._is_restarting = False
+
     def start_restarter(self):
         if self.autorestart and self.has_kernel:
             if self._restarter is None:
@@ -41,7 +45,7 @@
                     parent=self,
                     log=self.log,
                 )
-                self._restarter.add_callback(self._handle_kernel_restarted)
+            self._is_restarting = True
             self._restarter.start()
 
     def stop_restarter(self):
@@ -49,5 +53,8 @@
             if self._restarter is not None:
                 self._restarter.stop()
 
-    def _handle_kernel_restarted(self):
-        self.kernel_restarted.emit()
+    def post_start_kernel(self, **kw):
+        super().post_start_kernel(**kw)
+        if self._is_restarting:
+            self.kernel_restarted.emit()
+            self._is_restarting = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/pygments_highlighter.py 
new/qtconsole-5.0.1/qtconsole/pygments_highlighter.py
--- old/qtconsole-4.7.7/qtconsole/pygments_highlighter.py       2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/pygments_highlighter.py       2020-11-21 
05:27:38.000000000 +0100
@@ -4,10 +4,9 @@
 from qtpy import QtGui
 from qtconsole.qstringhelpers import qstring_length
 
-from ipython_genutils.py3compat import PY3, string_types
 from pygments.formatters.html import HtmlFormatter
 from pygments.lexer import RegexLexer, _TokenType, Text, Error
-from pygments.lexers import PythonLexer, Python3Lexer
+from pygments.lexers import Python3Lexer
 from pygments.styles import get_style_by_name
 
 
@@ -65,7 +64,7 @@
                     pos += 1
                     statestack = ['root']
                     statetokens = tokendefs['root']
-                    yield pos, Text, u'\n'
+                    yield pos, Text, '\n'
                     continue
                 yield pos, Error, text[pos]
                 pos += 1
@@ -104,7 +103,7 @@
     
#---------------------------------------------------------------------------
 
     def __init__(self, parent, lexer=None):
-        super(PygmentsHighlighter, self).__init__(parent)
+        super().__init__(parent)
 
         self._document = self.document()
         self._formatter = HtmlFormatter(nowrap=True)
@@ -112,10 +111,7 @@
         if lexer is not None:
             self._lexer = lexer
         else:
-            if PY3:
-                self._lexer = Python3Lexer()
-            else:
-                self._lexer = PythonLexer()
+            self._lexer = Python3Lexer()
 
     def highlightBlock(self, string):
         """ Highlight a block of text.
@@ -147,7 +143,7 @@
     def set_style(self, style):
         """ Sets the style to the specified Pygments style.
         """
-        if isinstance(style, string_types):
+        if isinstance(style, str):
             style = get_style_by_name(style)
         self._style = style
         self._clear_caches()
@@ -192,7 +188,7 @@
     def _get_format_from_document(self, token, document):
         """ Returns a QTextCharFormat for token by
         """
-        code, html = next(self._formatter._format_lines([(token, u'dummy')]))
+        code, html = next(self._formatter._format_lines([(token, 'dummy')]))
         self._document.setHtml(html)
         return QtGui.QTextCursor(self._document).charFormat()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/qstringhelpers.py 
new/qtconsole-5.0.1/qtconsole/qstringhelpers.py
--- old/qtconsole-4.7.7/qtconsole/qstringhelpers.py     2019-08-22 
10:43:15.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/qstringhelpers.py     2020-11-21 
05:27:38.000000000 +0100
@@ -1,24 +1,14 @@
-# -*- coding: utf-8 -*-
-#
 # Copyright © Spyder Project Contributors
 # Licensed under the terms of the MIT License
 # (see spyder/__init__.py for details)
 
 """QString compatibility."""
 
-import sys
-
-
-PY2 = sys.version[0] == '2'
-
 
 def qstring_length(text):
     """
     Tries to compute what the length of an utf16-encoded QString would be.
     """
-    if PY2:
-        # I don't know what this is encoded in, so there is nothing I can do.
-        return len(text)
     utf16_text = text.encode('utf16')
     length = len(utf16_text) // 2
     # Remove Byte order mark.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/qtconsoleapp.py 
new/qtconsole-5.0.1/qtconsole/qtconsoleapp.py
--- old/qtconsole-4.7.7/qtconsole/qtconsoleapp.py       2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/qtconsoleapp.py       2020-11-21 
05:27:38.000000000 +0100
@@ -40,8 +40,8 @@
         try:
             import ctypes, traceback
             MB_ICONERROR = 0x00000010
-            title = u'Error starting QtConsole'
-            msg = u''.join(traceback.format_exception(exctype, value, tb))
+            title = 'Error starting QtConsole'
+            msg = ''.join(traceback.format_exception(exctype, value, tb))
             ctypes.windll.user32.MessageBoxW(0, msg, title, MB_ICONERROR)
         finally:
             # Also call the old exception hook to let it do
@@ -174,7 +174,7 @@
     widget_factory = Any(RichJupyterWidget)
 
     def parse_command_line(self, argv=None):
-        super(JupyterQtConsoleApp, self).parse_command_line(argv)
+        super().parse_command_line(argv)
         self.build_kernel_argv(self.extra_args)
 
 
@@ -412,7 +412,7 @@
     def initialize(self, argv=None):
         self._init_asyncio_patch()
         self.init_qt_app()
-        super(JupyterQtConsoleApp, self).initialize(argv)
+        super().initialize(argv)
         if self._dispatching:
             return
         # handle deprecated renames
@@ -429,7 +429,7 @@
         self.init_signal()
 
     def start(self):
-        super(JupyterQtConsoleApp, self).start()
+        super().start()
 
         # draw the window
         if self.maximize:
@@ -446,7 +446,7 @@
     def __init__(self, *a, **kw):
         warn("IPythonQtConsoleApp is deprecated; use JupyterQtConsoleApp",
              DeprecationWarning)
-        super(IPythonQtConsoleApp, self).__init__(*a, **kw)
+        super().__init__(*a, **kw)
 
 
 # -----------------------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/rich_jupyter_widget.py 
new/qtconsole-5.0.1/qtconsole/rich_jupyter_widget.py
--- old/qtconsole-4.7.7/qtconsole/rich_jupyter_widget.py        2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/rich_jupyter_widget.py        2020-11-21 
05:27:38.000000000 +0100
@@ -50,7 +50,7 @@
         """ Create a RichJupyterWidget.
         """
         kw['kind'] = 'rich'
-        super(RichJupyterWidget, self).__init__(*args, **kw)
+        super().__init__(*args, **kw)
 
         # Configure the ConsoleWidget HTML exporter for our formats.
         self._html_exporter.image_tag = self._get_image_tag
@@ -75,7 +75,7 @@
         to the export running.
         """
         self._svg_warning_displayed = False
-        super(RichJupyterWidget, self).export_html()
+        super().export_html()
 
 
     
#---------------------------------------------------------------------------
@@ -101,7 +101,7 @@
                 menu.addAction('Save SVG As...',
                                lambda: save_svg(svg, self._control))
         else:
-            menu = super(RichJupyterWidget, self)._context_menu_make(pos)
+            menu = super()._context_menu_make(pos)
         return menu
 
     
#---------------------------------------------------------------------------
@@ -146,11 +146,11 @@
                 try:
                     self._append_latex(data['text/latex'], True)
                 except LatexError:
-                    return super(RichJupyterWidget, 
self)._handle_display_data(msg)
+                    return super()._handle_display_data(msg)
                 self._append_html(self.output_sep2, True)
             else:
                 # Default back to the plain text representation.
-                return super(RichJupyterWidget, 
self)._handle_execute_result(msg)
+                return super()._handle_execute_result(msg)
 
     def _handle_display_data(self, msg):
         """Overridden to handle rich data types, like SVG."""
@@ -177,10 +177,10 @@
                 try:
                     self._append_latex(data['text/latex'], True)
                 except LatexError:
-                    return super(RichJupyterWidget, 
self)._handle_display_data(msg)
+                    return super()._handle_display_data(msg)
             else:
                 # Default back to the plain text representation.
-                return super(RichJupyterWidget, self)._handle_display_data(msg)
+                return super()._handle_display_data(msg)
 
     
#---------------------------------------------------------------------------
     # 'RichJupyterWidget' protected interface
@@ -415,4 +415,4 @@
     def __init__(self, *a, **kw):
         warn("RichIPythonWidget is deprecated, use RichJupyterWidget",
              DeprecationWarning)
-        super(RichIPythonWidget, self).__init__(*a, **kw)
+        super().__init__(*a, **kw)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/rich_text.py 
new/qtconsole-5.0.1/qtconsole/rich_text.py
--- old/qtconsole-4.7.7/qtconsole/rich_text.py  2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/rich_text.py  2020-11-22 00:05:25.000000000 
+0100
@@ -9,8 +9,6 @@
 
 from qtpy import QtWidgets
 
-from ipython_genutils import py3compat
-
 #-----------------------------------------------------------------------------
 # Constants
 #-----------------------------------------------------------------------------
@@ -66,7 +64,7 @@
         if dialog.exec_():
             self.filename = dialog.selectedFiles()[0]
             choice = dialog.selectedNameFilter()
-            html = py3compat.cast_unicode(self.control.document().toHtml())
+            html = self.control.document().toHtml()
 
             # Configure the exporter.
             if choice.startswith('XHTML'):
@@ -177,7 +175,7 @@
         # valid XML.
         offset = html.find("<html>")
         assert offset > -1, 'Invalid HTML string: no <html> tag.'
-        html = (u'<html xmlns="http://www.w3.org/1999/xhtml";>\n'+
+        html = ('<html xmlns="http://www.w3.org/1999/xhtml";>\n'+
                 html[offset+6:])
 
         html = fix_html(html)
@@ -206,7 +204,7 @@
     format : "png"|"svg", optional [default "png"]
         Format for returned or referenced images.
     """
-    return u''
+    return ''
 
 
 def fix_html(html):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/svg.py 
new/qtconsole-5.0.1/qtconsole/svg.py
--- old/qtconsole-4.7.7/qtconsole/svg.py        2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/svg.py        2020-11-21 05:27:38.000000000 
+0100
@@ -4,8 +4,6 @@
 # System library imports.
 from qtpy import QtCore, QtGui, QtSvg, QtWidgets
 
-# Our own imports
-from ipython_genutils.py3compat import unicode_type
 
 def save_svg(string, parent=None):
     """ Prompts the user to save an SVG document to disk.
@@ -23,7 +21,7 @@
     The name of the file to which the document was saved, or None if the save
     was cancelled.
     """
-    if isinstance(string, unicode_type):
+    if isinstance(string, str):
         string = string.encode('utf-8')
 
     dialog = QtWidgets.QFileDialog(parent, 'Save SVG Document')
@@ -48,7 +46,7 @@
     string : basestring
         A Python string containing a SVG document.
     """
-    if isinstance(string, unicode_type):
+    if isinstance(string, str):
         string = string.encode('utf-8')
 
     mime_data = QtCore.QMimeData()
@@ -76,7 +74,7 @@
     -------
     A QImage of format QImage.Format_ARGB32.
     """
-    if isinstance(string, unicode_type):
+    if isinstance(string, str):
         string = string.encode('utf-8')
 
     renderer = QtSvg.QSvgRenderer(QtCore.QByteArray(string))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtconsole-4.7.7/qtconsole/tests/test_00_console_widget.py 
new/qtconsole-5.0.1/qtconsole/tests/test_00_console_widget.py
--- old/qtconsole-4.7.7/qtconsole/tests/test_00_console_widget.py       
2020-06-22 18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/tests/test_00_console_widget.py       
2020-11-21 23:57:26.000000000 +0100
@@ -1,5 +1,5 @@
-import sys
 import unittest
+import sys
 
 from flaky import flaky
 import pytest
@@ -10,10 +10,7 @@
 from qtconsole.qtconsoleapp import JupyterQtConsoleApp
 from . import no_display
 
-if sys.version[0] == '2':  # Python 2
-    from IPython.core.inputsplitter import InputSplitter as TransformerManager
-else:
-    from IPython.core.inputtransformer2 import TransformerManager
+from IPython.core.inputtransformer2 import TransformerManager
 
 
 SHELL_TIMEOUT = 20000
@@ -155,10 +152,7 @@
     with qtbot.waitSignal(shell.executed):
         shell.execute("import time")
 
-    if sys.version[0] == '2':
-        input_function = 'raw_input'
-    else:
-        input_function = 'input'
+    input_function = 'input'
     shell.execute("print(" + input_function + "('name: ')); time.sleep(3)")
 
     qtbot.waitUntil(lambda: control.toPlainText().split()[-1] == 'name:')
@@ -242,9 +236,9 @@
                        'foo\b\nbar\n',
                        'foo\b\nbar\r\n',
                        'abc\rxyz\b\b=']
-        expected_outputs = [u'x=z\u2029',
-                            u'foo\u2029bar\u2029',
-                            u'foo\u2029bar\u2029',
+        expected_outputs = ['x=z\u2029',
+                            'foo\u2029bar\u2029',
+                            'foo\u2029bar\u2029',
                             'x=z']
         for i, text in enumerate(test_inputs):
             w._insert_plain_text(cursor, text)
@@ -265,14 +259,14 @@
         w._insert_html(cursor, '<a href="http://python.org";>written in</a>')
         obj = w._control
         tip = QtWidgets.QToolTip
-        self.assertEqual(tip.text(), u'')
+        self.assertEqual(tip.text(), '')
 
         # should be somewhere else
         elsewhereEvent = QMouseEvent(MouseMove, QtCore.QPoint(50,50),
                                      noButton, noButtons, noModifiers)
         w.eventFilter(obj, elsewhereEvent)
         self.assertEqual(tip.isVisible(), False)
-        self.assertEqual(tip.text(), u'')
+        self.assertEqual(tip.text(), '')
         # should be over text
         overTextEvent = QMouseEvent(MouseMove, QtCore.QPoint(1,5),
                                     noButton, noButtons, noModifiers)
@@ -361,6 +355,7 @@
         copied = app.clipboard().text()
         self.assertEqual(copied,  'Header\nprompt>if:\n>     pass')
 
+    @pytest.mark.skipif(sys.platform == 'darwin', reason="Fails on macOS")
     def test_keypresses(self):
         """Test the event handling code for keypresses."""
         w = ConsoleWidget()
@@ -549,7 +544,7 @@
         w._handle_is_complete_reply(
             dict(parent_header=dict(msg_id=msg_id),
                  content=dict(status="incomplete", indent="!!!")))
-        self.assert_text_equal(cursor, u"thing\u2029> !!!")
+        self.assert_text_equal(cursor, "thing\u2029> !!!")
         self.assertEqual(calls, [])
 
         # test complete statement (_execute called)
@@ -562,16 +557,16 @@
                  content=dict(status="complete", indent="###")))
         self.assertEqual(calls, [("else", False)])
         calls = []
-        self.assert_text_equal(cursor, u"thing\u2029> !!!else\u2029")
+        self.assert_text_equal(cursor, "thing\u2029> !!!else\u2029")
 
         # test missing answer from is_complete
         msg_id = object()
         w.execute("done", interactive=True)
         self.assertEqual(calls, ["done"])
         calls = []
-        self.assert_text_equal(cursor, u"thing\u2029> !!!else\u2029")
+        self.assert_text_equal(cursor, "thing\u2029> !!!else\u2029")
         w._trigger_is_complete_callback()
-        self.assert_text_equal(cursor, u"thing\u2029> !!!else\u2029\u2029> ")
+        self.assert_text_equal(cursor, "thing\u2029> !!!else\u2029\u2029> ")
 
         # assert that late answer isn't destroying anything
         w._handle_is_complete_reply(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/tests/test_comms.py 
new/qtconsole-5.0.1/qtconsole/tests/test_comms.py
--- old/qtconsole-4.7.7/qtconsole/tests/test_comms.py   2019-11-17 
19:57:23.000000000 +0100
+++ new/qtconsole-5.0.1/qtconsole/tests/test_comms.py   2020-11-21 
05:27:38.000000000 +0100
@@ -1,16 +1,11 @@
 import time
-import sys
 
 import unittest
 
-from ipython_genutils.py3compat import PY3
 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):
 
@@ -146,17 +141,9 @@
 
         # Received message has a header and parent header. The parent header 
has
         # the info about the close message type in Python 3
-        if PY3:
-            assert msg['parent_header']['msg_type'] == 'comm_close'
-            assert msg['msg_type'] == 'stream'
-            assert msg['content']['text'] == 'close\n'
-        else:
-            # 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['parent_header']['msg_type'] == 'comm_close'
+        assert msg['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.7.7/qtconsole/tests/test_completion_widget.py 
new/qtconsole-5.0.1/qtconsole/tests/test_completion_widget.py
--- old/qtconsole-4.7.7/qtconsole/tests/test_completion_widget.py       
2020-06-22 18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/tests/test_completion_widget.py       
2020-11-21 05:27:38.000000000 +0100
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 import os
 import tempfile
 import shutil
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtconsole-4.7.7/qtconsole/tests/test_jupyter_widget.py 
new/qtconsole-5.0.1/qtconsole/tests/test_jupyter_widget.py
--- old/qtconsole-4.7.7/qtconsole/tests/test_jupyter_widget.py  2020-06-22 
18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole/tests/test_jupyter_widget.py  2020-11-21 
23:57:26.000000000 +0100
@@ -1,8 +1,9 @@
 import unittest
+import sys
 
 import pytest
-
 from qtpy import QtWidgets
+
 from qtconsole.client import QtKernelClient
 from qtconsole.jupyter_widget import JupyterWidget
 from . import no_display
@@ -39,6 +40,8 @@
         w.syntax_style = 'monokai'
         self.assertEqual(w._ansi_processor.get_color(15).name(), '#ffffff')
 
+    @pytest.mark.skipif(not sys.platform.startswith('linux'),
+                        reason="Works only on Linux")
     def test_other_output(self):
         """ Test displaying output from other clients.
         """
@@ -58,24 +61,24 @@
 
         self.assertEqual(document.blockCount(), 6)
         self.assertEqual(document.toPlainText(), (
-            u'Header\n'
-            u'\n'
-            u'[other] In [1]: a = 1 + 1\n'
-            u'           ...: b = range(10)\n'
-            u'\n'
-            u'In [2]: '
+            'Header\n'
+            '\n'
+            '[other] In [1]: a = 1 + 1\n'
+            '           ...: b = range(10)\n'
+            '\n'
+            'In [2]: '
         ))
 
         # Check proper syntax highlighting
         self.assertEqual(document.toHtml(), (
-            u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" 
"http://www.w3.org/TR/REC-html40/strict.dtd";>\n'
-            u'<html><head><meta name="qrichtext" content="1" /><style 
type="text/css">\n'
-            u'p, li { white-space: pre-wrap; }\n'
-            u'</style></head><body style=" font-family:\'Monospace\'; 
font-size:9pt; font-weight:400; font-style:normal;">\n'
-            u'<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;">Header</p>\n'
-            u'<p style="-qt-paragraph-type:empty; margin-top:0px; 
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; 
text-indent:0px;"><br /></p>\n'
-            u'<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" 
color:#000080;">[other] In [</span><span style=" font-weight:600; 
color:#000080;">1</span><span style=" color:#000080;">]:</span> a = 1 + 1</p>\n'
-            u'<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" 
color:#000080;">\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0...:</span> b = 
range(10)</p>\n'
-            u'<p style="-qt-paragraph-type:empty; margin-top:0px; 
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; 
text-indent:0px;"><br /></p>\n'
-            u'<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" 
color:#000080;">In [</span><span style=" font-weight:600; 
color:#000080;">2</span><span style=" color:#000080;">]:</span> 
</p></body></html>'
+            '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" 
"http://www.w3.org/TR/REC-html40/strict.dtd";>\n'
+            '<html><head><meta name="qrichtext" content="1" /><style 
type="text/css">\n'
+            'p, li { white-space: pre-wrap; }\n'
+            '</style></head><body style=" font-family:\'Monospace\'; 
font-size:9pt; font-weight:400; font-style:normal;">\n'
+            '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;">Header</p>\n'
+            '<p style="-qt-paragraph-type:empty; margin-top:0px; 
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; 
text-indent:0px;"><br /></p>\n'
+            '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" 
color:#000080;">[other] In [</span><span style=" font-weight:600; 
color:#000080;">1</span><span style=" color:#000080;">]:</span> a = 1 + 1</p>\n'
+            '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" 
color:#000080;">\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0...:</span> b = 
range(10)</p>\n'
+            '<p style="-qt-paragraph-type:empty; margin-top:0px; 
margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; 
text-indent:0px;"><br /></p>\n'
+            '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; 
margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" 
color:#000080;">In [</span><span style=" font-weight:600; 
color:#000080;">2</span><span style=" color:#000080;">]:</span> 
</p></body></html>'
         ))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole/util.py 
new/qtconsole-5.0.1/qtconsole/util.py
--- old/qtconsole-4.7.7/qtconsole/util.py       2020-06-22 18:28:02.000000000 
+0200
+++ new/qtconsole-5.0.1/qtconsole/util.py       2020-11-21 05:27:38.000000000 
+0100
@@ -5,7 +5,6 @@
 
 from qtpy import QtCore, QtGui
 
-from ipython_genutils.py3compat import iteritems
 from traitlets import HasTraits, TraitType
 
 #-----------------------------------------------------------------------------
@@ -25,7 +24,7 @@
     def __new__(mcls, name, bases, classdict):
         # FIXME: this duplicates the code from MetaHasTraits.
         # I don't think a super() call will help me here.
-        for k,v in iteritems(classdict):
+        for k,v in iter(classdict.items()):
             if isinstance(v, TraitType):
                 v.name = k
             elif inspect.isclass(v):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole.egg-info/PKG-INFO 
new/qtconsole-5.0.1/qtconsole.egg-info/PKG-INFO
--- old/qtconsole-4.7.7/qtconsole.egg-info/PKG-INFO     2020-09-03 
06:02:43.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole.egg-info/PKG-INFO     2020-11-24 
18:27:23.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: qtconsole
-Version: 4.7.7
+Version: 5.0.1
 Summary: Jupyter Qt console
 Home-page: http://jupyter.org
 Author: Jupyter Development Team
@@ -9,7 +9,9 @@
 License: BSD
 Description: # Jupyter QtConsole
         
-        [![Build 
Status](https://travis-ci.org/jupyter/qtconsole.svg?branch=master)](https://travis-ci.org/jupyter/qtconsole)
+        ![Windows 
tests](https://github.com/jupyter/qtconsole/workflows/Windows%20tests/badge.svg)
+        ![Macos 
tests](https://github.com/jupyter/qtconsole/workflows/Macos%20tests/badge.svg)
+        ![Linux 
tests](https://github.com/jupyter/qtconsole/workflows/Linux%20tests/badge.svg)
         [![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)
@@ -90,11 +92,12 @@
 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
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Requires-Python: >= 3.6
 Description-Content-Type: text/markdown
 Provides-Extra: test
 Provides-Extra: doc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole.egg-info/SOURCES.txt 
new/qtconsole-5.0.1/qtconsole.egg-info/SOURCES.txt
--- old/qtconsole-4.7.7/qtconsole.egg-info/SOURCES.txt  2020-09-03 
06:02:44.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole.egg-info/SOURCES.txt  2020-11-24 
18:27:23.000000000 +0100
@@ -2,7 +2,6 @@
 LICENSE
 MANIFEST.in
 README.md
-setup.cfg
 setup.py
 docs/Makefile
 docs/autogen_config.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/qtconsole.egg-info/requires.txt 
new/qtconsole-5.0.1/qtconsole.egg-info/requires.txt
--- old/qtconsole-4.7.7/qtconsole.egg-info/requires.txt 2020-09-03 
06:02:43.000000000 +0200
+++ new/qtconsole-5.0.1/qtconsole.egg-info/requires.txt 2020-11-24 
18:27:23.000000000 +0100
@@ -11,7 +11,6 @@
 Sphinx>=1.3
 
 [test]
+flaky
 pytest
-
-[test:python_version=="2.7"]
-mock
+pytest-qt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/setup.cfg 
new/qtconsole-5.0.1/setup.cfg
--- old/qtconsole-4.7.7/setup.cfg       2020-09-03 06:02:46.000000000 +0200
+++ new/qtconsole-5.0.1/setup.cfg       2020-11-24 18:27:25.000000000 +0100
@@ -1,6 +1,3 @@
-[bdist_wheel]
-universal = 1
-
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtconsole-4.7.7/setup.py new/qtconsole-5.0.1/setup.py
--- old/qtconsole-4.7.7/setup.py        2020-06-22 18:28:02.000000000 +0200
+++ new/qtconsole-5.0.1/setup.py        2020-11-24 18:19:30.000000000 +0100
@@ -1,11 +1,8 @@
 #!/usr/bin/env python
-# coding: utf-8
 
 # Copyright (c) Jupyter Development Team.
 # Distributed under the terms of the Modified BSD License.
 
-from __future__ import print_function
-
 # the name of the package
 name = 'qtconsole'
 
@@ -16,8 +13,8 @@
 import sys
 
 v = sys.version_info
-if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):
-    error = "ERROR: %s requires Python version 2.7 or 3.3 or above." % name
+if v[0] >= 3 and v[:2] < (3, 5):
+    error = "ERROR: %s requires Python version 3.6 or above." % name
     print(error, file=sys.stderr)
     sys.exit(1)
 
@@ -69,6 +66,7 @@
     license                       = 'BSD',
     platforms                     = "Linux, Mac OS X, Windows",
     keywords                      = ['Interactive', 'Interpreter', 'Shell'],
+    python_requires               = '>= 3.6',
     install_requires = [
         'traitlets',
         'ipython_genutils',
@@ -80,8 +78,7 @@
         'pyzmq>=17.1'
     ],
     extras_require = {
-        'test': ['pytest'],
-        'test:python_version=="2.7"': ['mock'],
+        'test': ['flaky', 'pytest', 'pytest-qt'],
         'doc': 'Sphinx>=1.3',
     },
     entry_points = {
@@ -95,11 +92,11 @@
         'Intended Audience :: Science/Research',
         'License :: OSI Approved :: BSD License',
         'Programming Language :: Python',
-        'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
     ],
 )
 
_______________________________________________
openSUSE Commits mailing list -- commit@lists.opensuse.org
To unsubscribe, email commit-le...@lists.opensuse.org
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives: 
https://lists.opensuse.org/archives/list/commit@lists.opensuse.org

Reply via email to