bpo-45447: Add syntax highlighting for .pyi files in IDLE (GH-28950)

Also add .pyi to the python extensions in the "File-open" and "File-save" dialogues.
Add util.py to contain objects that are used in multiple idlelib modules
and have no dependencies on any of them.

Co-authored-by: E-Paine <63801254+E-Paine@users.noreply.github.com>
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
(cherry picked from commit 50cf4991c4)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Terry Jan Reedy 2022-02-12 19:52:37 -05:00 committed by GitHub
parent b7a65c939c
commit 9fabcfbe68
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 77 additions and 3 deletions

View file

@ -4,6 +4,9 @@ Released on 2022-05-16
=========================
bpo-28950: Apply IDLE syntax highlighting to `.pyi` files. Add util.py
for common components. Patch by Alex Waygood and Terry Jan Reedy.
bpo-46630: Make query dialogs on Windows start with a cursor in the
entry box.

View file

@ -82,6 +82,7 @@ tabbedpages.py # Define tabbed pages widget (nim).
textview.py # Define read-only text widget (nim).
tree.py # Define tree widget, used in browsers (nim).
undo.py # Manage undo stack.
util.py # Define objects imported elsewhere with no dependencies (nim)
windows.py # Manage window list and define listed top level.
zoomheight.py # Zoom window to full height of screen.

View file

@ -27,6 +27,7 @@ from idlelib import query
from idlelib import replace
from idlelib import search
from idlelib.tree import wheel_event
from idlelib.util import py_extensions
from idlelib import window
# The default tab setting for a Text widget, in average-width characters.
@ -757,7 +758,7 @@ class EditorWindow:
if not filename or os.path.isdir(filename):
return True
base, ext = os.path.splitext(os.path.basename(filename))
if os.path.normcase(ext) in (".py", ".pyw"):
if os.path.normcase(ext) in py_extensions:
return True
line = self.text.get('1.0', '1.0 lineend')
return line.startswith('#!') and 'python' in line

View file

@ -0,0 +1,4 @@
#!usr/bin/env python
def example_function(some_argument):
pass

View file

@ -0,0 +1,2 @@
class Example:
def method(self, argument1: str, argument2: list[int]) -> None: ...

View file

@ -1,6 +1,6 @@
"Test , coverage 17%."
from idlelib import iomenu
from idlelib import iomenu, util
import unittest
from test.support import requires
from tkinter import Tk
@ -45,5 +45,27 @@ class IOBindingTest(unittest.TestCase):
eq(fix(), 'a'+io.eol_convention)
def _extension_in_filetypes(extension):
return any(
f'*{extension}' in filetype_tuple[1]
for filetype_tuple in iomenu.IOBinding.filetypes
)
class FiletypesTest(unittest.TestCase):
def test_python_source_files(self):
for extension in util.py_extensions:
with self.subTest(extension=extension):
self.assertTrue(
_extension_in_filetypes(extension)
)
def test_text_files(self):
self.assertTrue(_extension_in_filetypes('.txt'))
def test_all_files(self):
self.assertTrue(_extension_in_filetypes(''))
if __name__ == '__main__':
unittest.main(verbosity=2)

View file

@ -0,0 +1,14 @@
"""Test util, coverage 100%"""
import unittest
from idlelib import util
class UtilTest(unittest.TestCase):
def test_extensions(self):
for extension in {'.pyi', '.py', '.pyw'}:
self.assertIn(extension, util.py_extensions)
if __name__ == '__main__':
unittest.main(verbosity=2)

View file

@ -11,6 +11,9 @@ from tkinter.simpledialog import askstring
import idlelib
from idlelib.config import idleConf
from idlelib.util import py_extensions
py_extensions = ' '.join("*"+ext for ext in py_extensions)
encoding = 'utf-8'
if sys.platform == 'win32':
@ -348,7 +351,7 @@ class IOBinding:
savedialog = None
filetypes = (
("Python files", "*.py *.pyw", "TEXT"),
("Python files", py_extensions, "TEXT"),
("Text files", "*.txt", "TEXT"),
("All files", "*"),
)

22
Lib/idlelib/util.py Normal file
View file

@ -0,0 +1,22 @@
"""
Idlelib objects with no external idlelib dependencies
which are needed in more than one idlelib module.
They are included here because
a) they don't particularly belong elsewhere; or
b) because inclusion here simplifies the idlelib dependency graph.
TODO:
* Python versions (editor and help_about),
* tk version and patchlevel (pyshell, help_about, maxos?, editor?),
* std streams (pyshell, run),
* warning stuff (pyshell, run).
"""
from os import path
# .pyw is for Windows; .pyi is for stub files.
py_extensions = ('.py', '.pyw', '.pyi') # Order needed for open/save dialogs.
if __name__ == '__main__':
from unittest import main
main('idlelib.idle_test.test_util', verbosity=2)

View file

@ -0,0 +1,2 @@
Apply IDLE syntax highlighting to `.pyi` files. Patch by Alex Waygood
and Terry Jan Reedy.