Skip to content

[3.9] bpo-43013: Update idlelib code to 3.x (GH-24315) #24316

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Lib/idlelib/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def _sphinx_version():
return release


class EditorWindow(object):
class EditorWindow:
from idlelib.percolator import Percolator
from idlelib.colorizer import ColorDelegator, color_config
from idlelib.undo import UndoDelegator
Expand Down Expand Up @@ -1546,7 +1546,7 @@ def get_line_indent(line, tabwidth):
return m.end(), len(m.group().expandtabs(tabwidth))


class IndentSearcher(object):
class IndentSearcher:

# .run() chews over the Text widget, looking for a block opener
# and the stmt following it. Returns a pair,
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/idle_test/test_autocomplete.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ def test_open_completions_none(self):
self.assertFalse(acp.open_completions(ac.TAB))
self.text.delete('1.0', 'end')

class dummy_acw():
class dummy_acw:
__init__ = Func()
show_window = Func(result=False)
hide_window = Func()
Expand Down
4 changes: 2 additions & 2 deletions Lib/idlelib/idle_test/test_calltip.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


# Test Class TC is used in multiple get_argspec test methods
class TC():
class TC:
'doc'
tip = "(ai=None, *b)"
def __init__(self, ai=None, *b): 'doc'
Expand Down Expand Up @@ -268,7 +268,7 @@ def test_good_entity(self):
# open_calltip is about half the code; the others are fairly trivial.
# The default mocks are what are needed for open_calltip.

