Skip to content

fix(v3): revert unnecessary changes that impacts v3 #5087

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions aws_lambda_powertools/event_handler/openapi/constants.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
from pydantic import ConfigDict

DEFAULT_API_VERSION = "1.0.0"
DEFAULT_OPENAPI_VERSION = "3.1.0"
MODEL_CONFIG_ALLOW = ConfigDict(extra="allow")
MODEL_CONFIG_IGNORE = ConfigDict(extra="ignore")
9 changes: 4 additions & 5 deletions aws_lambda_powertools/event_handler/openapi/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
from enum import Enum
from typing import Any, Dict, List, Literal, Optional, Set, Union

from pydantic import AnyUrl, BaseModel, Field
from pydantic import AnyUrl, BaseModel, ConfigDict, Field
from typing_extensions import Annotated

from aws_lambda_powertools.event_handler.openapi.compat import model_rebuild
from aws_lambda_powertools.event_handler.openapi.constants import (
MODEL_CONFIG_ALLOW,
MODEL_CONFIG_IGNORE,
)

MODEL_CONFIG_ALLOW = ConfigDict(extra="allow")
MODEL_CONFIG_IGNORE = ConfigDict(extra="ignore")

"""
The code defines Pydantic models for the various OpenAPI objects like OpenAPI, PathItem, Operation, Parameter etc.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from pydantic import BaseModel, Field, field_validator

from aws_lambda_powertools.event_handler.openapi.constants import (
from aws_lambda_powertools.event_handler.openapi.models import (
MODEL_CONFIG_ALLOW,
)
from aws_lambda_powertools.shared.functions import powertools_dev_is_set
Expand Down
5 changes: 2 additions & 3 deletions aws_lambda_powertools/event_handler/openapi/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
from enum import Enum
from typing import TYPE_CHECKING, Any, Callable, Dict, Set, Type, TypedDict, Union

from pydantic import BaseModel

if TYPE_CHECKING:
from pydantic import BaseModel # noqa: F401
from typing_extensions import NotRequired

CacheKey = Union[Callable[..., Any], None]
IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]]
TypeModelOrEnum = Union[Type[BaseModel], Type[Enum]]
TypeModelOrEnum = Union[Type["BaseModel"], Type[Enum]]
ModelNameMap = Dict[TypeModelOrEnum, str]
UnionType = getattr(types, "UnionType", Union)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,21 @@

import enum
import re
from typing import Any
import warnings
from typing import Any, overload

from typing_extensions import deprecated

from aws_lambda_powertools.utilities.data_classes.common import (
BaseRequestContext,
BaseRequestContextV2,
CaseInsensitiveDict,
DictWrapper,
)
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
get_header_value,
)
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning


class APIGatewayRouteArn:
Expand Down Expand Up @@ -162,6 +169,55 @@ def stage_variables(self) -> dict[str, str]:
def request_context(self) -> BaseRequestContext:
return BaseRequestContext(self._data)

@overload
def get_header_value(
self,
name: str,
default_value: str,
case_sensitive: bool = False,
) -> str: ...

@overload
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None: ...

@deprecated(
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
category=None,
)
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None:
"""Get header value by name
Parameters
----------
name: str
Header name
default_value: str, optional
Default value if no value was found by name
case_sensitive: bool
Whether to use a case-sensitive look up
Returns
-------
str, optional
Header value
"""
warnings.warn(
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
"no longer has any effect. This function will be removed in the next major version. "
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
category=PowertoolsDeprecationWarning,
stacklevel=2,
)
return get_header_value(self.headers, name, default_value, case_sensitive)


class APIGatewayAuthorizerEventV2(DictWrapper):
"""API Gateway Authorizer Event Format 2.0
Expand Down Expand Up @@ -244,6 +300,50 @@ def path_parameters(self) -> dict[str, str]:
def stage_variables(self) -> dict[str, str]:
return self.get("stageVariables") or {}

@overload
def get_header_value(self, name: str, default_value: str, case_sensitive: bool = False) -> str: ...

@overload
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None: ...

@deprecated(
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
category=None,
)
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None:
"""Get header value by name
Parameters
----------
name: str
Header name
default_value: str, optional
Default value if no value was found by name
case_sensitive: bool
Whether to use a case-sensitive look up
Returns
-------
str, optional
Header value
"""
warnings.warn(
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
"no longer has any effect. This function will be removed in the next major version. "
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
category=PowertoolsDeprecationWarning,
stacklevel=2,
)
return get_header_value(self.headers, name, default_value, case_sensitive)


