Skip to content

Commit 46450b7

Browse files
committed
factor out override mapper, use segment ids as keys
1 parent bc147a5 commit 46450b7

File tree

1 file changed

+42
-31
lines changed

1 file changed

+42
-31
lines changed

flag_engine/context/mappers.py

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,48 @@ def map_environment_identity_to_context(
5252
segment_ctx_data["overrides"] = list(
5353
_map_feature_states_to_feature_contexts(segment_feature_states).values()
5454
)
55-
segments[segment.name] = segment_ctx_data
56-
# Concatenate feature states overriden for identities
57-
# to segment contexts
55+
segments[str(segment.id)] = segment_ctx_data
56+
identity_overrides = environment.identity_overrides + [identity] if identity else []
57+
segments.update(_map_identity_overrides_to_segment_contexts(identity_overrides))
58+
return {
59+
"environment": {
60+
"key": environment.api_key,
61+
"name": environment.name or "",
62+
},
63+
"identity": (
64+
{
65+
"identifier": identity.identifier,
66+
"key": str(identity.django_id or identity.composite_key),
67+
"traits": {
68+
trait.trait_key: trait.trait_value
69+
for trait in (
70+
override_traits
71+
if override_traits is not None
72+
else identity.identity_traits
73+
)
74+
},
75+
}
76+
if identity
77+
else None
78+
),
79+
"features": features,
80+
"segments": segments,
81+
}
82+
83+
84+
def _map_identity_overrides_to_segment_contexts(
85+
identity_overrides: typing.List[IdentityModel],
86+
) -> typing.Dict[str, SegmentContext]:
87+
"""
88+
Map identity overrides to segment contexts.
89+
90+
:param identity_overrides: A list of IdentityModel objects.
91+
:return: A dictionary mapping segment ids to SegmentContext objects.
92+
"""
5893
features_to_identifiers: typing.Dict[
5994
OverridesKey,
6095
typing.List[str],
6196
] = defaultdict(list)
62-
identity_overrides = environment.identity_overrides + [identity] if identity else []
6397
for identity_override in identity_overrides:
6498
identity_features: typing.List[FeatureStateModel] = (
6599
identity_override.identity_features
@@ -76,9 +110,10 @@ def map_environment_identity_to_context(
76110
for feature_state in sorted(identity_features, key=_get_name)
77111
)
78112
features_to_identifiers[overrides_key].append(identity_override.identifier)
113+
segment_contexts: typing.Dict[str, SegmentContext] = {}
79114
for overrides_key, identifiers in features_to_identifiers.items():
80115
segment_name = f"overrides_{abs(hash(overrides_key))}"
81-
segments[segment_name] = SegmentContext(
116+
segment_contexts[segment_name] = SegmentContext(
82117
key="", # Identity override segments never use % Split operator
83118
name=segment_name,
84119
rules=[
@@ -110,30 +145,7 @@ def map_environment_identity_to_context(
110145
for feature_key, feature_name, feature_enabled, feature_value in overrides_key
111146
],
112147
)
113-
return {
114-
"environment": {
115-
"key": environment.api_key,
116-
"name": environment.name or "",
117-
},
118-
"identity": (
119-
{
120-
"identifier": identity.identifier,
121-
"key": str(identity.django_id or identity.composite_key),
122-
"traits": {
123-
trait.trait_key: trait.trait_value
124-
for trait in (
125-
override_traits
126-
if override_traits is not None
127-
else identity.identity_traits
128-
)
129-
},
130-
}
131-
if identity
132-
else None
133-
),
134-
"features": features,
135-
"segments": segments,
136-
}
148+
return segment_contexts
137149

138150

139151
def _map_feature_states_to_feature_contexts(
@@ -158,8 +170,7 @@ def _map_feature_states_to_feature_contexts(
158170
MultivariateFeatureStateValueModel
159171
]
160172
if (
161-
multivariate_feature_state_values
162-
:= feature_state.multivariate_feature_state_values
173+
multivariate_feature_state_values := feature_state.multivariate_feature_state_values
163174
):
164175
feature_ctx_data["variants"] = [
165176
{

0 commit comments

Comments
 (0)