class mock_Shell():
class mock_Shell:
"Return mock sufficient to pass to hyperparser."
def __init__(self, text):
text.tag_prevrange = Mock(return_value=None)
Expand Down
38 changes: 19 additions & 19 deletions Lib/idlelib/idle_test/test_codecontext.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
}
code_sample = """\

class C1():
class C1:
# Class comment.
def __init__(self, a, b):
self.a = a
Expand Down Expand Up @@ -178,29 +178,29 @@ def test_get_context(self):
with self.assertRaises(AssertionError):
gc(1, stopline=0)

eq(gc(3), ([(2, 0, 'class C1():', 'class')], 0))
eq(gc(3), ([(2, 0, 'class C1:', 'class')], 0))

# Don't return comment.
eq(gc(4), ([(2, 0, 'class C1():', 'class')], 0))
eq(gc(4), ([(2, 0, 'class C1:', 'class')], 0))

# Two indentation levels and no comment.
eq(gc(5), ([(2, 0, 'class C1():', 'class'),
eq(gc(5), ([(2, 0, 'class C1:', 'class'),
(4, 4, ' def __init__(self, a, b):', 'def')], 0))

# Only one 'def' is returned, not both at the same indent level.
eq(gc(10), ([(2, 0, 'class C1():', 'class'),
eq(gc(10), ([(2, 0, 'class C1:', 'class'),
(7, 4, ' def compare(self):', 'def'),
(8, 8, ' if a > b:', 'if')], 0))

# With 'elif', also show the 'if' even though it's at the same level.
eq(gc(11), ([(2, 0, 'class C1():', 'class'),
eq(gc(11), ([(2, 0, 'class C1:', 'class'),
(7, 4, ' def compare(self):', 'def'),
(8, 8, ' if a > b:', 'if'),
(10, 8, ' elif a < b:', 'elif')], 0))

# Set stop_line to not go back to first line in source code.
# Return includes stop_line.
eq(gc(11, stopline=2), ([(2, 0, 'class C1():', 'class'),
eq(gc(11, stopline=2), ([(2, 0, 'class C1:', 'class'),
(7, 4, ' def compare(self):', 'def'),
(8, 8, ' if a > b:', 'if'),
(10, 8, ' elif a < b:', 'elif')], 0))
Expand Down Expand Up @@ -240,37 +240,37 @@ def test_update_code_context(self):
# Scroll down to line 2.
cc.text.yview(2)
cc.update_code_context()
eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1():', 'class')])
eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1:', 'class')])
eq(cc.topvisible, 3)
eq(cc.context.get('1.0', 'end-1c'), 'class C1():')
eq(cc.context.get('1.0', 'end-1c'), 'class C1:')

# Scroll down to line 3. Since it's a comment, nothing changes.
cc.text.yview(3)
cc.update_code_context()
eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1():', 'class')])
eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1:', 'class')])
eq(cc.topvisible, 4)
eq(cc.context.get('1.0', 'end-1c'), 'class C1():')
eq(cc.context.get('1.0', 'end-1c'), 'class C1:')

# Scroll down to line 4.
cc.text.yview(4)
cc.update_code_context()
eq(cc.info, [(0, -1, '', False),
(2, 0, 'class C1():', 'class'),
(2, 0, 'class C1:', 'class'),
(4, 4, ' def __init__(self, a, b):', 'def')])
eq(cc.topvisible, 5)
eq(cc.context.get('1.0', 'end-1c'), 'class C1():\n'
eq(cc.context.get('1.0', 'end-1c'), 'class C1:\n'
' def __init__(self, a, b):')

# Scroll down to line 11. Last 'def' is removed.
cc.text.yview(11)
cc.update_code_context()
eq(cc.info, [(0, -1, '', False),
(2, 0, 'class C1():', 'class'),
(2, 0, 'class C1:', 'class'),
(7, 4, ' def compare(self):', 'def'),
(8, 8, ' if a > b:', 'if'),
(10, 8, ' elif a < b:', 'elif')])
eq(cc.topvisible, 12)
eq(cc.context.get('1.0', 'end-1c'), 'class C1():\n'
eq(cc.context.get('1.0', 'end-1c'), 'class C1:\n'
' def compare(self):\n'
' if a > b:\n'
' elif a < b:')
Expand All @@ -279,12 +279,12 @@ def test_update_code_context(self):
cc.update_code_context()
cc.context_depth = 1
eq(cc.info, [(0, -1, '', False),
(2, 0, 'class C1():', 'class'),
(2, 0, 'class C1:', 'class'),
(7, 4, ' def compare(self):', 'def'),
(8, 8, ' if a > b:', 'if'),
(10, 8, ' elif a < b:', 'elif')])
eq(cc.topvisible, 12)
eq(cc.context.get('1.0', 'end-1c'), 'class C1():\n'
eq(cc.context.get('1.0', 'end-1c'), 'class C1:\n'
' def compare(self):\n'
' if a > b:\n'
' elif a < b:')
Expand All @@ -293,7 +293,7 @@ def test_update_code_context(self):
cc.text.yview(5)
cc.update_code_context()
eq(cc.info, [(0, -1, '', False),
(2, 0, 'class C1():', 'class'),
(2, 0, 'class C1:', 'class'),
(4, 4, ' def __init__(self, a, b):', 'def')])
eq(cc.topvisible, 6)
# context_depth is 1.
Expand Down Expand Up @@ -440,7 +440,7 @@ def test_get_line_info(self):
# Line 1 is not a BLOCKOPENER.
eq(gli(lines[0]), (codecontext.INFINITY, '', False))
# Line 2 is a BLOCKOPENER without an indent.
eq(gli(lines[1]), (0, 'class C1():', 'class'))
eq(gli(lines[1]), (0, 'class C1:', 'class'))
# Line 3 is not a BLOCKOPENER and does not return the indent level.
eq(gli(lines[2]), (codecontext.INFINITY, ' # Class comment.', False))
# Line 4 is a BLOCKOPENER and is indented.
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/idle_test/test_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ def tearDown(self):

code_sample = """\
# WS line needed for test.
class C1():
class C1:
# Class comment.
def __init__(self, a, b):
self.a = a
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/idle_test/test_help_about.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ def test_close(self):
self.dialog.winfo_class()


class Dummy_about_dialog():
class Dummy_about_dialog:
# Dummy class for testing file display functions.
idle_credits = About.show_idle_credits
idle_readme = About.show_readme
Expand Down
30 changes: 16 additions & 14 deletions Lib/idlelib/idle_test/test_pyparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,12 @@ def char_in_string_false(index): return False

