Skip to content

Commit a968668

Browse files
author
Ignacio Bolonio
committed
Some progress, still tests are failing
1 parent 4b52ade commit a968668

18 files changed

+361
-273
lines changed

Diff for: pycfmodel/model/base.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
from pydantic import BaseModel, Extra, root_validator
1+
from pydantic import BaseModel, ConfigDict, model_validator
22

33
from pycfmodel.utils import is_resolvable_dict
44

55

66
class CustomModel(BaseModel):
7-
class Config(BaseModel.Config):
8-
extra = Extra.forbid
9-
underscore_attrs_are_private = True
7+
model_config = ConfigDict(extra="forbid")
108

119
def dict(self, *args, exclude_unset=True, **kwargs):
1210
return super().dict(*args, **kwargs, exclude_unset=exclude_unset)
@@ -15,10 +13,10 @@ def dict(self, *args, exclude_unset=True, **kwargs):
1513
class FunctionDict(BaseModel):
1614
# Inheriting directly from base model as we want to allow extra fields
1715
# and there are no default values that we need to suppress
18-
class Config(BaseModel.Config):
19-
extra = Extra.allow
16+
model_config = ConfigDict(extra="allow")
2017

21-
@root_validator(pre=True)
18+
@model_validator(mode="before")
19+
@classmethod
2220
def check_if_valid_function(cls, values):
2321
if not is_resolvable_dict(values):
2422
raise ValueError("FunctionDict should only have 1 key and be a function")

Diff for: pycfmodel/model/cf_model.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class CFModel(CustomModel):
3232
More info at [AWS Docs](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)
3333
"""
3434

35-
AWSTemplateFormatVersion: Optional[date]
35+
AWSTemplateFormatVersion: Optional[date] = None
3636
Conditions: Optional[Dict] = {}
3737
Description: Optional[str] = None
3838
Mappings: Optional[Dict[str, Dict[str, Dict[str, Any]]]] = {}
@@ -41,7 +41,7 @@ class CFModel(CustomModel):
4141
Parameters: Optional[Dict[str, Parameter]] = {}
4242
Resources: Dict[str, Resolvable[Union[ResourceModels, GenericResource]]] = {}
4343
Rules: Optional[Dict] = {}
44-
Transform: Optional[Union[str, List[str]]]
44+
Transform: Optional[Union[str, List[str]]] = None
4545

4646
PSEUDO_PARAMETERS: ClassVar[Dict[str, Union[str, List[str]]]] = {
4747
# default pseudo parameters

Diff for: pycfmodel/model/generic.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from contextlib import suppress
33
from typing import Union
44

5-
from pydantic import BaseModel, Extra, ValidationError, root_validator, validator
5+
from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_validator, model_validator
66

77
from pycfmodel.model.base import FunctionDict
88
from pycfmodel.model.resources.properties.types import Properties
@@ -25,14 +25,15 @@ class _Auxiliar(BaseModel):
2525
Properties,
2626
ResolvableBoolOrList,
2727
ResolvableIntOrList,
28-
ResolvableDatetimeOrList,
2928
ResolvableDateOrList,
29+
ResolvableDatetimeOrList,
3030
ResolvableIPOrList,
3131
ResolvableArnOrList,
3232
ResolvableStrOrList,
33-
]
33+
] = Field(union_mode="left_to_right")
3434

35-
@validator("aux", pre=True)
35+
@field_validator("aux", mode="before")
36+
@classmethod
3637
def validate_string_property_formatted_as_json(cls, value):
3738
"""
3839
We have detected some properties that are defined as String in CloudFormation but including a
@@ -71,10 +72,10 @@ def cast(cls, value):
7172
class Generic(BaseModel):
7273
"""Any property under this class will be cast to an existing model of `pycfmodel` if possible."""
7374

74-
class Config(BaseModel.Config):
75-
extra = Extra.allow
75+
model_config = ConfigDict(extra="allow")
7676

77-
@root_validator(pre=True)
77+
@model_validator(mode="before")
78+
@classmethod
7879
def casting(cls, values):
7980
return {k: _Auxiliar.cast(v) for k, v in values.items()}
8081

Diff for: pycfmodel/model/resources/generic_resource.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from typing import ClassVar, Optional
33

