Skip to content

Commit 45786a9

Browse files
authored
chore: Expose flag change listeners from data system (#384)
1 parent 2b7eedc commit 45786a9

File tree

6 files changed

+22
-52
lines changed

6 files changed

+22
-52
lines changed

ldclient/client.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,16 +263,15 @@ def __start_up(self, start_wait: float):
263263
else:
264264
self._data_system = FDv2(self._config, datasystem_config)
265265

266-
# Provide flag evaluation function for value-change tracking
267-
self._data_system.set_flag_value_eval_fn( # type: ignore
266+
self.__flag_tracker = FlagTrackerImpl(
267+
self._data_system.flag_change_listeners,
268268
lambda key, context: self.variation(key, context, None)
269269
)
270270
# Expose providers and store from data system
271271
self.__data_store_status_provider = self._data_system.data_store_status_provider
272272
self.__data_source_status_provider = (
273273
self._data_system.data_source_status_provider
274274
)
275-
self.__flag_tracker = self._data_system.flag_tracker
276275

277276
big_segment_store_manager = BigSegmentStoreManager(self._config.big_segments)
278277
self.__big_segment_store_manager = big_segment_store_manager

ldclient/impl/datasystem/__init__.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from threading import Event
99
from typing import Protocol, runtime_checkable
1010

11+
from ldclient.impl.listeners import Listeners
1112
from ldclient.interfaces import (
1213
DataSourceStatusProvider,
1314
DataStoreStatusProvider,
@@ -111,13 +112,9 @@ def data_store_status_provider(self) -> DataStoreStatusProvider:
111112

112113
@property
113114
@abstractmethod
114-
def flag_tracker(self) -> FlagTracker:
115+
def flag_change_listeners(self) -> Listeners:
115116
"""
116-
Returns an interface for tracking changes in feature flag configurations.
117-
118-
The :class:`ldclient.interfaces.FlagTracker` contains methods for
119-
requesting notifications about feature flag changes using an event
120-
listener model.
117+
Returns the collection of listeners for flag change events.
121118
"""
122119
raise NotImplementedError
123120

ldclient/impl/datasystem/fdv1.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,6 @@ def __init__(self, config: Config):
6060
# Set up data source plumbing
6161
self._data_source_listeners = Listeners()
6262
self._flag_change_listeners = Listeners()
63-
self._flag_tracker_impl = FlagTrackerImpl(
64-
self._flag_change_listeners,
65-
lambda key, context: None, # Replaced by client to use its evaluation method
66-
)
6763
self._data_source_update_sink = DataSourceUpdateSinkImpl(
6864
self._store_wrapper,
6965
self._data_source_listeners,
@@ -102,14 +98,6 @@ def stop(self):
10298
def store(self) -> ReadOnlyStore:
10399
return self._store_wrapper
104100

105-
def set_flag_value_eval_fn(self, eval_fn):
106-
"""
107-
Injects the flag value evaluation function used by the flag tracker to
108-
compute FlagValueChange events. The function signature should be
109-
(key: str, context: Context) -> Any.
110-
"""
111-
self._flag_tracker_impl = FlagTrackerImpl(self._flag_change_listeners, eval_fn)
112-
113101
def set_diagnostic_accumulator(self, diagnostic_accumulator: DiagnosticAccumulator):
114102
"""
115103
Sets the diagnostic accumulator for streaming initialization metrics.
@@ -126,8 +114,8 @@ def data_store_status_provider(self) -> DataStoreStatusProvider:
126114
return self._data_store_status_provider_impl
127115

128116
@property
129-
def flag_tracker(self) -> FlagTracker:
130-
return self._flag_tracker_impl
117+
def flag_change_listeners(self) -> Listeners:
118+
return self._flag_change_listeners
131119

132120
@property
133121
def data_availability(self) -> DataAvailability:

ldclient/impl/datasystem/fdv2.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,6 @@ def __init__(
295295
wrapper, writable, self._data_store_status_provider
296296
)
297297

298-
# Flag tracker (evaluation function set later by client)
299-
self._flag_tracker = FlagTrackerImpl(
300-
self._flag_change_listeners,
301-
lambda key, context: None # Placeholder, replaced by client
302-
)
303-
304298
# Threading
305299
self._stop_event = Event()
306300
self._lock = ReadWriteLock()
@@ -659,14 +653,6 @@ def store(self) -> ReadOnlyStore:
659653
"""Get the underlying store for flag evaluation."""
660654
return self._store.get_active_store()
661655

662-
def set_flag_value_eval_fn(self, eval_fn):
663-
"""
664-
Set the flag value evaluation function for the flag tracker.
665-
666-
:param eval_fn: Function with signature (key: str, context: Context) -> Any
667-
"""
668-
self._flag_tracker = FlagTrackerImpl(self._flag_change_listeners, eval_fn)
669-
670656
@property
671657
def data_source_status_provider(self) -> DataSourceStatusProvider:
672658
"""Get the data source status provider."""
@@ -678,9 +664,9 @@ def data_store_status_provider(self) -> DataStoreStatusProvider:
678664
return self._data_store_status_provider
679665

680666
@property
681-
def flag_tracker(self) -> FlagTracker:
682-
"""Get the flag tracker for monitoring flag changes."""
683-
return self._flag_tracker
667+
def flag_change_listeners(self) -> Listeners:
668+
"""Get the collection of listeners for flag change events."""
669+
return self._flag_change_listeners
684670

685671
@property
686672
def data_availability(self) -> DataAvailability:

ldclient/testing/impl/datasystem/test_fdv2_datasystem.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def listener(flag_change: FlagChange):
5555
if count == 3:
5656
modified.set()
5757

58-
fdv2.flag_tracker.add_listener(listener)
58+
fdv2.flag_change_listeners.add(listener)
5959

6060
fdv2.start(set_on_ready)
6161
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -86,7 +86,7 @@ def listener(flag_change: FlagChange):
8686
changes.append(flag_change)
8787
changed.set()
8888

89-
fdv2.flag_tracker.add_listener(listener)
89+
fdv2.flag_change_listeners.add(listener)
9090

9191
fdv2.start(set_on_ready)
9292
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -140,7 +140,7 @@ def listener(flag_change: FlagChange):
140140

141141
set_on_ready = Event()
142142
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
143-
fdv2.flag_tracker.add_listener(listener)
143+
fdv2.flag_change_listeners.add(listener)
144144
fdv2.start(set_on_ready)
145145
assert set_on_ready.wait(1), "Data system did not become ready in time"
146146

@@ -215,7 +215,7 @@ def listener(flag_change: FlagChange):
215215

216216
set_on_ready = Event()
217217
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
218-
fdv2.flag_tracker.add_listener(listener)
218+
fdv2.flag_change_listeners.add(listener)
219219
fdv2.start(set_on_ready)
220220

221221
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -269,7 +269,7 @@ def listener(flag_change: FlagChange):
269269

270270
set_on_ready = Event()
271271
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
272-
fdv2.flag_tracker.add_listener(listener)
272+
fdv2.flag_change_listeners.add(listener)
273273
fdv2.start(set_on_ready)
274274

275275
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -324,7 +324,7 @@ def listener(flag_change: FlagChange):
324324

325325
set_on_ready = Event()
326326
fdv2 = FDv2(Config(sdk_key="dummy"), data_system_config)
327-
fdv2.flag_tracker.add_listener(listener)
327+
fdv2.flag_change_listeners.add(listener)
328328
fdv2.start(set_on_ready)
329329

330330
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -484,7 +484,7 @@ def listener(_: FlagChange):
484484
if count == 3:
485485
synchronizer_ran.set()
486486

487-
fdv2.flag_tracker.add_listener(listener)
487+
fdv2.flag_change_listeners.add(listener)
488488

489489
fdv2.start(set_on_ready)
490490
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -537,7 +537,7 @@ def listener(_: FlagChange):
537537
nonlocal count
538538
count += 1
539539

540-
fdv2.flag_tracker.add_listener(listener)
540+
fdv2.flag_change_listeners.add(listener)
541541

542542
fdv2.start(set_on_ready)
543543
assert set_on_ready.wait(1), "Data system did not become ready in time"

ldclient/testing/impl/datasystem/test_fdv2_persistence.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def listener(flag_change: FlagChange):
239239
): # First change is from initial sync, second is our update
240240
flag_changed.set()
241241

242-
fdv2.flag_tracker.add_listener(listener)
242+
fdv2.flag_change_listeners.add(listener)
243243
fdv2.start(set_on_ready)
244244

245245
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -293,7 +293,7 @@ def listener(flag_change: FlagChange):
293293
): # First change is from initial sync, second is our update
294294
flag_changed.set()
295295

296-
fdv2.flag_tracker.add_listener(listener)
296+
fdv2.flag_change_listeners.add(listener)
297297
fdv2.start(set_on_ready)
298298

299299
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -341,7 +341,7 @@ def listener(flag_change: FlagChange):
341341
if flag_change.key == "sync-flag":
342342
sync_flag_arrived.set()
343343

344-
fdv2.flag_tracker.add_listener(listener)
344+
fdv2.flag_change_listeners.add(listener)
345345
fdv2.start(set_on_ready)
346346

347347
assert set_on_ready.wait(1), "Data system did not become ready in time"
@@ -571,7 +571,7 @@ def test_persistent_store_outage_recovery_flushes_on_recovery():
571571
persistent_store.reset_operation_tracking()
572572

573573
event = Event()
574-
fdv2.flag_tracker.add_listener(lambda _flag_change: event.set())
574+
fdv2.flag_change_listeners.add(lambda _flag_change: event.set())
575575
# Simulate a new flag being added while store is "offline"
576576
# (In reality, the store is still online, but we're testing the recovery mechanism)
577577
td_synchronizer.update(td_synchronizer.flag("new-flag").on(False))

0 commit comments

Comments
 (0)