# Split def across lines.
setcode('"""This is a module docstring"""\n'
'class C():\n'
'class C:\n'
' def __init__(self, a,\n'
' b=True):\n'
' pass\n'
)
pos0, pos = 33, 42 # Start of 'class...', ' def' lines.

# Passing no value or non-callable should fail (issue 32989).
with self.assertRaises(TypeError):
Expand All @@ -91,40 +92,41 @@ def char_in_string_false(index): return False

# Make all text look like it's not in a string. This means that it
# found a good start position.
eq(start(char_in_string_false), 44)
eq(start(char_in_string_false), pos)

# If the beginning of the def line is not in a string, then it
# returns that as the index.
eq(start(is_char_in_string=lambda index: index > 44), 44)
eq(start(is_char_in_string=lambda index: index > pos), pos)
# If the beginning of the def line is in a string, then it
# looks for a previous index.
eq(start(is_char_in_string=lambda index: index >= 44), 33)
eq(start(is_char_in_string=lambda index: index >= pos), pos0)
# If everything before the 'def' is in a string, then returns None.
# The non-continuation def line returns 44 (see below).
eq(start(is_char_in_string=lambda index: index < 44), None)
eq(start(is_char_in_string=lambda index: index < pos), None)

# Code without extra line break in def line - mostly returns the same
# values.
setcode('"""This is a module docstring"""\n'
'class C():\n'
'class C:\n'
' def __init__(self, a, b=True):\n'
' pass\n'
)
eq(start(char_in_string_false), 44)
eq(start(is_char_in_string=lambda index: index > 44), 44)
eq(start(is_char_in_string=lambda index: index >= 44), 33)
) # Does not affect class, def positions.
eq(start(char_in_string_false), pos)
eq(start(is_char_in_string=lambda index: index > pos), pos)
eq(start(is_char_in_string=lambda index: index >= pos), pos0)
# When the def line isn't split, this returns which doesn't match the
# split line test.
eq(start(is_char_in_string=lambda index: index < 44), 44)
eq(start(is_char_in_string=lambda index: index < pos), pos)

def test_set_lo(self):
code = (
'"""This is a module docstring"""\n'
'class C():\n'
'class C:\n'
' def __init__(self, a,\n'
' b=True):\n'
' pass\n'
)
pos = 42
p = self.parser
p.set_code(code)

Expand All @@ -137,8 +139,8 @@ def test_set_lo(self):
self.assertEqual(p.code, code)

# An index that is preceded by a newline.
p.set_lo(44)
self.assertEqual(p.code, code[44:])
p.set_lo(pos)
self.assertEqual(p.code, code[pos:])

def test_study1(self):
eq = self.assertEqual
Expand Down
10 changes: 5 additions & 5 deletions Lib/idlelib/rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def handle_error(self, request, client_address):
response_queue = queue.Queue(0)


class SocketIO(object):
class SocketIO:

nextseq = 0

Expand Down Expand Up @@ -486,7 +486,7 @@ def EOFhook(self):

#----------------- end class SocketIO --------------------

class RemoteObject(object):
class RemoteObject:
# Token mix-in class
pass

Expand All @@ -497,7 +497,7 @@ def remoteref(obj):
return RemoteProxy(oid)


class RemoteProxy(object):
class RemoteProxy:

def __init__(self, oid):
self.oid = oid
Expand Down Expand Up @@ -547,7 +547,7 @@ def get_remote_proxy(self, oid):
return RPCProxy(self, oid)


class RPCProxy(object):
class RPCProxy:

__methods = None
__attributes = None
Expand Down Expand Up @@ -596,7 +596,7 @@ def _getattributes(obj, attributes):
attributes[name] = 1


class MethodProxy(object):
class MethodProxy:

def __init__(self, sockio, oid, name):
self.sockio = sockio
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ def decode_interrupthook(self):
thread.interrupt_main()


class Executive(object):
class Executive:

def __init__(self, rpchandler):
self.rpchandler = rpchandler
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/tooltip.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from tkinter import *


class TooltipBase(object):
class TooltipBase:
"""abstract base class for tooltips"""

def __init__(self, anchor_widget):
Expand Down