From bfbaa6b206abdb8b1c3861926f4334b879ec91cc Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 31 Aug 2016 00:50:55 -0400 Subject: Issue #27891: Consistently group and sort imports within idlelib modules. --- Lib/idlelib/README.txt | 21 +++++++++++++++++- Lib/idlelib/autocomplete.py | 17 ++++++++------- Lib/idlelib/autocomplete_w.py | 3 ++- Lib/idlelib/autoexpand.py | 3 +-- Lib/idlelib/browser.py | 6 +++--- Lib/idlelib/calltips.py | 2 +- Lib/idlelib/codecontext.py | 6 ++++-- Lib/idlelib/colorizer.py | 9 ++++---- Lib/idlelib/config.py | 2 +- Lib/idlelib/configdialog.py | 6 +++--- Lib/idlelib/debugger.py | 8 ++++--- Lib/idlelib/debugobj.py | 3 +-- Lib/idlelib/dynoption.py | 1 + Lib/idlelib/editor.py | 41 ++++++++++++++++++------------------ Lib/idlelib/filelist.py | 1 + Lib/idlelib/grep.py | 11 ++++++---- Lib/idlelib/help.py | 2 ++ Lib/idlelib/help_about.py | 5 ++++- Lib/idlelib/history.py | 4 +++- Lib/idlelib/hyperparser.py | 5 ++--- Lib/idlelib/idle_test/test_iomenu.py | 5 +++-- Lib/idlelib/macosx.py | 3 ++- Lib/idlelib/multicall.py | 4 ++-- Lib/idlelib/outwin.py | 7 ++++-- Lib/idlelib/paragraph.py | 4 +++- Lib/idlelib/parenmatch.py | 1 - Lib/idlelib/pathbrowser.py | 7 ++++-- Lib/idlelib/percolator.py | 2 +- Lib/idlelib/pyparse.py | 2 +- Lib/idlelib/pyshell.py | 24 ++++++++++----------- Lib/idlelib/query.py | 3 ++- Lib/idlelib/replace.py | 6 +++--- Lib/idlelib/rpc.py | 26 ++++++++++++++--------- Lib/idlelib/run.py | 24 ++++++++++----------- Lib/idlelib/runscript.py | 3 ++- Lib/idlelib/scrolledlist.py | 4 +++- Lib/idlelib/search.py | 1 + Lib/idlelib/searchbase.py | 1 + Lib/idlelib/searchengine.py | 3 +++ Lib/idlelib/stackviewer.py | 11 +++++++--- Lib/idlelib/statusbar.py | 2 ++ Lib/idlelib/tabbedpages.py | 3 +++ Lib/idlelib/textview.py | 2 +- Lib/idlelib/tree.py | 4 +++- Lib/idlelib/undo.py | 7 +++--- Lib/idlelib/windows.py | 2 ++ Lib/idlelib/zoomheight.py | 2 ++ 47 files changed, 197 insertions(+), 122 deletions(-) diff --git a/Lib/idlelib/README.txt b/Lib/idlelib/README.txt index f7aad68..e52b5cd 100644 --- a/Lib/idlelib/README.txt +++ b/Lib/idlelib/README.txt @@ -228,4 +228,23 @@ Help Center Insert # eEW.center_insert_event - + + +CODE STYLE -- Generally PEP 8. + +import +------ +Put import at the top, unless there is a good reason otherwise. +PEP 8 says to group stdlib, 3rd-party dependencies, and package imports. +For idlelib, the groups are general stdlib, tkinter, and idlelib. +Sort modules within each group, except that tkinter.ttk follows tkinter. +Sort 'from idlelib import mod1' and 'from idlelib.mod2 import object' +together by module, ignoring within module objects. +Put 'import __main__' after other idlelib imports. + +Imports only needed for testing are not at the top but are put in the +htest function def or the "if __name__ == '__main__'" clause. + +Within module imports like "from idlelib.mod import class" may cause +circular imports to deadlock. Even without this, circular imports may +require at least one of the imports to be delayed until a function call. diff --git a/Lib/idlelib/autocomplete.py b/Lib/idlelib/autocomplete.py index 1200008..1e44fa5 100644 --- a/Lib/idlelib/autocomplete.py +++ b/Lib/idlelib/autocomplete.py @@ -4,26 +4,27 @@ This extension can complete either attribute names or file names. It can pop a window with all available names, for the user to select from. """ import os -import sys import string +import sys -from idlelib.config import idleConf - -# This string includes all chars that may be in an identifier -ID_CHARS = string.ascii_letters + string.digits + "_" - -# These constants represent the two different types of completions +# These constants represent the two different types of completions. +# They must be defined here so autocomple_w can import them. COMPLETE_ATTRIBUTES, COMPLETE_FILES = range(1, 2+1) from idlelib import autocomplete_w +from idlelib.config import idleConf from idlelib.hyperparser import HyperParser - import __main__ +# This string includes all chars that may be in an identifier. +# TODO Update this here and elsewhere. +ID_CHARS = string.ascii_letters + string.digits + "_" + SEPS = os.sep if os.altsep: # e.g. '/' on Windows... SEPS += os.altsep + class AutoComplete: menudefs = [ diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py index 31837e0..3374c6e 100644 --- a/Lib/idlelib/autocomplete_w.py +++ b/Lib/idlelib/autocomplete_w.py @@ -3,8 +3,9 @@ An auto-completion window for IDLE, used by the autocomplete extension """ from tkinter import * from tkinter.ttk import Scrollbar -from idlelib.multicall import MC_SHIFT + from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES +from idlelib.multicall import MC_SHIFT HIDE_VIRTUAL_EVENT_NAME = "<>" HIDE_SEQUENCES = ("", "") diff --git a/Lib/idlelib/autoexpand.py b/Lib/idlelib/autoexpand.py index 7190607..6b46bee 100644 --- a/Lib/idlelib/autoexpand.py +++ b/Lib/idlelib/autoexpand.py @@ -12,8 +12,8 @@ its state. This is an extension file and there is only one instance of AutoExpand. ''' -import string import re +import string ###$ event <> ###$ win @@ -100,7 +100,6 @@ class AutoExpand: i = i-1 return line[i:] - if __name__ == '__main__': import unittest unittest.main('idlelib.idle_test.test_autoexpand', verbosity=2) diff --git a/Lib/idlelib/browser.py b/Lib/idlelib/browser.py index 9968333..ea05638 100644 --- a/Lib/idlelib/browser.py +++ b/Lib/idlelib/browser.py @@ -11,13 +11,13 @@ XXX TO DO: """ import os -import sys import pyclbr +import sys +from idlelib.config import idleConf from idlelib import pyshell -from idlelib.windows import ListedToplevel from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas -from idlelib.config import idleConf +from idlelib.windows import ListedToplevel file_open = None # Method...Item and Class...Item use this. # Normally pyshell.flist.open, but there is no pyshell.flist for htest. diff --git a/Lib/idlelib/calltips.py b/Lib/idlelib/calltips.py index 3a9b1c6..abcc142 100644 --- a/Lib/idlelib/calltips.py +++ b/Lib/idlelib/calltips.py @@ -5,7 +5,6 @@ parameter and docstring information when you type an opening parenthesis, and which disappear when you type a closing parenthesis. """ -import __main__ import inspect import re import sys @@ -14,6 +13,7 @@ import types from idlelib import calltip_w from idlelib.hyperparser import HyperParser +import __main__ class CallTips: diff --git a/Lib/idlelib/codecontext.py b/Lib/idlelib/codecontext.py index 2a21a1f..f25e1b3 100644 --- a/Lib/idlelib/codecontext.py +++ b/Lib/idlelib/codecontext.py @@ -9,10 +9,12 @@ variable in the codecontext section of config-extensions.def. Lines which do not open blocks are not shown in the context hints pane. """ -import tkinter -from tkinter.constants import TOP, LEFT, X, W, SUNKEN import re from sys import maxsize as INFINITY + +import tkinter +from tkinter.constants import TOP, LEFT, X, W, SUNKEN + from idlelib.config import idleConf BLOCKOPENERS = {"class", "def", "elif", "else", "except", "finally", "for", diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index f5dd03d..7310bb2 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -1,9 +1,10 @@ -import time -import re -import keyword import builtins -from idlelib.delegator import Delegator +import keyword +import re +import time + from idlelib.config import idleConf +from idlelib.delegator import Delegator DEBUG = False diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index d2f0b13..10fe3ba 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -18,10 +18,10 @@ configuration problem notification and resolution. """ # TODOs added Oct 2014, tjr +from configparser import ConfigParser import os import sys -from configparser import ConfigParser from tkinter.font import Font, nametofont class InvalidConfigType(Exception): pass diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 2f361bd..fa47aaa 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -11,17 +11,17 @@ Refer to comments in EditorWindow autoindent code for details. """ from tkinter import * from tkinter.ttk import Scrollbar -import tkinter.messagebox as tkMessageBox import tkinter.colorchooser as tkColorChooser import tkinter.font as tkFont +import tkinter.messagebox as tkMessageBox from idlelib.config import idleConf -from idlelib.dynoption import DynOptionMenu from idlelib.config_key import GetKeysDialog +from idlelib.dynoption import DynOptionMenu +from idlelib import macosx from idlelib.query import SectionName, HelpSource from idlelib.tabbedpages import TabbedPageSet from idlelib.textview import view_text -from idlelib import macosx class ConfigDialog(Toplevel): diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py index ea393b1..114d0d1 100644 --- a/Lib/idlelib/debugger.py +++ b/Lib/idlelib/debugger.py @@ -1,10 +1,12 @@ -import os import bdb +import os + from tkinter import * from tkinter.ttk import Scrollbar -from idlelib.windows import ListedToplevel -from idlelib.scrolledlist import ScrolledList + from idlelib import macosx +from idlelib.scrolledlist import ScrolledList +from idlelib.windows import ListedToplevel class Idb(bdb.Bdb): diff --git a/Lib/idlelib/debugobj.py b/Lib/idlelib/debugobj.py index c116fcd..b70b13c 100644 --- a/Lib/idlelib/debugobj.py +++ b/Lib/idlelib/debugobj.py @@ -8,11 +8,10 @@ # XXX TO DO: # - for classes/modules, add "open source" to object browser +from reprlib import Repr from idlelib.tree import TreeItem, TreeNode, ScrolledCanvas -from reprlib import Repr - myrepr = Repr() myrepr.maxstring = 100 myrepr.maxother = 100 diff --git a/Lib/idlelib/dynoption.py b/Lib/idlelib/dynoption.py index 962f2c3..9c6ffa4 100644 --- a/Lib/idlelib/dynoption.py +++ b/Lib/idlelib/dynoption.py @@ -3,6 +3,7 @@ OptionMenu widget modified to allow dynamic menu reconfiguration and setting of highlightthickness """ import copy + from tkinter import OptionMenu, _setit, StringVar, Button class DynOptionMenu(OptionMenu): diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 7372ecf..ae475cb 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -6,24 +6,28 @@ import platform import re import string import sys +import tokenize +import traceback +import webbrowser + from tkinter import * from tkinter.ttk import Scrollbar import tkinter.simpledialog as tkSimpleDialog import tkinter.messagebox as tkMessageBox -import traceback -import webbrowser +from idlelib.config import idleConf +from idlelib import configdialog +from idlelib import grep +from idlelib import help +from idlelib import help_about +from idlelib import macosx from idlelib.multicall import MultiCallCreator +from idlelib import pyparse from idlelib import query -from idlelib import windows -from idlelib import search -from idlelib import grep from idlelib import replace -from idlelib import pyparse -from idlelib.config import idleConf -from idlelib import help_about, textview, configdialog -from idlelib import macosx -from idlelib import help +from idlelib import search +from idlelib import textview +from idlelib import windows # The default tab setting for a Text widget, in average-width characters. TK_TABWIDTH_DEFAULT = 8 @@ -1515,9 +1519,6 @@ def classifyws(s, tabwidth): break return raw, effective -import tokenize -_tokenize = tokenize -del tokenize class IndentSearcher(object): @@ -1542,8 +1543,8 @@ class IndentSearcher(object): return self.text.get(mark, mark + " lineend+1c") def tokeneater(self, type, token, start, end, line, - INDENT=_tokenize.INDENT, - NAME=_tokenize.NAME, + INDENT=tokenize.INDENT, + NAME=tokenize.NAME, OPENERS=('class', 'def', 'for', 'if', 'try', 'while')): if self.finished: pass @@ -1554,19 +1555,19 @@ class IndentSearcher(object): self.finished = 1 def run(self): - save_tabsize = _tokenize.tabsize - _tokenize.tabsize = self.tabwidth + save_tabsize = tokenize.tabsize + tokenize.tabsize = self.tabwidth try: try: - tokens = _tokenize.generate_tokens(self.readline) + tokens = tokenize.generate_tokens(self.readline) for token in tokens: self.tokeneater(*token) - except (_tokenize.TokenError, SyntaxError): + except (tokenize.TokenError, SyntaxError): # since we cut off the tokenizer early, we can trigger # spurious errors pass finally: - _tokenize.tabsize = save_tabsize + tokenize.tabsize = save_tabsize return self.blkopenline, self.indentedline ### end autoindent code ### diff --git a/Lib/idlelib/filelist.py b/Lib/idlelib/filelist.py index b5af90cc..f46ad7c 100644 --- a/Lib/idlelib/filelist.py +++ b/Lib/idlelib/filelist.py @@ -1,4 +1,5 @@ import os + from tkinter import * import tkinter.messagebox as tkMessageBox diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index cfb0ea0..64ba28d 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -1,11 +1,14 @@ -import os import fnmatch +import os import sys + from tkinter import StringVar, BooleanVar from tkinter.ttk import Checkbutton -from idlelib import searchengine + from idlelib.searchbase import SearchDialogBase -# Importing OutputWindow fails due to import loop +from idlelib import searchengine + +# Importing OutputWindow here fails due to import loop # EditorWindow -> GrepDialop -> OutputWindow -> EditorWindow def grep(text, io=None, flist=None): @@ -127,9 +130,9 @@ class GrepDialog(SearchDialogBase): def _grep_dialog(parent): # htest # - from idlelib.pyshell import PyShellFileList from tkinter import Toplevel, Text, SEL, END from tkinter.ttk import Button + from idlelib.pyshell import PyShellFileList top = Toplevel(parent) top.title("Test GrepDialog") x, y = map(int, parent.geometry().split('+')[1:]) diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index 03d6ea2..77e01a3 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -27,9 +27,11 @@ show_idlehelp - Create HelpWindow. Called in EditorWindow.help_dialog. from html.parser import HTMLParser from os.path import abspath, dirname, isfile, join from platform import python_version + from tkinter import Toplevel, Frame, Text, Menu from tkinter.ttk import Menubutton, Scrollbar from tkinter import font as tkfont + from idlelib.config import idleConf ## About IDLE ## diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index 54f3599..071bd3e 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -1,12 +1,14 @@ """About Dialog for IDLE """ - import os from sys import version + from tkinter import * + from idlelib import textview + class AboutDialog(Toplevel): """Modal about dialog for idle @@ -144,6 +146,7 @@ class AboutDialog(Toplevel): def Ok(self, event=None): self.destroy() + if __name__ == '__main__': import unittest unittest.main('idlelib.idle_test.test_help_about', verbosity=2, exit=False) diff --git a/Lib/idlelib/history.py b/Lib/idlelib/history.py index 6068d4f..56f53a0 100644 --- a/Lib/idlelib/history.py +++ b/Lib/idlelib/history.py @@ -2,6 +2,7 @@ from idlelib.config import idleConf + class History: ''' Implement Idle Shell history mechanism. @@ -99,6 +100,7 @@ class History: self.pointer = None self.prefix = None + if __name__ == "__main__": from unittest import main - main('idlelib.idle_test.test_idlehistory', verbosity=2, exit=False) + main('idlelib.idle_test.test_history', verbosity=2, exit=False) diff --git a/Lib/idlelib/hyperparser.py b/Lib/idlelib/hyperparser.py index f904a39..450a709 100644 --- a/Lib/idlelib/hyperparser.py +++ b/Lib/idlelib/hyperparser.py @@ -4,11 +4,10 @@ HyperParser uses PyParser. PyParser mostly gives information on the proper indentation of code. HyperParser gives additional information on the structure of code. """ - -import string from keyword import iskeyword -from idlelib import pyparse +import string +from idlelib import pyparse # all ASCII chars that may be in an identifier _ASCII_ID_CHARS = frozenset(string.ascii_letters + string.digits + "_") diff --git a/Lib/idlelib/idle_test/test_iomenu.py b/Lib/idlelib/idle_test/test_iomenu.py index f8ff112..65bf593 100644 --- a/Lib/idlelib/idle_test/test_iomenu.py +++ b/Lib/idlelib/idle_test/test_iomenu.py @@ -1,6 +1,7 @@ import unittest import io -from idlelib.pyshell import PseudoInputFile, PseudoOutputFile + +from idlelib.run import PseudoInputFile, PseudoOutputFile class S(str): @@ -230,4 +231,4 @@ class PseudeInputFilesTest(unittest.TestCase): if __name__ == '__main__': - unittest.main() + unittest.main(verbosity=2) diff --git a/Lib/idlelib/macosx.py b/Lib/idlelib/macosx.py index f9f558d..c225dd9 100644 --- a/Lib/idlelib/macosx.py +++ b/Lib/idlelib/macosx.py @@ -2,9 +2,10 @@ A number of functions that enhance IDLE on Mac OSX. """ from sys import platform # Used in _init_tk_type, changed by test. -import tkinter import warnings +import tkinter + ## Define functions that query the Mac graphics type. ## _tk_type and its initializer are private to this section. diff --git a/Lib/idlelib/multicall.py b/Lib/idlelib/multicall.py index 8a66cd9..b74fed4 100644 --- a/Lib/idlelib/multicall.py +++ b/Lib/idlelib/multicall.py @@ -28,9 +28,9 @@ The order by which events are called is defined by these rules: unless this conflicts with the first rule. Each function will be called at most once for each event. """ - -import sys import re +import sys + import tkinter # the event type constants, which define the meaning of mc_type diff --git a/Lib/idlelib/outwin.py b/Lib/idlelib/outwin.py index b3bc786..f6d2915 100644 --- a/Lib/idlelib/outwin.py +++ b/Lib/idlelib/outwin.py @@ -1,9 +1,12 @@ -from tkinter import * -from idlelib.editor import EditorWindow import re + +from tkinter import * import tkinter.messagebox as tkMessageBox + +from idlelib.editor import EditorWindow from idlelib import iomenu + class OutputWindow(EditorWindow): """An editor window that can serve as an output file. diff --git a/Lib/idlelib/paragraph.py b/Lib/idlelib/paragraph.py index 0323b53..5d358ee 100644 --- a/Lib/idlelib/paragraph.py +++ b/Lib/idlelib/paragraph.py @@ -14,10 +14,11 @@ Known problems with comment reformatting: spaces, they will not be considered part of the same block. * Fancy comments, like this bulleted list, aren't handled :-) """ - import re + from idlelib.config import idleConf + class FormatParagraph: menudefs = [ @@ -189,6 +190,7 @@ def get_comment_header(line): if m is None: return "" return m.group(1) + if __name__ == "__main__": import unittest unittest.main('idlelib.idle_test.test_paragraph', diff --git a/Lib/idlelib/parenmatch.py b/Lib/idlelib/parenmatch.py index 9586a3b..ccec708 100644 --- a/Lib/idlelib/parenmatch.py +++ b/Lib/idlelib/parenmatch.py @@ -4,7 +4,6 @@ When you hit a right paren, the cursor should move briefly to the left paren. Paren here is used generically; the matching applies to parentheses, square brackets, and curly braces. """ - from idlelib.hyperparser import HyperParser from idlelib.config import idleConf diff --git a/Lib/idlelib/pathbrowser.py b/Lib/idlelib/pathbrowser.py index 966af4b..6c19508 100644 --- a/Lib/idlelib/pathbrowser.py +++ b/Lib/idlelib/pathbrowser.py @@ -1,10 +1,10 @@ +import importlib.machinery import os import sys -import importlib.machinery -from idlelib.tree import TreeItem from idlelib.browser import ClassBrowser, ModuleBrowserTreeItem from idlelib.pyshell import PyShellFileList +from idlelib.tree import TreeItem class PathBrowser(ClassBrowser): @@ -24,6 +24,7 @@ class PathBrowser(ClassBrowser): def rootnode(self): return PathBrowserTreeItem() + class PathBrowserTreeItem(TreeItem): def GetText(self): @@ -36,6 +37,7 @@ class PathBrowserTreeItem(TreeItem): sublist.append(item) return sublist + class DirBrowserTreeItem(TreeItem): def __init__(self, dir, packages=[]): @@ -95,6 +97,7 @@ class DirBrowserTreeItem(TreeItem): sorted.sort() return sorted + def _path_browser(parent): # htest # flist = PyShellFileList(parent) PathBrowser(flist, _htest=True) diff --git a/Lib/idlelib/percolator.py b/Lib/idlelib/percolator.py index 4474f9a..d18daf0 100644 --- a/Lib/idlelib/percolator.py +++ b/Lib/idlelib/percolator.py @@ -1,5 +1,5 @@ -from idlelib.redirector import WidgetRedirector from idlelib.delegator import Delegator +from idlelib.redirector import WidgetRedirector class Percolator: diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 9ccbb25..6739dfd 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -1,6 +1,6 @@ +from collections import Mapping import re import sys -from collections import Mapping # Reason last stmt is continued (or C_NONE if it's not). (C_NONE, C_BACKSLASH, C_STRING_FIRST_LINE, diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 740c72e..e1eade1 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -15,9 +15,13 @@ if TkVersion < 8.5: parent=root) sys.exit(1) +from code import InteractiveInterpreter import getopt +import io +import linecache import os import os.path +from platform import python_version, system import re import socket import subprocess @@ -25,23 +29,20 @@ import sys import threading import time import tokenize +import warnings -import linecache -from code import InteractiveInterpreter -from platform import python_version, system - -from idlelib import testing -from idlelib.editor import EditorWindow, fixwordbreaks -from idlelib.filelist import FileList +from idlelib import testing # bool value from idlelib.colorizer import ColorDelegator -from idlelib.undo import UndoDelegator -from idlelib.outwin import OutputWindow from idlelib.config import idleConf -from idlelib.run import idle_formatwarning, PseudoInputFile, PseudoOutputFile -from idlelib import rpc from idlelib import debugger from idlelib import debugger_r +from idlelib.editor import EditorWindow, fixwordbreaks +from idlelib.filelist import FileList from idlelib import macosx +from idlelib.outwin import OutputWindow +from idlelib import rpc +from idlelib.run import idle_formatwarning, PseudoInputFile, PseudoOutputFile +from idlelib.undo import UndoDelegator HOST = '127.0.0.1' # python execution server on localhost loopback PORT = 0 # someday pass in host, port for remote debug capability @@ -51,7 +52,6 @@ PORT = 0 # someday pass in host, port for remote debug capability # temporarily redirect the stream to the shell window to display warnings when # checking user's code. warning_stream = sys.__stderr__ # None, at least on Windows, if no console. -import warnings def idle_showwarning( message, category, filename, lineno, file=None, line=None): diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index a4584df..3b1f1e2 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -23,9 +23,10 @@ Subclass HelpSource gets menu item and path for additions to Help menu. import importlib import os from sys import executable, platform # Platform is set for one test. + from tkinter import Toplevel, StringVar, W, E, N, S -from tkinter import filedialog from tkinter.ttk import Frame, Button, Entry, Label +from tkinter import filedialog from tkinter.font import Font class Query(Toplevel): diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 367bfc9..abd9e59 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -3,12 +3,12 @@ Uses idlelib.SearchEngine for search capability. Defines various replace related functions like replace, replace all, replace+find. """ +import re + from tkinter import StringVar, TclError -from idlelib import searchengine from idlelib.searchbase import SearchDialogBase -import re - +from idlelib import searchengine def replace(text): """Returns a singleton ReplaceDialog instance.The single dialog diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index 48105f2..8f57edb8 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -26,23 +26,21 @@ See the Idle run.main() docstring for further information on how this was accomplished in Idle. """ - -import sys -import os +import builtins +import copyreg import io -import socket +import marshal +import os +import pickle +import queue import select +import socket import socketserver import struct -import pickle +import sys import threading -import queue import traceback -import copyreg import types -import marshal -import builtins - def unpickle_code(ms): co = marshal.loads(ms) @@ -60,10 +58,12 @@ def dumps(obj, protocol=None): p.dump(obj) return f.getvalue() + class CodePickler(pickle.Pickler): dispatch_table = {types.CodeType: pickle_code} dispatch_table.update(copyreg.dispatch_table) + BUFSIZE = 8*1024 LOCALHOST = '127.0.0.1' @@ -487,16 +487,19 @@ class RemoteObject(object): # Token mix-in class pass + def remoteref(obj): oid = id(obj) objecttable[oid] = obj return RemoteProxy(oid) + class RemoteProxy(object): def __init__(self, oid): self.oid = oid + class RPCHandler(socketserver.BaseRequestHandler, SocketIO): debugging = False @@ -514,6 +517,7 @@ class RPCHandler(socketserver.BaseRequestHandler, SocketIO): def get_remote_proxy(self, oid): return RPCProxy(self, oid) + class RPCClient(SocketIO): debugging = False @@ -539,6 +543,7 @@ class RPCClient(SocketIO): def get_remote_proxy(self, oid): return RPCProxy(self, oid) + class RPCProxy(object): __methods = None @@ -587,6 +592,7 @@ def _getattributes(obj, attributes): if not callable(attr): attributes[name] = 1 + class MethodProxy(object): def __init__(self, sockio, oid, name): diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index c7ee0b3..afa9744 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -2,21 +2,21 @@ import io import linecache import queue import sys -import _thread as thread -import threading import time import traceback -import tkinter - -from idlelib import calltips -from idlelib import autocomplete +import _thread as thread +import threading +import warnings -from idlelib import debugger_r -from idlelib import debugobj_r -from idlelib import stackviewer -from idlelib import rpc -from idlelib import iomenu +import tkinter # Tcl, deletions, messagebox if startup fails +from idlelib import autocomplete # AutoComplete, fetch_encodings +from idlelib import calltips # CallTips +from idlelib import debugger_r # start_debugger +from idlelib import debugobj_r # remote_object_tree_item +from idlelib import iomenu # encoding +from idlelib import rpc # multiple objects +from idlelib import stackviewer # StackTreeItem import __main__ for mod in ('simpledialog', 'messagebox', 'font', @@ -27,7 +27,6 @@ for mod in ('simpledialog', 'messagebox', 'font', LOCALHOST = '127.0.0.1' -import warnings def idle_formatwarning(message, category, filename, lineno, line=None): """Format warnings the IDLE way.""" @@ -280,6 +279,7 @@ def exit(): capture_warnings(False) sys.exit(0) + class MyRPCServer(rpc.RPCServer): def handle_error(self, request, client_address): diff --git a/Lib/idlelib/runscript.py b/Lib/idlelib/runscript.py index 7e7524a..79d86ad 100644 --- a/Lib/idlelib/runscript.py +++ b/Lib/idlelib/runscript.py @@ -20,11 +20,12 @@ XXX GvR Redesign this interface (yet again) as follows: import os import tabnanny import tokenize + import tkinter.messagebox as tkMessageBox -from idlelib import pyshell from idlelib.config import idleConf from idlelib import macosx +from idlelib import pyshell indent_message = """Error: Inconsistent indentation detected! diff --git a/Lib/idlelib/scrolledlist.py b/Lib/idlelib/scrolledlist.py index 4799995..cc08c26 100644 --- a/Lib/idlelib/scrolledlist.py +++ b/Lib/idlelib/scrolledlist.py @@ -1,7 +1,9 @@ from tkinter import * -from idlelib import macosx from tkinter.ttk import Scrollbar +from idlelib import macosx + + class ScrolledList: default = "(None)" diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index 508a35c..4b90659 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -24,6 +24,7 @@ def find_selection(text): "Handle the editor edit menu item and corresponding event." return _setup(text).find_selection(text) + class SearchDialog(SearchDialogBase): def create_widgets(self): diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index b326a1c..5f81785 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -3,6 +3,7 @@ from tkinter import Toplevel, Frame from tkinter.ttk import Entry, Label, Button, Checkbutton, Radiobutton + class SearchDialogBase: '''Create most of a 3 or 4 row, 3 column search dialog. diff --git a/Lib/idlelib/searchengine.py b/Lib/idlelib/searchengine.py index 2e3700e..253f1b0 100644 --- a/Lib/idlelib/searchengine.py +++ b/Lib/idlelib/searchengine.py @@ -1,5 +1,6 @@ '''Define SearchEngine for search dialogs.''' import re + from tkinter import StringVar, BooleanVar, TclError import tkinter.messagebox as tkMessageBox @@ -14,6 +15,7 @@ def get(root): # This creates a cycle that persists until root is deleted. return root._searchengine + class SearchEngine: """Handles searching a text widget for Find, Replace, and Grep.""" @@ -186,6 +188,7 @@ class SearchEngine: col = len(chars) - 1 return None + def search_reverse(prog, chars, col): '''Search backwards and return an re match object or None. diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py index c8c802c..0698def 100644 --- a/Lib/idlelib/stackviewer.py +++ b/Lib/idlelib/stackviewer.py @@ -1,11 +1,12 @@ -import os -import sys import linecache +import os import re +import sys + import tkinter as tk -from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem +from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas def StackBrowser(root, flist=None, tb=None, top=None): if top is None: @@ -16,6 +17,7 @@ def StackBrowser(root, flist=None, tb=None, top=None): node = TreeNode(sc.canvas, None, item) node.expand() + class StackTreeItem(TreeItem): def __init__(self, flist=None, tb=None): @@ -54,6 +56,7 @@ class StackTreeItem(TreeItem): sublist.append(item) return sublist + class FrameTreeItem(TreeItem): def __init__(self, info, flist): @@ -95,6 +98,7 @@ class FrameTreeItem(TreeItem): if os.path.isfile(filename): self.flist.gotofileline(filename, lineno) + class VariablesTreeItem(ObjectTreeItem): def GetText(self): @@ -119,6 +123,7 @@ class VariablesTreeItem(ObjectTreeItem): sublist.append(item) return sublist + def _stack_viewer(parent): # htest # from idlelib.pyshell import PyShellFileList top = tk.Toplevel(parent) diff --git a/Lib/idlelib/statusbar.py b/Lib/idlelib/statusbar.py index a65bfb3..8618528 100644 --- a/Lib/idlelib/statusbar.py +++ b/Lib/idlelib/statusbar.py @@ -1,5 +1,6 @@ from tkinter import Frame, Label + class MultiStatusBar(Frame): def __init__(self, master, **kw): @@ -17,6 +18,7 @@ class MultiStatusBar(Frame): label.config(width=width) label.config(text=text) + def _multistatus_bar(parent): # htest # from tkinter import Toplevel, Frame, Text, Button top = Toplevel(parent) diff --git a/Lib/idlelib/tabbedpages.py b/Lib/idlelib/tabbedpages.py index ed07588..4186fa2 100644 --- a/Lib/idlelib/tabbedpages.py +++ b/Lib/idlelib/tabbedpages.py @@ -285,6 +285,7 @@ class TabSet(Frame): # placed hide it self.tab_set.lower() + class TabbedPageSet(Frame): """A Tkinter tabbed-pane widget. @@ -302,6 +303,7 @@ class TabbedPageSet(Frame): remove_page() methods. """ + class Page(object): """Abstract base class for TabbedPageSet's pages. @@ -467,6 +469,7 @@ class TabbedPageSet(Frame): self._tab_set.set_selected_tab(page_name) + def _tabbed_pages(parent): # htest # top=Toplevel(parent) x, y = map(int, parent.geometry().split('+')[1:]) diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py index 7664524..b5c9f9b 100644 --- a/Lib/idlelib/textview.py +++ b/Lib/idlelib/textview.py @@ -1,11 +1,11 @@ """Simple text browser for IDLE """ - from tkinter import * from tkinter.ttk import Scrollbar from tkinter.messagebox import showerror + class TextViewer(Toplevel): """A simple text viewer dialog for IDLE diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py index 04e0734..292ce36 100644 --- a/Lib/idlelib/tree.py +++ b/Lib/idlelib/tree.py @@ -15,10 +15,12 @@ # - optimize tree redraw after expand of subnode import os + from tkinter import * from tkinter.ttk import Scrollbar -from idlelib import zoomheight + from idlelib.config import idleConf +from idlelib import zoomheight ICONDIR = "Icons" diff --git a/Lib/idlelib/undo.py b/Lib/idlelib/undo.py index 9f291e5..4332f10 100644 --- a/Lib/idlelib/undo.py +++ b/Lib/idlelib/undo.py @@ -1,5 +1,7 @@ import string + from idlelib.delegator import Delegator + # tkintter import not needed because module does not create widgets, # although many methods operate on text widget arguments. @@ -158,7 +160,6 @@ class UndoDelegator(Delegator): class Command: - # Base class for Undoable commands tags = None @@ -204,7 +205,6 @@ class Command: class InsertCommand(Command): - # Undoable insert command def __init__(self, index1, chars, tags=None): @@ -262,7 +262,6 @@ class InsertCommand(Command): class DeleteCommand(Command): - # Undoable delete command def __init__(self, index1, index2=None): @@ -297,8 +296,8 @@ class DeleteCommand(Command): text.see('insert') ##sys.__stderr__.write("undo: %s\n" % self) -class CommandSequence(Command): +class CommandSequence(Command): # Wrapper for a sequence of undoable cmds to be undone/redone # as a unit diff --git a/Lib/idlelib/windows.py b/Lib/idlelib/windows.py index bc74348..a3f858a 100644 --- a/Lib/idlelib/windows.py +++ b/Lib/idlelib/windows.py @@ -1,5 +1,6 @@ from tkinter import * + class WindowList: def __init__(self): @@ -48,6 +49,7 @@ class WindowList: t, v, tb = sys.exc_info() print("warning: callback failed in WindowList", t, ":", v) + registry = WindowList() add_windows_to_menu = registry.add_windows_to_menu diff --git a/Lib/idlelib/zoomheight.py b/Lib/idlelib/zoomheight.py index 0016e9d..aa4a427 100644 --- a/Lib/idlelib/zoomheight.py +++ b/Lib/idlelib/zoomheight.py @@ -5,6 +5,7 @@ import sys from idlelib import macosx + class ZoomHeight: menudefs = [ @@ -20,6 +21,7 @@ class ZoomHeight: top = self.editwin.top zoom_height(top) + def zoom_height(top): geom = top.wm_geometry() m = re.match(r"(\d+)x(\d+)\+(-?\d+)\+(-?\d+)", geom) -- cgit v0.12