Skip to content

Commit 69cd4d2

Browse files
fix(v3): revert unnecessary changes that impacts v3 (#5087)
* Fix unexpected bugs in v3 * Fix unexpected bugs in v3
1 parent 6acc5fa commit 69cd4d2

19 files changed

+457
-203
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,2 @@
1-
from pydantic import ConfigDict
2-
31
DEFAULT_API_VERSION = "1.0.0"
42
DEFAULT_OPENAPI_VERSION = "3.1.0"
5-
MODEL_CONFIG_ALLOW = ConfigDict(extra="allow")
6-
MODEL_CONFIG_IGNORE = ConfigDict(extra="ignore")

aws_lambda_powertools/event_handler/openapi/models.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22
from enum import Enum
33
from typing import Any, Dict, List, Literal, Optional, Set, Union
44

5-
from pydantic import AnyUrl, BaseModel, Field
5+
from pydantic import AnyUrl, BaseModel, ConfigDict, Field
66
from typing_extensions import Annotated
77

88
from aws_lambda_powertools.event_handler.openapi.compat import model_rebuild
9-
from aws_lambda_powertools.event_handler.openapi.constants import (
10-
MODEL_CONFIG_ALLOW,
11-
MODEL_CONFIG_IGNORE,
12-
)
9+
10+
MODEL_CONFIG_ALLOW = ConfigDict(extra="allow")
11+
MODEL_CONFIG_IGNORE = ConfigDict(extra="ignore")
1312

1413
"""
1514
The code defines Pydantic models for the various OpenAPI objects like OpenAPI, PathItem, Operation, Parameter etc.

aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import BaseModel, Field, field_validator
66

7-
from aws_lambda_powertools.event_handler.openapi.constants import (
7+
from aws_lambda_powertools.event_handler.openapi.models import (
88
MODEL_CONFIG_ALLOW,
99
)
1010
from aws_lambda_powertools.shared.functions import powertools_dev_is_set

aws_lambda_powertools/event_handler/openapi/types.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44
from enum import Enum
55
from typing import TYPE_CHECKING, Any, Callable, Dict, Set, Type, TypedDict, Union
66

7-
from pydantic import BaseModel
8-
97
if TYPE_CHECKING:
8+
from pydantic import BaseModel # noqa: F401
109
from typing_extensions import NotRequired
1110

1211
CacheKey = Union[Callable[..., Any], None]
1312
IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]]
14-
TypeModelOrEnum = Union[Type[BaseModel], Type[Enum]]
13+
TypeModelOrEnum = Union[Type["BaseModel"], Type[Enum]]
1514
ModelNameMap = Dict[TypeModelOrEnum, str]
1615
UnionType = getattr(types, "UnionType", Union)
1716

aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py

+101-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,21 @@
22

33
import enum
44
import re
5-
from typing import Any
5+
import warnings
6+
from typing import Any, overload
7+
8+
from typing_extensions import deprecated
69

710
from aws_lambda_powertools.utilities.data_classes.common import (
811
BaseRequestContext,
912
BaseRequestContextV2,
1013
CaseInsensitiveDict,
1114
DictWrapper,
1215
)
16+
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
17+
get_header_value,
18+
)
19+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
1320

1421

1522
class APIGatewayRouteArn:
@@ -162,6 +169,55 @@ def stage_variables(self) -> dict[str, str]:
162169
def request_context(self) -> BaseRequestContext:
163170
return BaseRequestContext(self._data)
164171

172+
@overload
173+
def get_header_value(
174+
self,
175+
name: str,
176+
default_value: str,
177+
case_sensitive: bool = False,
178+
) -> str: ...
179+
180+
@overload
181+
def get_header_value(
182+
self,
183+
name: str,
184+
default_value: str | None = None,
185+
case_sensitive: bool = False,
186+
) -> str | None: ...
187+
188+
@deprecated(
189+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
190+
category=None,
191+
)
192+
def get_header_value(
193+
self,
194+
name: str,
195+
default_value: str | None = None,
196+
case_sensitive: bool = False,
197+
) -> str | None:
198+
"""Get header value by name
199+
Parameters
200+
----------
201+
name: str
202+
Header name
203+
default_value: str, optional
204+
Default value if no value was found by name
205+
case_sensitive: bool
206+
Whether to use a case-sensitive look up
207+
Returns
208+
-------
209+
str, optional
210+
Header value
211+
"""
212+
warnings.warn(
213+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
214+
"no longer has any effect. This function will be removed in the next major version. "
215+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
216+
category=PowertoolsDeprecationWarning,
217+
stacklevel=2,
218+
)
219+
return get_header_value(self.headers, name, default_value, case_sensitive)
220+
165221

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

303+
@overload
304+
def get_header_value(self, name: str, default_value: str, case_sensitive: bool = False) -> str: ...
305+
306+
@overload
307+
def get_header_value(
308+
self,
309+
name: str,
310+
default_value: str | None = None,
311+
case_sensitive: bool = False,
312+
) -> str | None: ...
313+
314+
@deprecated(
315+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
316+
category=None,
317+
)
318+
def get_header_value(
319+
self,
320+
name: str,
321+
default_value: str | None = None,
322+
case_sensitive: bool = False,
323+
) -> str | None:
324+
"""Get header value by name
325+
Parameters
326+
----------
327+
name: str
328+
Header name
329+
default_value: str, optional
330+
Default value if no value was found by name
331+
case_sensitive: bool
332+
Whether to use a case-sensitive look up
333+
Returns
334+
-------
335+
str, optional
336+
Header value
337+
"""
338+
warnings.warn(
339+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
340+
"no longer has any effect. This function will be removed in the next major version. "
341+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
342+
category=PowertoolsDeprecationWarning,
343+
stacklevel=2,
344+
)
345+
return get_header_value(self.headers, name, default_value, case_sensitive)
346+
247347

248348
class APIGatewayAuthorizerResponseV2:
249349
"""Api Gateway HTTP API V2 payload authorizer simple response helper

aws_lambda_powertools/utilities/data_classes/appsync_resolver_event.py

+57-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
from __future__ import annotations
22

3-
from typing import Any
3+
import warnings
4+
from typing import Any, overload
5+
6+
from typing_extensions import deprecated
47

58
from aws_lambda_powertools.utilities.data_classes.common import CaseInsensitiveDict, DictWrapper
9+
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
10+
get_header_value,
11+
)
12+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
613

