diff --git a/aws_lambda_powertools/event_handler/appsync.py b/aws_lambda_powertools/event_handler/appsync.py index 29c48d71cb1..253fad15d74 100644 --- a/aws_lambda_powertools/event_handler/appsync.py +++ b/aws_lambda_powertools/event_handler/appsync.py @@ -392,7 +392,7 @@ def resolver(self, type_name: str = "*", field_name: str | None = None) -> Calla ---------- type_name : str, optional GraphQL type e.g., Query, Mutation, by default "*" meaning any - field_name : Optional[str], optional + field_name : str | None, optional GraphQL field e.g., getTodo, createTodo, by default None Returns @@ -447,7 +447,7 @@ def batch_resolver( ---------- type_name : str, optional GraphQL type e.g., Query, Mutation, by default "*" meaning any - field_name : Optional[str], optional + field_name : str | None, optional GraphQL field e.g., getTodo, createTodo, by default None raise_on_error : bool, optional Whether to fail entire batch upon error, or handle errors gracefully (None), by default False diff --git a/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py b/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py index dc88d904c25..1c4ed136c1b 100644 --- a/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py +++ b/aws_lambda_powertools/event_handler/graphql_appsync/_registry.py @@ -64,7 +64,7 @@ def find_resolver(self, type_name: str, field_name: str) -> dict | None: Field name Return ---------- - Optional[Dict] + dict | None A dictionary with the resolver and if raise exception on error """ logger.debug(f"Looking for resolver for type={type_name}, field={field_name}.") diff --git a/aws_lambda_powertools/event_handler/graphql_appsync/base.py b/aws_lambda_powertools/event_handler/graphql_appsync/base.py index ea03c44a3b0..2e4986cd194 100644 --- a/aws_lambda_powertools/event_handler/graphql_appsync/base.py +++ b/aws_lambda_powertools/event_handler/graphql_appsync/base.py @@ -25,8 +25,6 @@ def resolver(self, type_name: str = "*", field_name: str | None = None) -> Calla Examples -------- ```python - from typing import Optional - from aws_lambda_powertools.event_handler import AppSyncResolver from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent from aws_lambda_powertools.utilities.typing import LambdaContext @@ -34,7 +32,7 @@ def resolver(self, type_name: str = "*", field_name: str | None = None) -> Calla app = AppSyncResolver() @app.resolver(type_name="Query", field_name="getPost") - def related_posts(event: AppSyncResolverEvent) -> Optional[list]: + def related_posts(event: AppSyncResolverEvent) -> list | None: return {"success": "ok"} def lambda_handler(event, context: LambdaContext) -> dict: @@ -76,8 +74,6 @@ def batch_resolver( Examples -------- ```python - from typing import Optional - from aws_lambda_powertools.event_handler import AppSyncResolver from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent from aws_lambda_powertools.utilities.typing import LambdaContext @@ -85,7 +81,7 @@ def batch_resolver( app = AppSyncResolver() @app.batch_resolver(type_name="Query", field_name="getPost") - def related_posts(event: AppSyncResolverEvent, id) -> Optional[list]: + def related_posts(event: AppSyncResolverEvent, id) -> list | None: return {"post_id": id} def lambda_handler(event, context: LambdaContext) -> dict: @@ -127,8 +123,6 @@ def async_batch_resolver( Examples -------- ```python - from typing import Optional - from aws_lambda_powertools.event_handler import AppSyncResolver from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent from aws_lambda_powertools.utilities.typing import LambdaContext @@ -136,7 +130,7 @@ def async_batch_resolver( app = AppSyncResolver() @app.async_batch_resolver(type_name="Query", field_name="getPost") - async def related_posts(event: AppSyncResolverEvent, id) -> Optional[list]: + async def related_posts(event: AppSyncResolverEvent, id) -> list | None: return {"post_id": id} def lambda_handler(event, context: LambdaContext) -> dict: diff --git a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py index 470a19e6c54..a0311184a51 100644 --- a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py +++ b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py @@ -505,11 +505,11 @@ def _is_or_contains_sequence(annotation: Any) -> bool: This function handles complex type annotations like: - List[Model] - direct sequence - - Union[Model, List[Model]] - checks if any Union member is a sequence - - Optional[List[Model]] - Union[List[Model], None] - - RootModel[List[Model]] - checks if the RootModel wraps a sequence - - Optional[RootModel[List[Model]]] - Union member that is a RootModel - - RootModel[Union[Model, List[Model]]] - RootModel wrapping a Union with a sequence + - Union[Model, list[Model]] - checks if any Union member is a sequence + - list[Model] | None - Union[list[Model], None] + - RootModel[list[Model]] - checks if the RootModel wraps a sequence + - RootModel[list[Model]] | None - Union member that is a RootModel + - RootModel[Union[Model, list[Model]]] - RootModel wrapping a Union with a sequence """ # Direct sequence check if field_annotation_is_sequence(annotation): diff --git a/aws_lambda_powertools/event_handler/openapi/models.py b/aws_lambda_powertools/event_handler/openapi/models.py index 53becd3f870..0372c6b21f2 100644 --- a/aws_lambda_powertools/event_handler/openapi/models.py +++ b/aws_lambda_powertools/event_handler/openapi/models.py @@ -1,6 +1,6 @@ # ruff: noqa: FA100 from enum import Enum -from typing import Any, Dict, List, Literal, Optional, Set, Union +from typing import Any, Literal, Union from pydantic import AnyUrl, BaseModel, ConfigDict, Field, model_validator from typing_extensions import Annotated @@ -25,7 +25,7 @@ class OpenAPIExtensions(BaseModel): and add only the provided value in the schema. """ - openapi_extensions: Optional[Dict[str, Any]] = None + openapi_extensions: dict[str, Any] | None = None # If the 'openapi_extensions' field is present in the 'values' dictionary, # And if the extension starts with x- (must respect the RFC) @@ -50,9 +50,9 @@ def serialize_openapi_extension_v2(self): # https://swagger.io/specification/#contact-object class Contact(BaseModel): - name: Optional[str] = None - url: Optional[AnyUrl] = None - email: Optional[str] = None + name: str | None = None + url: AnyUrl | None = None + email: str | None = None model_config = MODEL_CONFIG_ALLOW @@ -60,8 +60,8 @@ class Contact(BaseModel): # https://swagger.io/specification/#license-object class License(BaseModel): name: str - identifier: Optional[str] = None - url: Optional[AnyUrl] = None + identifier: str | None = None + url: AnyUrl | None = None model_config = MODEL_CONFIG_ALLOW @@ -69,21 +69,21 @@ class License(BaseModel): # https://swagger.io/specification/#info-object class Info(BaseModel): title: str - description: Optional[str] = None - termsOfService: Optional[str] = None - contact: Optional[Contact] = None - license: Optional[License] = None # noqa: A003 + description: str | None = None + termsOfService: str | None = None + contact: Contact | None = None + license: License | None = None # noqa: A003 version: str - summary: Optional[str] = None + summary: str | None = None model_config = MODEL_CONFIG_IGNORE # https://swagger.io/specification/#server-variable-object class ServerVariable(BaseModel): - enum: Annotated[Optional[List[str]], Field(min_length=1)] = None + enum: Annotated[list[str] | None, Field(min_length=1)] = None default: str - description: Optional[str] = None + description: str | None = None model_config = MODEL_CONFIG_ALLOW @@ -91,8 +91,8 @@ class ServerVariable(BaseModel): # https://swagger.io/specification/#server-object class Server(OpenAPIExtensions): url: Union[AnyUrl, str] - description: Optional[str] = None - variables: Optional[Dict[str, ServerVariable]] = None + description: str | None = None + variables: dict[str, ServerVariable] | None = None model_config = MODEL_CONFIG_ALLOW @@ -105,23 +105,23 @@ class Reference(BaseModel): # https://swagger.io/specification/#discriminator-object class Discriminator(BaseModel): propertyName: str - mapping: Optional[Dict[str, str]] = None + mapping: dict[str, str] | None = None # https://swagger.io/specification/#xml-object class XML(BaseModel): - name: Optional[str] = None - namespace: Optional[str] = None - prefix: Optional[str] = None - attribute: Optional[bool] = None - wrapped: Optional[bool] = None + name: str | None = None + namespace: str | None = None + prefix: str | None = None + attribute: bool | None = None + wrapped: bool | None = None model_config = MODEL_CONFIG_ALLOW # https://swagger.io/specification/#external-documentation-object class ExternalDocumentation(BaseModel): - description: Optional[str] = None + description: str | None = None url: AnyUrl model_config = MODEL_CONFIG_ALLOW @@ -131,81 +131,81 @@ class ExternalDocumentation(BaseModel): class Schema(BaseModel): # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu # Core Vocabulary - schema_: Optional[str] = Field(default=None, alias="$schema") - vocabulary: Optional[str] = Field(default=None, alias="$vocabulary") - id: Optional[str] = Field(default=None, alias="$id") # noqa: A003 - anchor: Optional[str] = Field(default=None, alias="$anchor") - dynamicAnchor: Optional[str] = Field(default=None, alias="$dynamicAnchor") - ref: Optional[str] = Field(default=None, alias="$ref") - dynamicRef: Optional[str] = Field(default=None, alias="$dynamicRef") - defs: Optional[Dict[str, "SchemaOrBool"]] = Field(default=None, alias="$defs") - comment: Optional[str] = Field(default=None, alias="$comment") + schema_: str | None = Field(default=None, alias="$schema") + vocabulary: str | None = Field(default=None, alias="$vocabulary") + id: str | None = Field(default=None, alias="$id") # noqa: A003 + anchor: str | None = Field(default=None, alias="$anchor") + dynamicAnchor: str | None = Field(default=None, alias="$dynamicAnchor") + ref: str | None = Field(default=None, alias="$ref") + dynamicRef: str | None = Field(default=None, alias="$dynamicRef") + defs: dict[str, "SchemaOrBool"] | None = Field(default=None, alias="$defs") + comment: str | None = Field(default=None, alias="$comment") # Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-a-vocabulary-for-applying-s # A Vocabulary for Applying Subschemas - allOf: Optional[List["SchemaOrBool"]] = None - anyOf: Optional[List["SchemaOrBool"]] = None - oneOf: Optional[List["SchemaOrBool"]] = None - not_: Optional["SchemaOrBool"] = Field(default=None, alias="not") - if_: Optional["SchemaOrBool"] = Field(default=None, alias="if") - then: Optional["SchemaOrBool"] = None - else_: Optional["SchemaOrBool"] = Field(default=None, alias="else") - dependentSchemas: Optional[Dict[str, "SchemaOrBool"]] = None - prefixItems: Optional[List["SchemaOrBool"]] = None + allOf: list["SchemaOrBool"] | None = None + anyOf: list["SchemaOrBool"] | None = None + oneOf: list["SchemaOrBool"] | None = None + not_: "SchemaOrBool | None" = Field(default=None, alias="not") + if_: "SchemaOrBool | None" = Field(default=None, alias="if") + then: "SchemaOrBool | None" = None + else_: "SchemaOrBool | None" = Field(default=None, alias="else") + dependentSchemas: dict[str, "SchemaOrBool"] | None = None + prefixItems: list["SchemaOrBool"] | None = None # MAINTENANCE: uncomment and remove below when deprecating Pydantic v1 # MAINTENANCE: It generates a list of schemas for tuples, before prefixItems was available # MAINTENANCE: items: Optional["SchemaOrBool"] = None - items: Optional[Union["SchemaOrBool", List["SchemaOrBool"]]] = None - contains: Optional["SchemaOrBool"] = None - properties: Optional[Dict[str, "SchemaOrBool"]] = None - patternProperties: Optional[Dict[str, "SchemaOrBool"]] = None - additionalProperties: Optional["SchemaOrBool"] = None - propertyNames: Optional["SchemaOrBool"] = None - unevaluatedItems: Optional["SchemaOrBool"] = None - unevaluatedProperties: Optional["SchemaOrBool"] = None + items: Union["SchemaOrBool", list["SchemaOrBool"]] | None = None + contains: "SchemaOrBool | None" = None + properties: dict[str, "SchemaOrBool"] | None = None + patternProperties: dict[str, "SchemaOrBool"] | None = None + additionalProperties: "SchemaOrBool | None" = None + propertyNames: "SchemaOrBool | None" = None + unevaluatedItems: "SchemaOrBool | None" = None + unevaluatedProperties: "SchemaOrBool | None" = None # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-structural # A Vocabulary for Structural Validation - type: Optional[str] = None # noqa: A003 - enum: Optional[List[Any]] = None - const: Optional[Any] = None - multipleOf: Optional[float] = Field(default=None, gt=0) - maximum: Optional[float] = None - exclusiveMaximum: Optional[float] = None - minimum: Optional[float] = None - exclusiveMinimum: Optional[float] = None - maxLength: Optional[int] = Field(default=None, ge=0) - minLength: Optional[int] = Field(default=None, ge=0) - pattern: Optional[str] = None - maxItems: Optional[int] = Field(default=None, ge=0) - minItems: Optional[int] = Field(default=None, ge=0) - uniqueItems: Optional[bool] = None - maxContains: Optional[int] = Field(default=None, ge=0) - minContains: Optional[int] = Field(default=None, ge=0) - maxProperties: Optional[int] = Field(default=None, ge=0) - minProperties: Optional[int] = Field(default=None, ge=0) - required: Optional[List[str]] = None - dependentRequired: Optional[Dict[str, Set[str]]] = None + type: str | None = None # noqa: A003 + enum: list[Any] | None = None + const: Any | None = None + multipleOf: float | None = Field(default=None, gt=0) + maximum: float | None = None + exclusiveMaximum: float | None = None + minimum: float | None = None + exclusiveMinimum: float | None = None + maxLength: int | None = Field(default=None, ge=0) + minLength: int | None = Field(default=None, ge=0) + pattern: str | None = None + maxItems: int | None = Field(default=None, ge=0) + minItems: int | None = Field(default=None, ge=0) + uniqueItems: bool | None = None + maxContains: int | None = Field(default=None, ge=0) + minContains: int | None = Field(default=None, ge=0) + maxProperties: int | None = Field(default=None, ge=0) + minProperties: int | None = Field(default=None, ge=0) + required: list[str] | None = None + dependentRequired: dict[str, set[str]] | None = None # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-vocabularies-for-semantic-c # Vocabularies for Semantic Content With "format" - format: Optional[str] = None # noqa: A003 + format: str | None = None # noqa: A003 # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-the-conten # A Vocabulary for the Contents of String-Encoded Data - contentEncoding: Optional[str] = None - contentMediaType: Optional[str] = None - contentSchema: Optional["SchemaOrBool"] = None + contentEncoding: str | None = None + contentMediaType: str | None = None + contentSchema: "SchemaOrBool | None" = None # Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-basic-meta # A Vocabulary for Basic Meta-Data Annotations - title: Optional[str] = None - description: Optional[str] = None - default: Optional[Any] = None - deprecated: Optional[bool] = None - readOnly: Optional[bool] = None - writeOnly: Optional[bool] = None - examples: Optional[List[Any]] = None + title: str | None = None + description: str | None = None + default: Any | None = None + deprecated: bool | None = None + readOnly: bool | None = None + writeOnly: bool | None = None + examples: list[Any] | None = None # Ref: OpenAPI 3.0.0: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#schema-object # Schema Object - discriminator: Optional[Discriminator] = None - xml: Optional[XML] = None - externalDocs: Optional[ExternalDocumentation] = None + discriminator: Discriminator | None = None + xml: XML | None = None + externalDocs: ExternalDocumentation | None = None model_config = MODEL_CONFIG_ALLOW @@ -217,10 +217,10 @@ class Schema(BaseModel): # https://swagger.io/specification/#example-object class Example(BaseModel): - summary: Optional[str] = None - description: Optional[str] = None - value: Optional[Any] = None - externalValue: Optional[AnyUrl] = None + summary: str | None = None + description: str | None = None + value: Any | None = None + externalValue: AnyUrl | None = None model_config = MODEL_CONFIG_ALLOW @@ -234,37 +234,37 @@ class ParameterInType(Enum): # https://swagger.io/specification/#encoding-object class Encoding(BaseModel): - contentType: Optional[str] = None - headers: Optional[Dict[str, Union["Header", Reference]]] = None - style: Optional[str] = None - explode: Optional[bool] = None - allowReserved: Optional[bool] = None + contentType: str | None = None + headers: dict[str, Union["Header", Reference]] | None = None + style: str | None = None + explode: bool | None = None + allowReserved: bool | None = None model_config = MODEL_CONFIG_ALLOW # https://swagger.io/specification/#media-type-object class MediaType(BaseModel): - schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema") - examples: Optional[Dict[str, Union[Example, Reference]]] = None - encoding: Optional[Dict[str, Encoding]] = None + schema_: Union[Schema, Reference] | None = Field(default=None, alias="schema") + examples: dict[str, Union[Example, Reference]] | None = None + encoding: dict[str, Encoding] | None = None model_config = MODEL_CONFIG_ALLOW # https://swagger.io/specification/#parameter-object class ParameterBase(BaseModel): - description: Optional[str] = None - required: Optional[bool] = None - deprecated: Optional[bool] = None + description: str | None = None + required: bool | None = None + deprecated: bool | None = None # Serialization rules for simple scenarios - style: Optional[str] = None - explode: Optional[bool] = None - allowReserved: Optional[bool] = None - schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema") - examples: Optional[Dict[str, Union[Example, Reference]]] = None + style: str | None = None + explode: bool | None = None + allowReserved: bool | None = None + schema_: Union[Schema, Reference] | None = Field(default=None, alias="schema") + examples: dict[str, Union[Example, Reference]] | None = None # Serialization rules for more complex scenarios - content: Optional[Dict[str, MediaType]] = None + content: dict[str, MediaType] | None = None model_config = MODEL_CONFIG_ALLOW @@ -280,21 +280,21 @@ class Header(ParameterBase): # https://swagger.io/specification/#request-body-object class RequestBody(BaseModel): - description: Optional[str] = None - content: Dict[str, MediaType] - required: Optional[bool] = None + description: str | None = None + content: dict[str, MediaType] + required: bool | None = None model_config = MODEL_CONFIG_ALLOW # https://swagger.io/specification/#link-object class Link(BaseModel): - operationRef: Optional[str] = None - operationId: Optional[str] = None - parameters: Optional[Dict[str, Union[Any, str]]] = None - requestBody: Optional[Union[Any, str]] = None - description: Optional[str] = None - server: Optional[Server] = None + operationRef: str | None = None + operationId: str | None = None + parameters: dict[str, Union[Any, str]] | None = None + requestBody: Union[Any, str] | None = None + description: str | None = None + server: Server | None = None model_config = MODEL_CONFIG_ALLOW @@ -302,9 +302,9 @@ class Link(BaseModel): # https://swagger.io/specification/#response-object class Response(BaseModel): description: str - headers: Optional[Dict[str, Union[Header, Reference]]] = None - content: Optional[Dict[str, MediaType]] = None - links: Optional[Dict[str, Union[Link, Reference]]] = None + headers: dict[str, Union[Header, Reference]] | None = None + content: dict[str, MediaType] | None = None + links: dict[str, Union[Link, Reference]] | None = None model_config = MODEL_CONFIG_ALLOW @@ -312,46 +312,46 @@ class Response(BaseModel): # https://swagger.io/specification/#tag-object class Tag(BaseModel): name: str - description: Optional[str] = None - externalDocs: Optional[ExternalDocumentation] = None + description: str | None = None + externalDocs: ExternalDocumentation | None = None model_config = MODEL_CONFIG_ALLOW # https://swagger.io/specification/#operation-object class Operation(OpenAPIExtensions): - tags: Optional[List[str]] = None - summary: Optional[str] = None - description: Optional[str] = None - externalDocs: Optional[ExternalDocumentation] = None - operationId: Optional[str] = None - parameters: Optional[List[Union[Parameter, Reference]]] = None - requestBody: Optional[Union[RequestBody, Reference]] = None + tags: list[str] | None = None + summary: str | None = None + description: str | None = None + externalDocs: ExternalDocumentation | None = None + operationId: str | None = None + parameters: list[Union[Parameter, Reference]] | None = None + requestBody: Union[RequestBody, Reference] | None = None # Using Any for Specification Extensions - responses: Optional[Dict[int, Union[Response, Any]]] = None - callbacks: Optional[Dict[str, Union[Dict[str, "PathItem"], Reference]]] = None - deprecated: Optional[bool] = None - security: Optional[List[Dict[str, List[str]]]] = None - servers: Optional[List[Server]] = None + responses: dict[int, Union[Response, Any]] | None = None + callbacks: dict[str, Union[dict[str, "PathItem"], Reference]] | None = None + deprecated: bool | None = None + security: list[dict[str, list[str]]] | None = None + servers: list[Server] | None = None model_config = MODEL_CONFIG_ALLOW # https://swagger.io/specification/#path-item-object class PathItem(BaseModel): - ref: Optional[str] = Field(default=None, alias="$ref") - summary: Optional[str] = None - description: Optional[str] = None - get: Optional[Operation] = None - put: Optional[Operation] = None - post: Optional[Operation] = None - delete: Optional[Operation] = None - options: Optional[Operation] = None - head: Optional[Operation] = None - patch: Optional[Operation] = None - trace: Optional[Operation] = None - servers: Optional[List[Server]] = None - parameters: Optional[List[Union[Parameter, Reference]]] = None + ref: str | None = Field(default=None, alias="$ref") + summary: str | None = None + description: str | None = None + get: Operation | None = None + put: Operation | None = None + post: Operation | None = None + delete: Operation | None = None + options: Operation | None = None + head: Operation | None = None + patch: Operation | None = None + trace: Operation | None = None + servers: list[Server] | None = None + parameters: list[Union[Parameter, Reference]] | None = None model_config = MODEL_CONFIG_ALLOW @@ -367,7 +367,7 @@ class SecuritySchemeType(Enum): class SecurityBase(OpenAPIExtensions): type_: SecuritySchemeType = Field(alias="type") - description: Optional[str] = None + description: str | None = None model_config = {"extra": "allow", "populate_by_name": True} @@ -391,12 +391,12 @@ class HTTPBase(SecurityBase): class HTTPBearer(HTTPBase): # type: ignore[override] scheme: Literal["bearer"] = "bearer" - bearerFormat: Optional[str] = None + bearerFormat: str | None = None class OAuthFlow(BaseModel): - refreshUrl: Optional[str] = None - scopes: Dict[str, str] = {} + refreshUrl: str | None = None + scopes: dict[str, str] = {} model_config = MODEL_CONFIG_ALLOW @@ -419,10 +419,10 @@ class OAuthFlowAuthorizationCode(OAuthFlow): class OAuthFlows(BaseModel): - implicit: Optional[OAuthFlowImplicit] = None - password: Optional[OAuthFlowPassword] = None - clientCredentials: Optional[OAuthFlowClientCredentials] = None - authorizationCode: Optional[OAuthFlowAuthorizationCode] = None + implicit: OAuthFlowImplicit | None = None + password: OAuthFlowPassword | None = None + clientCredentials: OAuthFlowClientCredentials | None = None + authorizationCode: OAuthFlowAuthorizationCode | None = None model_config = MODEL_CONFIG_ALLOW @@ -449,17 +449,17 @@ class MutualTLS(SecurityBase): # https://swagger.io/specification/#components-object class Components(BaseModel): - schemas: Optional[Dict[str, Union[Schema, Reference]]] = None - responses: Optional[Dict[str, Union[Response, Reference]]] = None - parameters: Optional[Dict[str, Union[Parameter, Reference]]] = None - examples: Optional[Dict[str, Union[Example, Reference]]] = None - requestBodies: Optional[Dict[str, Union[RequestBody, Reference]]] = None - headers: Optional[Dict[str, Union[Header, Reference]]] = None - securitySchemes: Optional[Dict[str, Union[SecurityScheme, Reference]]] = None - links: Optional[Dict[str, Union[Link, Reference]]] = None + schemas: dict[str, Union[Schema, Reference]] | None = None + responses: dict[str, Union[Response, Reference]] | None = None + parameters: dict[str, Union[Parameter, Reference]] | None = None + examples: dict[str, Union[Example, Reference]] | None = None + requestBodies: dict[str, Union[RequestBody, Reference]] | None = None + headers: dict[str, Union[Header, Reference]] | None = None + securitySchemes: dict[str, Union[SecurityScheme, Reference]] | None = None + links: dict[str, Union[Link, Reference]] | None = None # Using Any for Specification Extensions - callbacks: Optional[Dict[str, Union[Dict[str, PathItem], Reference, Any]]] = None - pathItems: Optional[Dict[str, Union[PathItem, Reference]]] = None + callbacks: dict[str, Union[dict[str, PathItem], Reference, Any]] | None = None + pathItems: dict[str, Union[PathItem, Reference]] | None = None model_config = MODEL_CONFIG_ALLOW @@ -468,15 +468,15 @@ class Components(BaseModel): class OpenAPI(OpenAPIExtensions): openapi: str info: Info - jsonSchemaDialect: Optional[str] = None - servers: Optional[List[Server]] = None + jsonSchemaDialect: str | None = None + servers: list[Server] | None = None # Using Any for Specification Extensions - paths: Optional[Dict[str, Union[PathItem, Any]]] = None - webhooks: Optional[Dict[str, Union[PathItem, Reference]]] = None - components: Optional[Components] = None - security: Optional[List[Dict[str, List[str]]]] = None - tags: Optional[List[Tag]] = None - externalDocs: Optional[ExternalDocumentation] = None + paths: dict[str, Union[PathItem, Any]] | None = None + webhooks: dict[str, Union[PathItem, Reference]] | None = None + components: Components | None = None + security: list[dict[str, list[str]]] | None = None + tags: list[Tag] | None = None + externalDocs: ExternalDocumentation | None = None model_config = MODEL_CONFIG_ALLOW diff --git a/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py b/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py index 4cafdfe401c..0f810afdb98 100644 --- a/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py +++ b/aws_lambda_powertools/event_handler/openapi/swagger_ui/oauth2.py @@ -1,6 +1,8 @@ # ruff: noqa: E501 FA100 +from __future__ import annotations + import warnings -from typing import Dict, Optional, Sequence +from typing import Sequence from pydantic import BaseModel, Field, field_validator @@ -17,14 +19,14 @@ class OAuth2Config(BaseModel): """ # The client ID for the OAuth2 application - clientId: Optional[str] = Field(alias="client_id", default=None) + clientId: str | None = Field(alias="client_id", default=None) # The client secret for the OAuth2 application. This is sensitive information and requires the explicit presence # of the POWERTOOLS_DEV environment variable. - clientSecret: Optional[str] = Field(alias="client_secret", default=None) + clientSecret: str | None = Field(alias="client_secret", default=None) # The realm in which the OAuth2 application is registered. Optional. - realm: Optional[str] = Field(default=None) + realm: str | None = Field(default=None) # The name of the OAuth2 application appName: str = Field(alias="app_name") @@ -33,7 +35,7 @@ class OAuth2Config(BaseModel): scopes: Sequence[str] = Field(default=[]) # Additional query string parameters to be included in the OAuth2 request. Defaults to an empty dictionary. - additionalQueryStringParams: Dict[str, str] = Field(alias="additional_query_string_params", default={}) + additionalQueryStringParams: dict[str, str] = Field(alias="additional_query_string_params", default={}) # Whether to use basic authentication with the access code grant type. Defaults to False. useBasicAuthenticationWithAccessCodeGrant: bool = Field( @@ -47,7 +49,7 @@ class OAuth2Config(BaseModel): model_config = MODEL_CONFIG_ALLOW @field_validator("clientSecret") - def client_secret_only_on_dev(cls, v: Optional[str]) -> Optional[str]: + def client_secret_only_on_dev(cls, v: str | None) -> str | None: if not v: return None diff --git a/aws_lambda_powertools/event_handler/util.py b/aws_lambda_powertools/event_handler/util.py index 02fb805fa52..ed53469b0a6 100644 --- a/aws_lambda_powertools/event_handler/util.py +++ b/aws_lambda_powertools/event_handler/util.py @@ -74,9 +74,9 @@ def _validate_openapi_security_parameters( Parameters ---------- - security: List[Dict[str, List[str]]] + security: list[dict[str, list[str]]] A list of security requirements - security_schemes: Optional[Dict[str, Any]] + security_schemes: dict[str, Any] | None A dictionary mapping security scheme names to their corresponding security scheme objects. Returns