diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 68e912c9..16e532fd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,10 +24,8 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ["3.8", "3.13"] + python-version: ["3.9", "3.13"] include: - - os: ubuntu-latest - python-version: "3.9" - os: ubuntu-latest python-version: "3.10" - os: ubuntu-latest diff --git a/pyproject.toml b/pyproject.toml index c45fbca5..8f9ad3d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ classifiers = [ "Programming Language :: Python", "Typing :: Typed", ] -requires-python = ">=3.8" +requires-python = ">=3.9" dynamic = ["version"] [project.urls] @@ -86,7 +86,7 @@ build = [ [tool.mypy] files = "traitlets" -python_version = "3.8" +python_version = "3.9" strict = true enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] pretty = true diff --git a/tests/test_typing.py b/tests/test_typing.py index 8329feb8..94044747 100644 --- a/tests/test_typing.py +++ b/tests/test_typing.py @@ -407,27 +407,27 @@ class T(HasTraits): otcp = TCPAddress(None, allow_none=True) t = T() - reveal_type(t.tcp) # R: Tuple[builtins.str, builtins.int] + reveal_type(t.tcp) # R: tuple[builtins.str, builtins.int] reveal_type( - T.tcp # R: traitlets.traitlets.TCPAddress[Tuple[builtins.str, builtins.int], Tuple[builtins.str, builtins.int]] + T.tcp # R: traitlets.traitlets.TCPAddress[tuple[builtins.str, builtins.int], tuple[builtins.str, builtins.int]] ) reveal_type( - T.tcp.tag( # R:traitlets.traitlets.TCPAddress[Tuple[builtins.str, builtins.int], Tuple[builtins.str, builtins.int]] + T.tcp.tag( # R:traitlets.traitlets.TCPAddress[tuple[builtins.str, builtins.int], tuple[builtins.str, builtins.int]] sync=True ) ) - reveal_type(t.otcp) # R: Union[Tuple[builtins.str, builtins.int], None] + reveal_type(t.otcp) # R: Union[tuple[builtins.str, builtins.int], None] reveal_type( - T.otcp # R: traitlets.traitlets.TCPAddress[Union[Tuple[builtins.str, builtins.int], None], Union[Tuple[builtins.str, builtins.int], None]] + T.otcp # R: traitlets.traitlets.TCPAddress[Union[tuple[builtins.str, builtins.int], None], Union[tuple[builtins.str, builtins.int], None]] ) reveal_type( - T.otcp.tag( # R: traitlets.traitlets.TCPAddress[Union[Tuple[builtins.str, builtins.int], None], Union[Tuple[builtins.str, builtins.int], None]] + T.otcp.tag( # R: traitlets.traitlets.TCPAddress[Union[tuple[builtins.str, builtins.int], None], Union[tuple[builtins.str, builtins.int], None]] sync=True ) ) - t.tcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Tuple[str, int]") [assignment] - t.otcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Optional[Tuple[str, int]]") [assignment] - t.tcp = None # E: Incompatible types in assignment (expression has type "None", variable has type "Tuple[str, int]") [assignment] + t.tcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "tuple[str, int]") [assignment] + t.otcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Optional[tuple[str, int]]") [assignment] + t.tcp = None # E: Incompatible types in assignment (expression has type "None", variable has type "tuple[str, int]") [assignment] @pytest.mark.mypy_testing diff --git a/traitlets/_version.py b/traitlets/_version.py index fea66b5e..c827594c 100644 --- a/traitlets/_version.py +++ b/traitlets/_version.py @@ -4,7 +4,6 @@ from __future__ import annotations import re -from typing import List # Version string must appear intact for hatch versioning __version__ = "5.14.3" @@ -13,7 +12,7 @@ pattern = r"(?P\d+).(?P\d+).(?P\d+)(?P.*)" match = re.match(pattern, __version__) assert match is not None -parts: List[object] = [int(match[part]) for part in ["major", "minor", "patch"]] +parts: list[object] = [int(match[part]) for part in ["major", "minor", "patch"]] if match["rest"]: parts.append(match["rest"]) version_info = tuple(parts) diff --git a/traitlets/tests/utils.py b/traitlets/tests/utils.py index 3ff4bcf4..b1cff030 100644 --- a/traitlets/tests/utils.py +++ b/traitlets/tests/utils.py @@ -1,8 +1,9 @@ from __future__ import annotations import sys +from collections.abc import Sequence from subprocess import PIPE, Popen -from typing import Any, Sequence +from typing import Any def get_output_error_code(cmd: str | Sequence[str]) -> tuple[str, str, Any]: diff --git a/traitlets/utils/__init__.py b/traitlets/utils/__init__.py index 2695dc73..10d6a80f 100644 --- a/traitlets/utils/__init__.py +++ b/traitlets/utils/__init__.py @@ -2,7 +2,7 @@ import os import pathlib -from typing import Sequence +from collections.abc import Sequence # vestigal things from IPython_genutils. diff --git a/traitlets/utils/decorators.py b/traitlets/utils/decorators.py index 5b77d701..923959a7 100644 --- a/traitlets/utils/decorators.py +++ b/traitlets/utils/decorators.py @@ -3,7 +3,7 @@ import copy from inspect import Parameter, Signature, signature -from typing import Any, Type, TypeVar +from typing import Any, TypeVar from ..traitlets import HasTraits, Undefined @@ -16,7 +16,7 @@ def _get_default(value: Any) -> Any: T = TypeVar("T", bound=HasTraits) -def signature_has_traits(cls: Type[T]) -> Type[T]: +def signature_has_traits(cls: type[T]) -> type[T]: """Return a decorated class with a constructor signature that contain Trait names as kwargs.""" traits = [ (name, _get_default(value.default_value)) diff --git a/traitlets/utils/nested_update.py b/traitlets/utils/nested_update.py index 33a5ab8a..976beff6 100644 --- a/traitlets/utils/nested_update.py +++ b/traitlets/utils/nested_update.py @@ -2,10 +2,10 @@ # Distributed under the terms of the Modified BSD License. from __future__ import annotations -from typing import Any, Dict +from typing import Any -def nested_update(this: Dict[Any, Any], that: Dict[Any, Any]) -> Dict[Any, Any]: +def nested_update(this: dict[Any, Any], that: dict[Any, Any]) -> dict[Any, Any]: """Merge two nested dictionaries. Effectively a recursive ``dict.update``. diff --git a/traitlets/utils/text.py b/traitlets/utils/text.py index 22fc9df5..a177c2ca 100644 --- a/traitlets/utils/text.py +++ b/traitlets/utils/text.py @@ -6,7 +6,6 @@ import re import textwrap from textwrap import indent as _indent -from typing import List def indent(val: str) -> str: @@ -32,7 +31,7 @@ def _dedent(text: str) -> str: return "\n".join([first, rest]) -def wrap_paragraphs(text: str, ncols: int = 80) -> List[str]: +def wrap_paragraphs(text: str, ncols: int = 80) -> list[str]: """Wrap multiple paragraphs to fit a specified width. This is equivalent to textwrap.wrap, but with support for multiple