mirror of
https://github.com/python/cpython.git
synced 2025-08-10 03:49:18 +00:00
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 commit50cf4991c4
) Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> (cherry picked from commit9fabcfbe68
) Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
This commit is contained in:
parent
cc6d8f8828
commit
1d4d44c385
10 changed files with 77 additions and 3 deletions
|
@ -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
|
bpo-46630: Make query dialogs on Windows start with a cursor in the
|
||||||
entry box.
|
entry box.
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ tabbedpages.py # Define tabbed pages widget (nim).
|
||||||
textview.py # Define read-only text widget (nim).
|
textview.py # Define read-only text widget (nim).
|
||||||
tree.py # Define tree widget, used in browsers (nim).
|
tree.py # Define tree widget, used in browsers (nim).
|
||||||
undo.py # Manage undo stack.
|
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.
|
windows.py # Manage window list and define listed top level.
|
||||||
zoomheight.py # Zoom window to full height of screen.
|
zoomheight.py # Zoom window to full height of screen.
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ from idlelib import query
|
||||||
from idlelib import replace
|
from idlelib import replace
|
||||||
from idlelib import search
|
from idlelib import search
|
||||||
from idlelib.tree import wheel_event
|
from idlelib.tree import wheel_event
|
||||||
|
from idlelib.util import py_extensions
|
||||||
from idlelib import window
|
from idlelib import window
|
||||||
|
|
||||||
# The default tab setting for a Text widget, in average-width characters.
|
# 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):
|
if not filename or os.path.isdir(filename):
|
||||||
return True
|
return True
|
||||||
base, ext = os.path.splitext(os.path.basename(filename))
|
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
|
return True
|
||||||
line = self.text.get('1.0', '1.0 lineend')
|
line = self.text.get('1.0', '1.0 lineend')
|
||||||
return line.startswith('#!') and 'python' in line
|
return line.startswith('#!') and 'python' in line
|
||||||
|
|
4
Lib/idlelib/idle_test/example_noext
Normal file
4
Lib/idlelib/idle_test/example_noext
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#!usr/bin/env python
|
||||||
|
|
||||||
|
def example_function(some_argument):
|
||||||
|
pass
|
2
Lib/idlelib/idle_test/example_stub.pyi
Normal file
2
Lib/idlelib/idle_test/example_stub.pyi
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
class Example:
|
||||||
|
def method(self, argument1: str, argument2: list[int]) -> None: ...
|
|
@ -1,6 +1,6 @@
|
||||||
"Test , coverage 17%."
|
"Test , coverage 17%."
|
||||||
|
|
||||||
from idlelib import iomenu
|
from idlelib import iomenu, util
|
||||||
import unittest
|
import unittest
|
||||||
from test.support import requires
|
from test.support import requires
|
||||||
from tkinter import Tk
|
from tkinter import Tk
|
||||||
|
@ -45,5 +45,27 @@ class IOBindingTest(unittest.TestCase):
|
||||||
eq(fix(), 'a'+io.eol_convention)
|
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__':
|
if __name__ == '__main__':
|
||||||
unittest.main(verbosity=2)
|
unittest.main(verbosity=2)
|
||||||
|
|
14
Lib/idlelib/idle_test/test_util.py
Normal file
14
Lib/idlelib/idle_test/test_util.py
Normal 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)
|
|
@ -11,6 +11,9 @@ from tkinter.simpledialog import askstring
|
||||||
|
|
||||||
import idlelib
|
import idlelib
|
||||||
from idlelib.config import idleConf
|
from idlelib.config import idleConf
|
||||||
|
from idlelib.util import py_extensions
|
||||||
|
|
||||||
|
py_extensions = ' '.join("*"+ext for ext in py_extensions)
|
||||||
|
|
||||||
encoding = 'utf-8'
|
encoding = 'utf-8'
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
|
@ -348,7 +351,7 @@ class IOBinding:
|
||||||
savedialog = None
|
savedialog = None
|
||||||
|
|
||||||
filetypes = (
|
filetypes = (
|
||||||
("Python files", "*.py *.pyw", "TEXT"),
|
("Python files", py_extensions, "TEXT"),
|
||||||
("Text files", "*.txt", "TEXT"),
|
("Text files", "*.txt", "TEXT"),
|
||||||
("All files", "*"),
|
("All files", "*"),
|
||||||
)
|
)
|
||||||
|
|
22
Lib/idlelib/util.py
Normal file
22
Lib/idlelib/util.py
Normal 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)
|
|
@ -0,0 +1,2 @@
|
||||||
|
Apply IDLE syntax highlighting to `.pyi` files. Patch by Alex Waygood
|
||||||
|
and Terry Jan Reedy.
|
Loading…
Add table
Add a link
Reference in a new issue