diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000000..5ce366cab8 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,21 @@ +Release type: patch + +This release fixes an issue when using `Annotated` + `strawberry.lazy` + +deferred annotations such as: + +```python +from __future__ import annotations +import strawberry +from typing import Annotated + + +@strawberry.type +class Query: + a: Annotated["datetime", strawberry.lazy("datetime")] + + +schema = strawberry.Schema(Query) +``` + +Before this would only work if `datetime` was not inside quotes. Now it should +work as expected! diff --git a/strawberry/utils/typing.py b/strawberry/utils/typing.py index 353fa40162..bb786499b0 100644 --- a/strawberry/utils/typing.py +++ b/strawberry/utils/typing.py @@ -302,7 +302,7 @@ def _get_namespace_from_ast( # here to resolve lazy types by execing the annotated args, resolving the # type directly and then adding it to extra namespace, so that _eval_type # can properly resolve it later - type_name = args[0].strip() + type_name = args[0].strip(" '\"\n") for arg in args[1:]: evaled_arg = eval(arg, globalns, localns) # noqa: PGH001, S307 if isinstance(evaled_arg, StrawberryLazyReference): diff --git a/tests/utils/test_typing.py b/tests/utils/test_typing.py index addc11ebf1..a597c75038 100644 --- a/tests/utils/test_typing.py +++ b/tests/utils/test_typing.py @@ -62,6 +62,44 @@ class Foo: ... ) == Annotated[strawberry.auto, "foobar"] ) + assert ( + eval_type( + ForwardRef("Annotated[datetime, strawberry.lazy('datetime')]"), + {"strawberry": strawberry, "Annotated": Annotated}, + None, + ) + == Annotated[ + LazyType("datetime", "datetime"), + strawberry.lazy("datetime"), + ] + ) + + +def test_eval_type_with_deferred_annotations(): + assert ( + eval_type( + ForwardRef( + "Annotated['Fruit', strawberry.lazy('tests.utils.test_typing')]" + ), + {"strawberry": strawberry, "Annotated": Annotated}, + None, + ) + == Annotated[ + LazyType("Fruit", "tests.utils.test_typing"), + strawberry.lazy("tests.utils.test_typing"), + ] + ) + assert ( + eval_type( + ForwardRef("Annotated['datetime', strawberry.lazy('datetime')]"), + {"strawberry": strawberry, "Annotated": Annotated}, + None, + ) + == Annotated[ + LazyType("datetime", "datetime"), + strawberry.lazy("datetime"), + ] + ) def test_is_classvar():