Skip to content

Commit bda6572

Browse files
committed
Refactor Squeezer from an extension to an integral part of IDLE.
1 parent 71fb2c1 commit bda6572

10 files changed

Lines changed: 163 additions & 141 deletions

File tree

Lib/idlelib/config-extensions.def

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,6 @@ bell= True
4848
#
4949
# See config-keys.def for notes on specifying keys and extend.txt for
5050
# information on creating IDLE extensions.
51-
[Squeezer]
52-
enable= True
53-
enable_editor= False
54-
auto-squeeze-min-lines= 30
55-
show-tooltip= True
56-
tooltip-delay= 500
57-
[Squeezer_bindings]
58-
expand-last-squeezed=
59-
preview-last-squeezed=
60-
squeeze-current-text=
6151

6252
# A fake extension for testing and example purposes. When enabled and
6353
# invoked, inserts or deletes z-text at beginning of every line.

Lib/idlelib/config-main.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ font-size= 10
6666
font-bold= 0
6767
encoding= none
6868

69+
[PyShell]
70+
auto-squeeze-min-lines= 30
71+
show-squeezed-tooltips= 1
72+
squeezed-tooltips-delay= 0
73+
6974
[Indent]
7075
use-spaces= 1
7176
num-spaces= 4

Lib/idlelib/configdialog.py

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@
3030
from idlelib.codecontext import CodeContext
3131
from idlelib.parenmatch import ParenMatch
3232
from idlelib.paragraph import FormatParagraph
33+
from idlelib.squeezer import Squeezer
3334

3435
changes = ConfigChanges()
3536
# Reload changed options in the following classes.
36-
reloadables = (AutoComplete, CodeContext, ParenMatch, FormatParagraph)
37+
reloadables = (AutoComplete, CodeContext, ParenMatch, FormatParagraph,
38+
Squeezer)
3739

3840

3941
class ConfigDialog(Toplevel):
@@ -1748,9 +1750,9 @@ def delete_custom_keys(self):
17481750
self.customlist.SetMenu(item_list, item_list[0])
17491751
# Revert to default key set.
17501752
self.keyset_source.set(idleConf.defaultCfg['main']
1751-
.Get('Keys', 'default'))
1753+
.Get('Keys', 'default'))
17521754
self.builtin_name.set(idleConf.defaultCfg['main'].Get('Keys', 'name')
1753-
or idleConf.default_keys())
1755+
or idleConf.default_keys())
17541756
# User can't back out of these changes, they must be applied now.
17551757
changes.save_all()
17561758
self.cd.save_all_changed_extensions()
@@ -1817,6 +1819,16 @@ def create_page_general(self):
18171819
frame_context: Frame
18181820
context_title: Label
18191821
(*)context_int: Entry - context_lines
1822+
frame_shell: LabelFrame
1823+
frame_auto_squeeze_min_lines: Frame
1824+
auto_squeeze_min_lines_title: Label
1825+
(*)auto_squeeze_min_lines_int: Entry - auto_squeeze_min_lines
1826+
frame_show_squeezed_tooltips: Frame
1827+
show_squeezed_tooltips_title: Label
1828+
(*)show_squeezed_tooltips_bool: Entry - show_squeezed_tooltips
1829+
frame_squeezed_tooltips_delay: Frame
1830+
squeezed_tooltips_delay_title: Label
1831+
(*)squeezed_tooltips_delay_int: Entry - squeezed_tooltips_delay
18201832
frame_help: LabelFrame
18211833
frame_helplist: Frame
18221834
frame_helplist_buttons: Frame
@@ -1842,6 +1854,13 @@ def create_page_general(self):
18421854
self.paren_bell = tracers.add(
18431855
BooleanVar(self), ('extensions', 'ParenMatch', 'bell'))
18441856

