Skip to content

Commit 989b934

Browse files
committed
feat: use-env-document-to-reconciliate-types
1 parent 7eff58b commit 989b934

File tree

4 files changed

+76
-30
lines changed

4 files changed

+76
-30
lines changed

src/edge_proxy/environments.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, Optional
1+
from typing import Any
22
from datetime import datetime
33
from email.utils import formatdate
44
from functools import lru_cache
@@ -83,6 +83,10 @@ def get_flags_response_data(
8383
server_key_only_feature_ids = environment_document.get("project", {}).get(
8484
"server_key_only_feature_ids", []
8585
)
86+
feature_types = {
87+
fs["feature"]["id"]: fs["feature"].get("type", "STANDARD")
88+
for fs in environment_document.get("feature_states", [])
89+
}
8690

8791
context = map_environment_document_to_context(environment_document)
8892
evaluation_result = get_evaluation_result(context)
@@ -100,7 +104,7 @@ def get_flags_response_data(
100104
if not filtered:
101105
raise FeatureNotFoundError()
102106

103-
data = map_flag_result_to_response_data(flag_result)
107+
data = map_flag_result_to_response_data(flag_result, feature_types)
104108

105109
else:
106110
flags = list(evaluation_result["flags"].values())
@@ -114,7 +118,7 @@ def get_flags_response_data(
114118
"hide_disabled_flags", False
115119
)
116120
flags = filter_disabled_flags(flags, hide_disabled_flags)
117-
data = map_flag_results_to_response_data(flags)
121+
data = map_flag_results_to_response_data(flags, feature_types)
118122

119123
return data
120124

@@ -126,6 +130,10 @@ def get_identity_response_data(
126130
server_key_only_feature_ids = environment_document.get("project", {}).get(
127131
"server_key_only_feature_ids", []
128132
)
133+
feature_types = {
134+
fs["feature"]["id"]: fs["feature"].get("type", "STANDARD")
135+
for fs in environment_document.get("feature_states", [])
136+
}
129137

130138
environment_context = map_environment_document_to_context(environment_document)
131139
context = map_context_and_identity_data_to_context(
@@ -147,14 +155,14 @@ def get_identity_response_data(
147155

148156
data = {
149157
"traits": map_traits_to_response_data(input_data.traits),
150-
"flags": map_flag_results_to_response_data(flags),
158+
"flags": map_flag_results_to_response_data(flags, feature_types),
151159
}
152160
return data
153161

154162
def get_environment(
155163
self,
156164
*,
157-
environment_key: Optional[str] = None,
165+
environment_key: str | None = None,
158166
) -> dict[str, Any]:
159167
if environment_key and environment_key.startswith(SERVER_API_KEY_PREFIX):
160168
client_side_key = self._get_client_key_from_server_key(environment_key)

src/edge_proxy/feature_utils.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@ def filter_out_server_key_only_flags(
55
flags: list[dict[str, Any]],
66
server_key_only_feature_ids: list[int],
77
) -> list[dict[str, Any]]:
8-
"""
9-
Filter out server-key-only flags from the list.
10-
11-
Args:
12-
flags: List of flag results
13-
server_key_only_feature_ids: List of feature IDs that are server-key-only
14-
15-
Returns:
16-
Filtered list of flags excluding server-key-only features
17-
"""
188
return [
199
flag
2010
for flag in flags
@@ -25,16 +15,6 @@ def filter_out_server_key_only_flags(
2515
def filter_disabled_flags(
2616
flags: list[dict[str, Any]], hide_disabled: bool
2717
) -> list[dict[str, Any]]:
28-
"""
29-
Filter out disabled flags if hide_disabled is enabled.
30-
31-
Args:
32-
flags: List of flag results
33-
hide_disabled: Whether to filter out disabled flags
34-
35-
Returns:
36-
Filtered list of flags excluding disabled ones if hide_disabled is True
37-
"""
3818
if not hide_disabled:
3919
return flags
4020
return [flag for flag in flags if flag.get("enabled", False)]

src/edge_proxy/mappers.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88

99
def map_flag_result_to_response_data(
1010
flag_result: dict[str, Any],
11+
feature_types: dict[int, str] | None = None,
1112
) -> dict[str, Any]:
12-
"""Map a single flag result to API response format."""
13+
feature_id = flag_result.get("metadata", {}).get("id")
14+
feature_type = (feature_types or {}).get(feature_id, "STANDARD")
1315
return {
1416
"feature": {
15-
"id": flag_result.get("metadata", {}).get("id"),
17+
"id": feature_id,
1618
"name": flag_result["name"],
17-
"type": flag_result.get("type", "STANDARD"),
19+
"type": feature_type,
1820
},
1921
"enabled": flag_result["enabled"],
2022
"feature_state_value": flag_result["value"],
@@ -23,10 +25,11 @@ def map_flag_result_to_response_data(
2325

2426
def map_flag_results_to_response_data(
2527
flag_results: list[dict[str, Any]],
28+
feature_types: dict[int, str] | None = None,
2629
) -> list[dict[str, Any]]:
27-
"""Map multiple flag results to API response format."""
2830
return [
29-
map_flag_result_to_response_data(flag_result) for flag_result in flag_results
31+
map_flag_result_to_response_data(flag_result, feature_types)
32+
for flag_result in flag_results
3033
]
3134

3235

tests/test_mappers.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,27 @@ def test_map_flag_result_to_response_data__return_expected(
7575
}
7676

7777

78+
def test_map_flag_result_to_response_data__with_feature_types__return_expected(
79+
multivariate_flag_result: dict[str, Any],
80+
) -> None:
81+
# Given
82+
feature_types = {4: "MULTIVARIATE"}
83+
84+
# When
85+
result = map_flag_result_to_response_data(multivariate_flag_result, feature_types)
86+
87+
# Then
88+
assert result == {
89+
"enabled": False,
90+
"feature": {
91+
"id": 4,
92+
"name": "multivariate_feature",
93+
"type": "MULTIVARIATE",
94+
},
95+
"feature_state_value": None,
96+
}
97+
98+
7899
def test_map_flag_results_to_response_data__return_expected(
79100
flag_result: dict[str, Any],
80101
multivariate_flag_result: dict[str, Any],
@@ -108,6 +129,40 @@ def test_map_flag_results_to_response_data__return_expected(
108129
]
109130

110131

132+
def test_map_flag_results_to_response_data__with_feature_types__return_expected(
133+
flag_result: dict[str, Any],
134+
multivariate_flag_result: dict[str, Any],
135+
) -> None:
136+
# Given
137+
flag_results = [flag_result, multivariate_flag_result]
138+
feature_types = {1: "STANDARD", 4: "MULTIVARIATE"}
139+
140+
# When
141+
result = map_flag_results_to_response_data(flag_results, feature_types)
142+
143+
# Then
144+
assert result == [
145+
{
146+
"enabled": False,
147+
"feature": {
148+
"id": 1,
149+
"name": "feature_1",
150+
"type": "STANDARD",
151+
},
152+
"feature_state_value": "feature_1_value",
153+
},
154+
{
155+
"enabled": False,
156+
"feature": {
157+
"id": 4,
158+
"name": "multivariate_feature",
159+
"type": "MULTIVARIATE",
160+
},
161+
"feature_state_value": None,
162+
},
163+
]
164+
165+
111166
def test_map_traits_to_response_data__return_expected(
112167
traits_dict: dict[str, Any],
113168
traits_data: list[dict[str, Any]],

0 commit comments

Comments
 (0)