From 8232a9fde83ef2b29635e426dbaf9058b27fba1f Mon Sep 17 00:00:00 2001 From: raceychan Date: Sat, 23 Nov 2024 05:36:08 +0800 Subject: [PATCH] chores: reduce redudant typevar, add support for python3.13 --- .github/workflows/coverage.yml | 2 +- README.md | 9 +++++---- ididi/_ds.py | 3 +-- ididi/_itypes.py | 6 +----- ididi/_type_resolve.py | 4 ++-- ididi/api.py | 6 +----- ididi/graph.py | 9 ++++----- ididi/node.py | 7 +------ ididi/utils/param_utils.py | 2 +- ididi/utils/typing_utils.py | 3 +++ ididi/visual.py | 3 +-- pyproject.toml | 1 + 12 files changed, 22 insertions(+), 33 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index a3252da4..a37b4285 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/README.md b/README.md index 2fba2103..c4f73d73 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ ## Install +ididi requires python >= 3.9 + ```bash pip install ididi ``` @@ -60,11 +62,9 @@ NOTE: 2. async resource in a sync dependent is not supported, but sync resource in a async dependent is supported. ```python -from ididi import DependencyGraph +import ididi -dg = DependencyGraph() -@dg.node async def get_db(client: Client) -> ty.AsyncGenerator[DataBase, None]: db = DataBase(client) assert client.is_opened @@ -74,13 +74,14 @@ async def get_db(client: Client) -> ty.AsyncGenerator[DataBase, None]: finally: await db.close() -@dg.entry +@ididi.entry async def main(db: DataBase, sql: str) -> ty.Any: res = await db.execute(sql) return res assert await main(sql="select money from bank") ``` + > [!NOTE] > **`DependencyGraph.node` accepts a wide arrange of types, such as dependent class, sync/async facotry, sync/async resource factory, with typing support.** diff --git a/ididi/_ds.py b/ididi/_ds.py index ee214447..fc27819c 100644 --- a/ididi/_ds.py +++ b/ididi/_ds.py @@ -5,8 +5,7 @@ from ._type_resolve import get_bases from .node import DependentNode from .utils.param_utils import MISSING, Maybe - -T = ty.TypeVar("T") +from .utils.typing_utils import T GraphNodes = dict[type[T], DependentNode[T]] """ diff --git a/ididi/_itypes.py b/ididi/_itypes.py index 29509e12..67993fe2 100644 --- a/ididi/_itypes.py +++ b/ididi/_itypes.py @@ -1,11 +1,7 @@ import inspect import typing as ty -from typing_extensions import ParamSpec - -R = ty.TypeVar("R") -P = ParamSpec("P") -T = ty.TypeVar("T") +from .utils.typing_utils import P, R, T EMPTY_SIGNATURE = inspect.Signature() INSPECT_EMPTY = inspect.Signature.empty diff --git a/ididi/_type_resolve.py b/ididi/_type_resolve.py index 5f44c26b..b3ce6989 100644 --- a/ididi/_type_resolve.py +++ b/ididi/_type_resolve.py @@ -11,13 +11,13 @@ import typing_extensions as tye -from ._itypes import AsyncClosable, Closable, T +from ._itypes import AsyncClosable, Closable from .errors import ( ForwardReferenceNotFoundError, GenericDependencyNotSupportedError, MissingReturnTypeError, ) -from .utils.typing_utils import eval_type, get_full_typed_signature, is_builtin_type +from .utils.typing_utils import T, eval_type, get_full_typed_signature, is_builtin_type SyncResource = ty.Union[ty.ContextManager[ty.Any], Closable] AsyncResource = ty.Union[ty.AsyncContextManager[ty.Any], AsyncClosable] diff --git a/ididi/api.py b/ididi/api.py index cea71d90..5884ee55 100644 --- a/ididi/api.py +++ b/ididi/api.py @@ -1,11 +1,7 @@ import typing as ty -import typing_extensions as tye - from .graph import DependencyGraph as DependencyGraph - -T = ty.TypeVar("T") -P = tye.ParamSpec("P") +from .utils.typing_utils import P, T def entry( diff --git a/ididi/graph.py b/ididi/graph.py index 845b71f8..61153290 100644 --- a/ididi/graph.py +++ b/ididi/graph.py @@ -43,10 +43,9 @@ ) from .node import DependentNode, LazyDependent from .utils.param_utils import MISSING, Maybe, is_provided +from .utils.typing_utils import P, T -T = ty.TypeVar("T") Stack = ty.TypeVar("Stack", ExitStack, AsyncExitStack) -P = tye.ParamSpec("P") class AbstractScope(ty.Generic[Stack]): @@ -472,7 +471,7 @@ def _resolve_concrete_node( return node def replace_node( - self, old_node: DependentNode[ty.Any], new_node: DependentNode[ty.Any] + self, old_node: DependentNode[T], new_node: DependentNode[T] ) -> None: """ Replace an existing node with a new node. @@ -527,7 +526,7 @@ def static_resolve( self, dependent: ty.Union[type, ty.Callable[P, T]], node_config: Maybe[NodeConfig] = MISSING, - ) -> DependentNode[ty.Any]: + ) -> DependentNode[T]: """ Resolve a dependency without building its instance. Args: @@ -542,7 +541,7 @@ def static_resolve( def dfs( dependent_factory: ty.Union[type, ty.Callable[P, T]], node_config: Maybe[NodeConfig], - ) -> DependentNode[ty.Any]: + ) -> DependentNode[T]: if is_function(dependent_factory): sig = get_typed_signature(dependent_factory) diff --git a/ididi/node.py b/ididi/node.py index e450ca2b..20d28b0e 100644 --- a/ididi/node.py +++ b/ididi/node.py @@ -5,8 +5,6 @@ from functools import lru_cache from inspect import Parameter -import typing_extensions as tye - from ._itypes import ( EMPTY_SIGNATURE, INSPECT_EMPTY, @@ -33,10 +31,7 @@ ProtocolFacotryNotProvidedError, ) from .utils.param_utils import MISSING, Maybe, is_provided -from .utils.typing_utils import get_factory_sig_from_cls - -T = ty.TypeVar("T") -P = tye.ParamSpec("P") +from .utils.typing_utils import P, T, get_factory_sig_from_cls class Dependent(ty.Generic[T]): diff --git a/ididi/utils/param_utils.py b/ididi/utils/param_utils.py index b1838f63..a9c9c21a 100644 --- a/ididi/utils/param_utils.py +++ b/ididi/utils/param_utils.py @@ -2,7 +2,7 @@ import typing_extensions as tye -T = ty.TypeVar("T") +from .typing_utils import T class _Missed: diff --git a/ididi/utils/typing_utils.py b/ididi/utils/typing_utils.py index a9135cef..74d55f9d 100644 --- a/ididi/utils/typing_utils.py +++ b/ididi/utils/typing_utils.py @@ -2,9 +2,12 @@ import typing as ty from typing import _eval_type as ty_eval_type # type: ignore + import typing_extensions as tye T = ty.TypeVar("T") +R = ty.TypeVar("R") +P = tye.ParamSpec("P") PrimitiveBuiltins = type[ty.Union[int, float, complex, str, bool, bytes, bytearray]] ContainerBuiltins = type[ diff --git a/ididi/visual.py b/ididi/visual.py index 8ee642d3..20825806 100644 --- a/ididi/visual.py +++ b/ididi/visual.py @@ -1,12 +1,11 @@ import typing as ty +from .utils.typing_utils import T from graphviz import Digraph from .graph import DependencyGraph from .node import DependentNode as DependentNode -T = ty.TypeVar("T") - class Visualizer: def __init__( diff --git a/pyproject.toml b/pyproject.toml index 2d578b8d..4d6c3676 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] [project.optional-dependencies]