8000 [3.10] gh-95411: IDLE - Enable using the module browser with .pyw files (GH-95397) by miss-islington · Pull Request #95458 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

[3.10] gh-95411: IDLE - Enable using the module browser with .pyw files (GH-95397) #95458

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Lib/idlelib/NEWS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ after 3.10.0 until 3.10.10?
Released 2023-04-03?
=========================

gh-95411: Enable using IDLE's module browser with .pyw files.

gh-89610: Add .pyi as a recognized extension for IDLE on macOS. This allows
opening stub files by double clicking on them in the Finder.

Expand Down
27 changes: 18 additions & 9 deletions Lib/idlelib/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
(or recheck on window popup)
- add popup menu with more options (e.g. doc strings, base classes, imports)
- add base classes to class browser tree
- finish removing limitation to x.py files (ModuleBrowserTreeItem)
"""

import os
Expand All @@ -16,12 +15,22 @@
from idlelib.config import idleConf
from idlelib import pyshell
from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas
from idlelib.util import py_extensions
from idlelib.window import ListedToplevel


file_open = None # Method...Item and Class...Item use this.
# Normally pyshell.flist.open, but there is no pyshell.flist for htest.

# The browser depends on pyclbr and importlib which do not support .pyi files.
browseable_extension_blocklist = ('.pyi',)


def is_browseable_extension(path):
_, ext = os.path.splitext(path)
ext = os.path.normcase(ext)
return ext in py_extensions and ext not in browseable_extension_blocklist


def transform_children(child_dict, modname=None):
"""Transform a child dictionary to an ordered sequence of objects.
Expand Down Expand Up @@ -76,8 +85,8 @@ def __init__(self, master, path, *, _htest=False, _utest=False):

Instance variables:
name: Module name.
file: Full path and module with .py extension. Used in
creating ModuleBrowserTreeItem as the rootnode for
file: Full path and module with supported extension.
Used in creating ModuleBrowserTreeItem as the rootnode for
the tree and subsequently in the children.
"""
self.master = master
Expand Down Expand Up @@ -161,22 +170,22 @@ def GetSubList(self):

def OnDoubleClick(self):
"Open a module in an editor window when double clicked."
if os.path.normcase(self.file[-3:]) != ".py":
if not is_browseable_extension(self.file):
return
if not os.path.exists(self.file):
return
file_open(self.file)

def IsExpandable(self):
"Return True if Python (.py) file."
return os.path.normcase(self.file[-3:]) == ".py"
"Return True if Python file."
return is_browseable_extension(self.file)

def listchildren(self):
"Return sequenced classes and functions in the module."
dir, base = os.path.split(self.file)
name, ext = os.path.splitext(base)
if os.path.normcase(ext) != ".py":
if not is_browseable_extension(self.file):
return []
dir, base = os.path.split(self.file)
name, _ = os.path.splitext(base)
try:
tree = pyclbr.readmodule_ex(name, [dir] + sys.path)
except ImportError:
Expand Down
10 changes: 10 additions & 0 deletions Lib/idlelib/idle_test/test_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import unittest
from unittest import mock
from idlelib.idle_test.mock_idle import Func
from idlelib.util import py_extensions

from collections import deque
import os.path
Expand Down Expand Up @@ -57,6 +58,15 @@ def test_close(self):
self.assertTrue(mb.node.destroy.called)
del mb.top.destroy, mb.node.destroy

def test_is_browseable_extension(self):
path = "/path/to/file"
for ext in py_extensions:
with self.subTest(ext=ext):
filename = f'{path}{ext}'
actual = browser.is_browseable_extension(filename)
expected = ext not in browser.browseable_extension_blocklist
self.assertEqual(actual, expected)


# Nested tree same as in test_pyclbr.py except for supers on C0. C1.
mb = pyclbr
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Enable using IDLE's module browser with .pyw files.
0