Skip to content

Commit f711736

Browse files
committed
refactor(parser): add from __future__ import annotations
and update code according to ruff rules TCH, UP006, UP007, UP037 and FA100.
1 parent b4195eb commit f711736

24 files changed

+260
-247
lines changed

aws_lambda_powertools/utilities/parser/functions.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
from __future__ import annotations
22

3+
from typing import TYPE_CHECKING
4+
35
from pydantic import TypeAdapter
46

57
from aws_lambda_powertools.shared.cache_dict import LRUDict
6-
from aws_lambda_powertools.utilities.parser.types import T
8+
9+
if TYPE_CHECKING:
10+
from aws_lambda_powertools.utilities.parser.types import T
711

812
CACHE_TYPE_ADAPTER = LRUDict(max_items=1024)
913

aws_lambda_powertools/utilities/parser/models/alb.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Dict, Type, Union
1+
from __future__ import annotations
22

33
from pydantic import BaseModel
44

@@ -14,8 +14,8 @@ class AlbRequestContext(BaseModel):
1414
class AlbModel(BaseModel):
1515
httpMethod: str
1616
path: str
17-
body: Union[str, Type[BaseModel]]
17+
body: str | type[BaseModel]
1818
isBase64Encoded: bool
19-
headers: Dict[str, str]
20-
queryStringParameters: Dict[str, str]
19+
headers: dict[str, str]
20+
queryStringParameters: dict[str, str]
2121
requestContext: AlbRequestContext
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from datetime import datetime
2-
from typing import Any, Dict, List, Optional, Type, Union
1+
from __future__ import annotations
32

4-
from pydantic import BaseModel, model_validator
5-
from pydantic.networks import IPvAnyNetwork
3+
from datetime import datetime # noqa: TCH003
4+
from typing import Any, Literal
65

7-
from aws_lambda_powertools.utilities.parser.types import Literal
6+
from pydantic import BaseModel, model_validator
7+
from pydantic.networks import IPvAnyNetwork # noqa: TCH002
88

99

1010
class ApiGatewayUserCertValidity(BaseModel):
@@ -21,54 +21,54 @@ class ApiGatewayUserCert(BaseModel):
2121

2222

2323
class APIGatewayEventIdentity(BaseModel):
24-
accessKey: Optional[str] = None
25-
accountId: Optional[str] = None
26-
apiKey: Optional[str] = None
27-
apiKeyId: Optional[str] = None
28-
caller: Optional[str] = None
29-
cognitoAuthenticationProvider: Optional[str] = None
30-
cognitoAuthenticationType: Optional[str] = None
31-
cognitoIdentityId: Optional[str] = None
32-
cognitoIdentityPoolId: Optional[str] = None
33-
principalOrgId: Optional[str] = None
24+
accessKey: str | None = None
25+
accountId: str | None = None
26+
apiKey: str | None = None
27+
apiKeyId: str | None = None
28+
caller: str | None = None
29+
cognitoAuthenticationProvider: str | None = None
30+
cognitoAuthenticationType: str | None = None
31+
cognitoIdentityId: str | None = None
32+
cognitoIdentityPoolId: str | None = None
33+
principalOrgId: str | None = None
3434
# see #1562, temp workaround until API Gateway fixes it the Test button payload
3535
# removing it will not be considered a regression in the future
36-
sourceIp: Union[IPvAnyNetwork, Literal["test-invoke-source-ip"]]
37-
user: Optional[str] = None
38-
userAgent: Optional[str] = None
39-
userArn: Optional[str] = None
40-
clientCert: Optional[ApiGatewayUserCert] = None
36+
sourceIp: IPvAnyNetwork | Literal["test-invoke-source-ip"]
37+
user: str | None = None
38+
userAgent: str | None = None
39+
userArn: str | None = None
40+
clientCert: ApiGatewayUserCert | None = None
4141

4242

4343
class APIGatewayEventAuthorizer(BaseModel):
44-
claims: Optional[Dict[str, Any]] = None
45-
scopes: Optional[List[str]] = None
44+
claims: dict[str, Any] | None = None
45+
scopes: list[str] | None = None
4646

4747

