Skip to content

Commit

Permalink
fix: Fix Annotated + strawberry.lazy + deferred annotations
Browse files Browse the repository at this point in the history
Fix #3491
  • Loading branch information
bellini666 committed May 22, 2024
1 parent fc322a8 commit f960901
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 1 deletion.
21 changes: 21 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -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!
2 changes: 1 addition & 1 deletion strawberry/utils/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
38 changes: 38 additions & 0 deletions tests/utils/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down

0 comments on commit f960901

Please sign in to comment.