714

815
def get_identity_object(identity: dict | None) -> Any:
@@ -212,3 +219,52 @@ def stash(self) -> dict:
212219
stash to pass arbitrary data across request and response mapping templates, and across functions in
213220
a pipeline resolver."""
214221
return self.get("stash") or {}
222+
223+
@overload
224+
def get_header_value(
225+
self,
226+
name: str,
227+
default_value: str,
228+
case_sensitive: bool = False,
229+
) -> str: ...
230+
231+
@overload
232+
def get_header_value(
233+
self,
234+
name: str,
235+
default_value: str | None = None,
236+
case_sensitive: bool = False,
237+
) -> str | None: ...
238+
239+
@deprecated(
240+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
241+
category=None,
242+
)
243+
def get_header_value(
244+
self,
245+
name: str,
246+
default_value: str | None = None,
247+
case_sensitive: bool = False,
248+
) -> str | None:
249+
"""Get header value by name
250+
Parameters
251+
----------
252+
name: str
253+
Header name
254+
default_value: str, optional
255+
Default value if no value was found by name
256+
case_sensitive: bool
257+
Whether to use a case-sensitive look up
258+
Returns
259+
-------
260+
str, optional
261+
Header value
262+
"""
263+
warnings.warn(
264+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
265+
"no longer has any effect. This function will be removed in the next major version. "
266+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
267+
category=PowertoolsDeprecationWarning,
268+
stacklevel=2,
269+
)
270+
return get_header_value(self.request_headers, name, default_value, case_sensitive)

aws_lambda_powertools/utilities/data_classes/common.py

+114-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@
22

33
import base64
44
import json
5+
import warnings
56
from functools import cached_property
6-
from typing import TYPE_CHECKING, Any, Callable, Iterator, Mapping
7+
from typing import TYPE_CHECKING, Any, Callable, Iterator, Mapping, overload
8+
9+
from typing_extensions import deprecated
10+
11+
from aws_lambda_powertools.warnings import PowertoolsDeprecationWarning
712

813
if TYPE_CHECKING:
914
from aws_lambda_powertools.shared.headers_serializer import BaseHeadersSerializer
1015

16+
from aws_lambda_powertools.utilities.data_classes.shared_functions import (
17+
get_header_value,
18+
get_multi_value_query_string_values,
19+
get_query_string_value,
20+
)
21+
1122

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

222+
@overload
223+
def get_query_string_value(self, name: str, default_value: str) -> str: ...
224+
225+
@overload
226+
def get_query_string_value(self, name: str, default_value: str | None = None) -> str | None: ...
227+
228+
def get_query_string_value(self, name: str, default_value: str | None = None) -> str | None:
229+
"""Get query string value by name
230+
Parameters
231+
----------
232+
name: str
233+
Query string parameter name
234+
default_value: str, optional
235+
Default value if no value was found by name
236+
Returns
237+
-------
238+
str, optional
239+
Query string parameter value
240+
"""
241+
return get_query_string_value(
242+
query_string_parameters=self.query_string_parameters,
243+
name=name,
244+
default_value=default_value,
245+
)
246+
247+
def get_multi_value_query_string_values(
248+
self,
249+
name: str,
250+
default_values: list[str] | None = None,
251+
) -> list[str]:
252+
"""Get multi-value query string parameter values by name
253+
Parameters
254+
----------
255+
name: str
256+
Multi-Value query string parameter name
257+
default_values: List[str], optional
258+
Default values is no values are found by name
259+
Returns
260+
-------
261+
List[str], optional
262+
List of query string values
263+
"""
264+
return get_multi_value_query_string_values(
265+
multi_value_query_string_parameters=self.multi_value_query_string_parameters,
266+
name=name,
267+
default_values=default_values,
268+
)
269+
270+
@overload
271+
def get_header_value(
272+
self,
273+
name: str,
274+
default_value: str,
275+
case_sensitive: bool = False,
276+
) -> str: ...
277+
278+
@overload
279+
def get_header_value(
280+
self,
281+
name: str,
282+
default_value: str | None = None,
283+
case_sensitive: bool = False,
284+
) -> str | None: ...
285+
286+
@deprecated(
287+
"`get_header_value` function is deprecated; Access headers directly using event.headers.get('HeaderName')",
288+
category=None,
289+
)
290+
def get_header_value(
291+
self,
292+
name: str,
293+
default_value: str | None = None,
294+
case_sensitive: bool = False,
295+
) -> str | None:
296+
"""Get header value by name
297+
Parameters
298+
----------
299+
name: str
300+
Header name
301+
default_value: str, optional
302+
Default value if no value was found by name
303+
case_sensitive: bool
304+
Whether to use a case-sensitive look up. By default we make a case-insensitive lookup.
305+
Returns
306+
-------
307+
str, optional
308+
Header value
309+
"""
310+
warnings.warn(
311+
"The `get_header_value` function is deprecated in V3 and the `case_sensitive` parameter "
312+
"no longer has any effect. This function will be removed in the next major version. "
313+
"Instead, access headers directly using event.headers.get('HeaderName'), which is case insensitive.",
314+
category=PowertoolsDeprecationWarning,
315+
stacklevel=2,
316+
)
317+
return get_header_value(
318+
headers=self.headers,
319+
name=name,
320+
default_value=default_value,
321+
case_sensitive=case_sensitive,
322+
)
323+
211324
def header_serializer(self) -> BaseHeadersSerializer:
212325
raise NotImplementedError()
213326

0 commit comments

Comments
 (0)