Introduce _typing module for version-dependent typing imports (#1088)

* Introduce _typing module for version-dependent typing imports

* Remove unused import
This commit is contained in:
darrenburns
2022-11-01 17:13:42 +00:00
committed by GitHub
parent bbd811d671
commit 5e64a9fb90
22 changed files with 39 additions and 147 deletions

View File

@@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import inspect import inspect
import sys
from typing import Callable from typing import Callable
import rich.repr import rich.repr
@@ -12,11 +11,7 @@ __all__ = ["log", "panic"]
from ._context import active_app from ._context import active_app
from ._log import LogGroup, LogVerbosity from ._log import LogGroup, LogVerbosity
from ._typing import TypeAlias
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
LogCallable: TypeAlias = "Callable" LogCallable: TypeAlias = "Callable"

View File

@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import sys
from functools import lru_cache from functools import lru_cache
from typing import cast, Tuple, Union from typing import cast, Tuple, Union
@@ -11,11 +10,7 @@ from rich.style import Style
from .color import Color from .color import Color
from .css.types import EdgeStyle, EdgeType from .css.types import EdgeStyle, EdgeType
from ._typing import TypeAlias
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
INNER = 1 INNER = 1
OUTER = 2 OUTER = 2

View File

@@ -13,10 +13,9 @@ without having to render the entire screen.
from __future__ import annotations from __future__ import annotations
import sys
from itertools import chain from itertools import chain
from operator import itemgetter from operator import itemgetter
from typing import TYPE_CHECKING, Callable, Iterable, NamedTuple, cast from typing import TYPE_CHECKING, Iterable, NamedTuple, cast
import rich.repr import rich.repr
from rich.console import Console, ConsoleOptions, RenderableType, RenderResult from rich.console import Console, ConsoleOptions, RenderableType, RenderResult
@@ -27,15 +26,9 @@ from rich.style import Style
from . import errors from . import errors
from ._cells import cell_len from ._cells import cell_len
from ._loop import loop_last from ._loop import loop_last
from ._profile import timer
from ._types import Lines from ._types import Lines
from .geometry import Offset, Region, Size from .geometry import Offset, Region, Size
from ._typing import TypeAlias
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
if TYPE_CHECKING: if TYPE_CHECKING:
from .widget import Widget from .widget import Widget

View File

@@ -1,22 +1,14 @@
from __future__ import annotations from __future__ import annotations
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import sys
from typing import ClassVar, NamedTuple, TYPE_CHECKING from typing import ClassVar, NamedTuple, TYPE_CHECKING
from .geometry import Region, Size, Spacing from .geometry import Region, Size, Spacing
from ._typing import TypeAlias
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
if TYPE_CHECKING: if TYPE_CHECKING:
from .widget import Widget from .widget import Widget
ArrangeResult: TypeAlias = "tuple[list[WidgetPlacement], set[Widget]]" ArrangeResult: TypeAlias = "tuple[list[WidgetPlacement], set[Widget]]"
DockArrangeResult: TypeAlias = "tuple[list[WidgetPlacement], set[Widget], Spacing]" DockArrangeResult: TypeAlias = "tuple[list[WidgetPlacement], set[Widget], Spacing]"

View File

@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import sys
from typing import TYPE_CHECKING, Callable, Iterable, List from typing import TYPE_CHECKING, Callable, Iterable, List
from rich.segment import Segment from rich.segment import Segment
@@ -11,22 +10,16 @@ from ._filter import LineFilter
from ._opacity import _apply_opacity from ._opacity import _apply_opacity
from ._segment_tools import line_crop, line_pad, line_trim from ._segment_tools import line_crop, line_pad, line_trim
from ._types import Lines from ._types import Lines
from ._typing import TypeAlias
from .color import Color from .color import Color
from .geometry import Region, Size, Spacing from .geometry import Region, Size, Spacing
from .renderables.text_opacity import TextOpacity from .renderables.text_opacity import TextOpacity
from .renderables.tint import Tint from .renderables.tint import Tint
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
if TYPE_CHECKING: if TYPE_CHECKING:
from .css.styles import StylesBase from .css.styles import StylesBase
from .widget import Widget from .widget import Widget
RenderLineCallback: TypeAlias = Callable[[int], List[Segment]] RenderLineCallback: TypeAlias = Callable[[int], List[Segment]]

View File

@@ -1,13 +1,8 @@
import sys
from typing import Awaitable, Callable, List, TYPE_CHECKING, Union from typing import Awaitable, Callable, List, TYPE_CHECKING, Union
from rich.segment import Segment from rich.segment import Segment
if sys.version_info >= (3, 8): from textual._typing import Protocol
from typing import Protocol
else:
from typing_extensions import Protocol
if TYPE_CHECKING: if TYPE_CHECKING:
from .message import Message from .message import Message

11
src/textual/_typing.py Normal file
View File

@@ -0,0 +1,11 @@
import sys
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
if sys.version_info >= (3, 8):
from typing import Final, Literal, Protocol, TypedDict
else:
from typing_extensions import Final, Literal, Protocol, TypedDict

View File

@@ -1,8 +1,6 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from asyncio import Task
from contextlib import asynccontextmanager
import inspect import inspect
import io import io
import os import os
@@ -10,14 +8,14 @@ import platform
import sys import sys
import unicodedata import unicodedata
import warnings import warnings
from asyncio import Task
from contextlib import asynccontextmanager
from contextlib import redirect_stderr, redirect_stdout from contextlib import redirect_stderr, redirect_stdout
from datetime import datetime from datetime import datetime
from pathlib import Path, PurePath from pathlib import Path, PurePath
from time import perf_counter from time import perf_counter
from typing import ( from typing import (
Any, Any,
Callable,
Coroutine,
Generic, Generic,
Iterable, Iterable,
Type, Type,
@@ -29,9 +27,6 @@ from typing import (
) )
from weakref import WeakSet, WeakValueDictionary from weakref import WeakSet, WeakValueDictionary
from ._ansi_sequences import SYNC_END, SYNC_START
from ._path import _make_path_object_relative
import nanoid import nanoid
import rich import rich
import rich.repr import rich.repr
@@ -42,10 +37,13 @@ from rich.traceback import Traceback
from . import Logger, LogGroup, LogVerbosity, actions, events, log, messages from . import Logger, LogGroup, LogVerbosity, actions, events, log, messages
from ._animator import Animator, DEFAULT_EASING, Animatable, EasingFunction from ._animator import Animator, DEFAULT_EASING, Animatable, EasingFunction
from ._ansi_sequences import SYNC_END, SYNC_START
from ._callback import invoke from ._callback import invoke
from ._context import active_app from ._context import active_app
from ._event_broker import NoHandler, extract_handler_actions from ._event_broker import NoHandler, extract_handler_actions
from ._filter import LineFilter, Monochrome from ._filter import LineFilter, Monochrome
from ._path import _make_path_object_relative
from ._typing import TypeAlias
from .binding import Binding, Bindings from .binding import Binding, Bindings
from .css.query import NoMatches from .css.query import NoMatches
from .css.stylesheet import Stylesheet from .css.stylesheet import Stylesheet
@@ -67,11 +65,6 @@ if TYPE_CHECKING:
from .devtools.client import DevtoolsClient from .devtools.client import DevtoolsClient
from .pilot import Pilot from .pilot import Pilot
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
PLATFORM = platform.system() PLATFORM = platform.system()
WINDOWS = PLATFORM == "Windows" WINDOWS = PLATFORM == "Windows"

View File

@@ -1,15 +1,11 @@
from __future__ import annotations from __future__ import annotations
import sys
from dataclasses import dataclass from dataclasses import dataclass
from typing import Iterable, MutableMapping from typing import Iterable, MutableMapping
import rich.repr import rich.repr
if sys.version_info >= (3, 10): from textual._typing import TypeAlias
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
BindingType: TypeAlias = "Binding | tuple[str, str, str]" BindingType: TypeAlias = "Binding | tuple[str, str, str]"

View File

@@ -1,9 +1,9 @@
from __future__ import annotations from __future__ import annotations
import sys
from dataclasses import dataclass from dataclasses import dataclass
from typing import Iterable from typing import Iterable, Sequence
from textual._typing import Literal
from textual.color import ColorParseError from textual.color import ColorParseError
from textual.css._help_renderables import Example, Bullet, HelpText from textual.css._help_renderables import Example, Bullet, HelpText
from textual.css.constants import ( from textual.css.constants import (
@@ -15,11 +15,6 @@ from textual.css.constants import (
VALID_TEXT_ALIGN, VALID_TEXT_ALIGN,
) )
if sys.version_info >= (3, 8):
from typing import Literal, Iterable, Sequence
else:
from typing_extensions import Literal
from textual.css._error_tools import friendly_list from textual.css._error_tools import friendly_list
from textual.css.scalar import SYMBOL_UNIT from textual.css.scalar import SYMBOL_UNIT

View File

@@ -1,13 +1,8 @@
from __future__ import annotations from __future__ import annotations
import sys
import typing import typing
if sys.version_info >= (3, 8):
from typing import Final
else:
from typing_extensions import Final # pragma: no cover
from ..geometry import Spacing from ..geometry import Spacing
from .._typing import Final
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
from .types import EdgeType from .types import EdgeType

View File

@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import sys
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from dataclasses import dataclass, field from dataclasses import dataclass, field
from functools import lru_cache from functools import lru_cache
@@ -60,11 +59,7 @@ from .types import (
Visibility, Visibility,
TextAlign, TextAlign,
) )
from .._typing import TypedDict
if sys.version_info >= (3, 8):
from typing import TypedDict
else:
from typing_extensions import TypedDict
if TYPE_CHECKING: if TYPE_CHECKING:
from .._layout import Layout from .._layout import Layout

View File

@@ -1,15 +1,9 @@
from __future__ import annotations from __future__ import annotations
import sys
from typing import Tuple from typing import Tuple
from ..color import Color from ..color import Color
from .._typing import Literal
if sys.version_info >= (3, 8):
from typing import Literal
else:
from typing_extensions import Literal
Edge = Literal["top", "right", "bottom", "left"] Edge = Literal["top", "right", "bottom", "left"]
DockEdge = Literal["top", "right", "bottom", "left", ""] DockEdge = Literal["top", "right", "bottom", "left", ""]

View File

@@ -1,17 +1,11 @@
from __future__ import annotations from __future__ import annotations
import sys
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Iterable from typing import Iterable
from importlib_metadata import version from importlib_metadata import version
if sys.version_info >= (3, 8):
from typing import Literal
else:
from typing_extensions import Literal
from rich.align import Align from rich.align import Align
from rich.console import Console, ConsoleOptions, RenderResult from rich.console import Console, ConsoleOptions, RenderResult
from rich.markup import escape from rich.markup import escape
@@ -22,6 +16,7 @@ from rich.styled import Styled
from rich.table import Table from rich.table import Table
from rich.text import Text from rich.text import Text
from textual._log import LogGroup from textual._log import LogGroup
from textual._typing import Literal
DevConsoleMessageLevel = Literal["info", "warning", "error"] DevConsoleMessageLevel = Literal["info", "warning", "error"]

View File

@@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import re import re
import sys
from collections import deque from collections import deque
from inspect import getfile from inspect import getfile
from typing import ( from typing import (
@@ -42,20 +41,10 @@ if TYPE_CHECKING:
from .screen import Screen from .screen import Screen
from .widget import Widget from .widget import Widget
if sys.version_info >= (3, 8): from textual._typing import Literal, TypeAlias
from typing import Literal
else:
from typing_extensions import Literal
if sys.version_info >= (3, 10):
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
_re_identifier = re.compile(IDENTIFIER) _re_identifier = re.compile(IDENTIFIER)
WalkMethod: TypeAlias = Literal["depth", "breadth"] WalkMethod: TypeAlias = Literal["depth", "breadth"]

View File

@@ -1,13 +1,7 @@
from __future__ import annotations from __future__ import annotations
import sys
from typing import cast from typing import cast
from textual._typing import Final, Literal
if sys.version_info >= (3, 8):
from typing import Final, Literal
else:
from typing_extensions import Final, Literal
FEATURES: Final = {"devtools", "debug", "headless"} FEATURES: Final = {"devtools", "debug", "headless"}

View File

@@ -6,15 +6,11 @@ Functions and classes to manage terminal geometry (anything involving coordinate
from __future__ import annotations from __future__ import annotations
import sys
from functools import lru_cache from functools import lru_cache
from operator import attrgetter, itemgetter from operator import attrgetter, itemgetter
from typing import Any, Collection, NamedTuple, Tuple, TypeVar, Union, cast from typing import Any, Collection, NamedTuple, Tuple, TypeVar, Union, cast
if sys.version_info >= (3, 10): from textual._typing import TypeAlias
from typing import TypeAlias
else: # pragma: no cover
from typing_extensions import TypeAlias
SpacingDimensions: TypeAlias = Union[ SpacingDimensions: TypeAlias = Union[
int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int] int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]

View File

@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import sys
from typing import Iterable, Iterator from typing import Iterable, Iterator
import rich.repr import rich.repr
@@ -13,14 +12,11 @@ from ._compositor import Compositor, MapGeometry
from .timer import Timer from .timer import Timer
from ._types import CallbackType from ._types import CallbackType
from .geometry import Offset, Region, Size from .geometry import Offset, Region, Size
from ._typing import Final
from .reactive import Reactive from .reactive import Reactive
from .renderables.blank import Blank from .renderables.blank import Blank
from .widget import Widget from .widget import Widget
if sys.version_info >= (3, 8):
from typing import Final
else:
from typing_extensions import Final
# Screen updates will be batched so that they don't happen more often than 60 times per second: # Screen updates will be batched so that they don't happen more often than 60 times per second:
UPDATE_PERIOD: Final = 1 / 60 UPDATE_PERIOD: Final = 1 / 60

View File

@@ -5,7 +5,6 @@ from fractions import Fraction
from itertools import islice from itertools import islice
from operator import attrgetter from operator import attrgetter
from typing import ( from typing import (
Awaitable,
Generator, Generator,
TYPE_CHECKING, TYPE_CHECKING,
ClassVar, ClassVar,

View File

@@ -1,14 +1,8 @@
from __future__ import annotations from __future__ import annotations
import sys
from functools import partial from functools import partial
from typing import cast from typing import cast
if sys.version_info >= (3, 8):
from typing import Literal
else:
from typing_extensions import Literal # pragma: no cover
import rich.repr import rich.repr
from rich.console import RenderableType from rich.console import RenderableType
from rich.text import Text, TextType from rich.text import Text, TextType
@@ -18,6 +12,7 @@ from ..css._error_tools import friendly_list
from ..message import Message from ..message import Message
from ..reactive import Reactive from ..reactive import Reactive
from ..widgets import Static from ..widgets import Static
from .._typing import Literal
ButtonVariant = Literal["default", "primary", "success", "warning", "error"] ButtonVariant = Literal["default", "primary", "success", "warning", "error"]
_VALID_BUTTON_VARIANTS = {"default", "primary", "success", "warning", "error"} _VALID_BUTTON_VARIANTS = {"default", "primary", "success", "warning", "error"}

View File

@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import sys
from dataclasses import dataclass, field from dataclasses import dataclass, field
from itertools import chain, zip_longest from itertools import chain, zip_longest
from typing import ClassVar, Generic, Iterable, NamedTuple, TypeVar, cast from typing import ClassVar, Generic, Iterable, NamedTuple, TypeVar, cast
@@ -14,18 +13,13 @@ from rich.text import Text, TextType
from .. import events, messages from .. import events, messages
from .._cache import LRUCache from .._cache import LRUCache
from .._profile import timer
from .._segment_tools import line_crop from .._segment_tools import line_crop
from .._types import Lines from .._types import Lines
from ..geometry import Region, Size, Spacing, clamp from ..geometry import Region, Size, Spacing, clamp
from ..reactive import Reactive from ..reactive import Reactive
from ..render import measure from ..render import measure
from ..scroll_view import ScrollView from ..scroll_view import ScrollView
from .._typing import Literal
if sys.version_info >= (3, 8):
from typing import Literal
else:
from typing_extensions import Literal
CursorType = Literal["cell", "row", "column"] CursorType = Literal["cell", "row", "column"]
CELL: CursorType = "cell" CELL: CursorType = "cell"
@@ -115,16 +109,15 @@ class Coord(NamedTuple):
class DataTable(ScrollView, Generic[CellType], can_focus=True): class DataTable(ScrollView, Generic[CellType], can_focus=True):
DEFAULT_CSS = """ DEFAULT_CSS = """
App.-dark DataTable { App.-dark DataTable {
background:; background:;
} }
DataTable { DataTable {
background: $surface ; background: $surface ;
color: $text; color: $text;
} }
DataTable > .datatable--header { DataTable > .datatable--header {
text-style: bold; text-style: bold;
background: $primary; background: $primary;
color: $text; color: $text;
@@ -136,7 +129,7 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
} }
DataTable > .datatable--odd-row { DataTable > .datatable--odd-row {
} }
DataTable > .datatable--even-row { DataTable > .datatable--even-row {

View File

@@ -1,16 +1,9 @@
import sys
from decimal import Decimal from decimal import Decimal
if sys.version_info >= (3, 10):
from typing import Literal
else: # pragma: no cover
from typing_extensions import Literal
import pytest import pytest
from rich.style import Style from rich.style import Style
from textual.app import ComposeResult
from textual.color import Color from textual.color import Color
from textual.css.errors import StyleValueError from textual.css.errors import StyleValueError
from textual.css.scalar import Scalar, Unit from textual.css.scalar import Scalar, Unit