Skip to content

Commit 20d48a4

Browse files
csabellaterryjreedy
authored andcommitted
bpo-32100: IDLE: Fix pathbrowser errors; improve tests. (#4484)
Patch mostly by Cheryl Sabella
1 parent d434110 commit 20d48a4

6 files changed

Lines changed: 90 additions & 27 deletions

File tree

Lib/idlelib/browser.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ def __init__(self, master, path, *, _htest=False, _utest=False):
7979
creating ModuleBrowserTreeItem as the rootnode for
8080
the tree and subsequently in the children.
8181
"""
82-
global file_open
83-
if not (_htest or _utest):
84-
file_open = pyshell.flist.open
8582
self.master = master
8683
self.path = path
8784
self._htest = _htest
@@ -95,9 +92,13 @@ def close(self, event=None):
9592

9693
def init(self):
9794
"Create browser tkinter widgets, including the tree."
95+
global file_open
9896
root = self.master
99-
# reset pyclbr
97+
flist = (pyshell.flist if not (self._htest or self._utest)
98+
else pyshell.PyShellFileList(root))
99+
file_open = flist.open
100100
pyclbr._modules.clear()
101+
101102
# create top
102103
self.top = top = ListedToplevel(root)
103104
top.protocol("WM_DELETE_WINDOW", self.close)
@@ -107,6 +108,7 @@ def init(self):
107108
(root.winfo_rootx(), root.winfo_rooty() + 200))
108109
self.settitle()
109110
top.focus_set()
111+
110112
# create scrolled canvas
111113
theme = idleConf.CurrentTheme()
112114
background = idleConf.GetHighlight(theme, 'normal')['background']
@@ -236,8 +238,6 @@ class Nested_in_func(TreeNode):
236238
def nested_in_class(): pass
237239
def closure():
238240
class Nested_in_closure: pass
239-
global file_open
240-
file_open = pyshell.PyShellFileList(parent).open
241241
ModuleBrowser(parent, file, _htest=True)
242242

243243
if __name__ == "__main__":

Lib/idlelib/editor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ def open_module_browser(self, event=None):
668668

669669
def open_path_browser(self, event=None):
670670
from idlelib import pathbrowser
671-
pathbrowser.PathBrowser(self.flist)
671+
pathbrowser.PathBrowser(self.root)
672672
return "break"
673673

674674
def open_turtle_demo(self, event = None):

Lib/idlelib/idle_test/test_browser.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
(Higher, because should exclude 3 lines that .coveragerc won't exclude.)
55
"""
66

7+
from collections import deque
78
import os.path
8-
import unittest
99
import pyclbr
10+
from tkinter import Tk
1011

11-
from idlelib import browser, filelist
12-
from idlelib.tree import TreeNode
1312
from test.support import requires
13+
import unittest
1414
from unittest import mock
15-
from tkinter import Tk
1615
from idlelib.idle_test.mock_idle import Func
17-
from collections import deque
16+
17+
from idlelib import browser
18+
from idlelib import filelist
19+
from idlelib.tree import TreeNode
1820

1921

2022
class ModuleBrowserTest(unittest.TestCase):
@@ -29,6 +31,7 @@ def setUpClass(cls):
2931
@classmethod
3032
def tearDownClass(cls):
3133
cls.mb.close()
34+
cls.root.update_idletasks()
3235
cls.root.destroy()
3336
del cls.root, cls.mb
3437

@@ -38,6 +41,7 @@ def test_init(self):
3841
eq(mb.path, __file__)
3942
eq(pyclbr._modules, {})
4043
self.assertIsInstance(mb.node, TreeNode)
44+
self.assertIsNotNone(browser.file_open)
4145

4246
def test_settitle(self):
4347
mb = self.mb
@@ -151,10 +155,9 @@ def test_getsublist(self):
151155
self.assertEqual(sub0.name, 'f0')
152156
self.assertEqual(sub1.name, 'C0(base)')
153157

154-
155-
def test_ondoubleclick(self):
158+
@mock.patch('idlelib.browser.file_open')
159+
def test_ondoubleclick(self, fopen):
156160
mbt = self.mbt
157-
fopen = browser.file_open = mock.Mock()
158161

159162
with mock.patch('os.path.exists', return_value=False):
160163
mbt.OnDoubleClick()
@@ -165,8 +168,6 @@ def test_ondoubleclick(self):
165168
fopen.assert_called()
166169
fopen.called_with(fname)
167170

168-
del browser.file_open
169-
170171

171172
class ChildBrowserTreeItemTest(unittest.TestCase):
172173

@@ -212,14 +213,13 @@ def test_getsublist(self):
212213

213214
eq(self.cbt_F1.GetSubList(), [])
214215

215-
def test_ondoubleclick(self):
216-
fopen = browser.file_open = mock.Mock()
216+
@mock.patch('idlelib.browser.file_open')
217+
def test_ondoubleclick(self, fopen):
217218
goto = fopen.return_value.gotoline = mock.Mock()
218219
self.cbt_F1.OnDoubleClick()
219220
fopen.assert_called()
220221
goto.assert_called()
221222
goto.assert_called_with(self.cbt_F1.obj.lineno)
222-
del browser.file_open
223223
# Failure test would have to raise OSError or AttributeError.
224224

225225

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,68 @@
1+
""" Test idlelib.pathbrowser.
2+
"""
3+
4+
5+
import os.path
6+
import pyclbr # for _modules
7+
import sys # for sys.path
8+
from tkinter import Tk
9+
10+
from test.support import requires
111
import unittest
2-
import os
3-
import sys
4-
import idlelib
12+
from idlelib.idle_test.mock_idle import Func
13+
14+
import idlelib # for __file__
15+
from idlelib import browser
516
from idlelib import pathbrowser
17+
from idlelib.tree import TreeNode
18+
619

720
class PathBrowserTest(unittest.TestCase):
821

22+
@classmethod
23+
def setUpClass(cls):
24+
requires('gui')
25+
cls.root = Tk()
26+
cls.root.withdraw()
27+
cls.pb = pathbrowser.PathBrowser(cls.root, _utest=True)
28+
29+
@classmethod
30+
def tearDownClass(cls):
31+
cls.pb.close()
32+
cls.root.update_idletasks()
33+
cls.root.destroy()
34+
del cls.root, cls.pb
35+
36+
def test_init(self):
37+
pb = self.pb
38+
eq = self.assertEqual
39+
eq(pb.master, self.root)
40+
eq(pyclbr._modules, {})
41+
self.assertIsInstance(pb.node, TreeNode)
42+
self.assertIsNotNone(browser.file_open)
43+
44+
def test_settitle(self):
45+
pb = self.pb
46+
self.assertEqual(pb.top.title(), 'Path Browser')
47+
self.assertEqual(pb.top.iconname(), 'Path Browser')
48+
49+
def test_rootnode(self):
50+
pb = self.pb
51+
rn = pb.rootnode()
52+
self.assertIsInstance(rn, pathbrowser.PathBrowserTreeItem)
53+
54+
def test_close(self):
55+
pb = self.pb
56+
pb.top.destroy = Func()
57+
pb.node.destroy = Func()
58+
pb.close()
59+
self.assertTrue(pb.top.destroy.called)
60+
self.assertTrue(pb.node.destroy.called)
61+
del pb.top.destroy, pb.node.destroy
62+
63+
64+
class DirBrowserTreeItemTest(unittest.TestCase):
65+
966
def test_DirBrowserTreeItem(self):
1067
# Issue16226 - make sure that getting a sublist works
1168
d = pathbrowser.DirBrowserTreeItem('')
@@ -16,12 +73,16 @@ def test_DirBrowserTreeItem(self):
1673
self.assertEqual(d.ispackagedir(dir), True)
1774
self.assertEqual(d.ispackagedir(dir + '/Icons'), False)
1875

76+
77+
class PathBrowserTreeItemTest(unittest.TestCase):
78+
1979
def test_PathBrowserTreeItem(self):
2080
p = pathbrowser.PathBrowserTreeItem()
2181
self.assertEqual(p.GetText(), 'sys.path')
2282
sub = p.GetSubList()
2383
self.assertEqual(len(sub), len(sys.path))
2484
self.assertEqual(type(sub[0]), pathbrowser.DirBrowserTreeItem)
2585

86+
2687
if __name__ == '__main__':
2788
unittest.main(verbosity=2, exit=False)

Lib/idlelib/pathbrowser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99

1010
class PathBrowser(ModuleBrowser):
1111

12-
def __init__(self, flist, *, _htest=False, _utest=False):
12+
def __init__(self, master, *, _htest=False, _utest=False):
1313
"""
1414
_htest - bool, change box location when running htest
1515
"""
16+
self.master = master
1617
self._htest = _htest
1718
self._utest = _utest
18-
self.init(flist)
19+
self.init()
1920

2021
def settitle(self):
2122
"Set window titles."
@@ -100,8 +101,7 @@ def listmodules(self, allnames):
100101

101102

102103
def _path_browser(parent): # htest #
103-
flist = PyShellFileList(parent)
104-
PathBrowser(flist, _htest=True)
104+
PathBrowser(parent, _htest=True)
105105
parent.mainloop()
106106

107107
if __name__ == "__main__":
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
IDLE: Fix old and new bugs in pathbrowser; improve tests.
2+
Patch mostly by Cheryl Sabella.

0 commit comments

Comments
 (0)