diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5b9c58d3..0b279fc2 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,7 +15,8 @@ hide: - Per stack encoders. - Leverage new lilya encoder API. Encoders can use `__type__` -- **Breaking** for custom Encoders implementing encode either `__type__` or `is_type_structure` must be provided. +- **Breaking** For custom Encoders implementing encode either `__type__` or `is_type_structure` must be provided. +- **Breaking** For Python >=3.10 eval_str is used for retrieving the annotations of a function. The results can be slightly different. ## 3.5.0 diff --git a/esmerald/transformers/signature.py b/esmerald/transformers/signature.py index 8d3f0fc5..3d8ccfc7 100644 --- a/esmerald/transformers/signature.py +++ b/esmerald/transformers/signature.py @@ -1,4 +1,5 @@ import re +import sys from inspect import Parameter as InspectParameter, Signature as InspectSignature from typing import ( TYPE_CHECKING, @@ -41,6 +42,10 @@ object_setattr = object.__setattr__ +_signature_kwargs: dict = {} +if sys.version_info >= (3, 10): + _signature_kwargs["eval_str"] = True + def is_server_error(error: Any, klass: Type["SignatureModel"]) -> bool: """ @@ -350,7 +355,7 @@ def __init__(self, fn: "AnyCallable", dependency_names: Set[str], **kwargs: Any) """ super().__init__(**kwargs) self.fn = fn - self.signature = InspectSignature.from_callable(self.fn) + self.signature = InspectSignature.from_callable(self.fn, **_signature_kwargs) self.fn_name = fn.__name__ if hasattr(fn, "__name__") else "anonymous" self.defaults: Dict[str, Any] = {} self.dependency_names = dependency_names diff --git a/tests/dependencies/test_simple_case_injected_annotation.py b/tests/dependencies/test_simple_case_injected_annotation.py index 21c95a68..57f09071 100644 --- a/tests/dependencies/test_simple_case_injected_annotation.py +++ b/tests/dependencies/test_simple_case_injected_annotation.py @@ -1,14 +1,11 @@ -from typing import TYPE_CHECKING, List +from typing import List from esmerald import post from esmerald.injector import Inject from esmerald.routing.apis.views import APIView from esmerald.routing.gateways import Gateway from esmerald.testclient import create_client -from tests.dependencies.samples import DocumentService - -if TYPE_CHECKING: - from tests.dependencies.samples import DocumentCreateDTO +from tests.dependencies.samples import DocumentCreateDTO, DocumentService class DocumentAPIView(APIView): @@ -25,7 +22,6 @@ async def create( def test_injection(): - with create_client(routes=[Gateway(handler=DocumentAPIView)]) as client: response = client.post("/", json={"name": "test", "content": "test"}) assert response.status_code == 201