Skip to content

Commit db38e3e

Browse files
authored
Merge pull request #562 from splitio/rbs_factory
Updated tests
2 parents 1d8b448 + e070b90 commit db38e3e

26 files changed

+1157
-734
lines changed

splitio/client/factory.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@
2323
from splitio.storage.inmemmory import InMemorySplitStorage, InMemorySegmentStorage, \
2424
InMemoryImpressionStorage, InMemoryEventStorage, InMemoryTelemetryStorage, LocalhostTelemetryStorage, \
2525
InMemorySplitStorageAsync, InMemorySegmentStorageAsync, InMemoryImpressionStorageAsync, \
26-
InMemoryEventStorageAsync, InMemoryTelemetryStorageAsync, LocalhostTelemetryStorageAsync
26+
InMemoryEventStorageAsync, InMemoryTelemetryStorageAsync, LocalhostTelemetryStorageAsync, \
27+
InMemoryRuleBasedSegmentStorage, InMemoryRuleBasedSegmentStorageAsync
2728
from splitio.storage.adapters import redis
2829
from splitio.storage.redis import RedisSplitStorage, RedisSegmentStorage, RedisImpressionsStorage, \
2930
RedisEventsStorage, RedisTelemetryStorage, RedisSplitStorageAsync, RedisEventsStorageAsync,\
30-
RedisSegmentStorageAsync, RedisImpressionsStorageAsync, RedisTelemetryStorageAsync
31+
RedisSegmentStorageAsync, RedisImpressionsStorageAsync, RedisTelemetryStorageAsync, \
32+
RedisRuleBasedSegmentsStorage, RedisRuleBasedSegmentsStorageAsync
3133
from splitio.storage.pluggable import PluggableEventsStorage, PluggableImpressionsStorage, PluggableSegmentStorage, \
3234
PluggableSplitStorage, PluggableTelemetryStorage, PluggableTelemetryStorageAsync, PluggableEventsStorageAsync, \
33-
PluggableImpressionsStorageAsync, PluggableSegmentStorageAsync, PluggableSplitStorageAsync
35+
PluggableImpressionsStorageAsync, PluggableSegmentStorageAsync, PluggableSplitStorageAsync, \
36+
PluggableRuleBasedSegmentsStorage, PluggableRuleBasedSegmentsStorageAsync
3437

3538
# APIs
3639
from splitio.api.client import HttpClient, HttpClientAsync, HttpClientKerberos
@@ -543,6 +546,7 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
543546
storages = {
544547
'splits': InMemorySplitStorage(cfg['flagSetsFilter'] if cfg['flagSetsFilter'] is not None else []),
545548
'segments': InMemorySegmentStorage(),
549+
'rule_based_segments': InMemoryRuleBasedSegmentStorage(),
546550
'impressions': InMemoryImpressionStorage(cfg['impressionsQueueSize'], telemetry_runtime_producer),
547551
'events': InMemoryEventStorage(cfg['eventsQueueSize'], telemetry_runtime_producer),
548552
}
@@ -559,7 +563,7 @@ def _build_in_memory_factory(api_key, cfg, sdk_url=None, events_url=None, # pyl
559563
imp_strategy, none_strategy, telemetry_runtime_producer)
560564