4848
class APIGatewayEventRequestContext(BaseModel):
4949
accountId: str
5050
apiId: str
51-
authorizer: Optional[APIGatewayEventAuthorizer] = None
51+
authorizer: APIGatewayEventAuthorizer | None = None
5252
stage: str
5353
protocol: str
5454
identity: APIGatewayEventIdentity
5555
requestId: str
5656
requestTime: str
5757
requestTimeEpoch: datetime
58-
resourceId: Optional[str] = None
58+
resourceId: str | None = None
5959
resourcePath: str
60-
domainName: Optional[str] = None
61-
domainPrefix: Optional[str] = None
62-
extendedRequestId: Optional[str] = None
60+
domainName: str | None = None
61+
domainPrefix: str | None = None
62+
extendedRequestId: str | None = None
6363
httpMethod: Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
6464
path: str
65-
connectedAt: Optional[datetime] = None
66-
connectionId: Optional[str] = None
67-
eventType: Optional[Literal["CONNECT", "MESSAGE", "DISCONNECT"]] = None
68-
messageDirection: Optional[str] = None
69-
messageId: Optional[str] = None
70-
routeKey: Optional[str] = None
71-
operationName: Optional[str] = None
65+
connectedAt: datetime | None = None
66+
connectionId: str | None = None
67+
eventType: Literal["CONNECT", "MESSAGE", "DISCONNECT"] | None = None
68+
messageDirection: str | None = None
69+
messageId: str | None = None
70+
routeKey: str | None = None
71+
operationName: str | None = None
7272

7373
@model_validator(mode="before")
7474
def check_message_id(cls, values):
@@ -79,16 +79,16 @@ def check_message_id(cls, values):
7979

8080

8181
class APIGatewayProxyEventModel(BaseModel):
82-
version: Optional[str] = None
82+
version: str | None = None
8383
resource: str
8484
path: str
8585
httpMethod: Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
86-
headers: Dict[str, str]
87-
multiValueHeaders: Dict[str, List[str]]
88-
queryStringParameters: Optional[Dict[str, str]] = None
89-
multiValueQueryStringParameters: Optional[Dict[str, List[str]]] = None
86+
headers: dict[str, str]
87+
multiValueHeaders: dict[str, list[str]]
88+
queryStringParameters: dict[str, str] | None = None
89+
multiValueQueryStringParameters: dict[str, list[str]] | None = None
9090
requestContext: APIGatewayEventRequestContext
91-
pathParameters: Optional[Dict[str, str]] = None
92-
stageVariables: Optional[Dict[str, str]] = None
91+
pathParameters: dict[str, str] | None = None
92+
stageVariables: dict[str, str] | None = None
9393
isBase64Encoded: bool
94-
body: Optional[Union[str, Type[BaseModel]]] = None
94+
body: str | type[BaseModel] | None = None
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
from datetime import datetime
2-
from typing import Any, Dict, List, Optional, Type, Union
1+
from __future__ import annotations
32

4-
from pydantic import BaseModel, Field
5-
from pydantic.networks import IPvAnyNetwork
3+
from datetime import datetime # noqa: TCH003
4+
from typing import Any, Literal
65

7-
from aws_lambda_powertools.utilities.parser.types import Literal
6+
from pydantic import BaseModel, Field
7+
from pydantic.networks import IPvAnyNetwork # noqa: TCH002
88

99

1010
class RequestContextV2AuthorizerIamCognito(BaseModel):
11-
amr: List[str]
11+
amr: list[str]
1212
identityId: str
1313
identityPoolId: str
1414

1515

1616
class RequestContextV2AuthorizerIam(BaseModel):
17-
accessKey: Optional[str] = None
18-
accountId: Optional[str] = None
19-
callerId: Optional[str] = None
20-
principalOrgId: Optional[str] = None
21-
userArn: Optional[str] = None
22-
userId: Optional[str] = None
23-
cognitoIdentity: Optional[RequestContextV2AuthorizerIamCognito] = None
17+
accessKey: str | None = None
18+
accountId: str | None = None
19+
callerId: str | None = None
20+
principalOrgId: str | None = None
21+
userArn: str | None = None
22+
userId: str | None = None
23+
cognitoIdentity: RequestContextV2AuthorizerIamCognito | None = None
2424

2525

2626
class RequestContextV2AuthorizerJwt(BaseModel):
27-
claims: Dict[str, Any]
28-
scopes: Optional[List[str]] = None
27+
claims: dict[str, Any]
28+
scopes: list[str] | None = None
2929

3030

3131
class RequestContextV2Authorizer(BaseModel):
32-
jwt: Optional[RequestContextV2AuthorizerJwt] = None
33-
iam: Optional[RequestContextV2AuthorizerIam] = None
34-
lambda_value: Optional[Dict[str, Any]] = Field(None, alias="lambda")
32+
jwt: RequestContextV2AuthorizerJwt | None = None
33+
iam: RequestContextV2AuthorizerIam | None = None
34+
lambda_value: dict[str, Any] | None = Field(None, alias="lambda")
3535

