diff -r c9d59e6cc1e4 Lib/idlelib/README.txt --- a/Lib/idlelib/README.txt Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/README.txt Tue Aug 30 23:36:08 2016 -0400 @@ -228,4 +228,23 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/autocomplete.py --- a/Lib/idlelib/autocomplete.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/autocomplete.py Tue Aug 30 23:36:08 2016 -0400 @@ -4,26 +4,27 @@ a window with all available names, for the user to select from. """ import os +import string import sys -import string -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__ -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 -r c9d59e6cc1e4 Lib/idlelib/autocomplete_w.py --- a/Lib/idlelib/autocomplete_w.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/autocomplete_w.py Tue Aug 30 23:36:08 2016 -0400 @@ -3,8 +3,9 @@ """ from tkinter import * from tkinter.ttk import Scrollbar + +from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES from idlelib.multicall import MC_SHIFT -from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES HIDE_VIRTUAL_EVENT_NAME = "<>" HIDE_SEQUENCES = ("", "") diff -r c9d59e6cc1e4 Lib/idlelib/autoexpand.py --- a/Lib/idlelib/autoexpand.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/autoexpand.py Tue Aug 30 23:36:08 2016 -0400 @@ -12,8 +12,8 @@ This is an extension file and there is only one instance of AutoExpand. ''' +import re import string -import re ###$ event <> ###$ win @@ -100,7 +100,6 @@ i = i-1 return line[i:] - if __name__ == '__main__': import unittest unittest.main('idlelib.idle_test.test_autoexpand', verbosity=2) diff -r c9d59e6cc1e4 Lib/idlelib/browser.py --- a/Lib/idlelib/browser.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/browser.py Tue Aug 30 23:36:08 2016 -0400 @@ -11,13 +11,13 @@ """ import os +import pyclbr import sys -import pyclbr +from idlelib.config import idleConf from idlelib import pyshell +from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas from idlelib.windows import ListedToplevel -from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas -from idlelib.config import idleConf file_open = None # Method...Item and Class...Item use this. # Normally pyshell.flist.open, but there is no pyshell.flist for htest. diff -r c9d59e6cc1e4 Lib/idlelib/calltips.py --- a/Lib/idlelib/calltips.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/calltips.py Tue Aug 30 23:36:08 2016 -0400 @@ -5,7 +5,6 @@ which disappear when you type a closing parenthesis. """ -import __main__ import inspect import re import sys @@ -14,6 +13,7 @@ from idlelib import calltip_w from idlelib.hyperparser import HyperParser +import __main__ class CallTips: diff -r c9d59e6cc1e4 Lib/idlelib/codecontext.py --- a/Lib/idlelib/codecontext.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/codecontext.py Tue Aug 30 23:36:08 2016 -0400 @@ -9,10 +9,12 @@ not open blocks are not shown in the context hints pane. """ +import re +from sys import maxsize as INFINITY + import tkinter from tkinter.constants import TOP, LEFT, X, W, SUNKEN -import re -from sys import maxsize as INFINITY + from idlelib.config import idleConf BLOCKOPENERS = {"class", "def", "elif", "else", "except", "finally", "for", diff -r c9d59e6cc1e4 Lib/idlelib/colorizer.py --- a/Lib/idlelib/colorizer.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/colorizer.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,9 +1,10 @@ -import time -import re +import builtins import keyword -import builtins +import re +import time + +from idlelib.config import idleConf from idlelib.delegator import Delegator -from idlelib.config import idleConf DEBUG = False diff -r c9d59e6cc1e4 Lib/idlelib/config.py --- a/Lib/idlelib/config.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/config.py Tue Aug 30 23:36:08 2016 -0400 @@ -18,10 +18,10 @@ """ # 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 -r c9d59e6cc1e4 Lib/idlelib/configdialog.py --- a/Lib/idlelib/configdialog.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/configdialog.py Tue Aug 30 23:36:08 2016 -0400 @@ -11,17 +11,17 @@ """ 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.config_key import GetKeysDialog from idlelib.dynoption import DynOptionMenu -from idlelib.config_key import GetKeysDialog +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 -r c9d59e6cc1e4 Lib/idlelib/debugger.py --- a/Lib/idlelib/debugger.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/debugger.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,10 +1,12 @@ +import bdb import os -import bdb + from tkinter import * from tkinter.ttk import Scrollbar + +from idlelib import macosx +from idlelib.scrolledlist import ScrolledList from idlelib.windows import ListedToplevel -from idlelib.scrolledlist import ScrolledList -from idlelib import macosx class Idb(bdb.Bdb): diff -r c9d59e6cc1e4 Lib/idlelib/debugobj.py --- a/Lib/idlelib/debugobj.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/debugobj.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 -r c9d59e6cc1e4 Lib/idlelib/dynoption.py --- a/Lib/idlelib/dynoption.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/dynoption.py Tue Aug 30 23:36:08 2016 -0400 @@ -3,6 +3,7 @@ and setting of highlightthickness """ import copy + from tkinter import OptionMenu, _setit, StringVar, Button class DynOptionMenu(OptionMenu): diff -r c9d59e6cc1e4 Lib/idlelib/editor.py --- a/Lib/idlelib/editor.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/editor.py Tue Aug 30 23:36:08 2016 -0400 @@ -6,24 +6,28 @@ 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 replace 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 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 @@ break return raw, effective -import tokenize -_tokenize = tokenize -del tokenize class IndentSearcher(object): @@ -1542,8 +1543,8 @@ 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 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/filelist.py --- a/Lib/idlelib/filelist.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/filelist.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,4 +1,5 @@ import os + from tkinter import * import tkinter.messagebox as tkMessageBox diff -r c9d59e6cc1e4 Lib/idlelib/grep.py --- a/Lib/idlelib/grep.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/grep.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,11 +1,14 @@ +import fnmatch import os -import fnmatch import sys + from tkinter import StringVar, BooleanVar from tkinter.ttk import Checkbutton + +from idlelib.searchbase import SearchDialogBase from idlelib import searchengine -from idlelib.searchbase import SearchDialogBase -# Importing OutputWindow fails due to import loop + +# Importing OutputWindow here fails due to import loop # EditorWindow -> GrepDialop -> OutputWindow -> EditorWindow def grep(text, io=None, flist=None): @@ -127,9 +130,9 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/help.py --- a/Lib/idlelib/help.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/help.py Tue Aug 30 23:36:08 2016 -0400 @@ -27,9 +27,11 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/help_about.py --- a/Lib/idlelib/help_about.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/help_about.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/history.py --- a/Lib/idlelib/history.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/history.py Tue Aug 30 23:36:08 2016 -0400 @@ -2,6 +2,7 @@ from idlelib.config import idleConf + class History: ''' Implement Idle Shell history mechanism. @@ -99,6 +100,7 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/hyperparser.py --- a/Lib/idlelib/hyperparser.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/hyperparser.py Tue Aug 30 23:36:08 2016 -0400 @@ -4,12 +4,11 @@ proper indentation of code. HyperParser gives additional information on the structure of code. """ - +from keyword import iskeyword import string -from keyword import iskeyword + from idlelib import pyparse - # all ASCII chars that may be in an identifier _ASCII_ID_CHARS = frozenset(string.ascii_letters + string.digits + "_") # all ASCII chars that may be the first char of an identifier diff -r c9d59e6cc1e4 Lib/idlelib/idle_test/test_iomenu.py --- a/Lib/idlelib/idle_test/test_iomenu.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/idle_test/test_iomenu.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 @@ if __name__ == '__main__': - unittest.main() + unittest.main(verbosity=2) diff -r c9d59e6cc1e4 Lib/idlelib/macosx.py --- a/Lib/idlelib/macosx.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/macosx.py Tue Aug 30 23:36:08 2016 -0400 @@ -2,8 +2,9 @@ A number of functions that enhance IDLE on Mac OSX. """ from sys import platform # Used in _init_tk_type, changed by test. +import warnings + import tkinter -import warnings ## Define functions that query the Mac graphics type. diff -r c9d59e6cc1e4 Lib/idlelib/multicall.py --- a/Lib/idlelib/multicall.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/multicall.py Tue Aug 30 23:36:08 2016 -0400 @@ -28,9 +28,9 @@ unless this conflicts with the first rule. Each function will be called at most once for each event. """ +import re +import sys -import sys -import re import tkinter # the event type constants, which define the meaning of mc_type diff -r c9d59e6cc1e4 Lib/idlelib/outwin.py --- a/Lib/idlelib/outwin.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/outwin.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,9 +1,12 @@ +import re + from tkinter import * +import tkinter.messagebox as tkMessageBox + from idlelib.editor import EditorWindow -import re -import tkinter.messagebox as tkMessageBox from idlelib import iomenu + class OutputWindow(EditorWindow): """An editor window that can serve as an output file. diff -r c9d59e6cc1e4 Lib/idlelib/paragraph.py --- a/Lib/idlelib/paragraph.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/paragraph.py Tue Aug 30 23:36:08 2016 -0400 @@ -14,10 +14,11 @@ spaces, they will not be considered part of the same block. * Fancy comments, like this bulleted list, aren't handled :-) """ +import re -import re from idlelib.config import idleConf + class FormatParagraph: menudefs = [ @@ -189,6 +190,7 @@ if m is None: return "" return m.group(1) + if __name__ == "__main__": import unittest unittest.main('idlelib.idle_test.test_paragraph', diff -r c9d59e6cc1e4 Lib/idlelib/parenmatch.py --- a/Lib/idlelib/parenmatch.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/parenmatch.py Tue Aug 30 23:36:08 2016 -0400 @@ -4,7 +4,6 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/pathbrowser.py --- a/Lib/idlelib/pathbrowser.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/pathbrowser.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 @@ def rootnode(self): return PathBrowserTreeItem() + class PathBrowserTreeItem(TreeItem): def GetText(self): @@ -36,6 +37,7 @@ sublist.append(item) return sublist + class DirBrowserTreeItem(TreeItem): def __init__(self, dir, packages=[]): @@ -95,6 +97,7 @@ sorted.sort() return sorted + def _path_browser(parent): # htest # flist = PyShellFileList(parent) PathBrowser(flist, _htest=True) diff -r c9d59e6cc1e4 Lib/idlelib/percolator.py --- a/Lib/idlelib/percolator.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/percolator.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,5 +1,5 @@ +from idlelib.delegator import Delegator from idlelib.redirector import WidgetRedirector -from idlelib.delegator import Delegator class Percolator: diff -r c9d59e6cc1e4 Lib/idlelib/pyparse.py --- a/Lib/idlelib/pyparse.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/pyparse.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 -r c9d59e6cc1e4 Lib/idlelib/pyshell.py --- a/Lib/idlelib/pyshell.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/pyshell.py Tue Aug 30 23:36:08 2016 -0400 @@ -15,9 +15,13 @@ 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 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 import testing # bool value +from idlelib.colorizer import ColorDelegator +from idlelib.config import idleConf +from idlelib import debugger +from idlelib import debugger_r from idlelib.editor import EditorWindow, fixwordbreaks from idlelib.filelist import FileList -from idlelib.colorizer import ColorDelegator -from idlelib.undo import UndoDelegator +from idlelib import macosx 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 import macosx +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 @@ # 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 -r c9d59e6cc1e4 Lib/idlelib/query.py --- a/Lib/idlelib/query.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/query.py Tue Aug 30 23:36:08 2016 -0400 @@ -23,9 +23,10 @@ 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.ttk import Frame, Button, Entry, Label from tkinter import filedialog -from tkinter.ttk import Frame, Button, Entry, Label from tkinter.font import Font class Query(Toplevel): diff -r c9d59e6cc1e4 Lib/idlelib/replace.py --- a/Lib/idlelib/replace.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/replace.py Tue Aug 30 23:36:08 2016 -0400 @@ -3,12 +3,12 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/rpc.py Tue Aug 30 23:36:08 2016 -0400 @@ -26,23 +26,21 @@ accomplished in Idle. """ - -import sys +import builtins +import copyreg +import io +import marshal import os -import io +import pickle +import queue +import select import socket -import select 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 @@ 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 @@ # 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 @@ def get_remote_proxy(self, oid): return RPCProxy(self, oid) + class RPCClient(SocketIO): debugging = False @@ -539,6 +543,7 @@ def get_remote_proxy(self, oid): return RPCProxy(self, oid) + class RPCProxy(object): __methods = None @@ -587,6 +592,7 @@ if not callable(attr): attributes[name] = 1 + class MethodProxy(object): def __init__(self, sockio, oid, name): diff -r c9d59e6cc1e4 Lib/idlelib/run.py --- a/Lib/idlelib/run.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/run.py Tue Aug 30 23:36:08 2016 -0400 @@ -2,21 +2,21 @@ 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 @@ 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 @@ capture_warnings(False) sys.exit(0) + class MyRPCServer(rpc.RPCServer): def handle_error(self, request, client_address): diff -r c9d59e6cc1e4 Lib/idlelib/runscript.py --- a/Lib/idlelib/runscript.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/runscript.py Tue Aug 30 23:36:08 2016 -0400 @@ -20,11 +20,12 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/scrolledlist.py --- a/Lib/idlelib/scrolledlist.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/scrolledlist.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,6 +1,8 @@ from tkinter import * +from tkinter.ttk import Scrollbar + from idlelib import macosx -from tkinter.ttk import Scrollbar + class ScrolledList: diff -r c9d59e6cc1e4 Lib/idlelib/search.py --- a/Lib/idlelib/search.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/search.py Tue Aug 30 23:36:08 2016 -0400 @@ -24,6 +24,7 @@ "Handle the editor edit menu item and corresponding event." return _setup(text).find_selection(text) + class SearchDialog(SearchDialogBase): def create_widgets(self): diff -r c9d59e6cc1e4 Lib/idlelib/searchbase.py --- a/Lib/idlelib/searchbase.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/searchbase.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 -r c9d59e6cc1e4 Lib/idlelib/searchengine.py --- a/Lib/idlelib/searchengine.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/searchengine.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 @@ # 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 @@ col = len(chars) - 1 return None + def search_reverse(prog, chars, col): '''Search backwards and return an re match object or None. diff -r c9d59e6cc1e4 Lib/idlelib/stackviewer.py --- a/Lib/idlelib/stackviewer.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/stackviewer.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,11 +1,12 @@ +import linecache import os +import re import sys -import linecache -import re + import tkinter as tk +from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas -from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem def StackBrowser(root, flist=None, tb=None, top=None): if top is None: @@ -16,6 +17,7 @@ node = TreeNode(sc.canvas, None, item) node.expand() + class StackTreeItem(TreeItem): def __init__(self, flist=None, tb=None): @@ -54,6 +56,7 @@ sublist.append(item) return sublist + class FrameTreeItem(TreeItem): def __init__(self, info, flist): @@ -95,6 +98,7 @@ if os.path.isfile(filename): self.flist.gotofileline(filename, lineno) + class VariablesTreeItem(ObjectTreeItem): def GetText(self): @@ -119,6 +123,7 @@ sublist.append(item) return sublist + def _stack_viewer(parent): # htest # from idlelib.pyshell import PyShellFileList top = tk.Toplevel(parent) diff -r c9d59e6cc1e4 Lib/idlelib/statusbar.py --- a/Lib/idlelib/statusbar.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/statusbar.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,5 +1,6 @@ from tkinter import Frame, Label + class MultiStatusBar(Frame): def __init__(self, master, **kw): @@ -17,6 +18,7 @@ label.config(width=width) label.config(text=text) + def _multistatus_bar(parent): # htest # from tkinter import Toplevel, Frame, Text, Button top = Toplevel(parent) diff -r c9d59e6cc1e4 Lib/idlelib/tabbedpages.py --- a/Lib/idlelib/tabbedpages.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/tabbedpages.py Tue Aug 30 23:36:08 2016 -0400 @@ -285,6 +285,7 @@ # placed hide it self.tab_set.lower() + class TabbedPageSet(Frame): """A Tkinter tabbed-pane widget. @@ -302,6 +303,7 @@ remove_page() methods. """ + class Page(object): """Abstract base class for TabbedPageSet's pages. @@ -467,6 +469,7 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/textview.py --- a/Lib/idlelib/textview.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/textview.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 -r c9d59e6cc1e4 Lib/idlelib/tree.py --- a/Lib/idlelib/tree.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/tree.py Tue Aug 30 23:36:08 2016 -0400 @@ -15,10 +15,12 @@ # - optimize tree redraw after expand of subnode import os + from tkinter import * from tkinter.ttk import Scrollbar + +from idlelib.config import idleConf from idlelib import zoomheight -from idlelib.config import idleConf ICONDIR = "Icons" diff -r c9d59e6cc1e4 Lib/idlelib/undo.py --- a/Lib/idlelib/undo.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/undo.py Tue Aug 30 23:36:08 2016 -0400 @@ -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 Command: - # Base class for Undoable commands tags = None @@ -204,7 +205,6 @@ class InsertCommand(Command): - # Undoable insert command def __init__(self, index1, chars, tags=None): @@ -262,7 +262,6 @@ class DeleteCommand(Command): - # Undoable delete command def __init__(self, index1, index2=None): @@ -297,8 +296,8 @@ text.see('insert') ##sys.__stderr__.write("undo: %s\n" % self) + class CommandSequence(Command): - # Wrapper for a sequence of undoable cmds to be undone/redone # as a unit diff -r c9d59e6cc1e4 Lib/idlelib/windows.py --- a/Lib/idlelib/windows.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/windows.py Tue Aug 30 23:36:08 2016 -0400 @@ -1,5 +1,6 @@ from tkinter import * + class WindowList: def __init__(self): @@ -48,6 +49,7 @@ 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 -r c9d59e6cc1e4 Lib/idlelib/zoomheight.py --- a/Lib/idlelib/zoomheight.py Tue Aug 30 20:19:13 2016 -0400 +++ b/Lib/idlelib/zoomheight.py Tue Aug 30 23:36:08 2016 -0400 @@ -5,6 +5,7 @@ from idlelib import macosx + class ZoomHeight: menudefs = [ @@ -20,6 +21,7 @@ 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)