4-
from pydantic import Extra, validator
4+
from pydantic import ConfigDict, field_validator
55

66
from pycfmodel.model.generic import Generic
77
from pycfmodel.model.resources.resource import Resource
@@ -19,10 +19,9 @@ class GenericResource(Resource):
1919
Type: str
2020
Properties: Optional[Generic] = None
2121

22-
class Config(Resource.Config):
23-
extra = Extra.allow
22+
model_config = ConfigDict(extra="allow")
2423

25-
@validator("Type", pre=True)
24+
@field_validator("Type")
2625
def check_type(cls, value, values, **kwargs):
2726
if value in _EXISTING_RESOURCE_TYPES:
2827
if cls.ALLOW_EXISTING_TYPES:

Diff for: pycfmodel/model/resources/iam_group.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class IAMGroup(Resource):
3636

3737
TYPE_VALUE: ClassVar = "AWS::IAM::Group"
3838
Type: str = TYPE_VALUE
39-
Properties: Optional[Resolvable[IAMGroupProperties]]
39+
Properties: Optional[Resolvable[IAMGroupProperties]] = None
4040

4141
@property
4242
def policy_documents(self) -> List[OptionallyNamedPolicyDocument]:

Diff for: pycfmodel/model/resources/iam_user.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class IAMUser(Resource):
4343

4444
TYPE_VALUE: ClassVar = "AWS::IAM::User"
4545
Type: str = TYPE_VALUE
46-
Properties: Optional[Resolvable[IAMUserProperties]]
46+
Properties: Optional[Resolvable[IAMUserProperties]] = None
4747

4848
def has_hardcoded_credentials(self) -> bool:
4949
"""Returns True if login profile password contains a hardcoded string, otherwise False."""

Diff for: pycfmodel/model/resources/properties/policy_document.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import List, Optional, Pattern, Union
22

3-
from pydantic import Extra
3+
from pydantic import ConfigDict
44

55
from pycfmodel.cloudformation_actions import CLOUDFORMATION_ACTIONS
66
from pycfmodel.model.resources.properties.property import Property
@@ -20,8 +20,7 @@ class PolicyDocument(Property):
2020
- Version: An optional date indicating the version of the policy document being used.
2121
"""
2222

23-
class Config(Property.Config):
24-
extra = Extra.allow
23+
model_config = ConfigDict(extra="allow")
2524

2625
Statement: Resolvable[Union[Statement, List[Resolvable[Statement]]]]
2726
Id: Optional[ResolvableStr] = None

Diff for: pycfmodel/model/resources/properties/security_group_ingress_prop.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ def ipv6_slash_zero(self) -> bool:
5959

6060

6161
class DBSecurityGroupIngressProp(Property):
62-
CIDRIP: Optional[ResolvableIPv4Network]
63-
EC2SecurityGroupId: Optional[ResolvableStr]
64-
EC2SecurityGroupName: Optional[ResolvableStr]
65-
EC2SecurityGroupOwnerId: Optional[ResolvableStr]
62+
CIDRIP: Optional[ResolvableIPv4Network] = None
63+
EC2SecurityGroupId: Optional[ResolvableStr] = None
64+
EC2SecurityGroupName: Optional[ResolvableStr] = None
65+
EC2SecurityGroupOwnerId: Optional[ResolvableStr] = None
6666

6767
def is_public(self) -> bool:
6868
"""Returns True if `CidrIp` is public otherwise False."""

Diff for: pycfmodel/model/resources/properties/statement.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from typing import List, Optional, Pattern, Union
33

4-
from pydantic import validator
4+
from pydantic import field_validator
55

66
from pycfmodel.action_expander import _expand_action
77
from pycfmodel.model.base import FunctionDict
@@ -52,7 +52,8 @@ class Statement(Property):
5252
NotResource: Optional[ResolvableStrOrList] = None
5353
Condition: Optional[StatementCondition] = None
5454

55-
@validator("Effect")
55+
@field_validator("Effect")
56+
@classmethod
5657
def allowed_values_for_effect_and_capitalized(cls, v: ResolvableStr):
5758
if isinstance(v, str):
5859
v = v.capitalize()

0 commit comments

Comments
 (0)