Skip to content

Commit 72450bf

Browse files
committed
improve mapping
1 parent a9876fc commit 72450bf

File tree

2 files changed

+50
-32
lines changed

2 files changed

+50
-32
lines changed

flagsmith/flagsmith.py

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import typing
44
from datetime import datetime
5+
from urllib.parse import urljoin
56

67
import requests
78
from flag_engine import engine
@@ -12,6 +13,7 @@
1213
from flagsmith.analytics import AnalyticsProcessor
1314
from flagsmith.exceptions import FlagsmithAPIError, FlagsmithClientError
1415
from flagsmith.mappers import (
16+
map_context_and_identity_data_to_context,
1517
map_environment_document_to_context,
1618
map_environment_document_to_environment_updated_at,
1719
)
@@ -157,9 +159,9 @@ def __init__(
157159
self.request_timeout_seconds = request_timeout_seconds
158160
self.session.mount(self.api_url, HTTPAdapter(max_retries=retries))
159161

160-
self.environment_flags_url = f"{self.api_url}flags/"
161-
self.identities_url = f"{self.api_url}identities/"
162-
self.environment_url = f"{self.api_url}environment-document/"
162+
self.environment_flags_url = urljoin(self.api_url, "flags/")
163+
self.identities_url = urljoin(self.api_url, "identities/")
164+
self.environment_url = urljoin(self.api_url, "environment-document/")
163165

164166
if self.enable_local_evaluation:
165167
if not environment_key.startswith("ser."):
@@ -183,9 +185,9 @@ def _initialise_local_evaluation(self) -> None:
183185
if not self._evaluation_context:
184186
raise ValueError("Unable to get environment from API key")
185187

186-
stream_url = (
187-
f"{self.realtime_api_url}sse/environments/"
188-
f"{self._evaluation_context['environment']['key']}/stream"
188+
stream_url = urljoin(
189+
self.realtime_api_url,
190+
f"sse/environments/{self._evaluation_context['environment']['key']}/stream",
189191
)
190192

191193
self.event_stream_thread = EventStreamManager(
@@ -278,15 +280,11 @@ def get_identity_segments(
278280
"Local evaluation required to obtain identity segments."
279281
)
280282

281-
identity_key = f"{self._evaluation_context['environment']['key']}_{identifier}"
282-
context: engine.EvaluationContext = {
283-
**self._evaluation_context,
284-
"identity": {
285-
"identifier": identifier,
286-
"key": identity_key,
287-
"traits": dict(traits or {}),
288-
},
289-
}
283+
context = map_context_and_identity_data_to_context(
284+
context=self._evaluation_context,
285+
identifier=identifier,
286+
traits=traits,
287+
)
290288

291289
evaluation_result = engine.get_evaluation_result(
292290
context=context,
@@ -354,22 +352,11 @@ def _get_identity_flags_from_document(
354352
if self._evaluation_context is None:
355353
raise TypeError("No environment present")
356354

357-
identity_key = f"{self._evaluation_context['environment']['key']}_{identifier}"
358-
context: engine.EvaluationContext = {
359-
**self._evaluation_context,
360-
"identity": {
361-
"identifier": identifier,
362-
"key": identity_key,
363-
"traits": {
364-
trait_key: (
365-
trait_value_or_config["value"]
366-
if isinstance(trait_value_or_config, dict)
367-
else trait_value_or_config
368-
)
369-
for trait_key, trait_value_or_config in traits.items()
370-
},
371-
},
372-
}
355+
context = map_context_and_identity_data_to_context(
356+
context=self._evaluation_context,
357+
identifier=identifier,
358+
traits=traits,
359+
)
373360
evaluation_result = engine.get_evaluation_result(
374361
context=context,
375362
)

flagsmith/mappers.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
import sseclient
88
from flag_engine.context.types import (
9+
ContextValue,
910
EvaluationContext,
1011
FeatureContext,
1112
SegmentContext,
1213
SegmentRule,
1314
)
1415

15-
from flagsmith.types import StreamEvent
16+
from flagsmith.types import StreamEvent, TraitConfig
1617

1718
OverrideKey = typing.Tuple[
1819
str,
@@ -43,6 +44,36 @@ def map_environment_document_to_environment_updated_at(
4344
return updated_at.astimezone(tz=timezone.utc)
4445

4546

47+
def map_context_and_identity_data_to_context(
48+
context: EvaluationContext,
49+
identifier: str,
50+
traits: typing.Optional[
51+
typing.Mapping[
52+
str,
53+
typing.Union[
54+
ContextValue,
55+
TraitConfig,
56+
],
57+
]
58+
],
59+
) -> EvaluationContext:
60+
return {
61+
**context,
62+
"identity": {
63+
"identifier": identifier,
64+
"key": f"{context['environment']['key']}_{identifier}",
65+
"traits": {
66+
trait_key: (
67+
trait_value_or_config["value"]
68+
if isinstance(trait_value_or_config, dict)
69+
else trait_value_or_config
70+
)
71+
for trait_key, trait_value_or_config in (traits or {}).items()
72+
},
73+
},
74+
}
75+
76+
4677
def map_environment_document_to_context(
4778
environment_document: dict[str, typing.Any],
4879
) -> EvaluationContext:

0 commit comments

Comments
 (0)