diff --git a/packages/modern-di-faststream/tests_faststream/dependencies.py b/packages/modern-di-faststream/tests_faststream/dependencies.py index 1a85496..ce2ee97 100644 --- a/packages/modern-di-faststream/tests_faststream/dependencies.py +++ b/packages/modern-di-faststream/tests_faststream/dependencies.py @@ -1,4 +1,5 @@ import dataclasses +import typing from faststream import StreamMessage from modern_di import Group, Scope, providers @@ -14,7 +15,7 @@ class DependentCreator: dep1: SimpleCreator -def fetch_message_is_processed_from_request(message: StreamMessage) -> bool: # type:ignore[type-arg] +def fetch_message_is_processed_from_request(message: StreamMessage[typing.Any]) -> bool: return message.processed diff --git a/packages/modern-di-litestar/tests_litestar/dependencies.py b/packages/modern-di-litestar/tests_litestar/dependencies.py index 8442619..a503cfd 100644 --- a/packages/modern-di-litestar/tests_litestar/dependencies.py +++ b/packages/modern-di-litestar/tests_litestar/dependencies.py @@ -1,4 +1,5 @@ import dataclasses +import typing import litestar from modern_di import Group, Scope, providers @@ -14,12 +15,12 @@ class DependentCreator: dep1: SimpleCreator -def fetch_method_from_request(request: litestar.Request) -> str: # type: ignore[type-arg] +def fetch_method_from_request(request: litestar.Request[typing.Any, typing.Any, typing.Any]) -> str: assert isinstance(request, litestar.Request) return request.method -def fetch_url_from_websocket(websocket: litestar.WebSocket) -> str: # type: ignore[type-arg] +def fetch_url_from_websocket(websocket: litestar.WebSocket[typing.Any, typing.Any, typing.Any]) -> str: assert isinstance(websocket, litestar.WebSocket) return websocket.url.path diff --git a/packages/modern-di/modern_di/types_parser.py b/packages/modern-di/modern_di/types_parser.py index c3c9d60..83df6c4 100644 --- a/packages/modern-di/modern_di/types_parser.py +++ b/packages/modern-di/modern_di/types_parser.py @@ -22,10 +22,7 @@ def from_type(cls, type_: type, default: object = UNSET) -> "SignatureItem": type_ = type_.__args__[0] result: dict[str, typing.Any] = {"default": default} - if isinstance(type_, types.GenericAlias): - result["arg_type"] = type_.__origin__ - result["args"] = list(type_.__args__) - elif isinstance(type_, (types.UnionType, typing._UnionGenericAlias)): # type: ignore[attr-defined] # noqa: SLF001 + if isinstance(type_, (types.UnionType, typing._UnionGenericAlias)): # type: ignore[attr-defined] # noqa: SLF001 args = [x.__origin__ if isinstance(x, types.GenericAlias) else x for x in type_.__args__] if types.NoneType in args: result["is_nullable"] = True @@ -34,6 +31,10 @@ def from_type(cls, type_: type, default: object = UNSET) -> "SignatureItem": result["args"] = args elif args: result["arg_type"] = args[0] + elif isinstance(type_, (types.GenericAlias, typing._GenericAlias)): # type: ignore[attr-defined] # noqa: SLF001 + result["arg_type"] = type_.__origin__ + result["args"] = list(type_.__args__) + elif isinstance(type_, type): result["arg_type"] = type_ return cls(**result) diff --git a/packages/modern-di/tests_core/test_types_parser.py b/packages/modern-di/tests_core/test_types_parser.py index 5c3d56e..a40be7a 100644 --- a/packages/modern-di/tests_core/test_types_parser.py +++ b/packages/modern-di/tests_core/test_types_parser.py @@ -2,9 +2,13 @@ import typing import pytest +from modern_di import types from modern_di.types_parser import SignatureItem, parse_creator +class GenericClass(typing.Generic[types.T]): ... + + @pytest.mark.parametrize( ("type_", "result"), [ @@ -17,6 +21,7 @@ (str | int, SignatureItem(args=[str, int])), (typing.Union[str | int], SignatureItem(args=[str, int])), # noqa: UP007 (list[str] | None, SignatureItem(arg_type=list, is_nullable=True)), + (GenericClass[str], SignatureItem(arg_type=GenericClass, args=[str])), ], ) def test_signature_item_parser(type_: type, result: SignatureItem) -> None: