git: 080746748698 - main - devel/py-pyrepl: Update to 0.11.5

From: Po-Chuan Hsieh <sunpoet_at_FreeBSD.org>
Date: Tue, 29 Sep 2026 19:29:44 UTC
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=0807467486982ad89f4bf642f5bc9d8226ec40c1

commit 0807467486982ad89f4bf642f5bc9d8226ec40c1
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2026-09-29 18:59:29 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2026-09-29 19:24:45 +0000

    devel/py-pyrepl: Update to 0.11.5
    
    - Update WWW
    
    Changes:        https://github.com/bretello/pyrepl/releases
---
 devel/py-pyrepl/Makefile         |   7 +-
 devel/py-pyrepl/distinfo         |   6 +-
 devel/py-pyrepl/files/patch-2to3 | 703 ---------------------------------------
 3 files changed, 6 insertions(+), 710 deletions(-)

diff --git a/devel/py-pyrepl/Makefile b/devel/py-pyrepl/Makefile
index 6485f611dff0..4df33400a2df 100644
--- a/devel/py-pyrepl/Makefile
+++ b/devel/py-pyrepl/Makefile
@@ -1,18 +1,17 @@
 PORTNAME=	pyrepl
-PORTVERSION=	0.9.0
-PORTREVISION=	1
+PORTVERSION=	0.11.5
 CATEGORIES=	devel python
 MASTER_SITES=	PYPI
 PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
 
 MAINTAINER=	sunpoet@FreeBSD.org
 COMMENT=	Replacement for readline and interactive environment for Python
-WWW=		https://bitbucket.org/pypy/pyrepl
+WWW=		https://github.com/bretello/pyrepl
 
 LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}setuptools-scm>=8:devel/py-setuptools-scm@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
 
 USES=		python
