Skip to content

[3.8] bpo-27115: Use Query subclass for IDLE editor Goto (GH-18871) #18886

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

Merged
merged 1 commit into from
Mar 9, 2020
Merged
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
3 changes: 3 additions & 0 deletions Lib/idlelib/NEWS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ Released on 2019-12-16?
======================================


bpo-27115: For 'Go to Line', use a Query entry box subclass with
IDLE standard behavior and improved error checking.

bpo-39885: Since clicking to get an IDLE context menu moves the
cursor, any text selection should be and now is cleared.

Expand Down
22 changes: 10 additions & 12 deletions Lib/idlelib/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -672,18 +672,16 @@ def replace_event(self, event):

def goto_line_event(self, event):
text = self.text
lineno = tkSimpleDialog.askinteger("Goto",
"Go to line number:",parent=text)
if lineno is None:
return "break"
if lineno <= 0:
text.bell()
return "break"

text.tag_remove("sel", "1.0", "end")
text.mark_set("insert", f'{lineno}.0')
text.see("insert")
self.set_line_and_column()
lineno = query.Goto(
text, "Go To Line",
"Enter a positive integer\n"
"('big' = end of file):"
).result
if lineno is not None:
text.tag_remove("sel", "1.0", "end")
text.mark_set("insert", f'{lineno}.0')
text.see("insert")
self.set_line_and_column()
return "break"

def open_module(self):
Expand Down
43 changes: 43 additions & 0 deletions Lib/idlelib/idle_test/test_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,33 @@ def test_good_module_name(self):
self.assertEqual(dialog.entry_error['text'], '')


class GotoTest(unittest.TestCase):
"Test Goto subclass of Query."

class Dummy_ModuleName:
entry_ok = query.Goto.entry_ok # Function being tested.
def __init__(self, dummy_entry):
self.entry = Var(value=dummy_entry)
self.entry_error = {'text': ''}
def showerror(self, message):
self.entry_error['text'] = message

def test_bogus_goto(self):
dialog = self.Dummy_ModuleName('a')
self.assertEqual(dialog.entry_ok(), None)
self.assertIn('not a base 10 integer', dialog.entry_error['text'])

def test_bad_goto(self):
dialog = self.Dummy_ModuleName('0')
self.assertEqual(dialog.entry_ok(), None)
self.assertIn('not a positive integer', dialog.entry_error['text'])

def test_good_goto(self):
dialog = self.Dummy_ModuleName('1')
self.assertEqual(dialog.entry_ok(), 1)
self.assertEqual(dialog.entry_error['text'], '')


# 3 HelpSource test classes each test one method.

class HelpsourceBrowsefileTest(unittest.TestCase):
Expand Down Expand Up @@ -363,6 +390,22 @@ def test_click_module_name(self):
root.destroy()


class GotoGuiTest(unittest.TestCase):

@classmethod
def setUpClass(cls):
requires('gui')

def test_click_module_name(self):
root = Tk()
root.withdraw()
dialog = query.Goto(root, 'T', 't', _utest=True)
dialog.entry.insert(0, '22')
dialog.button_ok.invoke()
self.assertEqual(dialog.result, 22)
root.destroy()


class HelpsourceGuiTest(unittest.TestCase):

@classmethod
Expand Down
16 changes: 16 additions & 0 deletions Lib/idlelib/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,22 @@ def entry_ok(self):
return file_path


class Goto(Query):
"Get a positive line number for editor Go To Line."
# Used in editor.EditorWindow.goto_line_event.

def entry_ok(self):
try:
lineno = int(self.entry.get())
except ValueError:
self.showerror('not a base 10 integer.')
return None
if lineno <= 0:
self.showerror('not a positive integer.')
return None
return lineno


class HelpSource(Query):
"Get menu name and help source for Help menu."
# Used in ConfigDialog.HelpListItemAdd/Edit, (941/9)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
For 'Go to Line', use a Query box subclass with IDLE standard behavior
and improved error checking.