Skip to content

Commit a1baf63

Browse files
committed
Fix pydantic not working with Python 3.8
TypeError: You have a type annotation 'str | None' which makes use of newer typing features than are supported in your version of Python. To handle this error, you should either remove the use of new syntax or install the `eval_type_backport` package.
1 parent 6406f59 commit a1baf63

22 files changed

+234
-239
lines changed

aws_lambda_powertools/utilities/parser/models/alb.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from __future__ import annotations
1+
# ruff: noqa: FA100
2+
from typing import Dict, Type, Union
23

34
from pydantic import BaseModel
45

@@ -14,8 +15,8 @@ class AlbRequestContext(BaseModel):
1415
class AlbModel(BaseModel):
1516
httpMethod: str
1617
path: str
17-
body: str | type[BaseModel]
18+
body: Union[str, Type[BaseModel]]
1819
isBase64Encoded: bool
19-
headers: dict[str, str]
20-
queryStringParameters: dict[str, str]
20+
headers: Dict[str, str]
21+
queryStringParameters: Dict[str, str]
2122
requestContext: AlbRequestContext
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from __future__ import annotations
2-
3-
from datetime import datetime # noqa: TCH003
4-
from typing import Any, Literal
1+
# ruff: noqa: FA100
2+
from datetime import datetime
3+
from typing import Any, Dict, List, Literal, Optional, Type, Union
54

65
from pydantic import BaseModel, model_validator
7-
from pydantic.networks import IPvAnyNetwork # noqa: TCH002
6+
from pydantic.networks import IPvAnyNetwork
87

98

109
class ApiGatewayUserCertValidity(BaseModel):
@@ -21,54 +20,54 @@ class ApiGatewayUserCert(BaseModel):
2120

2221

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

4241

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

4746

4847
class APIGatewayEventRequestContext(BaseModel):
4948
accountId: str
5049
apiId: str
51-
authorizer: APIGatewayEventAuthorizer | None = None
50+
authorizer: Optional[APIGatewayEventAuthorizer] = None
5251
stage: str
5352
protocol: str
5453
identity: APIGatewayEventIdentity
5554
requestId: str
5655
requestTime: str
5756
requestTimeEpoch: datetime
58-
resourceId: str | None = None
57+
resourceId: Optional[str] = None
5958
resourcePath: str
60-
domainName: str | None = None
61-
domainPrefix: str | None = None
62-
extendedRequestId: str | None = None
59+
domainName: Optional[str] = None
60+
domainPrefix: Optional[str] = None
61+
extendedRequestId: Optional[str] = None
6362
httpMethod: Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
6463
path: str
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
64+
connectedAt: Optional[datetime] = None
65+
connectionId: Optional[str] = None
66+
eventType: Optional[Literal["CONNECT", "MESSAGE", "DISCONNECT"]] = None
67+
messageDirection: Optional[str] = None
68+
messageId: Optional[str] = None
69+
routeKey: Optional[str] = None
70+
operationName: Optional[str] = None
7271

7372
@model_validator(mode="before")
7473
def check_message_id(cls, values):
@@ -79,16 +78,16 @@ def check_message_id(cls, values):
7978

8079