1857+
self.auto_squeeze_min_lines = tracers.add(
1858+
StringVar(self), ('main', 'PyShell', 'auto-squeeze-min-lines'))
1859+
self.show_squeezed_tooltips = tracers.add(
1860+
StringVar(self), ('main', 'PyShell', 'show-squeezed-tooltips'))
1861+
self.squeezed_tooltips_delay = tracers.add(
1862+
StringVar(self), ('main', 'PyShell', 'squeezed-tooltips-delay'))
1863+
18451864
self.autosave = tracers.add(
18461865
IntVar(self), ('main', 'General', 'autosave'))
18471866
self.format_width = tracers.add(
@@ -1855,8 +1874,10 @@ def create_page_general(self):
18551874
text=' Window Preferences')
18561875
frame_editor = LabelFrame(self, borderwidth=2, relief=GROOVE,
18571876
text=' Editor Preferences')
1877+
frame_shell = LabelFrame(self, borderwidth=2, relief=GROOVE,
1878+
text=' Shell Preferences')
18581879
frame_help = LabelFrame(self, borderwidth=2, relief=GROOVE,
1859-
text=' Additional Help Sources ')
1880+
text=' Additional Help Sources ')
18601881
# Frame_window.
18611882
frame_run = Frame(frame_window, borderwidth=0)
18621883
startup_title = Label(frame_run, text='At Startup')
@@ -1918,6 +1939,25 @@ def create_page_general(self):
19181939
self.context_int = Entry(
19191940
frame_context, textvariable=self.context_lines, width=3)
19201941

1942+
# Frame_shell.
1943+
frame_auto_squeeze_min_lines = Frame(frame_shell, borderwidth=0)
1944+
auto_squeeze_min_lines_title = Label(frame_auto_squeeze_min_lines,
1945+
text='Auto-Squeeze Min. Lines:')
1946+
self.auto_squeeze_min_lines_int = Entry(
1947+
frame_auto_squeeze_min_lines, width=4,
1948+
textvariable=self.auto_squeeze_min_lines)
1949+
frame_show_squeezed_tooltips = Frame(frame_shell, borderwidth=0)
1950+
show_squeezed_tooltips_title = Label(frame_show_squeezed_tooltips,
1951+
text='Show Squeezed Tooltips:')
1952+
self.show_squeezed_tooltips_on = Checkbutton(
1953+
frame_show_squeezed_tooltips,
1954+
variable=self.show_squeezed_tooltips)
1955+
frame_squeezed_tooltips_delay = Frame(frame_shell, borderwidth=0)
1956+
squeezed_tooltips_delay_title = Label(frame_squeezed_tooltips_delay,
1957+
text='Squeezed Tooltip Delay:')
1958+
self.squeezed_tooltips_delay_int = Entry(
1959+
frame_squeezed_tooltips_delay, width=4,
1960+
textvariable=self.squeezed_tooltips_delay)
19211961

19221962
# frame_help.
19231963
frame_helplist = Frame(frame_help)
@@ -1943,6 +1983,7 @@ def create_page_general(self):
19431983
# Body.
19441984
frame_window.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
19451985
frame_editor.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
1986+
frame_shell.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
19461987
frame_help.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
19471988
# frame_run.
19481989
frame_run.pack(side=TOP, padx=5, pady=0, fill=X)
@@ -1983,6 +2024,19 @@ def create_page_general(self):
19832024
context_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
19842025
self.context_int.pack(side=TOP, padx=5, pady=5)
19852026

2027+
# frame_auto_squeeze_min_lines
2028+
frame_auto_squeeze_min_lines.pack(side=TOP, padx=5, pady=0, fill=X)
2029+
auto_squeeze_min_lines_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
2030+
self.auto_squeeze_min_lines_int.pack(side=TOP, padx=5, pady=5)
2031+
2032+
frame_show_squeezed_tooltips.pack(side=TOP, padx=5, pady=0, fill=X)
2033+
show_squeezed_tooltips_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
2034+
self.show_squeezed_tooltips_on.pack(side=TOP, padx=5, pady=5)
2035+
2036+
frame_squeezed_tooltips_delay.pack(side=TOP, padx=5, pady=0, fill=X)
2037+
squeezed_tooltips_delay_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
2038+
self.squeezed_tooltips_delay_int.pack(side=TOP, padx=5, pady=5)
2039+
19862040
# frame_help.
19872041
frame_helplist_buttons.pack(side=RIGHT, padx=5, pady=5, fill=Y)
19882042
frame_helplist.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH)
@@ -2018,6 +2072,14 @@ def load_general_cfg(self):
20182072
self.context_lines.set(idleConf.GetOption(
20192073
'extensions', 'CodeContext', 'maxlines', type='int'))
20202074

