Skip to content

Commit fa5a3fe

Browse files
authored
non-strict deserializer for request data (#142)
1 parent 84bf727 commit fa5a3fe

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/cloudformation_cli_python_lib/utils.py

+6
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ class RequestData:
6060
previousStackTags: Optional[Mapping[str, Any]] = None
6161
previousSystemTags: Optional[Mapping[str, Any]] = None
6262

63+
def __init__(self, **kwargs: Any) -> None:
64+
dataclass_fields = {f.name for f in fields(self)}
65+
for k, v in kwargs.items():
66+
if k in dataclass_fields:
67+
setattr(self, k, v)
68+
6369
@classmethod
6470
def deserialize(cls, json_data: MutableMapping[str, Any]) -> "RequestData":
6571
req_data = RequestData(**json_data)

tests/lib/utils_test.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,24 @@ def test_handler_request_serde_roundtrip():
7878
"previousResourceProperties": None,
7979
"stackTags": {"tag1": "abc"},
8080
"previousStackTags": {"tag1": "def"},
81+
"undesiredField": "value",
8182
},
8283
"stackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/e72"
8384
"2ae60-fe62-11e8-9a0e-0ae8cc519968",
8485
}
86+
undesired = "undesiredField"
8587
ser = HandlerRequest.deserialize(payload).serialize()
8688
# remove None values from payload
8789
expected = {
88-
k: {k: v for k, v in payload["requestData"].items() if v is not None}
90+
k: {
91+
k: v
92+
for k, v in payload["requestData"].items()
93+
if v is not None and k not in undesired
94+
}
8995
if k == "requestData"
9096
else v
9197
for k, v in payload.items()
92-
if v is not None
98+
if v is not None and k not in undesired
9399
}
94100

95101
assert ser == expected

0 commit comments

Comments
 (0)