3636

3737
class RequestContextV2Http(BaseModel):
@@ -45,7 +45,7 @@ class RequestContextV2Http(BaseModel):
4545
class RequestContextV2(BaseModel):
4646
accountId: str
4747
apiId: str
48-
authorizer: Optional[RequestContextV2Authorizer] = None
48+
authorizer: RequestContextV2Authorizer | None = None
4949
domainName: str
5050
domainPrefix: str
5151
requestId: str
@@ -61,11 +61,11 @@ class APIGatewayProxyEventV2Model(BaseModel):
6161
routeKey: str
6262
rawPath: str
6363
rawQueryString: str
64-
cookies: Optional[List[str]] = None
65-
headers: Dict[str, str]
66-
queryStringParameters: Optional[Dict[str, str]] = None
67-
pathParameters: Optional[Dict[str, str]] = None
68-
stageVariables: Optional[Dict[str, str]] = None
64+
cookies: list[str] | None = None
65+
headers: dict[str, str]
66+
queryStringParameters: dict[str, str] | None = None
67+
pathParameters: dict[str, str] | None = None
68+
stageVariables: dict[str, str] | None = None
6969
requestContext: RequestContextV2
70-
body: Optional[Union[str, Type[BaseModel]]] = None
70+
body: str | type[BaseModel] | None = None
7171
isBase64Encoded: bool

aws_lambda_powertools/utilities/parser/models/bedrock_agent.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Dict, List, Optional
1+
from __future__ import annotations
22

33
from pydantic import BaseModel, Field
44

@@ -17,11 +17,11 @@ class BedrockAgentPropertyModel(BaseModel):
1717

1818

1919
class BedrockAgentRequestMediaModel(BaseModel):
20-
properties: List[BedrockAgentPropertyModel]
20+
properties: list[BedrockAgentPropertyModel]
2121

2222

2323
class BedrockAgentRequestBodyModel(BaseModel):
24-
content: Dict[str, BedrockAgentRequestMediaModel]
24+
content: dict[str, BedrockAgentRequestMediaModel]
2525

2626

2727
class BedrockAgentEventModel(BaseModel):
@@ -31,8 +31,8 @@ class BedrockAgentEventModel(BaseModel):
3131
action_group: str = Field(..., alias="actionGroup")
3232
api_path: str = Field(..., alias="apiPath")
3333
http_method: str = Field(..., alias="httpMethod")
34-
session_attributes: Dict[str, str] = Field({}, alias="sessionAttributes")
35-
prompt_session_attributes: Dict[str, str] = Field({}, alias="promptSessionAttributes")
34+
session_attributes: dict[str, str] = Field({}, alias="sessionAttributes")
35+
prompt_session_attributes: dict[str, str] = Field({}, alias="promptSessionAttributes")
3636
agent: BedrockAgentModel
37-
parameters: Optional[List[BedrockAgentPropertyModel]] = None
38-
request_body: Optional[BedrockAgentRequestBodyModel] = Field(None, alias="requestBody")
37+
parameters: list[BedrockAgentPropertyModel] | None = None
38+
request_body: BedrockAgentRequestBodyModel | None = Field(None, alias="requestBody")

aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from typing import Any, Dict, Union
1+
from __future__ import annotations
22

3-
from pydantic import BaseModel, Field, HttpUrl
3+
from typing import Any, Literal
44

5-
from aws_lambda_powertools.utilities.parser.types import Literal
5+
from pydantic import BaseModel, Field, HttpUrl
66

77

88
class CloudFormationCustomResourceBaseModel(BaseModel):
@@ -13,7 +13,7 @@ class CloudFormationCustomResourceBaseModel(BaseModel):
1313
request_id: str = Field(..., alias="RequestId")
1414
logical_resource_id: str = Field(..., alias="LogicalResourceId")
1515
resource_type: str = Field(..., alias="ResourceType")
16-
resource_properties: Union[Dict[str, Any], BaseModel, None] = Field(None, alias="ResourceProperties")
16+
resource_properties: dict[str, Any] | BaseModel | None = Field(None, alias="ResourceProperties")
1717

1818