561565
synchronizers = SplitSynchronizers(
562-
SplitSynchronizer(apis['splits'], storages['splits']),
566+
SplitSynchronizer(apis['splits'], storages['splits'], storages['rule_based_segments']),
563567
SegmentSynchronizer(apis['segments'], storages['splits'], storages['segments']),
564568
ImpressionSynchronizer(apis['impressions'], storages['impressions'],
565569
cfg['impressionsBulkSize']),
@@ -671,6 +675,7 @@ async def _build_in_memory_factory_async(api_key, cfg, sdk_url=None, events_url=
671675
storages = {
672676
'splits': InMemorySplitStorageAsync(cfg['flagSetsFilter'] if cfg['flagSetsFilter'] is not None else []),
673677
'segments': InMemorySegmentStorageAsync(),
678+
'rule_based_segments': InMemoryRuleBasedSegmentStorageAsync(),
674679
'impressions': InMemoryImpressionStorageAsync(cfg['impressionsQueueSize'], telemetry_runtime_producer),
675680
'events': InMemoryEventStorageAsync(cfg['eventsQueueSize'], telemetry_runtime_producer),
676681
}
@@ -687,7 +692,7 @@ async def _build_in_memory_factory_async(api_key, cfg, sdk_url=None, events_url=
687692
imp_strategy, none_strategy, telemetry_runtime_producer)
688693

689694
synchronizers = SplitSynchronizers(
690-
SplitSynchronizerAsync(apis['splits'], storages['splits']),
695+
SplitSynchronizerAsync(apis['splits'], storages['splits'], storages['rule_based_segments']),
691696
SegmentSynchronizerAsync(apis['segments'], storages['splits'], storages['segments']),
692697
ImpressionSynchronizerAsync(apis['impressions'], storages['impressions'],
693698
cfg['impressionsBulkSize']),
@@ -756,6 +761,7 @@ def _build_redis_factory(api_key, cfg):
756761
storages = {
757762
'splits': RedisSplitStorage(redis_adapter, cache_enabled, cache_ttl, []),
758763
'segments': RedisSegmentStorage(redis_adapter),
764+
'rule_based_segments': RedisRuleBasedSegmentsStorage(redis_adapter),
759765
'impressions': RedisImpressionsStorage(redis_adapter, sdk_metadata),
760766
'events': RedisEventsStorage(redis_adapter, sdk_metadata),
761767
'telemetry': RedisTelemetryStorage(redis_adapter, sdk_metadata)
@@ -839,6 +845,7 @@ async def _build_redis_factory_async(api_key, cfg):
839845
storages = {
840846
'splits': RedisSplitStorageAsync(redis_adapter, cache_enabled, cache_ttl),
841847
'segments': RedisSegmentStorageAsync(redis_adapter),
848+
'rule_based_segments': RedisRuleBasedSegmentsStorageAsync(redis_adapter),
842849
'impressions': RedisImpressionsStorageAsync(redis_adapter, sdk_metadata),
843850
'events': RedisEventsStorageAsync(redis_adapter, sdk_metadata),
844851
'telemetry': await RedisTelemetryStorageAsync.create(redis_adapter, sdk_metadata)
@@ -922,6 +929,7 @@ def _build_pluggable_factory(api_key, cfg):
922929
storages = {
923930
'splits': PluggableSplitStorage(pluggable_adapter, storage_prefix, []),
924931
'segments': PluggableSegmentStorage(pluggable_adapter, storage_prefix),
932+
'rule_based_segments': PluggableRuleBasedSegmentsStorage(pluggable_adapter, storage_prefix),
925933
'impressions': PluggableImpressionsStorage(pluggable_adapter, sdk_metadata, storage_prefix),
926934
'events': PluggableEventsStorage(pluggable_adapter, sdk_metadata, storage_prefix),
927935
'telemetry': PluggableTelemetryStorage(pluggable_adapter, sdk_metadata, storage_prefix)
@@ -1003,6 +1011,7 @@ async def _build_pluggable_factory_async(api_key, cfg):
10031011
storages = {
10041012
'splits': PluggableSplitStorageAsync(pluggable_adapter, storage_prefix),
10051013
'segments': PluggableSegmentStorageAsync(pluggable_adapter, storage_prefix),
1014+
'rule_based_segments': PluggableRuleBasedSegmentsStorageAsync(pluggable_adapter, storage_prefix),
10061015
'impressions': PluggableImpressionsStorageAsync(pluggable_adapter, sdk_metadata, storage_prefix),
10071016
'events': PluggableEventsStorageAsync(pluggable_adapter, sdk_metadata, storage_prefix),
10081017
'telemetry': await PluggableTelemetryStorageAsync.create(pluggable_adapter, sdk_metadata, storage_prefix)
@@ -1081,13 +1090,15 @@ def _build_localhost_factory(cfg):
10811090
storages = {
10821091
'splits': InMemorySplitStorage(cfg['flagSetsFilter'] if cfg['flagSetsFilter'] is not None else []),
10831092
'segments': InMemorySegmentStorage(), # not used, just to avoid possible future errors.
1093+
'rule_based_segments': InMemoryRuleBasedSegmentStorage(),
10841094
'impressions': LocalhostImpressionsStorage(),
10851095
'events': LocalhostEventsStorage(),
10861096
}
10871097
localhost_mode = LocalhostMode.JSON if cfg['splitFile'][-5:].lower() == '.json' else LocalhostMode.LEGACY
10881098
synchronizers = SplitSynchronizers(
10891099
LocalSplitSynchronizer(cfg['splitFile'],
10901100
storages['splits'],
1101+
storages['rule_based_segments'],
10911102
localhost_mode),
10921103
LocalSegmentSynchronizer(cfg['segmentDirectory'], storages['splits'], storages['segments']),
10931104
None, None, None,
@@ -1151,13 +1162,15 @@ async def _build_localhost_factory_async(cfg):
11511162
storages = {
11521163
'splits': InMemorySplitStorageAsync(),
11531164
'segments': InMemorySegmentStorageAsync(), # not used, just to avoid possible future errors.
1165+
'rule_based_segments': InMemoryRuleBasedSegmentStorageAsync(),
11541166
'impressions': LocalhostImpressionsStorageAsync(),
11551167
'events': LocalhostEventsStorageAsync(),
11561168
}
11571169
localhost_mode = LocalhostMode.JSON if cfg['splitFile'][-5:].lower() == '.json' else LocalhostMode.LEGACY
11581170
synchronizers = SplitSynchronizers(
11591171
LocalSplitSynchronizerAsync(cfg['splitFile'],
11601172
storages['splits'],
1173+
storages['rule_based_segments'],
11611174
localhost_mode),
11621175
LocalSegmentSynchronizerAsync(cfg['segmentDirectory'], storages['splits'], storages['segments']),
11631176
None, None, None,

splitio/sync/split.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ def _sanitize_condition(self, feature_flag):
597597
{ "treatment": "off", "size": 100 }
598598
],
599599
"label": "default rule"
600-
})
600+
})
601601

602602
return feature_flag
603603

tests/api/test_auth.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_auth(self, mocker):
3434
call_made = httpclient.get.mock_calls[0]
3535

3636
# validate positional arguments
37-
assert call_made[1] == ('auth', 'v2/auth?s=1.1', 'some_api_key')
37+
assert call_made[1] == ('auth', 'v2/auth?s=1.3', 'some_api_key')
3838

3939
# validate key-value args (headers)
4040
assert call_made[2]['extra_headers'] == {
@@ -89,7 +89,7 @@ async def get(verb, url, key, extra_headers):
8989

9090
# validate positional arguments
9191
assert self.verb == 'auth'
92-
assert self.url == 'v2/auth?s=1.1'
92+
assert self.url == 'v2/auth?s=1.3'
9393
assert self.key == 'some_api_key'
9494
assert self.headers == {
9595
'SplitSDKVersion': 'python-%s' % __version__,

tests/api/test_splits_api.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def test_fetch_split_changes(self, mocker):
2424
'SplitSDKMachineIP': '1.2.3.4',
2525
'SplitSDKMachineName': 'some'
2626
},
27-
query={'s': '1.1', 'since': 123, 'rbSince': -1, 'sets': 'set1,set2'})]
27+
query={'s': '1.3', 'since': 123, 'rbSince': -1, 'sets': 'set1,set2'})]
2828

2929
httpclient.reset_mock()
3030
response = split_api.fetch_splits(123, 1, FetchOptions(True, 123, None,'set3'))
@@ -36,7 +36,7 @@ def test_fetch_split_changes(self, mocker):
3636
'SplitSDKMachineName': 'some',
3737
'Cache-Control': 'no-cache'
3838
},
39-
query={'s': '1.1', 'since': 123, 'rbSince': 1, 'till': 123, 'sets': 'set3'})]
39+
query={'s': '1.3', 'since': 123, 'rbSince': 1, 'till': 123, 'sets': 'set3'})]
4040

