Skip to content

Commit c9bfdff

Browse files
committed
General bug fixes, will add more tests later
1 parent 74f45c0 commit c9bfdff

File tree

6 files changed

+60
-37
lines changed

6 files changed

+60
-37
lines changed

splitio/client/factory.py

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -327,20 +327,12 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
327327
}
328328
imp_counter = ImpressionsCounter() if cfg['impressionsMode'] != ImpressionsMode.DEBUG else None
329329

330-
strategies = {
331-
ImpressionsMode.OPTIMIZED : StrategyOptimizedMode(imp_counter),
332-
ImpressionsMode.DEBUG : StrategyDebugMode(),
333-
ImpressionsMode.NONE : StrategyNoneMode(imp_counter),
334-
}
335-
imp_strategy = strategies[cfg['impressionsMode']]
336-
337-
imp_counter = ImpressionsCounter() if cfg['impressionsMode'] != ImpressionsMode.DEBUG else None
338-
339-
strategies = {
340-
ImpressionsMode.OPTIMIZED : StrategyOptimizedMode(imp_counter),
341-
ImpressionsMode.DEBUG : StrategyDebugMode(),
342-
}
343-
imp_strategy = strategies[cfg['impressionsMode']]
330+
if cfg['impressionsMode'] == ImpressionsMode.NONE:
331+
imp_strategy = StrategyNoneMode(imp_counter)
332+
elif cfg['impressionsMode'] == ImpressionsMode.DEBUG:
333+
imp_strategy = StrategyDebugMode()
334+
else:
335+
imp_strategy = StrategyOptimizedMode(imp_counter)
344336

345337
imp_manager = ImpressionsManager(
346338
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata),
@@ -354,7 +346,6 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
354346
EventSynchronizer(apis['events'], storages['events'], cfg['eventsBulkSize']),
355347
ImpressionsCountSynchronizer(apis['impressions'], imp_manager),
356348
)
357-
imp_count_sync_task = ImpressionsCountSyncTask(synchronizers.impressions_count_sync.synchronize_counters) if cfg['impressionsMode'] == 'OPTIMIZED' else None
358349