1919
class CloudFormationCustomResourceCreateModel(CloudFormationCustomResourceBaseModel):
@@ -28,4 +28,4 @@ class CloudFormationCustomResourceDeleteModel(CloudFormationCustomResourceBaseMo
2828
class CloudFormationCustomResourceUpdateModel(CloudFormationCustomResourceBaseModel):
2929
request_type: Literal["Update"] = Field(..., alias="RequestType")
3030
physical_resource_id: str = Field(..., alias="PhysicalResourceId")
31-
old_resource_properties: Union[Dict[str, Any], BaseModel, None] = Field(None, alias="OldResourceProperties")
31+
old_resource_properties: dict[str, Any] | BaseModel | None = Field(None, alias="OldResourceProperties")

aws_lambda_powertools/utilities/parser/models/cloudwatch.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
from __future__ import annotations
2+
13
import base64
24
import json
35
import logging
46
import zlib
5-
from datetime import datetime
6-
from typing import List, Optional, Type, Union
7+
from datetime import datetime # noqa: TCH003
78

89
from pydantic import BaseModel, Field, field_validator
910

@@ -13,17 +14,17 @@
1314
class CloudWatchLogsLogEvent(BaseModel):
1415
id: str # noqa AA03 VNE003
1516
timestamp: datetime
16-
message: Union[str, Type[BaseModel]]
17+
message: str | type[BaseModel]
1718

1819

1920
class CloudWatchLogsDecode(BaseModel):
2021
messageType: str
2122
owner: str
2223
logGroup: str
2324
logStream: str
24-
subscriptionFilters: List[str]
25-
logEvents: List[CloudWatchLogsLogEvent]
26-
policyLevel: Optional[str] = None
25+
subscriptionFilters: list[str]
26+
logEvents: list[CloudWatchLogsLogEvent]
27+
policyLevel: str | None = None
2728

2829

2930
class CloudWatchLogsData(BaseModel):

aws_lambda_powertools/utilities/parser/models/dynamodb.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
from datetime import datetime
2-
from typing import Any, Dict, List, Optional, Type, Union
1+
from __future__ import annotations
2+
3+
from datetime import datetime # noqa: TCH003
4+
from typing import Any, Literal
35

46
from pydantic import BaseModel, field_validator
57

68
from aws_lambda_powertools.shared.dynamodb_deserializer import TypeDeserializer
7-
from aws_lambda_powertools.utilities.parser.types import Literal
89

910
_DESERIALIZER = TypeDeserializer()
1011

1112

1213
class DynamoDBStreamChangedRecordModel(BaseModel):
13-
ApproximateCreationDateTime: Optional[datetime] = None
14-
Keys: Dict[str, Any]
15-
NewImage: Optional[Union[Dict[str, Any], Type[BaseModel], BaseModel]] = None
16-
OldImage: Optional[Union[Dict[str, Any], Type[BaseModel], BaseModel]] = None
14+
ApproximateCreationDateTime: datetime | None = None
15+
Keys: dict[str, Any]
16+
NewImage: dict[str, Any] | type[BaseModel] | BaseModel | None = None
17+
OldImage: dict[str, Any] | type[BaseModel] | BaseModel | None = None
1718
SequenceNumber: str
1819
SizeBytes: int
1920
StreamViewType: Literal["NEW_AND_OLD_IMAGES", "KEYS_ONLY", "NEW_IMAGE", "OLD_IMAGE"]
@@ -47,8 +48,8 @@ class DynamoDBStreamRecordModel(BaseModel):
4748
awsRegion: str
4849
eventSourceARN: str
4950
dynamodb: DynamoDBStreamChangedRecordModel
50-
userIdentity: Optional[UserIdentity] = None
51+
userIdentity: UserIdentity | None = None
5152

5253

5354
class DynamoDBStreamModel(BaseModel):
54-
Records: List[DynamoDBStreamRecordModel]
55+
Records: list[DynamoDBStreamRecordModel]
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from datetime import datetime
2-
from typing import List, Optional
1+
from __future__ import annotations
2+
3+
from datetime import datetime # noqa: TCH003
34

45
from pydantic import BaseModel, Field
56

6-
from aws_lambda_powertools.utilities.parser.types import RawDictOrModel
7+
from aws_lambda_powertools.utilities.parser.types import RawDictOrModel # noqa: TCH001
78

89

910
class EventBridgeModel(BaseModel):
@@ -13,7 +14,7 @@ class EventBridgeModel(BaseModel):
1314
account: str
1415
time: datetime
1516
region: str
16-
resources: List[str]
17+
resources: list[str]
1718
detail_type: str = Field(None, alias="detail-type")
1819
detail: RawDictOrModel
19-
replay_name: Optional[str] = Field(None, alias="replay-name")
20+
replay_name: str | None = Field(None, alias="replay-name")

0 commit comments

Comments
 (0)