Commit 0fe4513d authored by Terry Jan Reedy's avatar Terry Jan Reedy Committed by GitHub

bpo-36405: IDLE - Restore __main__ and add tests (#12518)

Fix error in commit 2b751555 noticed by Serhiy Storchaka.
parent 6661c172
...@@ -3,7 +3,7 @@ Released on 2019-10-20? ...@@ -3,7 +3,7 @@ Released on 2019-10-20?
====================================== ======================================
bpo-36405: Use dict unpacking in idlelib and remove unneeded __main__ imports. bpo-36405: Use dict unpacking in idlelib.
bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). bpo-36396: Remove fgBg param of idlelib.config.GetHighlight().
This param was only used twice and changed the return type. This param was only used twice and changed the return type.
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
Either on demand or after a user-selected delay after a key character, Either on demand or after a user-selected delay after a key character,
pop up a list of candidates. pop up a list of candidates.
""" """
import __main__
import os import os
import string import string
import sys import sys
...@@ -181,7 +182,8 @@ class AutoComplete: ...@@ -181,7 +182,8 @@ class AutoComplete:
else: else:
if mode == COMPLETE_ATTRIBUTES: if mode == COMPLETE_ATTRIBUTES:
if what == "": if what == "":
namespace = {**__builtins__.__dict__, **globals()} namespace = {**__main__.__builtins__.__dict__,
**__main__.__dict__}
bigl = eval("dir()", namespace) bigl = eval("dir()", namespace)
bigl.sort() bigl.sort()
if "__all__" in bigl: if "__all__" in bigl:
...@@ -216,8 +218,8 @@ class AutoComplete: ...@@ -216,8 +218,8 @@ class AutoComplete:
return smalll, bigl return smalll, bigl
def get_entity(self, name): def get_entity(self, name):
"Lookup name in a namespace spanning sys.modules and globals()." "Lookup name in a namespace spanning sys.modules and __main.dict__."
return eval(name, {**sys.modules, **globals()}) return eval(name, {**sys.modules, **__main__.__dict__})
AutoComplete.reload() AutoComplete.reload()
......
...@@ -4,6 +4,7 @@ Call Tips are floating windows which display function, class, and method ...@@ -4,6 +4,7 @@ Call Tips are floating windows which display function, class, and method
parameter and docstring information when you type an opening parenthesis, and parameter and docstring information when you type an opening parenthesis, and
which disappear when you type a closing parenthesis. which disappear when you type a closing parenthesis.
""" """
import __main__
import inspect import inspect
import re import re
import sys import sys
...@@ -99,10 +100,10 @@ class Calltip: ...@@ -99,10 +100,10 @@ class Calltip:
def get_entity(expression): def get_entity(expression):
"""Return the object corresponding to expression evaluated """Return the object corresponding to expression evaluated
in a namespace spanning sys.modules and globals(). in a namespace spanning sys.modules and __main.dict__.
""" """
if expression: if expression:
namespace = {**sys.modules, **globals()} namespace = {**sys.modules, **__main__.__dict__}
try: try:
return eval(expression, namespace) # Only protect user code. return eval(expression, namespace) # Only protect user code.
except BaseException: except BaseException:
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import unittest import unittest
from test.support import requires from test.support import requires
from tkinter import Tk, Text from tkinter import Tk, Text
import __main__
import idlelib.autocomplete as ac import idlelib.autocomplete as ac
import idlelib.autocomplete_w as acw import idlelib.autocomplete_w as acw
...@@ -35,7 +36,7 @@ class AutoCompleteTest(unittest.TestCase): ...@@ -35,7 +36,7 @@ class AutoCompleteTest(unittest.TestCase):
del cls.root del cls.root
def setUp(self): def setUp(self):
self.editor.text.delete('1.0', 'end') self.text.delete('1.0', 'end')
self.autocomplete = ac.AutoComplete(self.editor) self.autocomplete = ac.AutoComplete(self.editor)
def test_init(self): def test_init(self):
...@@ -132,12 +133,16 @@ class AutoCompleteTest(unittest.TestCase): ...@@ -132,12 +133,16 @@ class AutoCompleteTest(unittest.TestCase):
# a small list containing non-private variables. # a small list containing non-private variables.
# For file completion, a large list containing all files in the path, # For file completion, a large list containing all files in the path,
# and a small list containing files that do not start with '.' # and a small list containing files that do not start with '.'
pass small, large = self.autocomplete.fetch_completions(
'', ac.COMPLETE_ATTRIBUTES)
self.assertLess(len(small), len(large))
if __main__.__file__ != ac.__file__:
self.assertNotIn('AutoComplete', small) # See issue 36405.
def test_get_entity(self): def test_get_entity(self):
# Test that a name is in the namespace of sys.modules and # Test that a name is in the namespace of sys.modules and
# __main__.__dict__ # __main__.__dict__
pass self.assertEqual(self.autocomplete.get_entity('int'), int)
if __name__ == '__main__': if __name__ == '__main__':
......
Use dict unpacking in idlelib and remove unneeded __main__ imports. Use dict unpacking in idlelib.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment