From 01c95fb4655cebc358b71fadd7ba01eb31a7c3ea Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Fri, 10 Dec 2021 15:24:46 +0100 Subject: [PATCH 1/2] fix(parser): overload parse when using envelope --- .../utilities/parser/envelopes/base.py | 2 +- .../utilities/parser/parser.py | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/envelopes/base.py b/aws_lambda_powertools/utilities/parser/envelopes/base.py index 06e78160d87..85486fdd876 100644 --- a/aws_lambda_powertools/utilities/parser/envelopes/base.py +++ b/aws_lambda_powertools/utilities/parser/envelopes/base.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from typing import Any, Dict, Optional, Type, TypeVar, Union -from ..types import Model +from aws_lambda_powertools.utilities.parser.types import Model logger = logging.getLogger(__name__) diff --git a/aws_lambda_powertools/utilities/parser/parser.py b/aws_lambda_powertools/utilities/parser/parser.py index 7a7f6aec56b..f361b0b26d5 100644 --- a/aws_lambda_powertools/utilities/parser/parser.py +++ b/aws_lambda_powertools/utilities/parser/parser.py @@ -1,15 +1,15 @@ import logging -from typing import Any, Callable, Dict, Optional, Type, TypeVar, Union +from typing import Any, Callable, Dict, Optional, Type, TypeVar, overload + +from aws_lambda_powertools.utilities.parser.types import Model from ...middleware_factory import lambda_handler_decorator from ..typing import LambdaContext from .envelopes.base import Envelope from .exceptions import InvalidEnvelopeError, InvalidModelTypeError -from .types import Model logger = logging.getLogger(__name__) - EventParserReturnType = TypeVar("EventParserReturnType") @@ -19,7 +19,7 @@ def event_parser( event: Dict[str, Any], context: LambdaContext, model: Type[Model], - envelope: Optional[Union[Envelope, Type[Envelope]]] = None, + envelope: Optional[Type[Envelope]] = None, ) -> EventParserReturnType: """Lambda handler decorator to parse & validate events using Pydantic models @@ -81,14 +81,22 @@ def handler(event: Order, context: LambdaContext): InvalidEnvelopeError When envelope given does not implement BaseEnvelope """ - parsed_event = parse(event=event, model=model, envelope=envelope) + parsed_event = parse(event=event, model=model, envelope=envelope) if envelope else parse(event=event, model=model) logger.debug(f"Calling handler {handler.__name__}") return handler(parsed_event, context) -def parse( - event: Dict[str, Any], model: Type[Model], envelope: Optional[Union[Envelope, Type[Envelope]]] = None -) -> Model: +@overload +def parse(event: Dict[str, Any], model: Type[Model]) -> Model: + ... + + +@overload +def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]): + ... + + +def parse(event: Dict[str, Any], model: Type[Model], envelope: Optional[Type[Envelope]] = None): """Standalone function to parse & validate events using Pydantic models Typically used when you need fine-grained control over error handling compared to event_parser decorator. From eefb9e1cfcd8b66e8c2060b04853e059d6680607 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Fri, 10 Dec 2021 15:50:46 +0100 Subject: [PATCH 2/2] chore: move generics to types --- aws_lambda_powertools/utilities/parser/parser.py | 8 +++----- aws_lambda_powertools/utilities/parser/types.py | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/parser.py b/aws_lambda_powertools/utilities/parser/parser.py index f361b0b26d5..a12f163f8a6 100644 --- a/aws_lambda_powertools/utilities/parser/parser.py +++ b/aws_lambda_powertools/utilities/parser/parser.py @@ -1,7 +1,7 @@ import logging -from typing import Any, Callable, Dict, Optional, Type, TypeVar, overload +from typing import Any, Callable, Dict, Optional, Type, overload -from aws_lambda_powertools.utilities.parser.types import Model +from aws_lambda_powertools.utilities.parser.types import EnvelopeModel, EventParserReturnType, Model from ...middleware_factory import lambda_handler_decorator from ..typing import LambdaContext @@ -10,8 +10,6 @@ logger = logging.getLogger(__name__) -EventParserReturnType = TypeVar("EventParserReturnType") - @lambda_handler_decorator def event_parser( @@ -92,7 +90,7 @@ def parse(event: Dict[str, Any], model: Type[Model]) -> Model: @overload -def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]): +def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]) -> EnvelopeModel: ... diff --git a/aws_lambda_powertools/utilities/parser/types.py b/aws_lambda_powertools/utilities/parser/types.py index 2565e52c764..20958bd9c21 100644 --- a/aws_lambda_powertools/utilities/parser/types.py +++ b/aws_lambda_powertools/utilities/parser/types.py @@ -12,3 +12,5 @@ from typing_extensions import Literal # noqa: F401 Model = TypeVar("Model", bound=BaseModel) +EnvelopeModel = TypeVar("EnvelopeModel") +EventParserReturnType = TypeVar("EventParserReturnType")