Skip to content

Commit 20fcdfe

Browse files
Small refactor
1 parent fd1a872 commit 20fcdfe

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

aws_lambda_powertools/utilities/data_classes/dynamo_db_stream_event.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,11 @@ def _deserialize_bool(self, value: bool) -> bool:
7575
def _deserialize_n(self, value: str) -> Decimal:
7676
value = value.lstrip("0")
7777
if len(value) > 38:
78+
# See: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Number
79+
# Calculate the number of trailing zeros after the 38th character
7880
tail = len(value[38:]) - len(value[38:].rstrip("0"))
79-
value = value[:-tail]
81+
# Trim the value: remove trailing zeros if any, or just take the first 38 characters
82+
value = value[:-tail] if tail > 0 else value[:38]
8083

8184
return DYNAMODB_CONTEXT.create_decimal(value)
8285

tests/unit/data_classes/required_dependencies/test_dynamo_db_stream_event.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
)
99
from tests.functional.utils import load_event
1010

11+
DECIMAL_CONTEXT = Context(
12+
Emin=-128,
13+
Emax=126,
14+
prec=38,
15+
traps=[Clamped, Overflow, Inexact, Rounded, Underflow],
16+
)
17+
1118

1219
def test_dynamodb_stream_trigger_event():
13-
decimal_context = Context(
14-
Emin=-128,
15-
Emax=126,
16-
prec=38,
17-
traps=[Clamped, Overflow, Inexact, Rounded, Underflow],
18-
)
1920

2021
raw_event = load_event("dynamoStreamEvent.json")
2122
parsed_event = DynamoDBStreamEvent(raw_event)
@@ -36,7 +37,7 @@ def test_dynamodb_stream_trigger_event():
3637
assert dynamodb.approximate_creation_date_time == record_raw["dynamodb"]["ApproximateCreationDateTime"]
3738
keys = dynamodb.keys
3839
assert keys is not None
39-
assert keys["Id"] == decimal_context.create_decimal(101)
40+
assert keys["Id"] == DECIMAL_CONTEXT.create_decimal(101)
4041
assert dynamodb.new_image.get("Message") == record_raw["dynamodb"]["NewImage"]["Message"]["S"]
4142
assert dynamodb.old_image is None
4243
assert dynamodb.sequence_number == record_raw["dynamodb"]["SequenceNumber"]
@@ -45,12 +46,6 @@ def test_dynamodb_stream_trigger_event():
4546

4647

4748
def test_dynamodb_stream_record_deserialization_large_int():
48-
decimal_context = Context(
49-
Emin=-128,
50-
Emax=126,
51-
prec=38,
52-
traps=[Clamped, Overflow, Inexact, Rounded, Underflow],
53-
)
5449
data = {
5550
"Keys": {"key1": {"attr1": "value1"}},
5651
"NewImage": {
@@ -61,7 +56,22 @@ def test_dynamodb_stream_record_deserialization_large_int():
6156
record = StreamRecord(data)
6257
assert record.new_image == {
6358
"Name": "Joe",
64-
"Age": decimal_context.create_decimal("11011111111111111000000000000000000000"),
59+
"Age": DECIMAL_CONTEXT.create_decimal("11011111111111111000000000000000000000"),
60+
}
61+
62+
63+
def test_dynamodb_stream_record_deserialization_large_int_without_trailing_zeros():
64+
data = {
65+
"Keys": {"key1": {"attr1": "value1"}},
66+
"NewImage": {
67+
"Name": {"S": "Joe"},
68+
"Age": {"N": "000000011011111111111112222222222221111111111111111111111"},
69+
},
70+
}
71+
record = StreamRecord(data)
72+
assert record.new_image == {
73+
"Name": "Joe",
74+
"Age": DECIMAL_CONTEXT.create_decimal("11011111111111112222222222221111111111"),
6575
}
6676

6777

0 commit comments

Comments
 (0)