Skip to content

Commit bcf65af

Browse files
committed
feat: moved-feature-types-map-to-cache-on-environment-document-update
1 parent d6ff501 commit bcf65af

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

src/edge_proxy/cache.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from abc import ABC
22
from collections import defaultdict
33
from typing import Any
4+
from edge_proxy.feature_utils import build_feature_types_lookup
45

56

67
class BaseEnvironmentsCache(ABC):
@@ -34,6 +35,9 @@ def _put_environment(
3435
def get_environment(self, environment_api_key: str) -> dict[str, Any] | None:
3536
raise NotImplementedError()
3637

38+
def get_feature_types(self, environment_api_key: str) -> dict[int, str] | None:
39+
return None
40+
3741
def get_identity(
3842
self,
3943
environment_api_key: str,
@@ -49,6 +53,7 @@ class LocalMemEnvironmentsCache(BaseEnvironmentsCache):
4953
def __init__(self, *args, **kwargs):
5054
super().__init__(*args, **kwargs)
5155
self._environment_cache: _LocalCacheDict = {}
56+
self._feature_types_cache: dict[str, dict[int, str]] = {}
5257
self._identity_override_cache = defaultdict[str, _LocalCacheDict](dict)
5358

5459
def _put_environment(
@@ -57,6 +62,11 @@ def _put_environment(
5762
environment_document: dict[str, Any],
5863
) -> None:
5964
self._environment_cache[environment_api_key] = environment_document
65+
66+
self._feature_types_cache[environment_api_key] = build_feature_types_lookup(
67+
environment_document
68+
)
69+
6070
new_overrides = environment_document.get("identity_overrides") or []
6171
self._identity_override_cache[environment_api_key] = {
6272
identifier: identity_document
@@ -70,6 +80,9 @@ def get_environment(
7080
) -> dict[str, Any] | None:
7181
return self._environment_cache.get(environment_api_key)
7282

83+
def get_feature_types(self, environment_api_key: str) -> dict[int, str] | None:
84+
return self._feature_types_cache.get(environment_api_key)
85+
7386
def get_identity(
7487
self,
7588
environment_api_key: str,

src/edge_proxy/environments.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,11 @@ def get_flags_response_data(
8484
server_key_only_feature_ids = environment_document.get("project", {}).get(
8585
"server_key_only_feature_ids", []
8686
)
87-
feature_types = build_feature_types_lookup(environment_document)
87+
feature_types = None
88+
if hasattr(self.cache, "get_feature_types"):
89+
feature_types = self.cache.get_feature_types(environment_key)
90+
if feature_types is None:
91+
feature_types = build_feature_types_lookup(environment_document)
8892

8993
context = map_environment_document_to_context(environment_document)
9094
evaluation_result = get_evaluation_result(context)
@@ -134,7 +138,12 @@ def get_identity_response_data(
134138
server_key_only_feature_ids = environment_document.get("project", {}).get(
135139
"server_key_only_feature_ids", []
136140
)
137-
feature_types = build_feature_types_lookup(environment_document)
141+
142+
feature_types = None
143+
if hasattr(self.cache, "get_feature_types"):
144+
feature_types = self.cache.get_feature_types(environment_key)
145+
if feature_types is None:
146+
feature_types = build_feature_types_lookup(environment_document)
138147

139148
environment_context = map_environment_document_to_context(environment_document)
140149
context = map_context_and_identity_data_to_context(

tests/test_server.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def test_get_flags(
2525
"edge_proxy.server.environment_service.cache"
2626
)
2727
mocked_environment_cache.get_environment.return_value = environment_1
28+
mocked_environment_cache.get_feature_types.return_value = None
2829
response = client.get(
2930
"/api/v1/flags", headers={"X-Environment-Key": environment_key}
3031
)
@@ -42,6 +43,7 @@ def test_get_flags_single_feature(
4243
"edge_proxy.server.environment_service.cache"
4344
)
4445
mocked_environment_cache.get_environment.return_value = environment_1
46+
mocked_environment_cache.get_feature_types.return_value = None
4547
response = client.get(
4648
"/api/v1/flags",
4749
headers={"X-Environment-Key": environment_key},
@@ -61,6 +63,7 @@ def test_get_flags_single_feature__server_key_only_feature__return_expected(
6163
"edge_proxy.server.environment_service.cache"
6264
)
6365
mocked_environment_cache.get_environment.return_value = environment_1
66+
mocked_environment_cache.get_feature_types.return_value = None
6467

6568
# When
6669
response = client.get(
@@ -86,6 +89,7 @@ def test_get_flags_unknown_key(
8689
"edge_proxy.server.environment_service.cache"
8790
)
8891
mocked_environment_cache.get_environment.return_value = None
92+
mocked_environment_cache.get_feature_types.return_value = None
8993
response = client.get(
9094
"/api/v1/flags",
9195
headers={"X-Environment-Key": environment_key},
@@ -108,6 +112,7 @@ def test_post_identity_with_traits(
108112
"edge_proxy.server.environment_service.cache"
109113
)
110114
mocked_environment_cache.get_environment.return_value = environment_1
115+
mocked_environment_cache.get_feature_types.return_value = None
111116
data = {
112117
"traits": [{"trait_value": "test", "trait_key": "first_name"}],
113118
"identifier": "do_it_all_in_one_go_identity",
@@ -165,6 +170,7 @@ def test_post_identity__invalid_trait_data__expected_response(
165170
"edge_proxy.server.environment_service.cache"
166171
)
167172
mocked_environment_cache.get_environment.return_value = environment_1
173+
mocked_environment_cache.get_feature_types.return_value = None
168174
data = {
169175
"traits": [{"trait_value": "a" * 2001, "trait_key": "first_name"}],
170176
"identifier": "do_it_all_in_one_go_identity",
@@ -197,6 +203,7 @@ def test_get_identities(
197203
"edge_proxy.server.environment_service.cache"
198204
)
199205
mocked_environment_cache.get_environment.return_value = environment_1
206+
mocked_environment_cache.get_feature_types.return_value = None
200207
mocked_environment_cache.get_identity.return_value = {
201208
"environment_api_key": x_environment_key,
202209
"identifier": identifier,
@@ -289,6 +296,7 @@ def test_get_flags__client_key__hide_disabled_flags_enabled__only_returns_enable
289296
mocked_environment_cache.get_environment.return_value = (
290297
environment_with_hide_disabled_flags
291298
)
299+
mocked_environment_cache.get_feature_types.return_value = None
292300

293301
# When
294302
response = client.get(
@@ -313,6 +321,7 @@ def test_get_flags__client_key__hide_disabled_flags_disabled__returns_all_flags(
313321
"edge_proxy.server.environment_service.cache"
314322
)
315323
mocked_environment_cache.get_environment.return_value = environment_1
324+
mocked_environment_cache.get_feature_types.return_value = None
316325

317326
# When
318327
response = client.get(
@@ -338,6 +347,7 @@ def test_get_flags__server_key__hide_disabled_flags_enabled__returns_all_flags(
338347
mocked_environment_cache.get_environment.return_value = (
339348
environment_with_hide_disabled_flags
340349
)
350+
mocked_environment_cache.get_feature_types.return_value = None
341351
mocker.patch(
342352
"edge_proxy.server.environment_service._get_client_key_from_server_key",
343353
return_value=client_key,
@@ -364,6 +374,7 @@ def test_get_flags__client_key__hide_disabled_flags_enabled__single_disabled_fea
364374
mocked_environment_cache.get_environment.return_value = (
365375
environment_with_hide_disabled_flags
366376
)
377+
mocked_environment_cache.get_feature_types.return_value = None
367378

368379
# When
369380
response = client.get(
@@ -388,6 +399,7 @@ def test_post_identity__client_key__hide_disabled_flags_enabled__only_returns_en
388399
mocked_environment_cache.get_environment.return_value = (
389400
environment_with_hide_disabled_flags
390401
)
402+
mocked_environment_cache.get_feature_types.return_value = None
391403
data = {
392404
"identifier": "test_identifier",
393405
"traits": [],
@@ -419,6 +431,7 @@ def test_post_identity__client_key__hide_disabled_flags_disabled__returns_all_fl
419431
"edge_proxy.server.environment_service.cache"
420432
)
421433
mocked_environment_cache.get_environment.return_value = environment_1
434+
mocked_environment_cache.get_feature_types.return_value = None
422435
data = {
423436
"identifier": "test_identifier",
424437
"traits": [],

0 commit comments

Comments
 (0)