diff --git a/devel/py-pyrepl/distinfo b/devel/py-pyrepl/distinfo
index 5bebe9a87bdf..9eae21223cb9 100644
--- a/devel/py-pyrepl/distinfo
+++ b/devel/py-pyrepl/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1555592233
-SHA256 (pyrepl-0.9.0.tar.gz) = 292570f34b5502e871bbb966d639474f2b57fbfcd3373c2d6a2f3d56e681a775
-SIZE (pyrepl-0.9.0.tar.gz) = 48744
+TIMESTAMP = 1790435796
+SHA256 (pyrepl-0.11.5.tar.gz) = ca5ac139835636005bed2bb0b6e2168de31a093e03a5b95edccbdbb7ca69b6fc
+SIZE (pyrepl-0.11.5.tar.gz) = 51871
diff --git a/devel/py-pyrepl/files/patch-2to3 b/devel/py-pyrepl/files/patch-2to3
deleted file mode 100644
index afdeccca2b3b..000000000000
--- a/devel/py-pyrepl/files/patch-2to3
+++ /dev/null
@@ -1,703 +0,0 @@
---- pyrepl/cmdrepl.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/cmdrepl.py
-@@ -33,7 +33,7 @@ It was designed to let you do this:
- which is in fact done by the `pythoni' script that comes with
- pyrepl."""
- 
--from __future__ import print_function
-+
- 
- from pyrepl import completer
- from pyrepl.completing_reader import CompletingReader as CR
---- pyrepl/completer.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/completer.py
-@@ -18,7 +18,7 @@
- # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- 
- try:
--    import __builtin__ as builtins
-+    import builtins as builtins
-     builtins  # silence broken pyflakes
- except ImportError:
-     import builtins
-@@ -44,8 +44,8 @@ class Completer(object):
-         import keyword
-         matches = []
-         for list in [keyword.kwlist,
--                     builtins.__dict__.keys(),
--                     self.ns.keys()]:
-+                     list(builtins.__dict__.keys()),
-+                     list(self.ns.keys())]:
-             for word in list:
-                 if word.startswith(text) and word != "__builtins__":
-                     matches.append(word)
---- pyrepl/completing_reader.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/completing_reader.py
-@@ -64,7 +64,7 @@ def build_menu(cons, wordlist, start, use_brackets, so
-     else:
-         item = "%s  "
-         padding = 2
--    maxlen = min(max(map(real_len, wordlist)), cons.width - padding)
-+    maxlen = min(max(list(map(real_len, wordlist))), cons.width - padding)
-     cols = cons.width / (maxlen + padding)
-     rows = (len(wordlist) - 1)/cols + 1
- 
---- pyrepl/historical_reader.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/historical_reader.py
-@@ -23,7 +23,7 @@ from pyrepl.reader import Reader as R
- isearch_keymap = tuple(
-     [('\\%03o'%c, 'isearch-end') for c in range(256) if chr(c) != '\\'] + \
-     [(c, 'isearch-add-character')
--     for c in map(chr, range(32, 127)) if c != '\\'] + \
-+     for c in map(chr, list(range(32, 127))) if c != '\\'] + \
-     [('\\%03o'%c, 'isearch-add-character')
-      for c in range(256) if chr(c).isalpha() and chr(c) != '\\'] + \
-     [('\\\\', 'self-insert'),
-@@ -292,7 +292,7 @@ class HistoricalReader(R):
-     def finish(self):
-         super(HistoricalReader, self).finish()
-         ret = self.get_unicode()
--        for i, t in self.transient_history.items():
-+        for i, t in list(self.transient_history.items()):
-             if i < len(self.history) and i != self.historyi:
-                 self.history[i] = t
-         if ret:
---- pyrepl/input.py.orig	2019-04-16 13:00:52 UTC
-+++ pyrepl/input.py
-@@ -32,11 +32,11 @@
- # executive, temporary decision: [tab] and [C-i] are distinct, but
- # [meta-key] is identified with [esc key].  We demand that any console
- # class does quite a lot towards emulating a unix terminal.
--from __future__ import print_function
-+
- import unicodedata
- from collections import deque
- import pprint
--from trace import trace
-+from .trace import trace
- 
- 
- class InputTranslator(object):
---- pyrepl/keymap.py.orig	2019-04-16 13:00:52 UTC
-+++ pyrepl/keymap.py
-@@ -174,17 +174,17 @@ def parse_keys(key):
- 
- def compile_keymap(keymap, empty=b''):
-     r = {}
--    for key, value in keymap.items():
-+    for key, value in list(keymap.items()):
-         if isinstance(key, bytes):
-             first = key[:1]
-         else:
-             first = key[0]
-         r.setdefault(first, {})[key[1:]] = value
--    for key, value in r.items():
-+    for key, value in list(r.items()):
-         if empty in value:
-             if len(value) != 1:
-                 raise KeySpecError(
--                      "key definitions for %s clash"%(value.values(),))
-+                      "key definitions for %s clash"%(list(value.values()),))
-             else:
-                 r[key] = value[empty]
-         else:
---- pyrepl/keymaps.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/keymaps.py
-@@ -62,9 +62,9 @@ reader_emacs_keymap = tuple(
-      (r'\M-\n', 'self-insert'),
-      (r'\<backslash>', 'self-insert')] + \
-     [(c, 'self-insert')
--     for c in map(chr, range(32, 127)) if c <> '\\'] + \
-+     for c in map(chr, list(range(32, 127))) if c != '\\'] + \
-     [(c, 'self-insert')
--     for c in map(chr, range(128, 256)) if c.isalpha()] + \
-+     for c in map(chr, list(range(128, 256))) if c.isalpha()] + \
-     [(r'\<up>', 'up'),
-      (r'\<down>', 'down'),
-      (r'\<left>', 'left'),
-@@ -101,9 +101,9 @@ python_emacs_keymap = comp_emacs_keymap + (
-     
- reader_vi_insert_keymap = tuple(
-     [(c, 'self-insert')
--     for c in map(chr, range(32, 127)) if c <> '\\'] + \
-+     for c in map(chr, list(range(32, 127))) if c != '\\'] + \
-     [(c, 'self-insert')
--     for c in map(chr, range(128, 256)) if c.isalpha()] + \
-+     for c in map(chr, list(range(128, 256))) if c.isalpha()] + \
-     [(r'\C-d', 'delete'),
-      (r'\<backspace>', 'backspace'),
-      ('')])
---- pyrepl/pygame_console.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/pygame_console.py
-@@ -72,7 +72,7 @@ class FakeStdin:
-         # argh!
-         raise NotImplementedError
-     def readline(self, n=None):
--        from reader import Reader
-+        from .reader import Reader
-         try:
-             # this isn't quite right: it will clobber any prompt that's
-             # been printed.  Not sure how to get around this...
-@@ -130,7 +130,8 @@ class PyGameConsole(Console):
-         s.fill(c, [0, 600 - bmargin, 800, bmargin])
-         s.fill(c, [800 - rmargin, 0, lmargin, 600])
- 
--    def refresh(self, screen, (cx, cy)):
-+    def refresh(self, screen, xxx_todo_changeme):
-+        (cx, cy) = xxx_todo_changeme
-         self.screen = screen
-         self.pygame_screen.fill(colors.bg,
-                                 [0, tmargin + self.cur_top + self.scroll,
-@@ -211,12 +212,12 @@ class PyGameConsole(Console):
-         meta = bool(pyg_event.mod & (KMOD_ALT|KMOD_META))
- 
-         try:
--            return self.k[(pyg_event.unicode, meta, ctrl)], pyg_event.unicode
-+            return self.k[(pyg_event.str, meta, ctrl)], pyg_event.str
-         except KeyError:
-             try:
--                return self.k[(pyg_event.key, meta, ctrl)], pyg_event.unicode
-+                return self.k[(pyg_event.key, meta, ctrl)], pyg_event.str
-             except KeyError:
--                return "invalid-key", pyg_event.unicode
-+                return "invalid-key", pyg_event.str
- 
-     def get_event(self, block=1):
-         """Return an Event instance.  Returns None if |block| is false
-@@ -239,7 +240,7 @@ class PyGameConsole(Console):
-             self.cmd_buf += c.encode('ascii', 'replace')
-             self.k = k
- 
--            if not isinstance(k, types.DictType):
-+            if not isinstance(k, dict):
-                 e = Event(k, self.cmd_buf, [])
-                 self.k = self.keymap
-                 self.cmd_buf = ''
-@@ -282,7 +283,7 @@ class PyGameConsole(Console):
- 
-     def forgetinput(self):
-         """Forget all pending, but not yet processed input."""
--        while pygame.event.poll().type <> NOEVENT:
-+        while pygame.event.poll().type != NOEVENT:
-             pass
-     
-     def getpending(self):
-@@ -299,7 +300,7 @@ class PyGameConsole(Console):
- 
-     def wait(self):
-         """Wait for an event."""
--        raise Exception, "erp!"
-+        raise Exception("erp!")
- 
-     def repaint(self):
-         # perhaps we should consolidate grobs?
---- pyrepl/pygame_keymap.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/pygame_keymap.py
-@@ -85,27 +85,25 @@ def _parse_key1(key, s):
-     while not ret and s < len(key):
-         if key[s] == '\\':
-             c = key[s+1].lower()
--            if _escapes.has_key(c):
-+            if c in _escapes:
-                 ret = _escapes[c]
-                 s += 2
-             elif c == "c":
-                 if key[s + 2] != '-':
--                    raise KeySpecError, \
--                              "\\C must be followed by `-' (char %d of %s)"%(
--                        s + 2, repr(key))
-+                    raise KeySpecError("\\C must be followed by `-' (char %d of %s)"%(
-+                        s + 2, repr(key)))
-                 if ctrl:
--                    raise KeySpecError, "doubled \\C- (char %d of %s)"%(
--                        s + 1, repr(key))
-+                    raise KeySpecError("doubled \\C- (char %d of %s)"%(
-+                        s + 1, repr(key)))
-                 ctrl = 1
-                 s += 3
-             elif c == "m":
-                 if key[s + 2] != '-':
--                    raise KeySpecError, \
--                              "\\M must be followed by `-' (char %d of %s)"%(
--                        s + 2, repr(key))
-+                    raise KeySpecError("\\M must be followed by `-' (char %d of %s)"%(
-+                        s + 2, repr(key)))
-                 if meta:
--                    raise KeySpecError, "doubled \\M- (char %d of %s)"%(
--                        s + 1, repr(key))
-+                    raise KeySpecError("doubled \\M- (char %d of %s)"%(
-+                        s + 1, repr(key)))
-                 meta = 1
-                 s += 3
-             elif c.isdigit():
-@@ -119,28 +117,25 @@ def _parse_key1(key, s):
-             elif c == '<':
-                 t = key.find('>', s)
-                 if t == -1:
--                    raise KeySpecError, \
--                              "unterminated \\< starting at char %d of %s"%(
--                        s + 1, repr(key))
-+                    raise KeySpecError("unterminated \\< starting at char %d of %s"%(
-+                        s + 1, repr(key)))
-                 try:
-                     ret = _keynames[key[s+2:t].lower()]
-                     s = t + 1
-                 except KeyError:
--                    raise KeySpecError, \
--                              "unrecognised keyname `%s' at char %d of %s"%(
--                        key[s+2:t], s + 2, repr(key))
-+                    raise KeySpecError("unrecognised keyname `%s' at char %d of %s"%(
-+                        key[s+2:t], s + 2, repr(key)))
-                 if ret is None:
-                     return None, s
-             else:
--                raise KeySpecError, \
--                          "unknown backslash escape %s at char %d of %s"%(
--                    `c`, s + 2, repr(key))
-+                raise KeySpecError("unknown backslash escape %s at char %d of %s"%(
-+                    repr(c), s + 2, repr(key)))
-         else:
-             if ctrl:
-                 ret = chr(ord(key[s]) & 0x1f)   # curses.ascii.ctrl()
--                ret = unicode(ret)
-+                ret = str(ret)
-             else:
--                ret = unicode(key[s])
-+                ret = str(key[s])
-             s += 1
-     return (ret, meta, ctrl), s
- 
-@@ -156,13 +151,12 @@ def parse_keys(key):
- 
- def _compile_keymap(keymap):
-     r = {}
--    for key, value in keymap.items():
-+    for key, value in list(keymap.items()):
-         r.setdefault(key[0], {})[key[1:]] = value
--    for key, value in r.items():
--        if value.has_key(()):
--            if len(value) <> 1:
--                raise KeySpecError, \
--                          "key definitions for %s clash"%(value.values(),)
-+    for key, value in list(r.items()):
-+        if () in value:
-+            if len(value) != 1:
-+                raise KeySpecError("key definitions for %s clash"%(list(value.values()),))
-             else:
-                 r[key] = value[()]
-         else:
-@@ -173,7 +167,7 @@ def compile_keymap(keymap):
-     r = {}
-     for key, value in keymap:
-         k = parse_keys(key)
--        if value is None and r.has_key(k):
-+        if value is None and k in r:
-             del r[k]
-         if k is not None:
-             r[k] = value
-@@ -182,7 +176,7 @@ def compile_keymap(keymap):
- def keyname(key):
-     longest_match = ''
-     longest_match_name = ''
--    for name, keyseq in keyset.items():
-+    for name, keyseq in list(keyset.items()):
-         if keyseq and key.startswith(keyseq) and \
-                len(keyseq) > len(longest_match):
-             longest_match = keyseq
-@@ -202,7 +196,7 @@ def unparse_key(keyseq):
-         return ''
-     name, s = keyname(keyseq)
-     if name:
--        if name <> 'escape' or s == len(keyseq):
-+        if name != 'escape' or s == len(keyseq):
-             return '\\<' + name + '>' + unparse_key(keyseq[s:])
-         else:
-             return '\\M-' + unparse_key(keyseq[1:])
-@@ -211,7 +205,7 @@ def unparse_key(keyseq):
-         r = keyseq[1:]
-         if c == '\\':
-             p = '\\\\'
--        elif _unescapes.has_key(c):
-+        elif c in _unescapes:
-             p = _unescapes[c]
-         elif ord(c) < ord(' '):
-             p = '\\C-%s'%(chr(ord(c)+96),)
-@@ -226,7 +220,7 @@ def _unparse_keyf(keyseq):
-         return []
-     name, s = keyname(keyseq)
-     if name:
--        if name <> 'escape' or s == len(keyseq):
-+        if name != 'escape' or s == len(keyseq):
-             return [name] + _unparse_keyf(keyseq[s:])
-         else:
-             rest = _unparse_keyf(keyseq[1:])
-@@ -236,7 +230,7 @@ def _unparse_keyf(keyseq):
-         r = keyseq[1:]
-         if c == '\\':
-             p = '\\'
--        elif _unescapes.has_key(c):
-+        elif c in _unescapes:
-             p = _unescapes[c]
-         elif ord(c) < ord(' '):
-             p = 'C-%s'%(chr(ord(c)+96),)
---- pyrepl/python_reader.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/python_reader.py
-@@ -20,8 +20,8 @@
- # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- 
- # one impressive collections of imports:
--from __future__ import print_function
--from __future__ import unicode_literals
-+
-+
- from pyrepl.completing_reader import CompletingReader
- from pyrepl.historical_reader import HistoricalReader
- from pyrepl import completing_reader, reader
-@@ -31,9 +31,9 @@ import imp, sys, os, re, code, traceback
- import atexit, warnings
- 
- try:
--    unicode
-+    str
- except:
--    unicode = str
-+    str = str
- 
- try:
-     imp.find_module("twisted")
-@@ -179,7 +179,7 @@ class ReaderConsole(code.InteractiveInterpreter):
-         else:
-             return
-         try:
--            execfile(initfile, self.locals, self.locals)
-+            exec(compile(open(initfile, "rb").read(), initfile, 'exec'), self.locals, self.locals)
-         except:
-             etype, value, tb = sys.exc_info()
-             traceback.print_exception(etype, value, tb.tb_next)
-@@ -203,7 +203,7 @@ class ReaderConsole(code.InteractiveInterpreter):
-                         # can't have warnings spewed onto terminal
-                         sv = warnings.showwarning
-                         warnings.showwarning = eat_it
--                        l = unicode(self.reader.readline(), 'utf-8')
-+                        l = str(self.reader.readline(), 'utf-8')
-                     finally:
-                         warnings.showwarning = sv
-                 except KeyboardInterrupt:
-@@ -301,7 +301,7 @@ class ReaderConsole(code.InteractiveInterpreter):
-                     self.prepare()
-                     try:
-                         while 1:
--                            if sys.modules.has_key("_tkinter"):
-+                            if "_tkinter" in sys.modules:
-                                 self.really_tkinteract()
-                                 # really_tkinteract is not expected to
-                                 # return except via an exception, but:
---- pyrepl/reader.py.orig	2019-04-16 13:00:52 UTC
-+++ pyrepl/reader.py
-@@ -19,32 +19,32 @@
- # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- 
--from __future__ import unicode_literals
-+
- import unicodedata
- from pyrepl import commands
- from pyrepl import input
- try:
--    unicode
-+    str
- except NameError:
--    unicode = str
--    unichr = chr
--    basestring = bytes, str
-+    str = str
-+    chr = chr
-+    str = bytes, str
- 
- 
- def _make_unctrl_map():
-     uc_map = {}
--    for c in map(unichr, range(256)):
-+    for c in map(chr, list(range(256))):
-         if unicodedata.category(c)[0] != 'C':
-             uc_map[c] = c
-     for i in range(32):
--        c = unichr(i)
--        uc_map[c] = '^' + unichr(ord('A') + i - 1)
-+        c = chr(i)
-+        uc_map[c] = '^' + chr(ord('A') + i - 1)
-     uc_map[b'\t'] = '    '  # display TABs as 4 characters
--    uc_map[b'\177'] = unicode('^?')
-+    uc_map[b'\177'] = str('^?')
-     for i in range(256):
--        c = unichr(i)
-+        c = chr(i)
-         if c not in uc_map:
--            uc_map[c] = unicode('\\%03o') % i
-+            uc_map[c] = str('\\%03o') % i
-     return uc_map
- 
- 
-@@ -87,17 +87,17 @@ del _make_unctrl_map
- 
- [SYNTAX_WHITESPACE,
-  SYNTAX_WORD,
-- SYNTAX_SYMBOL] = range(3)
-+ SYNTAX_SYMBOL] = list(range(3))
- 
- 
- def make_default_syntax_table():
-     # XXX perhaps should use some unicodedata here?
-     st = {}
--    for c in map(unichr, range(256)):
-+    for c in map(chr, list(range(256))):
-         st[c] = SYNTAX_SYMBOL
--    for c in [a for a in map(unichr, range(256)) if a.isalpha()]:
-+    for c in [a for a in map(chr, list(range(256))) if a.isalpha()]:
-         st[c] = SYNTAX_WORD
--    st[unicode('\n')] = st[unicode(' ')] = SYNTAX_WHITESPACE
-+    st[str('\n')] = st[str(' ')] = SYNTAX_WHITESPACE
-     return st
- 
- default_keymap = tuple(
-@@ -145,9 +145,9 @@ default_keymap = tuple(
-      #(r'\M-\n', 'insert-nl'),
-      ('\\\\', 'self-insert')] +
-     [(c, 'self-insert')
--     for c in map(chr, range(32, 127)) if c != '\\'] +
-+     for c in map(chr, list(range(32, 127))) if c != '\\'] +
-     [(c, 'self-insert')
--     for c in map(chr, range(128, 256)) if c.isalpha()] +
-+     for c in map(chr, list(range(128, 256))) if c.isalpha()] +
-     [(r'\<up>', 'up'),
-      (r'\<down>', 'down'),
-      (r'\<left>', 'left'),
-@@ -245,7 +245,7 @@ feeling more loquacious than I am now."""
-         self.console = console
-         self.commands = {}
-         self.msg = ''
--        for v in vars(commands).values():
-+        for v in list(vars(commands).values()):
-             if (isinstance(v, type) and
-                     issubclass(v, commands.Command) and
-                     v.__name__[0].islower()):
-@@ -273,7 +273,7 @@ feeling more loquacious than I am now."""
-         screeninfo = []
-         w = self.console.width - 1
-         p = self.pos
--        for ln, line in zip(range(len(lines)), lines):
-+        for ln, line in zip(list(range(len(lines))), lines):
-             ll = len(line)
-             if 0 <= p <= ll:
-                 if self.msg and not self.msg_at_bottom:
-@@ -523,7 +523,7 @@ feeling more loquacious than I am now."""
- 
-     def do_cmd(self, cmd):
-         #print cmd
--        if isinstance(cmd[0], basestring):
-+        if isinstance(cmd[0], str):
-             #XXX: unify to text
-             cmd = self.commands.get(cmd[0],
-                                     commands.invalid_command)(self, *cmd)
-@@ -619,11 +619,11 @@ feeling more loquacious than I am now."""
-     def get_buffer(self, encoding=None):
-         if encoding is None:
-             encoding = self.console.encoding
--        return unicode('').join(self.buffer).encode(self.console.encoding)
-+        return str('').join(self.buffer).encode(self.console.encoding)
- 
-     def get_unicode(self):
-         """Return the current buffer as a unicode string."""
--        return unicode('').join(self.buffer)
-+        return str('').join(self.buffer)
- 
- 
- def test():
---- pyrepl/readline.py.orig	2019-04-16 14:11:33 UTC
-+++ pyrepl/readline.py
-@@ -248,16 +248,16 @@ class _ReadlineWrapper(object):
-         self.config.completer_delims = dict.fromkeys(string)
- 
-     def get_completer_delims(self):
--        chars = self.config.completer_delims.keys()
-+        chars = list(self.config.completer_delims.keys())
-         chars.sort()
-         return ''.join(chars)
- 
-     def _histline(self, line):
-         line = line.rstrip('\n')
-         try:
--            return unicode(line, ENCODING)
-+            return str(line, ENCODING)
-         except UnicodeDecodeError:   # bah, silently fall back...
--            return unicode(line, 'utf-8', 'replace')
-+            return str(line, 'utf-8', 'replace')
- 
-     def get_history_length(self):
-         return self.saved_history_length
-@@ -293,7 +293,7 @@ class _ReadlineWrapper(object):
-         history = self.get_reader().get_trimmed_history(maxlength)
-         f = open(os.path.expanduser(filename), 'w')
-         for entry in history:
--            if isinstance(entry, unicode):
-+            if isinstance(entry, str):
-                 try:
-                     entry = entry.encode(ENCODING)
-                 except UnicodeEncodeError:   # bah, silently fall back...
-@@ -340,7 +340,7 @@ class _ReadlineWrapper(object):
-     def _get_idxs(self):
-         start = cursor = self.get_reader().pos
-         buf = self.get_line_buffer()
--        for i in xrange(cursor - 1, -1, -1):
-+        for i in range(cursor - 1, -1, -1):
-             if buf[i] in self.get_completer_delims():
-                 break
-             start = i
-@@ -396,7 +396,7 @@ def _make_stub(_name, _ret):
-     def stub(*args, **kwds):
-         import warnings
-         warnings.warn("readline.%s() not implemented" % _name, stacklevel=2)
--    stub.func_name = _name
-+    stub.__name__ = _name
-     globals()[_name] = stub
- 
- for _name, _ret in [
-@@ -438,14 +438,14 @@ def _setup():
-                 del sys.__raw_input__
-             except AttributeError:
-                 pass
--            return raw_input(prompt)
-+            return input(prompt)
-         sys.__raw_input__ = _wrapper.raw_input
- 
-     else:
-         # this is not really what readline.c does.  Better than nothing I guess
--        import __builtin__
--        _old_raw_input = __builtin__.raw_input
--        __builtin__.raw_input = _wrapper.raw_input
-+        import builtins
-+        _old_raw_input = builtins.raw_input
-+        builtins.raw_input = _wrapper.raw_input
- 
- _old_raw_input = None
- _setup()
---- pyrepl/unix_console.py.orig	2015-12-06 11:35:46 UTC
-+++ pyrepl/unix_console.py
-@@ -40,9 +40,9 @@ class InvalidTerminal(RuntimeError):
-     pass
- 
- try:
--    unicode
-+    str
- except NameError:
--    unicode = str
-+    str = str
- 
- _error = (termios.error, curses.error, InvalidTerminal)
- 
-@@ -221,7 +221,7 @@ class UnixConsole(Console):
- 
-         self.__offset = offset
- 
--        for y, oldline, newline, in zip(range(offset, offset + height),
-+        for y, oldline, newline, in zip(list(range(offset, offset + height)),
-                                         oldscr,
-                                         newscr):
-             if oldline != newline:
-@@ -533,7 +533,7 @@ class UnixConsole(Console):
-             amount = struct.unpack(
-                 "i", ioctl(self.input_fd, FIONREAD, "\0\0\0\0"))[0]
-             data = os.read(self.input_fd, amount)
--            raw = unicode(data, self.encoding, 'replace')
-+            raw = str(data, self.encoding, 'replace')
-             #XXX: something is wrong here
-             e.data += raw
-             e.raw += raw
-@@ -549,7 +549,7 @@ class UnixConsole(Console):
- 
-             amount = 10000
-             data = os.read(self.input_fd, amount)
--            raw = unicode(data, self.encoding, 'replace')
-+            raw = str(data, self.encoding, 'replace')
-             #XXX: something is wrong here
-             e.data += raw
-             e.raw += raw
---- pyrepl/unix_eventqueue.py.orig	2019-04-16 13:00:52 UTC
-+++ pyrepl/unix_eventqueue.py
-@@ -30,9 +30,9 @@ from .trace import trace
- from termios import tcgetattr, VERASE
- import os
- try:
--    unicode
-+    str
- except NameError:
--    unicode = str
-+    str = str
- 
- 
- _keynames = {
-@@ -74,7 +74,7 @@ CTRL_ARROW_KEYCODE = {
- 
- def general_keycodes():
-     keycodes = {}
--    for key, tiname in _keynames.items():
-+    for key, tiname in list(_keynames.items()):
-         keycode = curses.tigetstr(tiname)
-         trace('key {key} tiname {tiname} keycode {keycode!r}', **locals())
-         if keycode:
-@@ -87,7 +87,7 @@ def EventQueue(fd, encoding):
-     keycodes = general_keycodes()
-     if os.isatty(fd):
-         backspace = tcgetattr(fd)[6][VERASE]
--        keycodes[backspace] = unicode('backspace')
-+        keycodes[backspace] = str('backspace')
-     k = keymap.compile_keymap(keycodes)
-     trace('keymap {k!r}', k=k)
-     return EncodedQueue(k, encoding)
-@@ -133,7 +133,7 @@ class EncodedQueue(object):
-                 self.insert(Event('key', k, self.flush_buf()))
-                 self.k = self.ck
- 
--        elif self.buf and self.buf[0] == 033: # 033 == escape
-+        elif self.buf and self.buf[0] == 0o33: # 033 == escape
-             # escape sequence not recognized by our keymap: propagate it
-             # outside so that i can be recognized as an M-... key (see also
-             # the docstring in keymap.py, in particular the line \\E.
---- testing/infrastructure.py.orig	2015-12-06 11:35:46 UTC
-+++ testing/infrastructure.py
-@@ -17,7 +17,7 @@
- # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- 
--from __future__ import print_function
-+
- from pyrepl.reader import Reader
- from pyrepl.console import Console, Event
- 
---- testing/test_readline.py.orig	2015-12-06 11:35:46 UTC
-+++ testing/test_readline.py
-@@ -5,7 +5,7 @@ import sys
- 
- if sys.version_info < (3, ):
-     bytes_type = str
--    unicode_type = unicode
-+    unicode_type = str
- else:
-     bytes_type = bytes
-     unicode_type = str
---- testing/test_unix_reader.py.orig	2019-04-16 13:00:52 UTC
-+++ testing/test_unix_reader.py
-@@ -1,11 +1,11 @@
--from __future__ import unicode_literals
-+
- from pyrepl.unix_eventqueue import EncodedQueue, Event
- 
- 
- def test_simple():
-     q = EncodedQueue({}, 'utf-8')
- 
--    a = u'\u1234'
-+    a = '\u1234'
-     b = a.encode('utf-8')
-     for c in b:
-         q.push(c)