bpo-36419: IDLE - Refactor autocompete and improve testing. (#15121)
diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py
index c249625..c69ab4a 100644
--- a/Lib/idlelib/autocomplete_w.py
+++ b/Lib/idlelib/autocomplete_w.py
@@ -6,7 +6,7 @@
from tkinter import *
from tkinter.ttk import Frame, Scrollbar
-from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES
+from idlelib.autocomplete import FILES, ATTRS
from idlelib.multicall import MC_SHIFT
HIDE_VIRTUAL_EVENT_NAME = "<<autocompletewindow-hide>>"
@@ -39,8 +39,7 @@
self.completions = None
# A list with more completions, or None
self.morecompletions = None
- # The completion mode. Either autocomplete.COMPLETE_ATTRIBUTES or
- # autocomplete.COMPLETE_FILES
+ # The completion mode, either autocomplete.ATTRS or .FILES.
self.mode = None
# The current completion start, on the text box (a string)
self.start = None
@@ -73,8 +72,8 @@
def _binary_search(self, s):
"""Find the first index in self.completions where completions[i] is
- greater or equal to s, or the last index if there is no such
- one."""
+ greater or equal to s, or the last index if there is no such.
+ """
i = 0; j = len(self.completions)
while j > i:
m = (i + j) // 2
@@ -87,7 +86,8 @@
def _complete_string(self, s):
"""Assuming that s is the prefix of a string in self.completions,
return the longest string which is a prefix of all the strings which
- s is a prefix of them. If s is not a prefix of a string, return s."""
+ s is a prefix of them. If s is not a prefix of a string, return s.
+ """
first = self._binary_search(s)
if self.completions[first][:len(s)] != s:
# There is not even one completion which s is a prefix of.
@@ -116,8 +116,10 @@
return first_comp[:i]
def _selection_changed(self):
- """Should be called when the selection of the Listbox has changed.
- Updates the Listbox display and calls _change_start."""
+ """Call when the selection of the Listbox has changed.
+
+ Updates the Listbox display and calls _change_start.
+ """
cursel = int(self.listbox.curselection()[0])
self.listbox.see(cursel)
@@ -153,8 +155,10 @@
def show_window(self, comp_lists, index, complete, mode, userWantsWin):
"""Show the autocomplete list, bind events.
- If complete is True, complete the text, and if there is exactly one
- matching completion, don't open a list."""
+
+ If complete is True, complete the text, and if there is exactly
+ one matching completion, don't open a list.
+ """
# Handle the start we already have
self.completions, self.morecompletions = comp_lists
self.mode = mode
@@ -300,7 +304,7 @@
if keysym != "Tab":
self.lastkey_was_tab = False
if (len(keysym) == 1 or keysym in ("underscore", "BackSpace")
- or (self.mode == COMPLETE_FILES and keysym in
+ or (self.mode == FILES and keysym in
("period", "minus"))) \
and not (state & ~MC_SHIFT):
# Normal editing of text
@@ -329,10 +333,10 @@
self.hide_window()
return 'break'
- elif (self.mode == COMPLETE_ATTRIBUTES and keysym in
+ elif (self.mode == ATTRS and keysym in
("period", "space", "parenleft", "parenright", "bracketleft",
"bracketright")) or \
- (self.mode == COMPLETE_FILES and keysym in
+ (self.mode == FILES and keysym in
("slash", "backslash", "quotedbl", "apostrophe")) \
and not (state & ~MC_SHIFT):
# If start is a prefix of the selection, but is not '' when
@@ -340,7 +344,7 @@
# selected completion. Anyway, close the list.
cursel = int(self.listbox.curselection()[0])
if self.completions[cursel][:len(self.start)] == self.start \
- and (self.mode == COMPLETE_ATTRIBUTES or self.start):
+ and (self.mode == ATTRS or self.start):
self._change_start(self.completions[cursel])
self.hide_window()
return None