8180
class APIGatewayProxyEventModel(BaseModel):
82-
version: str | None = None
81+
version: Optional[str] = None
8382
resource: str
8483
path: str
8584
httpMethod: Literal["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
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
85+
headers: Dict[str, str]
86+
multiValueHeaders: Dict[str, List[str]]
87+
queryStringParameters: Optional[Dict[str, str]] = None
88+
multiValueQueryStringParameters: Optional[Dict[str, List[str]]] = None
9089
requestContext: APIGatewayEventRequestContext
91-
pathParameters: dict[str, str] | None = None
92-
stageVariables: dict[str, str] | None = None
90+
pathParameters: Optional[Dict[str, str]] = None
91+
stageVariables: Optional[Dict[str, str]] = None
9392
isBase64Encoded: bool
94-
body: str | type[BaseModel] | None = None
93+
body: Optional[Union[str, Type[BaseModel]]] = None
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
1-
from __future__ import annotations
2-
3-
from datetime import datetime # noqa: TCH003
4-
from typing import Any, Literal
1+
# ruff: noqa: FA100
2+
from datetime import datetime
3+
from typing import Any, Dict, List, Literal, Optional, Type, Union
54

65
from pydantic import BaseModel, Field
7-
from pydantic.networks import IPvAnyNetwork # noqa: TCH002
6+
from pydantic.networks import IPvAnyNetwork
87

98

109
class RequestContextV2AuthorizerIamCognito(BaseModel):
11-
amr: list[str]
10+
amr: List[str]
1211
identityId: str
1312
identityPoolId: str
1413

1514

1615
class RequestContextV2AuthorizerIam(BaseModel):
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
16+
accessKey: Optional[str] = None
17+
accountId: Optional[str] = None
18+
callerId: Optional[str] = None
19+
principalOrgId: Optional[str] = None
20+
userArn: Optional[str] = None
21+
userId: Optional[str] = None
22+
cognitoIdentity: Optional[RequestContextV2AuthorizerIamCognito] = None
2423

2524

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

3029

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

3635

3736
class RequestContextV2Http(BaseModel):
@@ -45,7 +44,7 @@ class RequestContextV2Http(BaseModel):
4544
class RequestContextV2(BaseModel):
4645
accountId: str
4746
apiId: str
48-
authorizer: RequestContextV2Authorizer | None = None
47+
authorizer: Optional[RequestContextV2Authorizer] = None
4948
domainName: str
5049
domainPrefix: str
5150
requestId: str
@@ -61,11 +60,11 @@ class APIGatewayProxyEventV2Model(BaseModel):
6160
routeKey: str
6261
rawPath: str
6362
rawQueryString: str
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
63+
cookies: Optional[List[str]] = None
64+
headers: Dict[str, str]
65+
queryStringParameters: Optional[Dict[str, str]] = None
66+
pathParameters: Optional[Dict[str, str]] = None
67+
stageVariables: Optional[Dict[str, str]] = None
6968
requestContext: RequestContextV2
70-
body: str | type[BaseModel] | None = None
69+
body: Optional[Union[str, Type[BaseModel]]] = None
7170
isBase64Encoded: bool

aws_lambda_powertools/utilities/parser/models/bedrock_agent.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from __future__ import annotations
1+
# ruff: noqa: FA100
2+
from typing import Dict, List, Optional
23

34
from pydantic import BaseModel, Field
45

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

1819

1920
class BedrockAgentRequestMediaModel(BaseModel):
20-
properties: list[BedrockAgentPropertyModel]
21+
properties: List[BedrockAgentPropertyModel]
2122

2223

2324
class BedrockAgentRequestBodyModel(BaseModel):
24-
content: dict[str, BedrockAgentRequestMediaModel]
25+
content: Dict[str, BedrockAgentRequestMediaModel]
2526

2627

2728
class BedrockAgentEventModel(BaseModel):
@@ -31,8 +32,8 @@ class BedrockAgentEventModel(BaseModel):
3132
action_group: str = Field(..., alias="actionGroup")
3233
api_path: str = Field(..., alias="apiPath")
3334
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")
35+
session_attributes: Dict[str, str] = Field({}, alias="sessionAttributes")
36+
prompt_session_attributes: Dict[str, str] = Field({}, alias="promptSessionAttributes")
3637
agent: BedrockAgentModel
37-
parameters: list[BedrockAgentPropertyModel] | None = None
38-
request_body: BedrockAgentRequestBodyModel | None = Field(None, alias="requestBody")
38+
parameters: Optional[List[BedrockAgentPropertyModel]] = None
39+
request_body: Optional[BedrockAgentRequestBodyModel] = Field(None, alias="requestBody")

aws_lambda_powertools/utilities/parser/models/cloudformation_custom_resource.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
from __future__ import annotations
2-
3-
from typing import Any, Literal
1+
# ruff: noqa: FA100
2+
from typing import Any, Dict, Literal, Union
43

54
from pydantic import BaseModel, Field, HttpUrl
65

@@ -13,7 +12,7 @@ class CloudFormationCustomResourceBaseModel(BaseModel):
1312
request_id: str = Field(..., alias="RequestId")
1413
logical_resource_id: str = Field(..., alias="LogicalResourceId")
1514
resource_type: str = Field(..., alias="ResourceType")
16-
resource_properties: dict[str, Any] | BaseModel | None = Field(None, alias="ResourceProperties")
15+
resource_properties: Union[Dict[str, Any], BaseModel, None] = Field(None, alias="ResourceProperties")
1716

1817

1918
class CloudFormationCustomResourceCreateModel(CloudFormationCustomResourceBaseModel):
@@ -28,4 +27,4 @@ class CloudFormationCustomResourceDeleteModel(CloudFormationCustomResourceBaseMo
2827
class CloudFormationCustomResourceUpdateModel(CloudFormationCustomResourceBaseModel):
2928
request_type: Literal["Update"] = Field(..., alias="RequestType")
3029
physical_resource_id: str = Field(..., alias="PhysicalResourceId")
31-
old_resource_properties: dict[str, Any] | BaseModel | None = Field(None, alias="OldResourceProperties")
30+
old_resource_properties: Union[Dict[str, Any], BaseModel, None] = Field(None, alias="OldResourceProperties")

aws_lambda_powertools/utilities/parser/models/cloudwatch.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from __future__ import annotations
2-
1+
# ruff: noqa: FA100
32
import base64
43
import json
54
import logging
65
import zlib
7-
from datetime import datetime # noqa: TCH003
6+
from datetime import datetime
7+
from typing import List, Optional, Type, Union
88

99
from pydantic import BaseModel, Field, field_validator
1010

@@ -14,17 +14,17 @@
1414
class CloudWatchLogsLogEvent(BaseModel):
1515
id: str # noqa AA03 VNE003
1616
timestamp: datetime
17-
message: str | type[BaseModel]
17+
message: Union[str, Type[BaseModel]]
1818

1919

2020
class CloudWatchLogsDecode(BaseModel):
2121
messageType: str
2222
owner: str
2323
logGroup: str
2424
logStream: str
25-
subscriptionFilters: list[str]
26-
logEvents: list[CloudWatchLogsLogEvent]
27-
policyLevel: str | None = None
25+
subscriptionFilters: List[str]
26+
logEvents: List[CloudWatchLogsLogEvent]
27+
policyLevel: Optional[str] = None
2828

2929

3030
class CloudWatchLogsData(BaseModel):

aws_lambda_powertools/utilities/parser/models/dynamodb.py

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

65
from pydantic import BaseModel, field_validator
76

@@ -11,10 +10,10 @@
1110

1211

1312
class DynamoDBStreamChangedRecordModel(BaseModel):
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
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
1817
SequenceNumber: str
1918
SizeBytes: int
2019
StreamViewType: Literal["NEW_AND_OLD_IMAGES", "KEYS_ONLY", "NEW_IMAGE", "OLD_IMAGE"]
@@ -48,8 +47,8 @@ class DynamoDBStreamRecordModel(BaseModel):
4847
awsRegion: str
4948
eventSourceARN: str
5049
dynamodb: DynamoDBStreamChangedRecordModel
51-
userIdentity: UserIdentity | None = None
50+
userIdentity: Optional[UserIdentity] = None
5251

5352

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

55
from pydantic import BaseModel, Field
66

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

99

1010
class EventBridgeModel(BaseModel):
@@ -14,7 +14,7 @@ class EventBridgeModel(BaseModel):
1414
account: str
1515
time: datetime
1616
region: str
17-
resources: list[str]
17+
resources: List[str]
1818
detail_type: str = Field(None, alias="detail-type")
1919
detail: RawDictOrModel
20-
replay_name: str | None = Field(None, alias="replay-name")
20+
replay_name: Optional[str] = Field(None, alias="replay-name")

0 commit comments

Comments
 (0)