Skip to content

Commit 1cdb0d4

Browse files
authored
Release 2.0.2 (#115)
* Release 2.0.2 * fix(traits/float_value): Add custom field to ser/deser trait_value (#114) * fix(traits/float_value): Add custom field to ser/deser trait_value Since dynamodb can't understand float(and trait value can be float) we need to convert it to Decimal in order to store that in dynamodb * minor review fixes
1 parent 3e02f2a commit 1cdb0d4

File tree

4 files changed

+60
-3
lines changed

4 files changed

+60
-3
lines changed
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,30 @@
1+
import decimal
2+
13
from marshmallow import fields
24

35
from flag_engine.identities.traits.models import TraitModel
46
from flag_engine.utils.marshmallow.schemas import LoadToModelSchema
57

68

9+
class TraitValueField(fields.Field):
10+
"""Field that serializes float(and only float) to Decimal(because dynamodb can't understand float)
11+
and deserializes Decimal(and only decimal) to float
12+
"""
13+
14+
def _serialize(self, value, attr, obj, **kwargs):
15+
if type(value) is float:
16+
value = decimal.Decimal(str(value))
17+
return value
18+
19+
def _deserialize(self, value, attr, data, **kwargs):
20+
if isinstance(value, decimal.Decimal):
21+
value = float(value)
22+
return value
23+
24+
725
class TraitSchema(LoadToModelSchema):
826
trait_key = fields.Str()
9-
trait_value = fields.Field(allow_none=True)
27+
trait_value = TraitValueField(allow_none=True)
1028

1129
class Meta:
1230
model_class = TraitModel

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name="flagsmith-flag-engine",
5-
version="2.0.1",
5+
version="2.0.2",
66
author="Flagsmith",
77
author_email="support@flagsmith.com",
88
packages=find_packages(include=["flag_engine", "flag_engine.*"]),

tests/unit/api/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ def django_identity(
190190
django_enabled_feature_state_with_string_value,
191191
django_multivariate_feature_state,
192192
django_environment,
193+
django_trait_integer,
194+
django_trait_float,
195+
django_trait_string,
196+
django_trait_boolean,
193197
):
194198
return DjangoIdentity(
195199
id=1,
@@ -201,4 +205,10 @@ def django_identity(
201205
django_enabled_feature_state_with_string_value,
202206
django_multivariate_feature_state,
203207
],
208+
identity_traits=[
209+
django_trait_boolean,
210+
django_trait_float,
211+
django_trait_integer,
212+
django_trait_string,
213+
],
204214
)

tests/unit/identities/test_trait_schema.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import decimal
2+
13
import pytest
24

35
from flag_engine.identities.traits.models import TraitModel
@@ -28,13 +30,27 @@ def test_trait_schema_load(trait_key, trait_value):
2830
assert trait_model.trait_value == trait_value
2931

3032

33+
def test_trait_schema_load_converts_decimal_to_float():
34+
# Given
35+
trait_value = 11.9
36+
trait_schema = TraitSchema()
37+
38+
# When
39+
trait_model = trait_schema.load(
40+
{"trait_key": "key", "trait_value": decimal.Decimal(str(trait_value))}
41+
)
42+
43+
# Then
44+
assert trait_model.trait_value == trait_value
45+
assert isinstance(trait_model.trait_value, float)
46+
47+
3148
@pytest.mark.parametrize(
3249
"trait_model",
3350
(
3451
TraitModel("key", "value"),
3552
TraitModel("key", 21),
3653
TraitModel("key1", None),
37-
TraitModel("key1", 11.2),
3854
TraitModel("key1", True),
3955
),
4056
)
@@ -48,3 +64,16 @@ def test_trait_schema_dump(trait_model):
4864
# Then
4965
assert trait_data["trait_key"] == trait_model.trait_key
5066
assert trait_data["trait_value"] == trait_model.trait_value
67+
68+
69+
def test_trait_schema_dump_converts_float_to_decimal():
70+
# Given
71+
trait_model = TraitModel("key1", 12.1)
72+
trait_schema = TraitSchema()
73+
74+
# When
75+
trait_data = trait_schema.dump(trait_model)
76+
77+
# Then
78+
assert trait_data["trait_key"] == trait_model.trait_key
79+
assert trait_data["trait_value"] == decimal.Decimal(str(trait_model.trait_value))

0 commit comments

Comments
 (0)