2075+
# Set variables for shell windows.
2076+
self.auto_squeeze_min_lines.set(idleConf.GetOption(
2077+
'main', 'PyShell', 'auto-squeeze-min-lines', type='int'))
2078+
self.show_squeezed_tooltips.set(idleConf.GetOption(
2079+
'main', 'PyShell', 'show-squeezed-tooltips', type='bool'))
2080+
self.squeezed_tooltips_delay.set(idleConf.GetOption(
2081+
'main', 'PyShell', 'squeezed-tooltips-delay', type='int'))
2082+
20212083
# Set additional help sources.
20222084
self.user_helplist = idleConf.GetAllExtraHelpSourcesList()
20232085
self.helplist.delete(0, 'end')
@@ -2211,6 +2273,14 @@ def detach(self):
22112273
22122274
CodeContext: Maxlines is the maximum number of code context lines to
22132275
display when Code Context is turned on for an editor window.
2276+
2277+
Shell Preferences:
2278+
* Auto-Squeeze Min. Lines is the minimum number of lines of output to
2279+
automatically "squeeze".
2280+
* Show Squeezed Tooltips toggles whether tooltips are shown for squeezed
2281+
outputs.
2282+
* Squeezed Tooltips Delay sets the mouse hover delay over a squeezed output
2283+
before its tooltip is shown, in milliseconds.
22142284
'''
22152285
}
22162286

Lib/idlelib/editor.py

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
import importlib.util
33
import os
44
import platform
5-
import re
65
import string
7-
import sys
86
import tokenize
97
import traceback
108
import webbrowser
@@ -50,7 +48,6 @@ class EditorWindow(object):
5048
from idlelib.undo import UndoDelegator
5149
from idlelib.iomenu import IOBinding, encoding
5250
from idlelib import mainmenu
53-
from tkinter import Toplevel, EventType
5451
from idlelib.statusbar import MultiStatusBar
5552
from idlelib.autocomplete import AutoComplete
5653
from idlelib.autoexpand import AutoExpand
@@ -59,6 +56,7 @@ class EditorWindow(object):
5956
from idlelib.paragraph import FormatParagraph
6057
from idlelib.parenmatch import ParenMatch
6158
from idlelib.rstrip import Rstrip
59+
from idlelib.squeezer import Squeezer
6260
from idlelib.zoomheight import ZoomHeight
6361

6462
filesystemencoding = sys.getfilesystemencoding() # for file names
@@ -319,6 +317,9 @@ def __init__(self, flist=None, filename=None, key=None, root=None):
319317
text.bind("<<zoom-height>>", self.ZoomHeight(self).zoom_height_event)
320318
text.bind("<<toggle-code-context>>",
321319
self.CodeContext(self).toggle_code_context_event)
320+
squeezer = self.Squeezer(self)
321+
text.bind("<<squeeze-current-text>>",
322+
squeezer.squeeze_current_text_event)
322323

323324
def _filename_to_unicode(self, filename):
324325
"""Return filename as BMP unicode so diplayable in Tk."""
@@ -1062,7 +1063,15 @@ def get_standard_extension_names(self):
10621063
}
10631064

10641065
def load_extension(self, name):
1065-
mod = self._load_extension_module(name)
1066+
fname = self.extfiles.get(name, name)
1067+
try:
1068+
try:
1069+
mod = importlib.import_module('.' + fname, package=__package__)
1070+
except (ImportError, TypeError):
1071+
mod = importlib.import_module(fname)
1072+
except ImportError:
1073+
print("\nFailed to import extension: ", name)
1074+
raise
10661075
cls = getattr(mod, name)
10671076
keydefs = idleConf.GetExtensionBindings(name)
10681077
if hasattr(cls, "menudefs"):
@@ -1081,28 +1090,6 @@ def load_extension(self, name):
10811090
if hasattr(ins, methodname):
10821091
self.text.bind(vevent, getattr(ins, methodname))
10831092

1084-
def _load_extension_module(self, name):
1085-
fname = self.extfiles.get(name, name)
1086-
mod = None
1087-
first_exception = None
1088-
for modpath, package in [
1089-
['.' + fname, __package__],
1090-
[fname, None],
1091-
['.' + fname.lower(), __package__],
1092-
[fname.lower(), None],
1093-
]:
1094-
try:
1095-
mod = importlib.import_module(modpath, package=package)
1096-
except (ImportError, TypeError) as exc:
1097-
if first_exception is None:
1098-
first_exception = exc
1099-
continue
1100-
break
1101-
if mod is None:
1102-
print("\nFailed to import extension: ", name)
1103-
raise first_exception
1104-
return mod
1105-
11061093
def apply_bindings(self, keydefs=None):
11071094
if keydefs is None:
11081095
keydefs = self.mainmenu.default_keydefs

Lib/idlelib/idle_test/htest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def _wrapper(parent): # htest #
163163
'msg': "Click the 'Show GrepDialog' button.\n"
164164
"Test the various 'Find-in-files' functions.\n"
165165
"The results should be displayed in a new '*Output*' window.\n"
166-
"'Right-click'->'Goto file/line' anywhere in the search results "
166+
"'Right-click'->'Go to file/line' anywhere in the search results "
167167
"should open that file \nin a new EditorWindow."
168168
}
169169

Lib/idlelib/idle_test/test_config.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -356,11 +356,11 @@ def test_get_section_list(self):
356356

357357
self.assertCountEqual(
358358
conf.GetSectionList('default', 'main'),
359-
['General', 'EditorWindow', 'Indent', 'Theme',
359+
['General', 'EditorWindow', 'PyShell', 'Indent', 'Theme',
360360
'Keys', 'History', 'HelpFiles'])
361361
self.assertCountEqual(
362362
conf.GetSectionList('user', 'main'),
363-
['General', 'EditorWindow', 'Indent', 'Theme',
363+
['General', 'EditorWindow', 'PyShell', 'Indent', 'Theme',
364364
'Keys', 'History', 'HelpFiles'])
365365

366366
with self.assertRaises(config.InvalidConfigSet):
@@ -431,22 +431,18 @@ def test_default_keys(self):
431431

432432
def test_get_extensions(self):
433433
userextn.read_string('''
434-
[Squeezer]
435-
enable = True
436434
[ZzDummy]
437435
enable = True
438436
[DISABLE]
439437
enable = False
440438
''')
441439
eq = self.assertEqual
442440
iGE = idleConf.GetExtensions
443-
eq(iGE(shell_only=True), ['Squeezer'])
444-
eq(iGE(), ['Squeezer', 'ZzDummy'])
441+
eq(iGE(shell_only=True), [])
442+
eq(iGE(), ['ZzDummy'])
445443
eq(iGE(editor_only=True), ['ZzDummy'])
446-
eq(iGE(active_only=False), ['Squeezer', 'ZzDummy', 'DISABLE'])
447-
eq(iGE(active_only=False, editor_only=True),
448-
['Squeezer', 'ZzDummy', 'DISABLE'])
449-
userextn.remove_section('Squeezer')
444+
eq(iGE(active_only=False), ['ZzDummy', 'DISABLE'])
445+
eq(iGE(active_only=False, editor_only=True), ['ZzDummy', 'DISABLE'])
450446
userextn.remove_section('ZzDummy')
451447
userextn.remove_section('DISABLE')
452448

@@ -456,8 +452,7 @@ def test_remove_key_bind_names(self):
456452

457453
self.assertCountEqual(
458454
conf.RemoveKeyBindNames(conf.GetSectionList('default', 'extensions')),
459-
['AutoComplete', 'CodeContext', 'FormatParagraph', 'ParenMatch',
460-
'Squeezer', 'ZzDummy'])
455+
['AutoComplete', 'CodeContext', 'FormatParagraph', 'ParenMatch', 'ZzDummy'])
461456

462457
def test_get_extn_name_for_event(self):
463458
userextn.read_string('''

0 commit comments

Comments
 (0)