Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion UnleashClient/context.py → UnleashClient/_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,18 @@ def _safe_value(value: Any) -> str:
return str(value)


class ContextEnricher:
class _ContextEnricher:
"""
Turns a caller-supplied context into the shape the engine expects.

The config's static context is read on every call, so reassigning
``config.static_context`` (which ``UnleashClient.unleash_static_context``
does) takes effect immediately.

Example::

enricher = _ContextEnricher(config)
context = enricher.build({"userId": "123"})
"""

def __init__(self, config: UnleashConfig) -> None:
Expand Down
6 changes: 3 additions & 3 deletions UnleashClient/_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

from yggdrasil_engine.engine import UnleashEngine

from UnleashClient._context import _ContextEnricher
from UnleashClient.config import UnleashConfig
from UnleashClient.context import ContextEnricher
from UnleashClient.events import (
EventDispatcher,
UnleashEvent,
Expand All @@ -29,7 +29,7 @@ class _Evaluator:
def __init__(
self,
engine: UnleashEngine,
enricher: ContextEnricher,
enricher: _ContextEnricher,
config: UnleashConfig,
events: Optional[EventDispatcher] = None,
) -> None:
Expand All @@ -40,7 +40,7 @@ def __init__(
:param events: Optional dispatcher that delivers events to the user's callback.
"""
self._engine: UnleashEngine = engine
self._enricher: ContextEnricher = enricher
self._enricher: _ContextEnricher = enricher
self._config: UnleashConfig = config
self._events: Optional[EventDispatcher] = events

Expand Down
4 changes: 2 additions & 2 deletions UnleashClient/clients/async_unleash_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@

from UnleashClient._async_scheduler import _AsyncScheduler
from UnleashClient._async_transport import _AsyncTransport
from UnleashClient._context import _ContextEnricher
from UnleashClient._evaluator import _Evaluator
from UnleashClient._feature_store import _FeatureStore
from UnleashClient._instance_registry import _get_instance_registry
from UnleashClient._metrics import _AsyncMetricsReporter
from UnleashClient.cache import BaseCache, FileCache
from UnleashClient.config import ExperimentalMode, UnleashConfig
from UnleashClient.constants import REQUEST_RETRIES, REQUEST_TIMEOUT
from UnleashClient.context import ContextEnricher
from UnleashClient.events import BaseEvent, EventDispatcher
from UnleashClient.headers import HeaderFactory
from UnleashClient.impact_metrics import ImpactMetrics
Expand Down Expand Up @@ -84,7 +84,7 @@ def __init__( # noqa: PLR0913, PLR0917
experimental_mode=experimental_mode,
custom_strategies=custom_strategies,
)
self._enricher: ContextEnricher = ContextEnricher(self._config)
self._enricher: _ContextEnricher = _ContextEnricher(self._config)
self._headers: HeaderFactory = HeaderFactory(self._config)

self._event_dispatcher: Optional[EventDispatcher] = (
Expand Down
4 changes: 2 additions & 2 deletions UnleashClient/clients/unleash_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from apscheduler.schedulers.base import BaseScheduler
from yggdrasil_engine.engine import UnleashEngine

from UnleashClient._context import _ContextEnricher
from UnleashClient._evaluator import _Evaluator
from UnleashClient._feature_store import _FeatureStore
from UnleashClient._instance_registry import _get_instance_registry
Expand All @@ -35,7 +36,6 @@
REQUEST_RETRIES,
REQUEST_TIMEOUT,
)
from UnleashClient.context import ContextEnricher
from UnleashClient.events import (
BaseEvent,
EventDispatcher,
Expand Down Expand Up @@ -177,7 +177,7 @@ def __init__( # noqa: PLR0913, PLR0917
experimental_mode=experimental_mode,
custom_strategies=custom_strategies,
)
self._enricher = ContextEnricher(self._config)
self._enricher = _ContextEnricher(self._config)
self._headers = HeaderFactory(self._config)
self.unleash_event_callback = event_callback
# Events are handed to the dispatcher, which delivers them to the user's
Expand Down
8 changes: 4 additions & 4 deletions tests/unit_tests/test_context.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import uuid
from datetime import datetime, timezone

from UnleashClient._context import _ContextEnricher
from UnleashClient.config import UnleashConfig
from UnleashClient.context import ContextEnricher

URL = "http://localhost:4242/api"
APP_NAME = "pytest"


def build_enricher(**kwargs) -> ContextEnricher:
return ContextEnricher(UnleashConfig(URL, APP_NAME, **kwargs))
def build_enricher(**kwargs) -> _ContextEnricher:
return _ContextEnricher(UnleashConfig(URL, APP_NAME, **kwargs))


def test_static_context_is_merged_in():
Expand Down Expand Up @@ -118,7 +118,7 @@ def test_static_context_is_read_on_every_call():
# UnleashClient.unleash_static_context has a setter, so a client can swap
# the dict out after the enricher was constructed.
config = UnleashConfig(URL, APP_NAME, environment="unit")
enricher = ContextEnricher(config)
enricher = _ContextEnricher(config)

config.static_context = {"appName": "replaced", "environment": "qa"}
context = enricher.build({})
Expand Down
6 changes: 3 additions & 3 deletions tests/unit_tests/test_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
MOCK_FEATURE_RESPONSE,
MOCK_FEATURE_RESPONSE_PROJECT,
)
from UnleashClient._context import _ContextEnricher
from UnleashClient._evaluator import _Evaluator
from UnleashClient.config import UnleashConfig
from UnleashClient.context import ContextEnricher
from UnleashClient.events import UnleashEventType

URL = "http://localhost:4242/api"
Expand All @@ -37,7 +37,7 @@ def build_evaluator(state=FEATURES, events=None, **kwargs):
engine.take_state(state)
return _Evaluator(
engine=engine,
enricher=ContextEnricher(config),
enricher=_ContextEnricher(config),
config=config,
events=events,
)
Expand Down Expand Up @@ -184,7 +184,7 @@ def test_the_verbose_log_level_is_read_on_every_call(caplog):
engine.take_state(FEATURES)
evaluator = _Evaluator(
engine=engine,
enricher=ContextEnricher(config),
enricher=_ContextEnricher(config),
config=config,
events=FailingDispatcher(),
)
Expand Down
Loading