class APIGatewayAuthorizerResponseV2:
"""Api Gateway HTTP API V2 payload authorizer simple response helper
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
from __future__ import annotations

from typing import Any
import warnings
from typing import Any, overload

from typing_extensions import deprecated

from aws_lambda_powertools.utilities.data_classes.common import CaseInsensitiveDict, DictWrapper
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
get_header_value,
)
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning


def get_identity_object(identity: dict | None) -> Any:
Expand Down Expand Up @@ -212,3 +219,52 @@ def stash(self) -> dict:
stash to pass arbitrary data across request and response mapping templates, and across functions in
a pipeline resolver."""
return self.get("stash") or {}

@overload
def get_header_value(
self,
name: str,
default_value: str,
case_sensitive: bool = False,
) -> str: ...

@overload
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None: ...

@deprecated(
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
category=None,
)
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None:
"""Get header value by name
Parameters
----------
name: str
Header name
default_value: str, optional
Default value if no value was found by name
case_sensitive: bool
Whether to use a case-sensitive look up
Returns
-------
str, optional
Header value
"""
warnings.warn(
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
"no longer has any effect. This function will be removed in the next major version. "
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
category=PowertoolsDeprecationWarning,
stacklevel=2,
)
return get_header_value(self.request_headers, name, default_value, case_sensitive)
115 changes: 114 additions & 1 deletion aws_lambda_powertools/utilities/data_classes/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,23 @@

import base64
import json
import warnings
from functools import cached_property
from typing import TYPE_CHECKING, Any, Callable, Iterator, Mapping
from typing import TYPE_CHECKING, Any, Callable, Iterator, Mapping, overload

from typing_extensions import deprecated

from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning

if TYPE_CHECKING:
from aws_lambda_powertools.shared.headers_serializer import BaseHeadersSerializer

from aws_lambda_powertools.utilities.data_classes.shared_functions import (
get_header_value,
get_multi_value_query_string_values,
get_query_string_value,
)


class CaseInsensitiveDict(dict):
"""Case insensitive dict implementation. Assumes string keys only."""
Expand Down Expand Up @@ -208,6 +219,108 @@ def http_method(self) -> str:
"""The HTTP method used. Valid values include: DELETE, GET, HEAD, OPTIONS, PATCH, POST, and PUT."""
return self["httpMethod"]

@overload
def get_query_string_value(self, name: str, default_value: str) -> str: ...

@overload
def get_query_string_value(self, name: str, default_value: str | None = None) -> str | None: ...

def get_query_string_value(self, name: str, default_value: str | None = None) -> str | None:
"""Get query string value by name
Parameters
----------
name: str
Query string parameter name
default_value: str, optional
Default value if no value was found by name
Returns
-------
str, optional
Query string parameter value
"""
return get_query_string_value(
query_string_parameters=self.query_string_parameters,
name=name,
default_value=default_value,
)

def get_multi_value_query_string_values(
self,
name: str,
default_values: list[str] | None = None,
) -> list[str]:
"""Get multi-value query string parameter values by name
Parameters
----------
name: str
Multi-Value query string parameter name
default_values: List[str], optional
Default values is no values are found by name
Returns
-------
List[str], optional
List of query string values
"""
return get_multi_value_query_string_values(
multi_value_query_string_parameters=self.multi_value_query_string_parameters,
name=name,
default_values=default_values,
)

@overload
def get_header_value(
self,
name: str,
default_value: str,
case_sensitive: bool = False,
) -> str: ...

@overload
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None: ...

@deprecated(
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
category=None,
)
def get_header_value(
self,
name: str,
default_value: str | None = None,
case_sensitive: bool = False,
) -> str | None:
"""Get header value by name
Parameters
----------
name: str
Header name
default_value: str, optional
Default value if no value was found by name
case_sensitive: bool
Whether to use a case-sensitive look up. By default we make a case-insensitive lookup.
Returns
-------
str, optional
Header value
"""
warnings.warn(
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
"no longer has any effect. This function will be removed in the next major version. "
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
category=PowertoolsDeprecationWarning,
stacklevel=2,
)
return get_header_value(
headers=self.headers,
name=name,
default_value=default_value,
case_sensitive=case_sensitive,
)

def header_serializer(self) -> BaseHeadersSerializer:
raise NotImplementedError()

Expand Down
Loading
Loading