From 5930ebf82e8588fe055881e8335bc01c786040cc Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Tue, 7 Feb 2023 10:46:28 +0000 Subject: [PATCH] remove _typing.py --- examples/five_by_five.py | 4 ++-- src/textual/__init__.py | 4 ++-- src/textual/_animator.py | 11 +++++++++-- src/textual/_asyncio.py | 2 +- src/textual/_border.py | 5 +++-- src/textual/_compositor.py | 2 +- src/textual/_layout.py | 2 +- src/textual/_layout_resolve.py | 2 +- src/textual/_resolve.py | 5 +++-- src/textual/_types.py | 6 +++--- src/textual/_typing.py | 23 ----------------------- src/textual/app.py | 6 +++--- src/textual/binding.py | 2 +- src/textual/css/_help_text.py | 9 +++++---- src/textual/css/_style_properties.py | 9 ++++++++- src/textual/css/constants.py | 2 +- src/textual/css/styles.py | 5 ++--- src/textual/css/types.py | 2 +- src/textual/devtools/renderables.py | 4 ++-- src/textual/dom.py | 4 ++-- src/textual/features.py | 4 ++-- src/textual/geometry.py | 2 +- src/textual/screen.py | 2 +- src/textual/widgets/_button.py | 3 ++- src/textual/widgets/_data_table.py | 4 ++-- src/textual/widgets/_list_view.py | 1 - src/textual/widgets/_placeholder.py | 4 +++- src/textual/widgets/_text_log.py | 6 +++--- src/textual/widgets/_tree.py | 2 +- tests/css/test_stylesheet.py | 2 +- tests/snapshot_tests/conftest.py | 1 - tests/test_immutable_sequence_view.py | 1 + 32 files changed, 68 insertions(+), 73 deletions(-) delete mode 100644 src/textual/_typing.py diff --git a/examples/five_by_five.py b/examples/five_by_five.py index 4bb6be480..09592e115 100644 --- a/examples/five_by_five.py +++ b/examples/five_by_five.py @@ -1,7 +1,7 @@ """Simple version of 5x5, developed for/with Textual.""" from pathlib import Path -from typing import TYPE_CHECKING, cast +from typing_extensions import TYPE_CHECKING, cast from rich.markdown import Markdown @@ -15,7 +15,7 @@ from textual.widget import Widget from textual.widgets import Button, Footer, Label if TYPE_CHECKING: - from typing import Final + from typing_extensions import Final class Help(Screen): diff --git a/src/textual/__init__.py b/src/textual/__init__.py index c0c22e485..8f10728b4 100644 --- a/src/textual/__init__.py +++ b/src/textual/__init__.py @@ -4,14 +4,14 @@ import inspect import rich.repr from rich.console import RenderableType -from typing import TYPE_CHECKING +from typing import Callable, TYPE_CHECKING from ._context import active_app from ._log import LogGroup, LogVerbosity if TYPE_CHECKING: - from typing import Callable, TypeAlias + from typing_extensions import TypeAlias __all__ = ["log", "panic", "__version__"] # type: ignore diff --git a/src/textual/_animator.py b/src/textual/_animator.py index 6fbbe890e..d2dc7f7bd 100644 --- a/src/textual/_animator.py +++ b/src/textual/_animator.py @@ -5,13 +5,20 @@ import sys from abc import ABC, abstractmethod from dataclasses import dataclass from functools import partial -from typing import TYPE_CHECKING, Any, Callable, TypeVar + +from typing import Callable +from typing_extensions import ( + TYPE_CHECKING, + Any, + Protocol, + TypeVar, + runtime_checkable, +) from . import _clock from ._callback import invoke from ._easing import DEFAULT_EASING, EASING from ._types import CallbackType -from ._typing import Protocol, runtime_checkable from .timer import Timer if TYPE_CHECKING: diff --git a/src/textual/_asyncio.py b/src/textual/_asyncio.py index f5c4aa5a4..941da4289 100644 --- a/src/textual/_asyncio.py +++ b/src/textual/_asyncio.py @@ -16,7 +16,7 @@ if sys.version_info >= (3, 8): else: import asyncio from asyncio import create_task as _create_task - from typing import Awaitable + from typing_extensions import Awaitable def create_task(coroutine: Awaitable, *, name: str | None = None) -> asyncio.Task: """Schedule the execution of a coroutine object in a spawn task.""" diff --git a/src/textual/_border.py b/src/textual/_border.py index 6d86806e4..2feb33df0 100644 --- a/src/textual/_border.py +++ b/src/textual/_border.py @@ -1,7 +1,8 @@ from __future__ import annotations from functools import lru_cache -from typing import cast, Tuple, TYPE_CHECKING, Union +from typing import cast, Tuple, Union +from typing import TYPE_CHECKING from rich.segment import Segment from rich.style import Style @@ -10,7 +11,7 @@ from .color import Color from .css.types import EdgeStyle, EdgeType if TYPE_CHECKING: - from typing import TypeAlias + from typing_extensions import TypeAlias INNER = 1 OUTER = 2 diff --git a/src/textual/_compositor.py b/src/textual/_compositor.py index a51a861cd..a74910d78 100644 --- a/src/textual/_compositor.py +++ b/src/textual/_compositor.py @@ -31,7 +31,7 @@ from .geometry import NULL_OFFSET, Offset, Region, Size if TYPE_CHECKING: from .widget import Widget - from typing import TypeAlias + from typing_extensions import TypeAlias class ReflowResult(NamedTuple): diff --git a/src/textual/_layout.py b/src/textual/_layout.py index 2b6baca4d..22c7129cd 100644 --- a/src/textual/_layout.py +++ b/src/textual/_layout.py @@ -6,7 +6,7 @@ from typing import ClassVar, NamedTuple, TYPE_CHECKING from .geometry import Region, Size, Spacing if TYPE_CHECKING: - from typing import TypeAlias + from typing_extensions import TypeAlias from .widget import Widget ArrangeResult: TypeAlias = "tuple[list[WidgetPlacement], set[Widget]]" diff --git a/src/textual/_layout_resolve.py b/src/textual/_layout_resolve.py index a9d209034..d94cfec7f 100644 --- a/src/textual/_layout_resolve.py +++ b/src/textual/_layout_resolve.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from fractions import Fraction from typing import Sequence, cast -from ._typing import Protocol +from typing_extensions import Protocol class EdgeProtocol(Protocol): diff --git a/src/textual/_resolve.py b/src/textual/_resolve.py index 1c5fe73df..5a6961381 100644 --- a/src/textual/_resolve.py +++ b/src/textual/_resolve.py @@ -2,9 +2,10 @@ from __future__ import annotations from fractions import Fraction from itertools import accumulate -from typing import TYPE_CHECKING, Sequence, cast +from typing import Sequence, cast, TYPE_CHECKING + +from typing_extensions import Literal -from ._typing import Literal from .box_model import BoxModel from .css.scalar import Scalar from .geometry import Size diff --git a/src/textual/_types.py b/src/textual/_types.py index 56a3efd33..390c376b8 100644 --- a/src/textual/_types.py +++ b/src/textual/_types.py @@ -1,8 +1,8 @@ -from typing import Awaitable, Callable, List, TYPE_CHECKING, Union +from typing import Callable, List, Union +from typing import Awaitable, TYPE_CHECKING -from rich.segment import Segment -from ._typing import Protocol +from typing_extensions import Protocol if TYPE_CHECKING: diff --git a/src/textual/_typing.py b/src/textual/_typing.py deleted file mode 100644 index 847ca865c..000000000 --- a/src/textual/_typing.py +++ /dev/null @@ -1,23 +0,0 @@ -import sys - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from typing import Literal, Protocol, TypedDict, runtime_checkable -else: - if sys.version_info >= (3, 8): - from typing import Literal, Protocol, TypedDict, runtime_checkable - else: - from typing_extensions import ( - Literal, - Protocol, - TypedDict, - runtime_checkable, - ) - -__all__ = [ - "Literal", - "Protocol", - "runtime_checkable", - "TypedDict", -] diff --git a/src/textual/app.py b/src/textual/app.py index 3fe8ba634..d6a0d766d 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -46,11 +46,11 @@ from ._animator import DEFAULT_EASING, Animatable, Animator, EasingFunction from ._ansi_sequences import SYNC_END, SYNC_START from ._asyncio import create_task from ._callback import invoke -from ._context import active_app, active_message_pump +from ._context import active_app from ._event_broker import NoHandler, extract_handler_actions from ._filter import LineFilter, Monochrome from ._path import _make_path_object_relative -from ._typing import Final + from ._wait import wait_for_idle from .actions import SkipAction from .await_remove import AwaitRemove @@ -72,7 +72,7 @@ from .screen import Screen from .widget import AwaitMount, Widget if TYPE_CHECKING: - from typing import Coroutine, TypeAlias + from typing_extensions import Coroutine, Final, TypeAlias from .devtools.client import DevtoolsClient from .pilot import Pilot diff --git a/src/textual/binding.py b/src/textual/binding.py index 9cf32b829..acf6b0345 100644 --- a/src/textual/binding.py +++ b/src/textual/binding.py @@ -8,7 +8,7 @@ import rich.repr from .keys import _character_to_key if TYPE_CHECKING: - from typing import TypeAlias + from typing_extensions import TypeAlias BindingType: TypeAlias = "Binding | tuple[str, str, str]" diff --git a/src/textual/css/_help_text.py b/src/textual/css/_help_text.py index 1541706fd..34b7591ca 100644 --- a/src/textual/css/_help_text.py +++ b/src/textual/css/_help_text.py @@ -3,10 +3,11 @@ from __future__ import annotations from dataclasses import dataclass from typing import Iterable, Sequence -from textual._typing import Literal -from textual.color import ColorParseError -from textual.css._help_renderables import Example, Bullet, HelpText -from textual.css.constants import ( +from typing import Literal + +from ..color import ColorParseError +from ._help_renderables import Example, Bullet, HelpText +from .constants import ( VALID_BORDER, VALID_LAYOUT, VALID_ALIGN_HORIZONTAL, diff --git a/src/textual/css/_style_properties.py b/src/textual/css/_style_properties.py index 882be31cf..f3e5908a6 100644 --- a/src/textual/css/_style_properties.py +++ b/src/textual/css/_style_properties.py @@ -10,7 +10,14 @@ when setting and getting. from __future__ import annotations from operator import attrgetter -from typing import TYPE_CHECKING, Generic, Iterable, NamedTuple, TypeVar, cast +from typing import ( + TYPE_CHECKING, + Generic, + Iterable, + NamedTuple, + TypeVar, + cast, +) import rich.errors import rich.repr diff --git a/src/textual/css/constants.py b/src/textual/css/constants.py index ea7a21023..c9598ff32 100644 --- a/src/textual/css/constants.py +++ b/src/textual/css/constants.py @@ -4,7 +4,7 @@ import typing from ..geometry import Spacing if typing.TYPE_CHECKING: - from typing import Final + from typing_extensions import Final from .types import EdgeType VALID_VISIBILITY: Final = {"visible", "hidden"} diff --git a/src/textual/css/styles.py b/src/textual/css/styles.py index 6b57d4db2..e41744b87 100644 --- a/src/textual/css/styles.py +++ b/src/textual/css/styles.py @@ -4,7 +4,8 @@ from abc import ABC, abstractmethod from dataclasses import dataclass, field from functools import lru_cache from operator import attrgetter -from typing import TYPE_CHECKING, Any, Iterable, NamedTuple, cast +from typing import Iterable, cast +from typing import TYPE_CHECKING, Any, NamedTuple, TypedDict import rich.repr from rich.style import Style @@ -62,8 +63,6 @@ from .types import ( ) if TYPE_CHECKING: - from typing import TypedDict - from .._layout import Layout from ..dom import DOMNode diff --git a/src/textual/css/types.py b/src/textual/css/types.py index b0f78c796..60a1d2f5f 100644 --- a/src/textual/css/types.py +++ b/src/textual/css/types.py @@ -1,9 +1,9 @@ from __future__ import annotations from typing import Tuple +from typing_extensions import Literal from ..color import Color -from .._typing import Literal Edge = Literal["top", "right", "bottom", "left"] DockEdge = Literal["top", "right", "bottom", "left", ""] diff --git a/src/textual/devtools/renderables.py b/src/textual/devtools/renderables.py index cd1ca7f54..a8ddb166e 100644 --- a/src/textual/devtools/renderables.py +++ b/src/textual/devtools/renderables.py @@ -5,7 +5,6 @@ from pathlib import Path from typing import Iterable from importlib_metadata import version - from rich.align import Align from rich.console import Console, ConsoleOptions, RenderResult from rich.markup import escape @@ -15,8 +14,9 @@ from rich.style import Style from rich.styled import Styled from rich.table import Table from rich.text import Text +from typing_extensions import Literal + from textual._log import LogGroup -from textual._typing import Literal DevConsoleMessageLevel = Literal["info", "warning", "error"] diff --git a/src/textual/dom.py b/src/textual/dom.py index 3921cfd50..b6129daed 100644 --- a/src/textual/dom.py +++ b/src/textual/dom.py @@ -40,9 +40,9 @@ if TYPE_CHECKING: from .css.query import DOMQuery from .screen import Screen from .widget import Widget - from typing import TypeAlias + from typing_extensions import TypeAlias -from ._typing import Literal +from typing_extensions import Literal _re_identifier = re.compile(IDENTIFIER) diff --git a/src/textual/features.py b/src/textual/features.py index 760794bff..507de18f0 100644 --- a/src/textual/features.py +++ b/src/textual/features.py @@ -1,9 +1,9 @@ from __future__ import annotations -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, Literal, cast if TYPE_CHECKING: - from typing import Final, Literal + from typing_extensions import Final FEATURES: Final = {"devtools", "debug", "headless"} diff --git a/src/textual/geometry.py b/src/textual/geometry.py index 4c301fdd0..f2f8ef3d8 100644 --- a/src/textual/geometry.py +++ b/src/textual/geometry.py @@ -20,7 +20,7 @@ from typing import ( ) if TYPE_CHECKING: - from typing import TypeAlias + from typing_extensions import TypeAlias SpacingDimensions: TypeAlias = Union[ diff --git a/src/textual/screen.py b/src/textual/screen.py index 9c57a0fda..3bed42f18 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -20,7 +20,7 @@ from .renderables.blank import Blank from .widget import Widget if TYPE_CHECKING: - from typing import Final + from typing_extensions import Final # Screen updates will be batched so that they don't happen more often than 120 times per second: UPDATE_PERIOD: Final[float] = 1 / 120 diff --git a/src/textual/widgets/_button.py b/src/textual/widgets/_button.py index 164ca38ef..12518445b 100644 --- a/src/textual/widgets/_button.py +++ b/src/textual/widgets/_button.py @@ -2,6 +2,7 @@ from __future__ import annotations from functools import partial from typing import cast +from typing_extensions import Literal import rich.repr from rich.console import RenderableType @@ -12,7 +13,7 @@ from ..css._error_tools import friendly_list from ..message import Message from ..reactive import Reactive from ..widgets import Static -from .._typing import Literal + ButtonVariant = Literal["default", "primary", "success", "warning", "error"] _VALID_BUTTON_VARIANTS = {"default", "primary", "success", "warning", "error"} diff --git a/src/textual/widgets/_data_table.py b/src/textual/widgets/_data_table.py index 04823df11..bd4ecc6d3 100644 --- a/src/textual/widgets/_data_table.py +++ b/src/textual/widgets/_data_table.py @@ -2,7 +2,8 @@ from __future__ import annotations from dataclasses import dataclass, field from itertools import chain, zip_longest -from typing import ClassVar, Generic, Iterable, TypeVar, cast +from typing import Generic, Iterable, cast +from typing_extensions import ClassVar, TypeVar, Literal import rich.repr from rich.console import RenderableType @@ -16,7 +17,6 @@ from .. import events, messages from .._cache import LRUCache from .._segment_tools import line_crop from .._types import SegmentLines -from .._typing import Literal from ..binding import Binding, BindingType from ..coordinate import Coordinate from ..geometry import Region, Size, Spacing, clamp diff --git a/src/textual/widgets/_list_view.py b/src/textual/widgets/_list_view.py index 87675ec47..a4a530e2e 100644 --- a/src/textual/widgets/_list_view.py +++ b/src/textual/widgets/_list_view.py @@ -1,7 +1,6 @@ from __future__ import annotations from typing import ClassVar -from textual import events from textual.await_remove import AwaitRemove from textual.binding import Binding, BindingType from textual.containers import Vertical diff --git a/src/textual/widgets/_placeholder.py b/src/textual/widgets/_placeholder.py index 755f85a8b..d111d906b 100644 --- a/src/textual/widgets/_placeholder.py +++ b/src/textual/widgets/_placeholder.py @@ -2,11 +2,13 @@ from __future__ import annotations from itertools import cycle +from typing_extensions import Literal + from .. import events from ..css._error_tools import friendly_list from ..reactive import Reactive, reactive from ..widget import Widget, RenderResult -from .._typing import Literal + PlaceholderVariant = Literal["default", "size", "text"] _VALID_PLACEHOLDER_VARIANTS_ORDERED: list[PlaceholderVariant] = [ diff --git a/src/textual/widgets/_text_log.py b/src/textual/widgets/_text_log.py index 1c116c0b4..f78934e70 100644 --- a/src/textual/widgets/_text_log.py +++ b/src/textual/widgets/_text_log.py @@ -10,10 +10,10 @@ from rich.protocol import is_renderable from rich.segment import Segment from rich.text import Text -from ..reactive import var -from ..geometry import Size, Region -from ..scroll_view import ScrollView from .._cache import LRUCache +from ..geometry import Region, Size +from ..reactive import var +from ..scroll_view import ScrollView from ..strip import Strip diff --git a/src/textual/widgets/_tree.py b/src/textual/widgets/_tree.py index fb98caab6..9421d47ad 100644 --- a/src/textual/widgets/_tree.py +++ b/src/textual/widgets/_tree.py @@ -21,7 +21,7 @@ from ..scroll_view import ScrollView from ..strip import Strip if TYPE_CHECKING: - from typing import TypeAlias + from typing_extensions import TypeAlias NodeID = NewType("NodeID", int) TreeDataType = TypeVar("TreeDataType") diff --git a/tests/css/test_stylesheet.py b/tests/css/test_stylesheet.py index be54fe936..199e6755e 100644 --- a/tests/css/test_stylesheet.py +++ b/tests/css/test_stylesheet.py @@ -1,5 +1,5 @@ from contextlib import nullcontext as does_not_raise -from typing import Any +from typing_extensions import Any import pytest diff --git a/tests/snapshot_tests/conftest.py b/tests/snapshot_tests/conftest.py index 127d53596..c5d9ee21b 100644 --- a/tests/snapshot_tests/conftest.py +++ b/tests/snapshot_tests/conftest.py @@ -118,7 +118,6 @@ def pytest_sessionfinish( diffs: List[SvgSnapshotDiff] = [] num_snapshots_passing = 0 for item in session.items: - # Grab the data our fixture attached to the pytest node num_snapshots_passing += int(item.stash.get(TEXTUAL_SNAPSHOT_PASS, False)) snapshot_svg = item.stash.get(TEXTUAL_SNAPSHOT_SVG_KEY, None) diff --git a/tests/test_immutable_sequence_view.py b/tests/test_immutable_sequence_view.py index 500eaa6d0..fd691798c 100644 --- a/tests/test_immutable_sequence_view.py +++ b/tests/test_immutable_sequence_view.py @@ -3,6 +3,7 @@ import pytest from typing import Sequence from textual._immutable_sequence_view import ImmutableSequenceView + def wrap(source: Sequence[int]) -> ImmutableSequenceView[int]: """Wrap a sequence of integers inside an immutable sequence view.""" return ImmutableSequenceView[int](source)