4141
httpclient.reset_mock()
4242
response = split_api.fetch_splits(123, 122, FetchOptions(True, 123, None, 'set3'))
@@ -48,7 +48,7 @@ def test_fetch_split_changes(self, mocker):
4848
'SplitSDKMachineName': 'some',
4949
'Cache-Control': 'no-cache'
5050
},
51-
query={'s': '1.1', 'since': 123, 'rbSince': 122, 'till': 123, 'sets': 'set3'})]
51+
query={'s': '1.3', 'since': 123, 'rbSince': 122, 'till': 123, 'sets': 'set3'})]
5252

5353
httpclient.reset_mock()
5454
def raise_exception(*args, **kwargs):
@@ -92,7 +92,7 @@ async def get(verb, url, key, query, extra_headers):
9292
'SplitSDKMachineIP': '1.2.3.4',
9393
'SplitSDKMachineName': 'some'
9494
}
95-
assert self.query == {'s': '1.1', 'since': 123, 'rbSince': -1, 'sets': 'set1,set2'}
95+
assert self.query == {'s': '1.3', 'since': 123, 'rbSince': -1, 'sets': 'set1,set2'}
9696

9797
httpclient.reset_mock()
9898
response = await split_api.fetch_splits(123, 1, FetchOptions(True, 123, None, 'set3'))
@@ -106,7 +106,7 @@ async def get(verb, url, key, query, extra_headers):
106106
'SplitSDKMachineName': 'some',
107107
'Cache-Control': 'no-cache'
108108
}
109-
assert self.query == {'s': '1.1', 'since': 123, 'rbSince': 1, 'till': 123, 'sets': 'set3'}
109+
assert self.query == {'s': '1.3', 'since': 123, 'rbSince': 1, 'till': 123, 'sets': 'set3'}
110110

111111
httpclient.reset_mock()
112112
response = await split_api.fetch_splits(123, 122, FetchOptions(True, 123, None))
@@ -120,7 +120,7 @@ async def get(verb, url, key, query, extra_headers):
120120
'SplitSDKMachineName': 'some',
121121
'Cache-Control': 'no-cache'
122122
}
123-
assert self.query == {'s': '1.1', 'since': 123, 'rbSince': 122, 'till': 123}
123+
assert self.query == {'s': '1.3', 'since': 123, 'rbSince': 122, 'till': 123}
124124

125125
httpclient.reset_mock()
126126
def raise_exception(*args, **kwargs):

0 commit comments

Comments
 (0)