bpo-37038: Make idlelib.run runnable; add test clause (GH-13560)
authorTerry Jan Reedy <tjreedy@udel.edu>
Sat, 25 May 2019 01:59:53 +0000 (21:59 -0400)
committerGitHub <noreply@github.com>
Sat, 25 May 2019 01:59:53 +0000 (21:59 -0400)
Lib/idlelib/NEWS.txt
Lib/idlelib/run.py
Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst [new file with mode: 0644]

index 3f19ce737396308dd0b50d0537036e2dcef3143d..e1bc009ae933323abec5db64058b104d3653d1c4 100644 (file)
@@ -3,6 +3,8 @@ Released on 2019-10-20?
 ======================================
 
 
+bpo-37038: Make idlelib.run runnable; add test clause.
+
 bpo-36958: Print any argument other than None or int passed to
 SystemExit or sys.exit().
 
index b4a2b54a33c850b49734b78ce6efec038077fc12..4075deec51d8ed1e4cfdd34f1688db864377a428 100644 (file)
@@ -1,3 +1,9 @@
+""" idlelib.run
+
+Simplified, pyshell.ModifiedInterpreter spawns a subprocess with
+f'''{sys.executable} -c "__import__('idlelib.run').run.main()"'''
+'.run' is needed because __import__ returns idlelib, not idlelib.run.
+"""
 import io
 import linecache
 import queue
@@ -8,8 +14,6 @@ import _thread as thread
 import threading
 import warnings
 
-import tkinter  # Tcl, deletions, messagebox if startup fails
-
 from idlelib import autocomplete  # AutoComplete, fetch_encodings
 from idlelib import calltip  # Calltip
 from idlelib import debugger_r  # start_debugger
@@ -19,11 +23,16 @@ from idlelib import rpc  # multiple objects
 from idlelib import stackviewer  # StackTreeItem
 import __main__
 
-for mod in ('simpledialog', 'messagebox', 'font',
-            'dialog', 'filedialog', 'commondialog',
-            'ttk'):
-    delattr(tkinter, mod)
-    del sys.modules['tkinter.' + mod]
+import tkinter  # Use tcl and, if startup fails, messagebox.
+if not hasattr(sys.modules['idlelib.run'], 'firstrun'):
+    # Undo modifications of tkinter by idlelib imports; see bpo-25507.
+    for mod in ('simpledialog', 'messagebox', 'font',
+                'dialog', 'filedialog', 'commondialog',
+                'ttk'):
+        delattr(tkinter, mod)
+        del sys.modules['tkinter.' + mod]
+    # Avoid AttributeError if run again; see bpo-37038.
+    sys.modules['idlelib.run'].firstrun = False
 
 LOCALHOST = '127.0.0.1'
 
@@ -523,4 +532,9 @@ class Executive(object):
         item = stackviewer.StackTreeItem(flist, tb)
         return debugobj_r.remote_object_tree_item(item)
 
-capture_warnings(False)  # Make sure turned off; see issue 18081
+
+if __name__ == '__main__':
+    from unittest import main
+    main('idlelib.idle_test.test_run', verbosity=2)
+
+capture_warnings(False)  # Make sure turned off; see bpo-18081.
diff --git a/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst
new file mode 100644 (file)
index 0000000..762e9f1
--- /dev/null
@@ -0,0 +1 @@
+Make idlelib.run runnable; add test clause.