Skip to content

Commit 808cae0

Browse files
Addressing Heitor's feedback
1 parent 13f6935 commit 808cae0

File tree

9 files changed

+146
-157
lines changed

9 files changed

+146
-157
lines changed

aws_lambda_powertools/event_handler/openapi/compat.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
)
2323

2424
from pydantic import TypeAdapter, ValidationError
25+
26+
# Importing from internal libraries in Pydantic may introduce potential risks, as these internal libraries
27+
# are not part of the public API and may change without notice in future releases.
28+
# We use this for forward reference, as it allows us to handle forward references in type annotations.
2529
from pydantic._internal._typing_extra import eval_type_lenient
2630
from pydantic.fields import FieldInfo
2731
from pydantic._internal._utils import lenient_issubclass
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
1+
from pydantic import ConfigDict
2+
13
DEFAULT_API_VERSION = "1.0.0"
24
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/encoders.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
from pydantic import BaseModel
1313
from pydantic.types import SecretBytes, SecretStr
14-
from pydantic_extra_types.color import Color
1514

1615
from aws_lambda_powertools.event_handler.openapi.compat import _model_dump
1716
from aws_lambda_powertools.event_handler.openapi.types import IncEx
@@ -318,7 +317,6 @@ def decimal_encoder(dec_value: Decimal) -> Union[int, float]:
318317
# Encoders for types that are not JSON serializable
319318
ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = {
320319
bytes: lambda o: o.decode(),
321-
Color: str,
322320
datetime.date: iso_format,
323321
datetime.datetime: iso_format,
324322
datetime.time: iso_format,

aws_lambda_powertools/event_handler/openapi/models.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
from pydantic import AnyUrl, BaseModel, Field
55

66
from aws_lambda_powertools.event_handler.openapi.compat import model_rebuild
7+
from aws_lambda_powertools.event_handler.openapi.constants import (
8+
MODEL_CONFIG_ALLOW,
9+
MODEL_CONFIG_IGNORE,
10+
)
711
from aws_lambda_powertools.shared.types import Annotated, Literal
812

913
"""
@@ -18,7 +22,7 @@ class Contact(BaseModel):
1822
url: Optional[AnyUrl] = None
1923
email: Optional[str] = None
2024

21-
model_config = {"extra": "allow"}
25+
model_config = MODEL_CONFIG_ALLOW
2226

2327

2428
# https://swagger.io/specification/#license-object
@@ -27,7 +31,7 @@ class License(BaseModel):
2731
identifier: Optional[str] = None
2832
url: Optional[AnyUrl] = None
2933

30-
model_config = {"extra": "allow"}
34+
model_config = MODEL_CONFIG_ALLOW
3135

3236

3337
# https://swagger.io/specification/#info-object
@@ -40,7 +44,7 @@ class Info(BaseModel):
4044
version: str
4145
summary: Optional[str] = None
4246

43-
model_config = {"extra": "ignore"}
47+
model_config = MODEL_CONFIG_IGNORE
4448

4549

4650
# https://swagger.io/specification/#server-variable-object
@@ -49,7 +53,7 @@ class ServerVariable(BaseModel):
4953
default: str
5054
description: Optional[str] = None
5155

52-
model_config = {"extra": "allow"}
56+
model_config = MODEL_CONFIG_ALLOW
5357

5458

5559
# https://swagger.io/specification/#server-object
@@ -58,7 +62,7 @@ class Server(BaseModel):
5862
description: Optional[str] = None
5963
variables: Optional[Dict[str, ServerVariable]] = None
6064

61-
model_config = {"extra": "allow"}
65+
model_config = MODEL_CONFIG_ALLOW
6266

6367

6468
# https://swagger.io/specification/#reference-object
@@ -80,15 +84,15 @@ class XML(BaseModel):
8084
attribute: Optional[bool] = None
8185
wrapped: Optional[bool] = None
8286

83-
model_config = {"extra": "allow"}
87+
model_config = MODEL_CONFIG_ALLOW
8488

8589

8690
# https://swagger.io/specification/#external-documentation-object
8791
class ExternalDocumentation(BaseModel):
8892
description: Optional[str] = None
8993
url: AnyUrl
9094

91-
model_config = {"extra": "allow"}
95+
model_config = MODEL_CONFIG_ALLOW
9296

9397

9498
# https://swagger.io/specification/#schema-object
@@ -171,7 +175,7 @@ class Schema(BaseModel):
171175
xml: Optional[XML] = None
172176
externalDocs: Optional[ExternalDocumentation] = None
173177

174-
model_config = {"extra": "allow"}
178+
model_config = MODEL_CONFIG_ALLOW
175179

176180

177181
# Ref: https://json-schema.org/draft/2020-12/json-schema-core.html#name-json-schema-documents
@@ -186,7 +190,7 @@ class Example(BaseModel):
186190
value: Optional[Any] = None
187191
externalValue: Optional[AnyUrl] = None
188192

189-
model_config = {"extra": "allow"}
193+
model_config = MODEL_CONFIG_ALLOW
190194

191195

192196
class ParameterInType(Enum):
@@ -204,7 +208,7 @@ class Encoding(BaseModel):
204208
explode: Optional[bool] = None
205209
allowReserved: Optional[bool] = None
206210

207-
model_config = {"extra": "allow"}
211+
model_config = MODEL_CONFIG_ALLOW
208212

209213

210214
# https://swagger.io/specification/#media-type-object
@@ -213,7 +217,7 @@ class MediaType(BaseModel):
213217
examples: Optional[Dict[str, Union[Example, Reference]]] = None
214218
encoding: Optional[Dict[str, Encoding]] = None
215219

216-
model_config = {"extra": "allow"}
220+
model_config = MODEL_CONFIG_ALLOW
217221

218222

219223
# https://swagger.io/specification/#parameter-object
@@ -230,7 +234,7 @@ class ParameterBase(BaseModel):
230234
# Serialization rules for more complex scenarios
231235
content: Optional[Dict[str, MediaType]] = None
232236

233-
model_config = {"extra": "allow"}
237+
model_config = MODEL_CONFIG_ALLOW
234238

235239

236240
class Parameter(ParameterBase):
@@ -248,7 +252,7 @@ class RequestBody(BaseModel):
248252
content: Dict[str, MediaType]
249253
required: Optional[bool] = None
250254

251-
model_config = {"extra": "allow"}
255+
model_config = MODEL_CONFIG_ALLOW
252256

253257

254258
# https://swagger.io/specification/#link-object
@@ -260,7 +264,7 @@ class Link(BaseModel):
260264
description: Optional[str] = None
261265
server: Optional[Server] = None
262266

263-
model_config = {"extra": "allow"}
267+
model_config = MODEL_CONFIG_ALLOW
264268

265269

266270
# https://swagger.io/specification/#response-object
@@ -270,7 +274,7 @@ class Response(BaseModel):
270274
content: Optional[Dict[str, MediaType]] = None
271275
links: Optional[Dict[str, Union[Link, Reference]]] = None
272276

273-
model_config = {"extra": "allow"}
277+
model_config = MODEL_CONFIG_ALLOW
274278

275279

276280
# https://swagger.io/specification/#tag-object
@@ -279,7 +283,7 @@ class Tag(BaseModel):
279283
description: Optional[str] = None
280284
externalDocs: Optional[ExternalDocumentation] = None
281285

282-
model_config = {"extra": "allow"}
286+
model_config = MODEL_CONFIG_ALLOW
283287

284288

285289
# https://swagger.io/specification/#operation-object
@@ -298,7 +302,7 @@ class Operation(BaseModel):
298302
security: Optional[List[Dict[str, List[str]]]] = None
299303
servers: Optional[List[Server]] = None
300304

301-
model_config = {"extra": "allow"}
305+
model_config = MODEL_CONFIG_ALLOW
302306

303307

304308
# https://swagger.io/specification/#path-item-object
@@ -317,7 +321,7 @@ class PathItem(BaseModel):
317321
servers: Optional[List[Server]] = None
318322
parameters: Optional[List[Union[Parameter, Reference]]] = None
319323

320-
model_config = {"extra": "allow"}
324+
model_config = MODEL_CONFIG_ALLOW
321325

322326

323327
# https://swagger.io/specification/#security-scheme-object
@@ -361,7 +365,7 @@ class OAuthFlow(BaseModel):
361365
refreshUrl: Optional[str] = None
362366
scopes: Dict[str, str] = {}
363367

364-
model_config = {"extra": "allow"}
368+
model_config = MODEL_CONFIG_ALLOW
365369

366370

367371
class OAuthFlowImplicit(OAuthFlow):
@@ -387,7 +391,7 @@ class OAuthFlows(BaseModel):
387391
clientCredentials: Optional[OAuthFlowClientCredentials] = None
388392
authorizationCode: Optional[OAuthFlowAuthorizationCode] = None
389393

390-
model_config = {"extra": "allow"}
394+
model_config = MODEL_CONFIG_ALLOW
391395

392396

393397
class OAuth2(SecurityBase):
@@ -420,7 +424,7 @@ class Components(BaseModel):
420424
callbacks: Optional[Dict[str, Union[Dict[str, PathItem], Reference, Any]]] = None
421425
pathItems: Optional[Dict[str, Union[PathItem, Reference]]] = None
422426

423-
model_config = {"extra": "allow"}
427+
model_config = MODEL_CONFIG_ALLOW
424428

425429

426430
# https://swagger.io/specification/#openapi-object
@@ -437,7 +441,7 @@ class OpenAPI(BaseModel):
437441
tags: Optional[List[Tag]] = None
438442
externalDocs: Optional[ExternalDocumentation] = None
439443

440-
model_config = {"extra": "allow"}
444+
model_config = MODEL_CONFIG_ALLOW
441445

442446

443447
model_rebuild(Schema)

aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
from pydantic import BaseModel, Field, field_validator
66

7+
from aws_lambda_powertools.event_handler.openapi.constants import (
8+
MODEL_CONFIG_ALLOW,
9+
)
710
from aws_lambda_powertools.shared.functions import powertools_dev_is_set
811

912

@@ -41,7 +44,7 @@ class OAuth2Config(BaseModel):
4144
# Whether to use PKCE with the authorization code grant type. Defaults to False.
4245
usePkceWithAuthorizationCodeGrant: bool = Field(alias="use_pkce_with_authorization_code_grant", default=False)
4346

44-
model_config = {"extra": "allow"}
47+
model_config = MODEL_CONFIG_ALLOW
4548

4649
@field_validator("clientSecret")
4750
def client_secret_only_on_dev(cls, v: Optional[str]) -> Optional[str]:

0 commit comments

Comments
 (0)