Skip to content

Commit

Permalink
Merge pull request #5092 from domsammut/master
Browse files Browse the repository at this point in the history
[bug] Round Decimal to 9 places to support DynamoDB constraints
  • Loading branch information
wochinge authored Jan 22, 2020
2 parents 834981a + d2c7355 commit 4bbf78b
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 3 deletions.
1 change: 1 addition & 0 deletions changelog/5092.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DynamoDB tracker store decimal values will now be rounded on save. Previously values exceeding 38 digits caused an unhandled error.
7 changes: 4 additions & 3 deletions rasa/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,14 +458,15 @@ def handler(fut: Future) -> None:
return handler


def replace_floats_with_decimals(obj: Union[List, Dict]) -> Any:
def replace_floats_with_decimals(obj: Union[List, Dict], round_digits: int = 9) -> Any:
"""
Utility method to recursively walk a dictionary or list converting all `float` to `Decimal` as required by DynamoDb.
Args:
obj: A `List` or `Dict` object.
round_digits: A int value to set the rounding precision of Decimal values.
Returns: An object with all matching values and `float` type replaced by `Decimal`.
Returns: An object with all matching values and `float` types replaced by `Decimal`s rounded to `round_digits` decimal places.
"""
if isinstance(obj, list):
Expand All @@ -477,7 +478,7 @@ def replace_floats_with_decimals(obj: Union[List, Dict]) -> Any:
obj[j] = replace_floats_with_decimals(obj[j])
return obj
elif isinstance(obj, float):
return Decimal(obj)
return round(Decimal(obj), round_digits)
else:
return obj

Expand Down
2 changes: 2 additions & 0 deletions tests/core/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ def test_float_conversion_to_decimal():
d = {
"int": -1,
"float": 2.1,
"float_round": 1579507733.1107571125030517578125,
"list": ["one", "two"],
"list_of_floats": [1.0, -2.1, 3.2],
"nested_dict_with_floats": {"list_with_floats": [4.5, -5.6], "float": 6.7},
Expand All @@ -106,6 +107,7 @@ def test_float_conversion_to_decimal():

assert isinstance(d_replaced["int"], int)
assert isinstance(d_replaced["float"], Decimal)
assert d_replaced["float_round"] == Decimal("1579507733.110757113")
for t in d_replaced["list"]:
assert isinstance(t, str)
for f in d_replaced["list_of_floats"]:
Expand Down

0 comments on commit 4bbf78b

Please sign in to comment.