diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 22080c95b3..09092d2e58 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,7 +3,7 @@ name: test on: push: # any branch pull_request: - branches: [master] + branches: [main] env: FORCE_COLOR: 1 @@ -14,41 +14,35 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: + ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"] steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v5 + - uses: actions/checkout@v6.0.2 + - uses: astral-sh/setup-uv@v7 with: python-version: ${{ matrix.python-version }} - name: Code formatting - if: ${{ matrix.python-version == '3.13' }} + if: ${{ matrix.python-version == '3.14' }} run: | - uvx ruff check . - uvx ruff format --check . + uv run ruff check . + uv run ruff format --check . - name: Typos - if: ${{ matrix.python-version == '3.13' }} + if: ${{ matrix.python-version == '3.14' }} run: | - uvx typos . + uv run typos . - name: Unit test run: | - uvx --with . --with pytest coverage run -m pytest tests/ + uv run coverage run -m pytest tests/ - name: Type Checking - if: ${{ matrix.python-version != '3.8' }} run: | - uvx --with . --with asyncssh mypy --strict src/ --platform win32 - uvx --with . --with asyncssh mypy --strict src/ --platform linux - uvx --with . --with asyncssh mypy --strict src/ --platform darwin - - name: Validate README.md - if: ${{ matrix.python-version == '3.13' }} - # Ensure that the README renders correctly (required for uploading to PyPI). - run: | - uv pip install readme_renderer - python -m readme_renderer README.rst > /dev/null + uv run mypy --strict src/ --platform win32 + uv run mypy --strict src/ --platform linux + uv run mypy --strict src/ --platform darwin - name: Run codecov run: | - uvx codecov + uv run codecov - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 337ddba0f5..8bf050dc42 100644 --- a/.gitignore +++ b/.gitignore @@ -30,10 +30,14 @@ pip-log.txt .tox nosetests.xml .pytest_cache +coverage.xml # Translations *.mo +# Makefile - for those who like that workflow +Makefile + # Mr Developer .mr.developer.cfg .project @@ -45,6 +49,9 @@ docs/_build # pycharm metadata .idea +# uv +uv.lock + # vscode metadata .vscode diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..ab2291c8be --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,30 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: "v6.0.0" + hooks: + - id: check-case-conflict + - id: check-executables-have-shebangs + - id: check-merge-conflict + - id: check-toml + - id: detect-private-key + - id: end-of-file-fixer + - id: fix-byte-order-marker + - id: mixed-line-ending + - id: trailing-whitespace + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.15.6" + hooks: + - id: ruff-format + args: [--config=pyproject.toml] + - id: ruff-check + args: [--config=pyproject.toml, --fix, --exit-non-zero-on-fix] + + - repo: https://github.com/crate-ci/typos + rev: v1.44.0 + hooks: + - id: typos + exclude: | + (?x)^( + tests/.* + )$ diff --git a/PROJECTS.rst b/PROJECTS.rst index 5f862b3d4f..fb3a966739 100644 --- a/PROJECTS.rst +++ b/PROJECTS.rst @@ -37,7 +37,7 @@ Shells: - `athenacli `_: A CLI for AWS Athena. - `vulcano `_: A framework for creating command-line applications that also runs in REPL mode. - `kafka-shell `_: A supercharged shell for Apache Kafka. -- `starterTree `_: A command launcher organized in a tree structure with fuzzy autocompletion +- `starterTree `_: A command launcher organized in a tree structure with fuzzy autocompletion - `git-delete-merged-branches `_: Command-line tool to delete merged Git branches - `radian `_: A 21 century R console diff --git a/README.rst b/README.rst index 7d02a53bb0..686fa254c9 100644 --- a/README.rst +++ b/README.rst @@ -141,4 +141,3 @@ Special thanks to .. |Codecov| image:: https://codecov.io/gh/prompt-toolkit/python-prompt-toolkit/branch/master/graphs/badge.svg?style=flat :target: https://codecov.io/gh/prompt-toolkit/python-prompt-toolkit/ - diff --git a/docs/index.rst b/docs/index.rst index 5f0e8a3d2b..802abf6be2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -42,7 +42,7 @@ Have a look at :ref:`the gallery ` to get an idea of what is possible. Getting started --------------- -Go to :ref:`getting started ` and build your first prompt. +Go to :ref:`getting started ` and build your first prompt. Issues are tracked `on the Github project `_. diff --git a/docs/pages/advanced_topics/styling.rst b/docs/pages/advanced_topics/styling.rst index 55cf6ee0ea..846f3aff87 100644 --- a/docs/pages/advanced_topics/styling.rst +++ b/docs/pages/advanced_topics/styling.rst @@ -185,7 +185,7 @@ The style is determined as follows: - Then we go through this style from left to right, starting from the default style. Inline styling is applied directly. - + If we come across a class name, then we generate all combinations of the class names that we collected so far (this one and all class names to the left), and for each combination which includes the new class name, we look diff --git a/docs/pages/advanced_topics/unit_testing.rst b/docs/pages/advanced_topics/unit_testing.rst index 02ca82d46f..b3ccdc4362 100644 --- a/docs/pages/advanced_topics/unit_testing.rst +++ b/docs/pages/advanced_topics/unit_testing.rst @@ -36,7 +36,7 @@ these. structures (like text buffers) change over time. So we programmatically feed some input to the input pipe, have the key -bindings process the input and then test what comes out of it. +bindings process the input and then test what comes out of it. In the following example we use a :class:`~prompt_toolkit.shortcuts.PromptSession`, but the same works for any diff --git a/docs/pages/asking_for_input.rst b/docs/pages/asking_for_input.rst index f960aeb61d..83da97aea2 100644 --- a/docs/pages/asking_for_input.rst +++ b/docs/pages/asking_for_input.rst @@ -178,7 +178,7 @@ Suppose we'd like to use a Pygments style, for instance tango_style = style_from_pygments_cls(TangoStyle) text = prompt( - "Enter HTML: ", + "Enter HTML: ", lexer=PygmentsLexer(HtmlLexer), style=tango_style ) diff --git a/docs/pages/dialogs.rst b/docs/pages/dialogs.rst index e171995181..86d3fdddb3 100644 --- a/docs/pages/dialogs.rst +++ b/docs/pages/dialogs.rst @@ -98,14 +98,14 @@ each providing the return value (first element) and the displayed value (second from prompt_toolkit.shortcuts import radiolist_dialog - result = radiolist_dialog( - title="RadioList dialog", - text="Which breakfast would you like ?", - values=[ - ("breakfast1", "Eggs and beacon"), - ("breakfast2", "French breakfast"), - ("breakfast3", "Equestrian breakfast") - ] + result = radiolist_dialog( + title="RadioList dialog", + text="Which breakfast would you like ?", + values=[ + ("breakfast1", "Eggs and beacon"), + ("breakfast2", "French breakfast"), + ("breakfast3", "Equestrian breakfast") + ] ).run() @@ -118,15 +118,15 @@ The :func:`~prompt_toolkit.shortcuts.checkboxlist_dialog` has the same usage and from prompt_toolkit.shortcuts import checkboxlist_dialog - results_array = checkboxlist_dialog( - title="CheckboxList dialog", + results_array = checkboxlist_dialog( + title="CheckboxList dialog", text="What would you like in your breakfast ?", - values=[ + values=[ ("eggs", "Eggs"), ("bacon", "Bacon"), ("croissants", "20 Croissants"), ("daily", "The breakfast of the day") - ] + ] ).run() diff --git a/docs/pages/full_screen_apps.rst b/docs/pages/full_screen_apps.rst index 9123c20cfa..2e24a268be 100644 --- a/docs/pages/full_screen_apps.rst +++ b/docs/pages/full_screen_apps.rst @@ -84,7 +84,7 @@ a key press), it will send that to the the appropriate handler, like for instance, a key binding. When :func:`~prompt_toolkit.application.Application.run()` is called, the event -loop will run until the application is done. An application will quit when +loop will run until the application is done. An application will quit when :func:`~prompt_toolkit.application.Application.exit()` is called. @@ -311,7 +311,7 @@ the key handler: Pressing Ctrl-Q will exit the user interface. Setting a return value means: quit the event loop that drives the user - interface and return this value from the `Application.run()` call. + interface and return this value from the `Application.run()` call. """ event.app.exit() diff --git a/docs/pages/progress_bars.rst b/docs/pages/progress_bars.rst index 5248f98436..99ee693b90 100644 --- a/docs/pages/progress_bars.rst +++ b/docs/pages/progress_bars.rst @@ -4,7 +4,7 @@ Progress bars ============= Prompt_toolkit ships with a high level API for displaying progress bars, -inspired by `tqdm `_ +inspired by `tqdm `_ .. warning:: diff --git a/docs/pages/upgrading/2.0.rst b/docs/pages/upgrading/2.0.rst index 60670578fc..e16d2f6277 100644 --- a/docs/pages/upgrading/2.0.rst +++ b/docs/pages/upgrading/2.0.rst @@ -218,4 +218,3 @@ rather then inheriting from `Filter`. For instance: @Condition def my_filter(); return True # Or False - diff --git a/examples/tutorial/README.md b/examples/tutorial/README.md old mode 100755 new mode 100644 index 3aa5f70d69..37b0138011 --- a/examples/tutorial/README.md +++ b/examples/tutorial/README.md @@ -1 +1 @@ -See http://python-prompt-toolkit.readthedocs.io/en/stable/pages/tutorials/repl.html +See http://python-prompt-toolkit.readthedocs.io/en/stable/pages/tutorials/repl.html diff --git a/pyproject.toml b/pyproject.toml index 1d4e169b0e..cd89b96d6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "prompt_toolkit" -version = "3.0.52" # Also update in `docs/conf.py`. -description="Library for building powerful interactive command lines in Python" +version = "3.0.52" # Also update in `docs/conf.py`. +description = "Library for building powerful interactive command lines in Python" readme = "README.rst" authors = [{ name = "Jonathan Slenders" }] classifiers = [ @@ -10,19 +10,40 @@ classifiers = [ "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: Free Threading :: 3 - Stable", "Programming Language :: Python", "Topic :: Software Development", ] -requires-python = ">=3.8" -dependencies = [ - "wcwidth>=0.1.4", +requires-python = ">=3.10" +dependencies = ["wcwidth>=0.1.4"] + +[dependency-groups] +build = ["build>=1", "setuptools>=68"] +docs = [ + "sphinx>=8,<9", + "wcwidth", + "pyperclip", + "sphinx_copybutton>=0.5.2,<1.0.0", + "sphinx-nefertiti>=0.8.8", +] +dev = [ + "asyncssh", + "codecov>=2.1", + "coverage>=7.11", + "ipython>=8.23", + "mypy>=1.13", + "prek>=0.3.5", + "pytest>=8.1.1", + "pytest-cov>=5", + "pytest-mock>=3.14.1", + "ruff>=0.14.10", + "typos", ] [project.urls] @@ -30,38 +51,52 @@ Homepage = "https://github.com/prompt-toolkit/python-prompt-toolkit" Documentation = "https://python-prompt-toolkit.readthedocs.io/en/stable/" [tool.ruff] -target-version = "py37" +target-version = "py310" lint.select = [ - "E", # pycodestyle errors - "W", # pycodestyle warnings - "F", # pyflakes - "C", # flake8-comprehensions - "T", # Print. - "I", # isort + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "C", # flake8-comprehensions + "T", # Print. + "I", # isort # "B", # flake8-bugbear - "UP", # pyupgrade - "RUF100", # unused-noqa - "Q", # quotes + "UP", # pyupgrade + "RUF100", # unused-noqa + "Q", # quotes ] lint.ignore = [ - "E501", # Line too long, handled by black - "C901", # Too complex - "E731", # Assign lambda. + "E501", # Line too long, handled by black + "C901", # Too complex + "E731", # Assign lambda. "E402", # Module level import not at the top. "E741", # Ambiguous variable name. ] [tool.ruff.lint.per-file-ignores] -"examples/*" = ["UP031", "T201"] # Print allowed in examples. -"src/prompt_toolkit/application/application.py" = ["T100", "T201", "F821"] # pdb and print allowed. -"src/prompt_toolkit/contrib/telnet/server.py" = ["T201"] # Print allowed. -"src/prompt_toolkit/key_binding/bindings/named_commands.py" = ["T201"] # Print allowed. -"src/prompt_toolkit/shortcuts/progress_bar/base.py" = ["T201"] # Print allowed. -"tools/*" = ["T201"] # Print allowed. -"src/prompt_toolkit/filters/__init__.py" = ["F403", "F405"] # Possibly undefined due to star import. -"src/prompt_toolkit/filters/cli.py" = ["F403", "F405"] # Possibly undefined due to star import. -"src/prompt_toolkit/shortcuts/progress_bar/formatters.py" = ["UP031"] # %-style formatting. -"src/*" = ["UP031", "UP032"] # f-strings instead of format calls. +"examples/*" = ["UP031", "T201"] # Print allowed in examples. +"src/prompt_toolkit/application/application.py" = [ + "T100", + "T201", + "F821", +] # pdb and print allowed. +"src/prompt_toolkit/contrib/telnet/server.py" = ["T201"] # Print allowed. +"src/prompt_toolkit/key_binding/bindings/named_commands.py" = [ + "T201", +] # Print allowed. +"src/prompt_toolkit/shortcuts/progress_bar/base.py" = ["T201"] # Print allowed. +"tools/*" = ["T201"] # Print allowed. +"src/prompt_toolkit/filters/__init__.py" = [ + "F403", + "F405", +] # Possibly undefined due to star import. +"src/prompt_toolkit/filters/cli.py" = [ + "F403", + "F405", +] # Possibly undefined due to star import. +"src/prompt_toolkit/shortcuts/progress_bar/formatters.py" = [ + "UP031", +] # %-style formatting. +"src/*" = ["UP031", "UP032"] # f-strings instead of format calls. [tool.ruff.lint.isort] known-first-party = ["prompt_toolkit"] @@ -79,7 +114,7 @@ extend-ignore-re = [ "ret", "rouble", "x1b\\[4m", - "Vertica", # Database. + "Vertica", # Database. # Deliberate spelling mistakes in autocorrection.py "wolrd", "impotr", @@ -88,7 +123,7 @@ extend-ignore-re = [ "varius", ] -locale = 'en-us' # US English. +locale = 'en-us' # US English. [tool.typos.files] extend-exclude = [ @@ -108,6 +143,16 @@ disallow_subclassing_any = true disallow_untyped_calls = true disallow_untyped_decorators = true disallow_untyped_defs = true +exclude = [ + "^.git/", + "^.venv/", + "^build/", # .build directory + "^docs/", # docs directory + "^dist/", + "^examples/", # examples directory + "^tests/", # tests directory +] +files = ['.'] ignore_missing_imports = true no_implicit_optional = true no_implicit_reexport = true @@ -121,3 +166,6 @@ warn_unused_ignores = true [build-system] requires = ["setuptools>=68"] build-backend = "setuptools.build_meta" + +[tool.uv] +default-groups = ["build", "dev"] diff --git a/src/prompt_toolkit/application/application.py b/src/prompt_toolkit/application/application.py index f27ada1a00..8d7402f6cb 100644 --- a/src/prompt_toolkit/application/application.py +++ b/src/prompt_toolkit/application/application.py @@ -16,18 +16,13 @@ get_running_loop, sleep, ) +from collections.abc import Callable, Coroutine, Generator, Hashable, Iterable, Iterator from contextlib import ExitStack, contextmanager from subprocess import Popen from traceback import format_tb from typing import ( Any, - Callable, - Coroutine, - Generator, Generic, - Hashable, - Iterable, - Iterator, TypeVar, cast, overload, @@ -731,9 +726,11 @@ def flush_input() -> None: f.set_exception(EOFError) # Enter raw mode, attach input and attach WINCH event handler. - with self.input.raw_mode(), self.input.attach( - read_from_input_in_context - ), attach_winch_signal_handler(self._on_resize): + with ( + self.input.raw_mode(), + self.input.attach(read_from_input_in_context), + attach_winch_signal_handler(self._on_resize), + ): # Draw UI. self._request_absolute_cursor_position() self._redraw() diff --git a/src/prompt_toolkit/application/current.py b/src/prompt_toolkit/application/current.py index f7032fe72a..2b4681be9f 100644 --- a/src/prompt_toolkit/application/current.py +++ b/src/prompt_toolkit/application/current.py @@ -1,8 +1,9 @@ from __future__ import annotations +from collections.abc import Generator from contextlib import contextmanager from contextvars import ContextVar -from typing import TYPE_CHECKING, Any, Generator +from typing import TYPE_CHECKING, Any if TYPE_CHECKING: from prompt_toolkit.input.base import Input diff --git a/src/prompt_toolkit/application/dummy.py b/src/prompt_toolkit/application/dummy.py index 43819e1e71..c134c33fe7 100644 --- a/src/prompt_toolkit/application/dummy.py +++ b/src/prompt_toolkit/application/dummy.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Callable +from collections.abc import Callable from prompt_toolkit.eventloop import InputHook from prompt_toolkit.formatted_text import AnyFormattedText diff --git a/src/prompt_toolkit/application/run_in_terminal.py b/src/prompt_toolkit/application/run_in_terminal.py index 1f5e18ea78..24bae836be 100644 --- a/src/prompt_toolkit/application/run_in_terminal.py +++ b/src/prompt_toolkit/application/run_in_terminal.py @@ -5,8 +5,9 @@ from __future__ import annotations from asyncio import Future, ensure_future +from collections.abc import AsyncGenerator, Awaitable, Callable from contextlib import asynccontextmanager -from typing import AsyncGenerator, Awaitable, Callable, TypeVar +from typing import TypeVar from prompt_toolkit.eventloop import run_in_executor_with_context diff --git a/src/prompt_toolkit/auto_suggest.py b/src/prompt_toolkit/auto_suggest.py index 73213ba690..198c5cadd6 100644 --- a/src/prompt_toolkit/auto_suggest.py +++ b/src/prompt_toolkit/auto_suggest.py @@ -15,7 +15,8 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import TYPE_CHECKING, Callable +from collections.abc import Callable +from typing import TYPE_CHECKING from prompt_toolkit.eventloop import run_in_executor_with_context diff --git a/src/prompt_toolkit/buffer.py b/src/prompt_toolkit/buffer.py index f5847d4ab9..ae1198f114 100644 --- a/src/prompt_toolkit/buffer.py +++ b/src/prompt_toolkit/buffer.py @@ -14,9 +14,10 @@ import subprocess import tempfile from collections import deque +from collections.abc import Callable, Coroutine, Iterable from enum import Enum from functools import wraps -from typing import Any, Callable, Coroutine, Iterable, TypeVar, cast +from typing import Any, TypeVar, cast from .application.current import get_app from .application.run_in_terminal import run_in_terminal diff --git a/src/prompt_toolkit/cache.py b/src/prompt_toolkit/cache.py index 01dd1f79d6..5ca170a7c4 100644 --- a/src/prompt_toolkit/cache.py +++ b/src/prompt_toolkit/cache.py @@ -1,8 +1,9 @@ from __future__ import annotations from collections import deque +from collections.abc import Callable, Hashable from functools import wraps -from typing import Any, Callable, Dict, Generic, Hashable, Tuple, TypeVar, cast +from typing import Any, Generic, TypeVar, cast __all__ = [ "SimpleCache", @@ -58,11 +59,11 @@ def clear(self) -> None: self._keys = deque() -_K = TypeVar("_K", bound=Tuple[Hashable, ...]) +_K = TypeVar("_K", bound=tuple[Hashable, ...]) _V = TypeVar("_V") -class FastDictCache(Dict[_K, _V]): +class FastDictCache(dict[_K, _V]): """ Fast, lightweight cache which keeps at most `size` items. It will discard the oldest items in the cache first. diff --git a/src/prompt_toolkit/clipboard/base.py b/src/prompt_toolkit/clipboard/base.py index 28cfdcd766..be1a606e36 100644 --- a/src/prompt_toolkit/clipboard/base.py +++ b/src/prompt_toolkit/clipboard/base.py @@ -5,7 +5,7 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import Callable +from collections.abc import Callable from prompt_toolkit.selection import SelectionType diff --git a/src/prompt_toolkit/completion/base.py b/src/prompt_toolkit/completion/base.py index 3846ef7562..6e73290ec0 100644 --- a/src/prompt_toolkit/completion/base.py +++ b/src/prompt_toolkit/completion/base.py @@ -3,7 +3,7 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import AsyncGenerator, Callable, Iterable, Sequence +from collections.abc import AsyncGenerator, Callable, Iterable, Sequence from prompt_toolkit.document import Document from prompt_toolkit.eventloop import aclosing, generator_to_async_generator diff --git a/src/prompt_toolkit/completion/deduplicate.py b/src/prompt_toolkit/completion/deduplicate.py index c3d525669d..0bb82ea064 100644 --- a/src/prompt_toolkit/completion/deduplicate.py +++ b/src/prompt_toolkit/completion/deduplicate.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Iterable +from collections.abc import Iterable from prompt_toolkit.document import Document diff --git a/src/prompt_toolkit/completion/filesystem.py b/src/prompt_toolkit/completion/filesystem.py index 8e7f87e00b..5da254d8e3 100644 --- a/src/prompt_toolkit/completion/filesystem.py +++ b/src/prompt_toolkit/completion/filesystem.py @@ -1,7 +1,7 @@ from __future__ import annotations import os -from typing import Callable, Iterable +from collections.abc import Callable, Iterable from prompt_toolkit.completion import CompleteEvent, Completer, Completion from prompt_toolkit.document import Document diff --git a/src/prompt_toolkit/completion/fuzzy_completer.py b/src/prompt_toolkit/completion/fuzzy_completer.py index 82625ab63f..adaa763e11 100644 --- a/src/prompt_toolkit/completion/fuzzy_completer.py +++ b/src/prompt_toolkit/completion/fuzzy_completer.py @@ -1,7 +1,8 @@ from __future__ import annotations import re -from typing import Callable, Iterable, NamedTuple, Sequence +from collections.abc import Callable, Iterable, Sequence +from typing import NamedTuple from prompt_toolkit.document import Document from prompt_toolkit.filters import FilterOrBool, to_filter diff --git a/src/prompt_toolkit/completion/nested.py b/src/prompt_toolkit/completion/nested.py index b72b69ee21..5c18114efa 100644 --- a/src/prompt_toolkit/completion/nested.py +++ b/src/prompt_toolkit/completion/nested.py @@ -4,7 +4,8 @@ from __future__ import annotations -from typing import Any, Iterable, Mapping, Set, Union +from collections.abc import Iterable, Mapping +from typing import Any from prompt_toolkit.completion import CompleteEvent, Completer, Completion from prompt_toolkit.completion.word_completer import WordCompleter @@ -13,7 +14,7 @@ __all__ = ["NestedCompleter"] # NestedDict = Mapping[str, Union['NestedDict', Set[str], None, Completer]] -NestedDict = Mapping[str, Union[Any, Set[str], None, Completer]] +NestedDict = Mapping[str, Any | set[str] | None | Completer] class NestedCompleter(Completer): diff --git a/src/prompt_toolkit/completion/word_completer.py b/src/prompt_toolkit/completion/word_completer.py index 2e124056ba..563fdadcb6 100644 --- a/src/prompt_toolkit/completion/word_completer.py +++ b/src/prompt_toolkit/completion/word_completer.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import Callable, Iterable, Mapping, Pattern, Sequence +from collections.abc import Callable, Iterable, Mapping, Sequence +from re import Pattern from prompt_toolkit.completion import CompleteEvent, Completer, Completion from prompt_toolkit.document import Document diff --git a/src/prompt_toolkit/contrib/regular_languages/compiler.py b/src/prompt_toolkit/contrib/regular_languages/compiler.py index 4009d54f2d..9416291096 100644 --- a/src/prompt_toolkit/contrib/regular_languages/compiler.py +++ b/src/prompt_toolkit/contrib/regular_languages/compiler.py @@ -42,8 +42,10 @@ from __future__ import annotations import re -from typing import Callable, Dict, Iterable, Iterator, Pattern, TypeVar, overload -from typing import Match as RegexMatch +from collections.abc import Callable, Iterable, Iterator +from re import Match as RegexMatch +from re import Pattern +from typing import TypeVar, overload from .regex_parser import ( AnyNode, @@ -65,7 +67,7 @@ # expression has been matched.) _INVALID_TRAILING_INPUT = "invalid_trailing" -EscapeFuncDict = Dict[str, Callable[[str], str]] +EscapeFuncDict = dict[str, Callable[[str], str]] class _CompiledGrammar: diff --git a/src/prompt_toolkit/contrib/regular_languages/completion.py b/src/prompt_toolkit/contrib/regular_languages/completion.py index 19ebaad938..2181a42ccf 100644 --- a/src/prompt_toolkit/contrib/regular_languages/completion.py +++ b/src/prompt_toolkit/contrib/regular_languages/completion.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Iterable +from collections.abc import Iterable from prompt_toolkit.completion import CompleteEvent, Completer, Completion from prompt_toolkit.document import Document diff --git a/src/prompt_toolkit/contrib/regular_languages/lexer.py b/src/prompt_toolkit/contrib/regular_languages/lexer.py index c5434cfdee..774df2869a 100644 --- a/src/prompt_toolkit/contrib/regular_languages/lexer.py +++ b/src/prompt_toolkit/contrib/regular_languages/lexer.py @@ -5,7 +5,7 @@ from __future__ import annotations -from typing import Callable +from collections.abc import Callable from prompt_toolkit.document import Document from prompt_toolkit.formatted_text.base import StyleAndTextTuples diff --git a/src/prompt_toolkit/contrib/ssh/server.py b/src/prompt_toolkit/contrib/ssh/server.py index 4badc6cad0..7ce70f7812 100644 --- a/src/prompt_toolkit/contrib/ssh/server.py +++ b/src/prompt_toolkit/contrib/ssh/server.py @@ -7,7 +7,8 @@ import asyncio import traceback from asyncio import get_running_loop -from typing import Any, Callable, Coroutine, TextIO, cast +from collections.abc import Callable, Coroutine +from typing import Any, TextIO, cast import asyncssh diff --git a/src/prompt_toolkit/contrib/telnet/protocol.py b/src/prompt_toolkit/contrib/telnet/protocol.py index 58286e23e7..e56edd1ca3 100644 --- a/src/prompt_toolkit/contrib/telnet/protocol.py +++ b/src/prompt_toolkit/contrib/telnet/protocol.py @@ -8,7 +8,7 @@ from __future__ import annotations import struct -from typing import Callable, Generator +from collections.abc import Callable, Generator from .log import logger diff --git a/src/prompt_toolkit/contrib/telnet/server.py b/src/prompt_toolkit/contrib/telnet/server.py index bc2ad53064..5347a3f98a 100644 --- a/src/prompt_toolkit/contrib/telnet/server.py +++ b/src/prompt_toolkit/contrib/telnet/server.py @@ -8,7 +8,8 @@ import contextvars import socket from asyncio import get_running_loop -from typing import Any, Callable, Coroutine, TextIO, cast +from collections.abc import Callable, Coroutine +from typing import Any, TextIO, cast from prompt_toolkit.application.current import create_app_session, get_app from prompt_toolkit.application.run_in_terminal import run_in_terminal diff --git a/src/prompt_toolkit/cursor_shapes.py b/src/prompt_toolkit/cursor_shapes.py index 01d10926a2..04a42ccf54 100644 --- a/src/prompt_toolkit/cursor_shapes.py +++ b/src/prompt_toolkit/cursor_shapes.py @@ -1,8 +1,9 @@ from __future__ import annotations from abc import ABC, abstractmethod +from collections.abc import Callable from enum import Enum -from typing import TYPE_CHECKING, Any, Callable, Union +from typing import TYPE_CHECKING, Any from prompt_toolkit.enums import EditingMode from prompt_toolkit.key_binding.vi_state import InputMode @@ -47,7 +48,7 @@ def get_cursor_shape(self, application: Application[Any]) -> CursorShape: """ -AnyCursorShapeConfig = Union[CursorShape, CursorShapeConfig, None] +AnyCursorShapeConfig = CursorShape | CursorShapeConfig | None class SimpleCursorShapeConfig(CursorShapeConfig): diff --git a/src/prompt_toolkit/document.py b/src/prompt_toolkit/document.py index d2657a50ef..003a7852e4 100644 --- a/src/prompt_toolkit/document.py +++ b/src/prompt_toolkit/document.py @@ -8,7 +8,9 @@ import re import string import weakref -from typing import Callable, Dict, Iterable, List, NoReturn, Pattern, cast +from collections.abc import Callable, Iterable +from re import Pattern +from typing import NoReturn, cast from .clipboard import ClipboardData from .filters import vi_mode @@ -40,12 +42,12 @@ # `Document` is constructed with the same text, it should have the same # `_DocumentCache`.) _text_to_document_cache: dict[str, _DocumentCache] = cast( - Dict[str, "_DocumentCache"], + dict[str, "_DocumentCache"], weakref.WeakValueDictionary(), # Maps document.text to DocumentCache instance. ) -class _ImmutableLineList(List[str]): +class _ImmutableLineList(list[str]): """ Some protection for our 'lines' list, which is assumed to be immutable in the cache. (Useful for detecting obvious bugs.) diff --git a/src/prompt_toolkit/eventloop/async_generator.py b/src/prompt_toolkit/eventloop/async_generator.py index 32e5f88247..6b92d06ce9 100644 --- a/src/prompt_toolkit/eventloop/async_generator.py +++ b/src/prompt_toolkit/eventloop/async_generator.py @@ -5,9 +5,10 @@ from __future__ import annotations from asyncio import get_running_loop +from collections.abc import AsyncGenerator, Callable, Iterable from contextlib import asynccontextmanager from queue import Empty, Full, Queue -from typing import Any, AsyncGenerator, Callable, Iterable, TypeVar +from typing import Any, TypeVar from .utils import run_in_executor_with_context diff --git a/src/prompt_toolkit/eventloop/inputhook.py b/src/prompt_toolkit/eventloop/inputhook.py index 40016e87f6..60c2da4d54 100644 --- a/src/prompt_toolkit/eventloop/inputhook.py +++ b/src/prompt_toolkit/eventloop/inputhook.py @@ -32,8 +32,9 @@ import sys import threading from asyncio import AbstractEventLoop, get_running_loop +from collections.abc import Callable, Mapping from selectors import BaseSelector, SelectorKey -from typing import TYPE_CHECKING, Any, Callable, Mapping +from typing import TYPE_CHECKING, Any __all__ = [ "new_eventloop_with_inputhook", @@ -44,8 +45,9 @@ ] if TYPE_CHECKING: + from typing import TypeAlias + from _typeshed import FileDescriptorLike - from typing_extensions import TypeAlias _EventMask = int diff --git a/src/prompt_toolkit/eventloop/utils.py b/src/prompt_toolkit/eventloop/utils.py index 313836137c..69b797a32d 100644 --- a/src/prompt_toolkit/eventloop/utils.py +++ b/src/prompt_toolkit/eventloop/utils.py @@ -5,8 +5,9 @@ import sys import time from asyncio import get_running_loop +from collections.abc import Awaitable, Callable from types import TracebackType -from typing import Any, Awaitable, Callable, TypeVar, cast +from typing import Any, TypeVar, cast __all__ = [ "run_in_executor_with_context", diff --git a/src/prompt_toolkit/filters/base.py b/src/prompt_toolkit/filters/base.py index cd95424dc3..4a513eccd4 100644 --- a/src/prompt_toolkit/filters/base.py +++ b/src/prompt_toolkit/filters/base.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import Callable, Iterable, Union +from collections.abc import Callable, Iterable __all__ = ["Filter", "Never", "Always", "Condition", "FilterOrBool"] @@ -257,4 +257,4 @@ def __repr__(self) -> str: # Often used as type annotation. -FilterOrBool = Union[Filter, bool] +FilterOrBool = Filter | bool diff --git a/src/prompt_toolkit/formatted_text/ansi.py b/src/prompt_toolkit/formatted_text/ansi.py index 8cc37a6363..2f355c2b74 100644 --- a/src/prompt_toolkit/formatted_text/ansi.py +++ b/src/prompt_toolkit/formatted_text/ansi.py @@ -1,7 +1,7 @@ from __future__ import annotations +from collections.abc import Generator from string import Formatter -from typing import Generator from prompt_toolkit.output.vt100 import BG_ANSI_COLORS, FG_ANSI_COLORS from prompt_toolkit.output.vt100 import _256_colors as _256_colors_table diff --git a/src/prompt_toolkit/formatted_text/base.py b/src/prompt_toolkit/formatted_text/base.py index 75f47d87ac..5866b46acb 100644 --- a/src/prompt_toolkit/formatted_text/base.py +++ b/src/prompt_toolkit/formatted_text/base.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Callable, Iterable, List, Tuple, Union, cast +from collections.abc import Callable, Iterable +from typing import TYPE_CHECKING, Union, cast from prompt_toolkit.mouse_events import MouseEvent @@ -21,16 +22,17 @@ "FormattedText", ] -OneStyleAndTextTuple = Union[ - Tuple[str, str], Tuple[str, str, Callable[[MouseEvent], "NotImplementedOrNone"]] -] +OneStyleAndTextTuple = ( + tuple[str, str] | tuple[str, str, Callable[[MouseEvent], "NotImplementedOrNone"]] +) + # List of (style, text) tuples. -StyleAndTextTuples = List[OneStyleAndTextTuple] +StyleAndTextTuples = list[OneStyleAndTextTuple] if TYPE_CHECKING: - from typing_extensions import TypeGuard + from typing import TypeGuard class MagicFormattedText(Protocol): """ @@ -83,8 +85,7 @@ def to_formatted_text( result = [("", f"{value}")] else: raise ValueError( - "No formatted text. Expecting a unicode object, " - f"HTML, ANSI or a FormattedText instance. Got {value!r}" + f"No formatted text. Expecting a unicode object, HTML, ANSI or a FormattedText instance. Got {value!r}" ) # Apply extra style. diff --git a/src/prompt_toolkit/formatted_text/utils.py b/src/prompt_toolkit/formatted_text/utils.py index a6f78cb4e0..8aede2b55f 100644 --- a/src/prompt_toolkit/formatted_text/utils.py +++ b/src/prompt_toolkit/formatted_text/utils.py @@ -7,7 +7,8 @@ from __future__ import annotations -from typing import Iterable, cast +from collections.abc import Iterable +from typing import cast from prompt_toolkit.utils import get_cwidth diff --git a/src/prompt_toolkit/history.py b/src/prompt_toolkit/history.py index 2d497a0209..764a8d6578 100644 --- a/src/prompt_toolkit/history.py +++ b/src/prompt_toolkit/history.py @@ -15,7 +15,8 @@ import threading from abc import ABCMeta, abstractmethod from asyncio import get_running_loop -from typing import AsyncGenerator, Iterable, Sequence, Union +from collections.abc import AsyncGenerator, Iterable, Sequence +from typing import Union __all__ = [ "History", diff --git a/src/prompt_toolkit/input/base.py b/src/prompt_toolkit/input/base.py index 40ffd9df20..eac80ec9b7 100644 --- a/src/prompt_toolkit/input/base.py +++ b/src/prompt_toolkit/input/base.py @@ -5,8 +5,8 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from contextlib import contextmanager -from typing import Callable, ContextManager, Generator +from collections.abc import Callable, Generator +from contextlib import AbstractContextManager, contextmanager from prompt_toolkit.key_binding import KeyPress @@ -62,26 +62,28 @@ def closed(self) -> bool: return False @abstractmethod - def raw_mode(self) -> ContextManager[None]: + def raw_mode(self) -> AbstractContextManager[None]: """ Context manager that turns the input into raw mode. """ @abstractmethod - def cooked_mode(self) -> ContextManager[None]: + def cooked_mode(self) -> AbstractContextManager[None]: """ Context manager that turns the input into cooked mode. """ @abstractmethod - def attach(self, input_ready_callback: Callable[[], None]) -> ContextManager[None]: + def attach( + self, input_ready_callback: Callable[[], None] + ) -> AbstractContextManager[None]: """ Return a context manager that makes this input active in the current event loop. """ @abstractmethod - def detach(self) -> ContextManager[None]: + def detach(self) -> AbstractContextManager[None]: """ Return a context manager that makes sure that this input is not active in the current event loop. @@ -129,13 +131,15 @@ def closed(self) -> bool: # `EOFError` immediately in the application. return True - def raw_mode(self) -> ContextManager[None]: + def raw_mode(self) -> AbstractContextManager[None]: return _dummy_context_manager() - def cooked_mode(self) -> ContextManager[None]: + def cooked_mode(self) -> AbstractContextManager[None]: return _dummy_context_manager() - def attach(self, input_ready_callback: Callable[[], None]) -> ContextManager[None]: + def attach( + self, input_ready_callback: Callable[[], None] + ) -> AbstractContextManager[None]: # Call the callback immediately once after attaching. # This tells the callback to call `read_keys` and check the # `input.closed` flag, after which it won't receive any keys, but knows @@ -145,7 +149,7 @@ def attach(self, input_ready_callback: Callable[[], None]) -> ContextManager[Non return _dummy_context_manager() - def detach(self) -> ContextManager[None]: + def detach(self) -> AbstractContextManager[None]: return _dummy_context_manager() diff --git a/src/prompt_toolkit/input/defaults.py b/src/prompt_toolkit/input/defaults.py index 483eeb2092..ac375a13c0 100644 --- a/src/prompt_toolkit/input/defaults.py +++ b/src/prompt_toolkit/input/defaults.py @@ -2,7 +2,8 @@ import io import sys -from typing import ContextManager, TextIO +from contextlib import AbstractContextManager +from typing import TextIO from .base import DummyInput, Input, PipeInput @@ -56,7 +57,7 @@ def create_input(stdin: TextIO | None = None, always_prefer_tty: bool = False) - return Vt100Input(stdin) -def create_pipe_input() -> ContextManager[PipeInput]: +def create_pipe_input() -> AbstractContextManager[PipeInput]: """ Create an input pipe. This is mostly useful for unit testing. diff --git a/src/prompt_toolkit/input/posix_pipe.py b/src/prompt_toolkit/input/posix_pipe.py index c131fb816e..61410f60ab 100644 --- a/src/prompt_toolkit/input/posix_pipe.py +++ b/src/prompt_toolkit/input/posix_pipe.py @@ -5,8 +5,9 @@ assert sys.platform != "win32" import os -from contextlib import contextmanager -from typing import ContextManager, Iterator, TextIO, cast +from collections.abc import Iterator +from contextlib import AbstractContextManager, contextmanager +from typing import TextIO, cast from ..utils import DummyContext from .base import PipeInput @@ -97,10 +98,10 @@ def send_text(self, data: str) -> None: "Send text to the input." os.write(self.pipe.write_fd, data.encode("utf-8")) - def raw_mode(self) -> ContextManager[None]: + def raw_mode(self) -> AbstractContextManager[None]: return DummyContext() - def cooked_mode(self) -> ContextManager[None]: + def cooked_mode(self) -> AbstractContextManager[None]: return DummyContext() def close(self) -> None: diff --git a/src/prompt_toolkit/input/vt100.py b/src/prompt_toolkit/input/vt100.py index c1660de956..60a049b35f 100644 --- a/src/prompt_toolkit/input/vt100.py +++ b/src/prompt_toolkit/input/vt100.py @@ -9,7 +9,9 @@ import termios import tty from asyncio import AbstractEventLoop, get_running_loop -from typing import Callable, ContextManager, Generator, TextIO +from collections.abc import Callable, Generator +from contextlib import AbstractContextManager +from typing import TextIO from ..key_binding import KeyPress from .base import Input @@ -74,14 +76,16 @@ def __init__(self, stdin: TextIO) -> None: lambda key_press: self._buffer.append(key_press) ) - def attach(self, input_ready_callback: Callable[[], None]) -> ContextManager[None]: + def attach( + self, input_ready_callback: Callable[[], None] + ) -> AbstractContextManager[None]: """ Return a context manager that makes this input active in the current event loop. """ return _attached_input(self, input_ready_callback) - def detach(self) -> ContextManager[None]: + def detach(self) -> AbstractContextManager[None]: """ Return a context manager that makes sure that this input is not active in the current event loop. @@ -119,10 +123,10 @@ def flush_keys(self) -> list[KeyPress]: def closed(self) -> bool: return self.stdin_reader.closed - def raw_mode(self) -> ContextManager[None]: + def raw_mode(self) -> AbstractContextManager[None]: return raw_mode(self.stdin.fileno()) - def cooked_mode(self) -> ContextManager[None]: + def cooked_mode(self) -> AbstractContextManager[None]: return cooked_mode(self.stdin.fileno()) def fileno(self) -> int: diff --git a/src/prompt_toolkit/input/vt100_parser.py b/src/prompt_toolkit/input/vt100_parser.py index 73dbce3d83..34ea110575 100644 --- a/src/prompt_toolkit/input/vt100_parser.py +++ b/src/prompt_toolkit/input/vt100_parser.py @@ -5,7 +5,7 @@ from __future__ import annotations import re -from typing import Callable, Dict, Generator +from collections.abc import Callable, Generator from ..key_binding.key_processor import KeyPress from ..keys import Keys @@ -39,7 +39,7 @@ class _Flush: pass -class _IsPrefixOfLongerMatchCache(Dict[str, bool]): +class _IsPrefixOfLongerMatchCache(dict[str, bool]): """ Dictionary that maps input sequences to a boolean indicating whether there is any key that start with this characters. diff --git a/src/prompt_toolkit/input/win32.py b/src/prompt_toolkit/input/win32.py index 616df8e78d..25a97e1a15 100644 --- a/src/prompt_toolkit/input/win32.py +++ b/src/prompt_toolkit/input/win32.py @@ -4,7 +4,7 @@ import sys from abc import abstractmethod from asyncio import get_running_loop -from contextlib import contextmanager +from contextlib import AbstractContextManager, contextmanager from ..utils import SPHINX_AUTODOC_RUNNING @@ -16,9 +16,10 @@ import msvcrt from ctypes import windll +from collections.abc import Callable, Iterable, Iterator from ctypes import Array, byref, pointer from ctypes.wintypes import DWORD, HANDLE -from typing import Callable, ContextManager, Iterable, Iterator, TextIO +from typing import TextIO from prompt_toolkit.eventloop import run_in_executor_with_context from prompt_toolkit.eventloop.win32 import create_win32_event, wait_for_handles @@ -87,14 +88,16 @@ def __init__(self, stdin: TextIO | None = None) -> None: else: self.console_input_reader = ConsoleInputReader() - def attach(self, input_ready_callback: Callable[[], None]) -> ContextManager[None]: + def attach( + self, input_ready_callback: Callable[[], None] + ) -> AbstractContextManager[None]: """ Return a context manager that makes this input active in the current event loop. """ return attach_win32_input(self, input_ready_callback) - def detach(self) -> ContextManager[None]: + def detach(self) -> AbstractContextManager[None]: """ Return a context manager that makes sure that this input is not active in the current event loop. @@ -111,12 +114,12 @@ def flush_keys(self) -> list[KeyPress]: def closed(self) -> bool: return False - def raw_mode(self) -> ContextManager[None]: + def raw_mode(self) -> AbstractContextManager[None]: return raw_mode( use_win10_virtual_terminal_input=self._use_virtual_terminal_input ) - def cooked_mode(self) -> ContextManager[None]: + def cooked_mode(self) -> AbstractContextManager[None]: return cooked_mode() def fileno(self) -> int: diff --git a/src/prompt_toolkit/input/win32_pipe.py b/src/prompt_toolkit/input/win32_pipe.py index 0bafa49eab..309903f3f5 100644 --- a/src/prompt_toolkit/input/win32_pipe.py +++ b/src/prompt_toolkit/input/win32_pipe.py @@ -4,10 +4,10 @@ assert sys.platform == "win32" -from contextlib import contextmanager +from collections.abc import Callable, Iterator +from contextlib import AbstractContextManager, contextmanager from ctypes import windll from ctypes.wintypes import HANDLE -from typing import Callable, ContextManager, Iterator from prompt_toolkit.eventloop.win32 import create_win32_event @@ -81,14 +81,16 @@ def handle(self) -> HANDLE: "The handle used for registering this pipe in the event loop." return self._event - def attach(self, input_ready_callback: Callable[[], None]) -> ContextManager[None]: + def attach( + self, input_ready_callback: Callable[[], None] + ) -> AbstractContextManager[None]: """ Return a context manager that makes this input active in the current event loop. """ return attach_win32_input(self, input_ready_callback) - def detach(self) -> ContextManager[None]: + def detach(self) -> AbstractContextManager[None]: """ Return a context manager that makes sure that this input is not active in the current event loop. @@ -138,10 +140,10 @@ def send_text(self, text: str) -> None: # Set event. windll.kernel32.SetEvent(self._event) - def raw_mode(self) -> ContextManager[None]: + def raw_mode(self) -> AbstractContextManager[None]: return DummyContext() - def cooked_mode(self) -> ContextManager[None]: + def cooked_mode(self) -> AbstractContextManager[None]: return DummyContext() def close(self) -> None: diff --git a/src/prompt_toolkit/key_binding/bindings/named_commands.py b/src/prompt_toolkit/key_binding/bindings/named_commands.py index 8ea8dd03de..2c2403e267 100644 --- a/src/prompt_toolkit/key_binding/bindings/named_commands.py +++ b/src/prompt_toolkit/key_binding/bindings/named_commands.py @@ -6,7 +6,8 @@ from __future__ import annotations -from typing import Callable, TypeVar, Union, cast +from collections.abc import Callable +from typing import TypeVar, cast from prompt_toolkit.document import Document from prompt_toolkit.enums import EditingMode @@ -26,7 +27,7 @@ # Typing. _Handler = Callable[[KeyPressEvent], None] -_HandlerOrBinding = Union[_Handler, Binding] +_HandlerOrBinding = _Handler | Binding _T = TypeVar("_T", bound=_HandlerOrBinding) E = KeyPressEvent diff --git a/src/prompt_toolkit/key_binding/bindings/vi.py b/src/prompt_toolkit/key_binding/bindings/vi.py index d68a31f29a..e3fca1b981 100644 --- a/src/prompt_toolkit/key_binding/bindings/vi.py +++ b/src/prompt_toolkit/key_binding/bindings/vi.py @@ -3,9 +3,10 @@ import codecs import string +from collections.abc import Callable, Iterable from enum import Enum from itertools import accumulate -from typing import Callable, Iterable, Tuple, TypeVar +from typing import TypeVar from prompt_toolkit.application.current import get_app from prompt_toolkit.buffer import Buffer, indent, reshape_text, unindent @@ -422,7 +423,7 @@ def load_vi_bindings() -> KeyBindingsBase: # (Note: Always take the navigation bindings in read-only mode, even when # ViState says different.) - TransformFunction = Tuple[Tuple[str, ...], Filter, Callable[[str], str]] + TransformFunction = tuple[tuple[str, ...], Filter, Callable[[str], str]] vi_transform_functions: list[TransformFunction] = [ # Rot 13 transformation diff --git a/src/prompt_toolkit/key_binding/key_bindings.py b/src/prompt_toolkit/key_binding/key_bindings.py index cf37c6d90d..5fd56394ba 100644 --- a/src/prompt_toolkit/key_binding/key_bindings.py +++ b/src/prompt_toolkit/key_binding/key_bindings.py @@ -38,15 +38,11 @@ def my_key_binding(event): from __future__ import annotations from abc import ABCMeta, abstractmethod +from collections.abc import Callable, Coroutine, Hashable, Sequence from inspect import isawaitable from typing import ( TYPE_CHECKING, Any, - Callable, - Coroutine, - Hashable, - Sequence, - Tuple, TypeVar, Union, cast, @@ -147,7 +143,7 @@ def __repr__(self) -> str: # Sequence of keys presses. -KeysTuple = Tuple[Union[Keys, str], ...] +KeysTuple = tuple[Keys | str, ...] class KeyBindingsBase(metaclass=ABCMeta): @@ -200,7 +196,7 @@ def bindings(self) -> list[Binding]: # `add` and `remove` don't have to be part of this interface. -T = TypeVar("T", bound=Union[KeyHandlerCallable, Binding]) +T = TypeVar("T", bound=KeyHandlerCallable | Binding) class KeyBindings(KeyBindingsBase): @@ -348,7 +344,7 @@ def remove(self, *args: Keys | str | KeyHandlerCallable) -> None: else: assert len(args) > 0 - args = cast(Tuple[Union[Keys, str]], args) + args = cast(tuple[Keys | str], args) # Remove this sequence of key bindings. keys = tuple(_parse_key(k) for k in args) diff --git a/src/prompt_toolkit/key_binding/key_processor.py b/src/prompt_toolkit/key_binding/key_processor.py index e2070a14f0..c0e60575cc 100644 --- a/src/prompt_toolkit/key_binding/key_processor.py +++ b/src/prompt_toolkit/key_binding/key_processor.py @@ -11,7 +11,8 @@ import weakref from asyncio import Task, sleep from collections import deque -from typing import TYPE_CHECKING, Any, Generator +from collections.abc import Generator +from typing import TYPE_CHECKING, Any from prompt_toolkit.application.current import get_app from prompt_toolkit.enums import EditingMode diff --git a/src/prompt_toolkit/key_binding/vi_state.py b/src/prompt_toolkit/key_binding/vi_state.py index 0543911e32..cb1a1b140e 100644 --- a/src/prompt_toolkit/key_binding/vi_state.py +++ b/src/prompt_toolkit/key_binding/vi_state.py @@ -1,7 +1,8 @@ from __future__ import annotations +from collections.abc import Callable from enum import Enum -from typing import TYPE_CHECKING, Callable +from typing import TYPE_CHECKING from prompt_toolkit.clipboard import ClipboardData diff --git a/src/prompt_toolkit/layout/containers.py b/src/prompt_toolkit/layout/containers.py index f6fe381f5a..fbc54d8c06 100644 --- a/src/prompt_toolkit/layout/containers.py +++ b/src/prompt_toolkit/layout/containers.py @@ -6,9 +6,10 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod +from collections.abc import Callable, Sequence from enum import Enum from functools import partial -from typing import TYPE_CHECKING, Callable, Sequence, Union, cast +from typing import TYPE_CHECKING, Union, cast from prompt_toolkit.application.current import get_app from prompt_toolkit.cache import SimpleCache @@ -52,7 +53,7 @@ from .utils import explode_text_fragments if TYPE_CHECKING: - from typing_extensions import Protocol, TypeGuard + from typing import Protocol, TypeGuard from prompt_toolkit.key_binding.key_bindings import NotImplementedOrNone diff --git a/src/prompt_toolkit/layout/controls.py b/src/prompt_toolkit/layout/controls.py index 5083c8286d..7178945646 100644 --- a/src/prompt_toolkit/layout/controls.py +++ b/src/prompt_toolkit/layout/controls.py @@ -6,7 +6,8 @@ import time from abc import ABCMeta, abstractmethod -from typing import TYPE_CHECKING, Callable, Hashable, Iterable, NamedTuple +from collections.abc import Callable, Hashable, Iterable +from typing import TYPE_CHECKING, NamedTuple from prompt_toolkit.application.current import get_app from prompt_toolkit.buffer import Buffer diff --git a/src/prompt_toolkit/layout/dimension.py b/src/prompt_toolkit/layout/dimension.py index eec6c6924c..28fdc9b959 100644 --- a/src/prompt_toolkit/layout/dimension.py +++ b/src/prompt_toolkit/layout/dimension.py @@ -5,7 +5,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, Union +from collections.abc import Callable +from typing import TYPE_CHECKING __all__ = [ "Dimension", @@ -18,7 +19,7 @@ ] if TYPE_CHECKING: - from typing_extensions import TypeGuard + from typing import TypeGuard class Dimension: @@ -169,14 +170,8 @@ def max_layout_dimensions(dimensions: list[Dimension]) -> Dimension: return Dimension() -# Anything that can be converted to a dimension. -AnyDimension = Union[ - None, # None is a valid dimension that will fit anything. - int, - Dimension, - # Callable[[], 'AnyDimension'] # Recursive definition not supported by mypy. - Callable[[], Any], -] +# Anything that can be converted to a dimension +AnyDimension = None | int | Dimension | Callable[[], "AnyDimension"] def to_dimension(value: AnyDimension) -> Dimension: diff --git a/src/prompt_toolkit/layout/layout.py b/src/prompt_toolkit/layout/layout.py index f9b7110925..1af6afce8e 100644 --- a/src/prompt_toolkit/layout/layout.py +++ b/src/prompt_toolkit/layout/layout.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Generator, Iterable, Union +from collections.abc import Generator, Iterable from prompt_toolkit.buffer import Buffer @@ -23,7 +23,7 @@ "walk", ] -FocusableElement = Union[str, Buffer, UIControl, AnyContainer] +FocusableElement = str | Buffer | UIControl | AnyContainer class Layout: diff --git a/src/prompt_toolkit/layout/margins.py b/src/prompt_toolkit/layout/margins.py index 737a74d29b..68e3e11904 100644 --- a/src/prompt_toolkit/layout/margins.py +++ b/src/prompt_toolkit/layout/margins.py @@ -5,7 +5,8 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import TYPE_CHECKING, Callable +from collections.abc import Callable +from typing import TYPE_CHECKING from prompt_toolkit.filters import FilterOrBool, to_filter from prompt_toolkit.formatted_text import ( diff --git a/src/prompt_toolkit/layout/menus.py b/src/prompt_toolkit/layout/menus.py index 612e8ab6a3..168792e507 100644 --- a/src/prompt_toolkit/layout/menus.py +++ b/src/prompt_toolkit/layout/menus.py @@ -1,8 +1,9 @@ from __future__ import annotations import math +from collections.abc import Callable, Iterable, Sequence from itertools import zip_longest -from typing import TYPE_CHECKING, Callable, Iterable, Sequence, TypeVar, cast +from typing import TYPE_CHECKING, TypeVar, cast from weakref import WeakKeyDictionary from prompt_toolkit.application.current import get_app diff --git a/src/prompt_toolkit/layout/mouse_handlers.py b/src/prompt_toolkit/layout/mouse_handlers.py index 52deac1456..31cf54a656 100644 --- a/src/prompt_toolkit/layout/mouse_handlers.py +++ b/src/prompt_toolkit/layout/mouse_handlers.py @@ -1,7 +1,8 @@ from __future__ import annotations from collections import defaultdict -from typing import TYPE_CHECKING, Callable +from collections.abc import Callable +from typing import TYPE_CHECKING from prompt_toolkit.mouse_events import MouseEvent diff --git a/src/prompt_toolkit/layout/processors.py b/src/prompt_toolkit/layout/processors.py index 666e79c66d..139f07c3e9 100644 --- a/src/prompt_toolkit/layout/processors.py +++ b/src/prompt_toolkit/layout/processors.py @@ -10,7 +10,8 @@ import re from abc import ABCMeta, abstractmethod -from typing import TYPE_CHECKING, Callable, Hashable, cast +from collections.abc import Callable, Hashable +from typing import TYPE_CHECKING, cast from prompt_toolkit.application.current import get_app from prompt_toolkit.cache import SimpleCache diff --git a/src/prompt_toolkit/layout/screen.py b/src/prompt_toolkit/layout/screen.py index 475f540d11..be3e7b7e92 100644 --- a/src/prompt_toolkit/layout/screen.py +++ b/src/prompt_toolkit/layout/screen.py @@ -1,7 +1,8 @@ from __future__ import annotations from collections import defaultdict -from typing import TYPE_CHECKING, Callable +from collections.abc import Callable +from typing import TYPE_CHECKING from prompt_toolkit.cache import FastDictCache from prompt_toolkit.data_structures import Point diff --git a/src/prompt_toolkit/layout/utils.py b/src/prompt_toolkit/layout/utils.py index 373fe52a5a..cba84bcb5d 100644 --- a/src/prompt_toolkit/layout/utils.py +++ b/src/prompt_toolkit/layout/utils.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Iterable, List, TypeVar, cast, overload +from collections.abc import Iterable +from typing import TYPE_CHECKING, TypeVar, cast, overload from prompt_toolkit.formatted_text.base import OneStyleAndTextTuple @@ -14,7 +15,7 @@ _T = TypeVar("_T", bound=OneStyleAndTextTuple) -class _ExplodedList(List[_T]): +class _ExplodedList(list[_T]): """ Wrapper around a list, that marks it as 'exploded'. @@ -52,7 +53,7 @@ def __setitem__( int_index = index.__index__() index = slice(int_index, int_index + 1) if isinstance(value, tuple): # In case of `OneStyleAndTextTuple`. - value = cast("List[_T]", [value]) + value = cast("list[_T]", [value]) super().__setitem__(index, explode_text_fragments(value)) diff --git a/src/prompt_toolkit/lexers/base.py b/src/prompt_toolkit/lexers/base.py index c61e2b9d32..e8536908bf 100644 --- a/src/prompt_toolkit/lexers/base.py +++ b/src/prompt_toolkit/lexers/base.py @@ -5,7 +5,7 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import Callable, Hashable +from collections.abc import Callable, Hashable from prompt_toolkit.document import Document from prompt_toolkit.formatted_text.base import StyleAndTextTuples diff --git a/src/prompt_toolkit/lexers/pygments.py b/src/prompt_toolkit/lexers/pygments.py index ff972d4a8d..696d90e82e 100644 --- a/src/prompt_toolkit/lexers/pygments.py +++ b/src/prompt_toolkit/lexers/pygments.py @@ -9,7 +9,8 @@ import re from abc import ABCMeta, abstractmethod -from typing import TYPE_CHECKING, Callable, Dict, Generator, Iterable, Tuple +from collections.abc import Callable, Generator, Iterable +from typing import TYPE_CHECKING from prompt_toolkit.document import Document from prompt_toolkit.filters import FilterOrBool, to_filter @@ -123,7 +124,7 @@ def from_pygments_lexer_cls(cls, lexer_cls: type[PygmentsLexerCls]) -> RegexSync return cls(p) -class _TokenCache(Dict[Tuple[str, ...], str]): +class _TokenCache(dict[tuple[str, ...], str]): """ Cache that converts Pygments tokens into `prompt_toolkit` style objects. @@ -219,7 +220,7 @@ def lex_document(self, document: Document) -> Callable[[int], StyleAndTextTuples Create a lexer function that takes a line number and returns the list of (style_str, text) tuples as the Pygments lexer returns for that line. """ - LineGenerator = Generator[Tuple[int, StyleAndTextTuples], None, None] + LineGenerator = Generator[tuple[int, StyleAndTextTuples], None, None] # Cache of already lexed lines. cache: dict[int, StyleAndTextTuples] = {} diff --git a/src/prompt_toolkit/output/flush_stdout.py b/src/prompt_toolkit/output/flush_stdout.py index daf58efee6..556e968251 100644 --- a/src/prompt_toolkit/output/flush_stdout.py +++ b/src/prompt_toolkit/output/flush_stdout.py @@ -3,8 +3,9 @@ import errno import os import sys +from collections.abc import Iterator from contextlib import contextmanager -from typing import IO, Iterator, TextIO +from typing import IO, TextIO __all__ = ["flush_stdout"] diff --git a/src/prompt_toolkit/output/vt100.py b/src/prompt_toolkit/output/vt100.py index 57826b9409..b2fe073a13 100644 --- a/src/prompt_toolkit/output/vt100.py +++ b/src/prompt_toolkit/output/vt100.py @@ -12,7 +12,8 @@ import io import os import sys -from typing import Callable, Dict, Hashable, Iterable, Sequence, TextIO, Tuple +from collections.abc import Callable, Hashable, Iterable, Sequence +from typing import TextIO from prompt_toolkit.cursor_shapes import CursorShape from prompt_toolkit.data_structures import Size @@ -139,7 +140,7 @@ def _get_closest_ansi_color(r: int, g: int, b: int, exclude: Sequence[str] = ()) return match -_ColorCodeAndName = Tuple[int, str] +_ColorCodeAndName = tuple[int, str] class _16ColorCache: @@ -183,7 +184,7 @@ def _get( return code, match -class _256ColorCache(Dict[Tuple[int, int, int], int]): +class _256ColorCache(dict[tuple[int, int, int], int]): """ Cache which maps (r, g, b) tuples to 256 colors. """ @@ -254,7 +255,7 @@ def __missing__(self, value: tuple[int, int, int]) -> int: _256_colors = _256ColorCache() -class _EscapeCodeCache(Dict[Attrs, str]): +class _EscapeCodeCache(dict[Attrs, str]): """ Cache for VT100 escape codes. It maps (fgcolor, bgcolor, bold, underline, strike, italic, blink, reverse, hidden, dim) tuples to VT100 diff --git a/src/prompt_toolkit/output/win32.py b/src/prompt_toolkit/output/win32.py index 1c0cc4eec8..1bf0cbbbc2 100644 --- a/src/prompt_toolkit/output/win32.py +++ b/src/prompt_toolkit/output/win32.py @@ -5,9 +5,10 @@ assert sys.platform == "win32" import os +from collections.abc import Callable from ctypes import ArgumentError, byref, c_char, c_long, c_uint, c_ulong, pointer from ctypes.wintypes import DWORD, HANDLE -from typing import Callable, TextIO, TypeVar +from typing import TextIO, TypeVar from prompt_toolkit.cursor_shapes import CursorShape from prompt_toolkit.data_structures import Size diff --git a/src/prompt_toolkit/patch_stdout.py b/src/prompt_toolkit/patch_stdout.py index 47da779398..1695c1639a 100644 --- a/src/prompt_toolkit/patch_stdout.py +++ b/src/prompt_toolkit/patch_stdout.py @@ -25,8 +25,9 @@ import sys import threading import time +from collections.abc import Generator from contextlib import contextmanager -from typing import Generator, TextIO, cast +from typing import TextIO, cast from .application import get_app_session, run_in_terminal from .output import Output diff --git a/src/prompt_toolkit/renderer.py b/src/prompt_toolkit/renderer.py index 8d5e03c19e..fcfde223e1 100644 --- a/src/prompt_toolkit/renderer.py +++ b/src/prompt_toolkit/renderer.py @@ -7,8 +7,9 @@ from asyncio import FIRST_COMPLETED, Future, ensure_future, sleep, wait from collections import deque +from collections.abc import Callable, Hashable from enum import Enum -from typing import TYPE_CHECKING, Any, Callable, Dict, Hashable +from typing import TYPE_CHECKING, Any from prompt_toolkit.application.current import get_app from prompt_toolkit.cursor_shapes import CursorShape @@ -267,7 +268,7 @@ class HeightIsUnknownError(Exception): "Information unavailable. Did not yet receive the CPR response." -class _StyleStringToAttrsCache(Dict[str, Attrs]): +class _StyleStringToAttrsCache(dict[str, Attrs]): """ A cache structure that maps style strings to :class:`.Attr`. (This is an important speed up.) @@ -289,7 +290,7 @@ def __missing__(self, style_str: str) -> Attrs: return attrs -class _StyleStringHasStyleCache(Dict[str, bool]): +class _StyleStringHasStyleCache(dict[str, bool]): """ Cache for remember which style strings don't render the default output style (default fg/bg, no underline and no reverse and no blink). That way diff --git a/src/prompt_toolkit/shortcuts/choice_input.py b/src/prompt_toolkit/shortcuts/choice_input.py index 95ffd0b5b4..8e34343cc0 100644 --- a/src/prompt_toolkit/shortcuts/choice_input.py +++ b/src/prompt_toolkit/shortcuts/choice_input.py @@ -1,6 +1,7 @@ from __future__ import annotations -from typing import Generic, Sequence, TypeVar +from collections.abc import Sequence +from typing import Generic, TypeVar from prompt_toolkit.application import Application from prompt_toolkit.filters import ( diff --git a/src/prompt_toolkit/shortcuts/dialogs.py b/src/prompt_toolkit/shortcuts/dialogs.py index d12bbb03aa..9236b5e31c 100644 --- a/src/prompt_toolkit/shortcuts/dialogs.py +++ b/src/prompt_toolkit/shortcuts/dialogs.py @@ -1,7 +1,8 @@ from __future__ import annotations import functools -from typing import Any, Callable, Sequence, TypeVar +from collections.abc import Callable, Sequence +from typing import Any, TypeVar from prompt_toolkit.application import Application from prompt_toolkit.application.current import get_app diff --git a/src/prompt_toolkit/shortcuts/progress_bar/base.py b/src/prompt_toolkit/shortcuts/progress_bar/base.py index a7c2a527d8..a8b796627a 100644 --- a/src/prompt_toolkit/shortcuts/progress_bar/base.py +++ b/src/prompt_toolkit/shortcuts/progress_bar/base.py @@ -17,13 +17,9 @@ import signal import threading import traceback +from collections.abc import Callable, Iterable, Iterator, Sequence, Sized from typing import ( - Callable, Generic, - Iterable, - Iterator, - Sequence, - Sized, TextIO, TypeVar, cast, diff --git a/src/prompt_toolkit/shortcuts/prompt.py b/src/prompt_toolkit/shortcuts/prompt.py index 68cfeb9aa0..f14ecd80c8 100644 --- a/src/prompt_toolkit/shortcuts/prompt.py +++ b/src/prompt_toolkit/shortcuts/prompt.py @@ -28,10 +28,11 @@ from __future__ import annotations from asyncio import get_running_loop +from collections.abc import Callable, Iterator from contextlib import contextmanager from enum import Enum from functools import partial -from typing import TYPE_CHECKING, Callable, Generic, Iterator, TypeVar, Union, cast +from typing import TYPE_CHECKING, Generic, TypeVar, Union, cast from prompt_toolkit.application import Application from prompt_toolkit.application.current import get_app @@ -520,17 +521,21 @@ def accept(buff: Buffer) -> bool: # enable_history_search is enabled. (First convert to Filter, # to avoid doing bitwise operations on bool objects.) complete_while_typing=Condition( - lambda: is_true(self.complete_while_typing) - and not is_true(self.enable_history_search) - and not self.complete_style == CompleteStyle.READLINE_LIKE + lambda: ( + is_true(self.complete_while_typing) + and not is_true(self.enable_history_search) + and not self.complete_style == CompleteStyle.READLINE_LIKE + ) ), validate_while_typing=dyncond("validate_while_typing"), enable_history_search=dyncond("enable_history_search"), validator=DynamicValidator(lambda: self.validator), completer=DynamicCompleter( - lambda: ThreadedCompleter(self.completer) - if self.complete_in_thread and self.completer - else self.completer + lambda: ( + ThreadedCompleter(self.completer) + if self.complete_in_thread and self.completer + else self.completer + ) ), history=self.history, auto_suggest=DynamicAutoSuggest(lambda: self.auto_suggest), @@ -654,15 +659,19 @@ def multi_column_complete_style() -> bool: ConditionalContainer( default_buffer_window, Condition( - lambda: get_app().layout.current_control - != search_buffer_control + lambda: ( + get_app().layout.current_control + != search_buffer_control + ) ), ), ConditionalContainer( Window(search_buffer_control), Condition( - lambda: get_app().layout.current_control - == search_buffer_control + lambda: ( + get_app().layout.current_control + == search_buffer_control + ) ), ), ] diff --git a/src/prompt_toolkit/styles/base.py b/src/prompt_toolkit/styles/base.py index 1e044679f0..9144a77c88 100644 --- a/src/prompt_toolkit/styles/base.py +++ b/src/prompt_toolkit/styles/base.py @@ -5,7 +5,8 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import Callable, Hashable, NamedTuple +from collections.abc import Callable, Hashable +from typing import NamedTuple __all__ = [ "Attrs", diff --git a/src/prompt_toolkit/styles/style.py b/src/prompt_toolkit/styles/style.py index 8aab8e1b21..388a87e8d3 100644 --- a/src/prompt_toolkit/styles/style.py +++ b/src/prompt_toolkit/styles/style.py @@ -6,8 +6,9 @@ import itertools import re +from collections.abc import Hashable from enum import Enum -from typing import Hashable, TypeVar +from typing import TypeVar from prompt_toolkit.cache import SimpleCache diff --git a/src/prompt_toolkit/styles/style_transformation.py b/src/prompt_toolkit/styles/style_transformation.py index e8d5b0a89f..7db723c393 100644 --- a/src/prompt_toolkit/styles/style_transformation.py +++ b/src/prompt_toolkit/styles/style_transformation.py @@ -13,8 +13,8 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod +from collections.abc import Callable, Hashable, Sequence from colorsys import hls_to_rgb, rgb_to_hls -from typing import Callable, Hashable, Sequence from prompt_toolkit.cache import memoized from prompt_toolkit.filters import FilterOrBool, to_filter diff --git a/src/prompt_toolkit/utils.py b/src/prompt_toolkit/utils.py index 1a99a2868a..142142a0f4 100644 --- a/src/prompt_toolkit/utils.py +++ b/src/prompt_toolkit/utils.py @@ -5,14 +5,11 @@ import sys import threading from collections import deque +from collections.abc import Callable, Generator +from contextlib import AbstractContextManager from typing import ( - Callable, - ContextManager, - Dict, - Generator, Generic, TypeVar, - Union, ) from wcwidth import wcwidth @@ -112,7 +109,7 @@ def __isub__(self, handler: Callable[[_Sender], None]) -> Event[_Sender]: return self -class DummyContext(ContextManager[None]): +class DummyContext(AbstractContextManager[None]): """ (contextlib.nested is not available on Py3) """ @@ -124,7 +121,7 @@ def __exit__(self, *a: object) -> None: pass -class _CharSizesCache(Dict[str, int]): +class _CharSizesCache(dict[str, int]): """ Cache for wcwidth sizes. """ @@ -303,7 +300,7 @@ def to_int(value: Callable[[], int] | int) -> int: return int(value) -AnyFloat = Union[Callable[[], float], float] +AnyFloat = Callable[[], float] | float def to_float(value: AnyFloat) -> float: diff --git a/src/prompt_toolkit/validation.py b/src/prompt_toolkit/validation.py index 2b35d1fcc9..d33fa38796 100644 --- a/src/prompt_toolkit/validation.py +++ b/src/prompt_toolkit/validation.py @@ -6,7 +6,7 @@ from __future__ import annotations from abc import ABCMeta, abstractmethod -from typing import Callable +from collections.abc import Callable from prompt_toolkit.eventloop import run_in_executor_with_context diff --git a/src/prompt_toolkit/widgets/base.py b/src/prompt_toolkit/widgets/base.py index b8c2d671bd..d2bcacf2e4 100644 --- a/src/prompt_toolkit/widgets/base.py +++ b/src/prompt_toolkit/widgets/base.py @@ -15,8 +15,9 @@ from __future__ import annotations +from collections.abc import Callable, Sequence from functools import partial -from typing import Callable, Generic, Sequence, TypeVar +from typing import Generic, TypeVar from prompt_toolkit.application.current import get_app from prompt_toolkit.auto_suggest import AutoSuggest, DynamicAutoSuggest diff --git a/src/prompt_toolkit/widgets/dialogs.py b/src/prompt_toolkit/widgets/dialogs.py index 5f5f17026d..7f3cfe7695 100644 --- a/src/prompt_toolkit/widgets/dialogs.py +++ b/src/prompt_toolkit/widgets/dialogs.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence from prompt_toolkit.filters import has_completions, has_focus from prompt_toolkit.formatted_text import AnyFormattedText diff --git a/src/prompt_toolkit/widgets/menus.py b/src/prompt_toolkit/widgets/menus.py index c574c06799..9cb5de2bd2 100644 --- a/src/prompt_toolkit/widgets/menus.py +++ b/src/prompt_toolkit/widgets/menus.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Callable, Iterable, Sequence +from collections.abc import Callable, Iterable, Sequence from prompt_toolkit.application.current import get_app from prompt_toolkit.filters import Condition diff --git a/tests/test_key_binding.py b/tests/test_key_binding.py index 1c60880af9..479559c61d 100644 --- a/tests/test_key_binding.py +++ b/tests/test_key_binding.py @@ -39,6 +39,10 @@ def set_dummy_app(): input=pipe_input, ) + def create_background_task(coroutine, **kw): + coroutine.close() + return None + # Don't start background tasks for these tests. The `KeyProcessor` # wants to create a background task for flushing keys. We can ignore it # here for these tests. @@ -46,7 +50,7 @@ def set_dummy_app(): # the `Application` should pass its task group to the constructor of # `KeyProcessor`. That way, it doesn't have to do a lookup using # `get_app()`. - app.create_background_task = lambda *_, **kw: None + app.create_background_task = create_background_task with set_app(app): yield diff --git a/tests/test_memory_leaks.py b/tests/test_memory_leaks.py index 31ea7c8ce8..08afac5e28 100644 --- a/tests/test_memory_leaks.py +++ b/tests/test_memory_leaks.py @@ -2,8 +2,6 @@ import gc -import pytest - from prompt_toolkit.shortcuts.prompt import PromptSession @@ -16,8 +14,7 @@ def _count_prompt_session_instances() -> int: return len([obj for obj in objects if isinstance(obj, PromptSession)]) -# Fails in GitHub CI, probably due to GC differences. -@pytest.mark.xfail(reason="Memory leak testing fails in GitHub CI.") +# This test used to fail in GitHub CI, probably due to GC differences. def test_prompt_session_memory_leak() -> None: before_count = _count_prompt_session_instances() diff --git a/tools/debug_input_cross_platform.py b/tools/debug_input_cross_platform.py index d87cfcc03d..70a8f3f33d 100755 --- a/tools/debug_input_cross_platform.py +++ b/tools/debug_input_cross_platform.py @@ -16,7 +16,7 @@ async def main() -> None: done = asyncio.Event() input = create_input() - def keys_ready(): + def keys_ready() -> None: for key_press in input.read_keys(): print(key_press) diff --git a/tools/debug_vt100_input.py b/tools/debug_vt100_input.py index b74c06fb84..20722dcff5 100755 --- a/tools/debug_vt100_input.py +++ b/tools/debug_vt100_input.py @@ -10,17 +10,18 @@ from prompt_toolkit.input.vt100 import raw_mode from prompt_toolkit.input.vt100_parser import Vt100Parser +from prompt_toolkit.key_binding import KeyPress from prompt_toolkit.keys import Keys -def callback(key_press): +def callback(key_press: KeyPress) -> None: print(key_press) if key_press.key == Keys.ControlC: sys.exit(0) -def main(): +def main() -> None: stream = Vt100Parser(callback) with raw_mode(sys.stdin.fileno()):