359350
tasks = SplitTasks(
360351
SplitSynchronizationTask(
@@ -452,6 +443,7 @@ def _build_redis_factory(api_key, cfg):
452443
recorder,
453444
)
454445

446+
455447
def _build_localhost_factory(cfg):
456448
"""Build and return a localhost factory for testing/development purposes."""
457449
storages = {
@@ -478,7 +470,6 @@ def _build_localhost_factory(cfg):
478470
synchronizer = LocalhostSynchronizer(synchronizers, tasks)
479471
manager = Manager(ready_event, synchronizer, None, False, sdk_metadata)
480472
manager.start()
481-
482473
recorder = StandardRecorder(
483474
ImpressionsManager(None, StrategyDebugMode()),
484475
storages['events'],

splitio/engine/sender_adapters/in_memory_sender_adapter.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,9 @@ def _uniques_formatter(self, uniques):
3333
:return: unique keys JSON
3434
:rtype: json
3535
"""
36-
formatted_uniques = json.loads('{"keys": []}')
3736
if len(uniques) == 0:
3837
return json.loads('{"keys": []}')
3938

4039
return {
4140
'keys': [{'f': feature, 'ks': list(keys)} for feature, keys in uniques.items()]
42-
}
43-
# for key in uniques:
44-
# formatted_uniques["keys"].append(json.loads('{"f":"' + key +'", "ks":' + json.dumps(list(uniques[key])) + '}'))
45-
46-
# return formatted_uniques
41+
}

splitio/engine/strategies/strategy_none_mode.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from splitio.engine.strategies.base_strategy import BaseStrategy
2-
from splitio.engine.strategies import Observer, Counter, truncate_time
2+
from splitio.engine.strategies import Counter, truncate_time
33
from splitio.engine.unique_keys_tracker import UniqueKeysTracker
44
from splitio import util
55

@@ -14,7 +14,6 @@ def __init__(self, counter=None):
1414
Construct a strategy instance for none mode.
1515
1616
"""
17-
self._observer = Observer(_IMPRESSION_OBSERVER_CACHE_SIZE)
1817
self._counter = counter
1918
self._unique_keys_tracker = UniqueKeysTracker(_UNIQUE_KEYS_CACHE_SIZE)
2019

@@ -31,9 +30,6 @@ def process_impressions(self, impressions):
3130
:returns: Empty list, no impressions to post
3231
:rtype: list[]
3332
"""
34-
imps = [(self._observer.test_and_set(imp), attrs) for imp, attrs in impressions]
35-
self._counter.track([imp for imp, _ in imps])
36-
this_hour = truncate_time(util.utctime_ms())
37-
[self._unique_keys_tracker.track(i.matching_key, i.feature_name) for i, _ in imps if i.previous_time is None or i.previous_time < this_hour]
38-
39-
return [], imps
33+
self._counter.track([imp for imp, _ in impressions])
34+
[self._unique_keys_tracker.track(i.matching_key, i.feature_name) for i, _ in impressions]
35+
return [], impressions

splitio/sync/impression.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from splitio.api import APIException
55
from splitio.engine.strategies import Counter
66

7-
87
_LOGGER = logging.getLogger(__name__)
98

109

@@ -69,21 +68,25 @@ def synchronize_impressions(self):
6968

7069

7170
class ImpressionsCountSynchronizer(object):
72-
def __init__(self, impressions_api, impressions_counter):
71+
def __init__(self, impressions_api, impressions_manager):
7372
"""
7473
Class constructor.
7574
7675
:param impressions_api: Impressions Api object to send data to the backend
7776
:type impressions_api: splitio.api.impressions.ImpressionsAPI
7877
:param impressions_manager: Impressions manager instance
79-
:type impressions_counter: splitio.engine.strategies
78+
:type impressions_manager: splitio.engine.impressions.Manager
8079
8180
"""
8281
self._impressions_api = impressions_api
83-
self._impressions_counter = impressions_counter
82+
self._impressions_manager = impressions_manager
8483

8584
def synchronize_counters(self):
8685
"""Send impressions from both the failed and new queues."""
86+
87+
if not isinstance(self._impressions_manager._strategy._counter, Counter):
88+
return
89+
8790
to_send = self._impressions_manager._strategy._counter.pop_all()
8891
if not to_send:
8992
return

splitio/tasks/unique_keys_sync.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
_LOGGER = logging.getLogger(__name__)
9-
9+
_PERIOD = 15 * 60 # 15 minutes
1010

1111
class UniqueKeysSyncTask(BaseSynchronizationTask):
1212
"""Unique Keys synchronization task uses an asynctask.AsyncTask to send MTKs."""
@@ -20,8 +20,8 @@ def __init__(self, synchronize_unique_keys):
2020
:param period: How many seconds to wait between subsequent unique keys pushes to the BE.
2121
:type period: int
2222
"""
23-
_period = 15 * 60 # 15 minutes
24-
self._task = AsyncTask(synchronize_unique_keys, _period,
23+
24+
self._task = AsyncTask(synchronize_unique_keys, _PERIOD,
2525
on_stop=synchronize_unique_keys)
2626

2727
def start(self):

tests/engine/test_send_adapters.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import unittest.mock as mock
2+
3+
from splitio.engine.sender_adapters.in_memory_sender_adapter import InMemorySenderAdapter
4+
from splitio.api.telemetry import TelemetryAPI
5+
6+
import pytest
7+
8+
class InMemorySenderAdapterTests(object):
9+
"""In memory sender adapter test."""
10+
11+
def test_uniques_formatter(self, mocker):
12+
"""Test formatting dict to json."""
13+
14+
uniques = {"feature1": set({'key1', 'key2', 'key3'}),
15+
"feature2": set({'key6', 'key1', 'key10'}),
16+
}
17+
formatted = {'keys': [
18+
{'f': 'feature1', 'ks': ['key1', 'key2', 'key3']},
19+
{'f': 'feature2', 'ks': ['key1', 'key6', 'key10']},
20+
]}
21+
22+
sender_adapter = InMemorySenderAdapter(mocker.Mock())
23+
for i in range(0,1):
24+
assert(sorted(sender_adapter._uniques_formatter(uniques)["keys"][i]["ks"]) == sorted(formatted["keys"][i]["ks"]))
25+
26+
27+
@mock.patch('splitio.api.telemetry.TelemetryAPI.record_unique_keys')
28+
def test_record_unique_keys(self, mocker):
29+
"""Test sending unique keys."""
30+
31+
uniques = {"feature1": set({'key1', 'key2', 'key3'}),
32+
"feature2": set({'key1', 'key2', 'key3'}),
33+
}
34+
telemetry_api = TelemetryAPI(mocker.Mock(), 'some_api_key', mocker.Mock())
35+
sender_adapter = InMemorySenderAdapter(telemetry_api)
36+
sender_adapter.record_unique_keys(uniques)
37+
38+
assert(mocker.called)

0 commit comments

Comments
 (0)