Skip to content

Commit a64a06e

Browse files
committed
update storage helper
1 parent 163afc8 commit a64a06e

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

splitio/util/storage_helper.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,34 @@ async def update_feature_flag_storage_async(feature_flag_storage, feature_flags,
8888
await feature_flag_storage.update(to_add, to_delete, change_number)
8989
return segment_list
9090

91+
async def update_rule_based_segment_storage_async(rule_based_segment_storage, rule_based_segments, change_number):
92+
"""
93+
Update rule based segment storage from given list of rule based segments
94+
95+
:param rule_based_segment_storage: rule based segment storage instance
96+
:type rule_based_segment_storage: splitio.storage.RuleBasedSegmentStorage
97+
:param rule_based_segments: rule based segment instance to validate.
98+
:type rule_based_segments: splitio.models.rule_based_segments.RuleBasedSegment
99+
:param: last change number
100+
:type: int
101+
102+
:return: segments list from excluded segments list
103+
:rtype: list(str)
104+
"""
105+
segment_list = set()
106+
to_add = []
107+
to_delete = []
108+
for rule_based_segment in rule_based_segments:
109+
if rule_based_segment.status == "ACTIVE":
110+
to_add.append(rule_based_segment)
111+
segment_list.update(set(rule_based_segment.excluded.get_excluded_segments()))
112+
else:
113+
if await rule_based_segment_storage.get(rule_based_segment.name) is not None:
114+
to_delete.append(rule_based_segment.name)
115+
116+
await rule_based_segment_storage.update(to_add, to_delete, change_number)
117+
return segment_list
118+
91119
def get_valid_flag_sets(flag_sets, flag_set_filter):
92120
"""
93121
Check each flag set in given array, return it if exist in a given config flag set array, if config array is empty return all

tests/storage/test_inmemory_storage.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# pylint: disable=no-self-use
33
import random
44
import pytest
5+
import copy
56

67
from splitio.models.splits import Split
78
from splitio.models.segments import Segment
@@ -13,6 +14,7 @@
1314
InMemoryImpressionStorage, InMemoryEventStorage, InMemoryTelemetryStorage, InMemoryImpressionStorageAsync, InMemoryEventStorageAsync, \
1415
InMemoryTelemetryStorageAsync, FlagSets, InMemoryRuleBasedSegmentStorage, InMemoryRuleBasedSegmentStorageAsync
1516
from splitio.models.rule_based_segments import RuleBasedSegment
17+
from splitio.models import rule_based_segments
1618

1719
class FlagSetsFilterTests(object):
1820
"""Flag sets filter storage tests."""
@@ -1840,6 +1842,31 @@ def test_store_get_changenumber(self):
18401842
assert storage.get_change_number() == -1
18411843
storage.update([], [], 5)
18421844
assert storage.get_change_number() == 5
1845+
1846+
def test_contains(self):
1847+
raw = {
1848+
"changeNumber": 123,
1849+
"name": "segment1",
1850+
"status": "ACTIVE",
1851+
"trafficTypeName": "user",
1852+
"excluded":{
1853+
"keys":[],
1854+
"segments":[]
1855+
},
1856+
"conditions": []
1857+
}
1858+
segment1 = rule_based_segments.from_raw(raw)
1859+
raw2 = copy.deepcopy(raw)
1860+
raw2["name"] = "segment2"
1861+
segment2 = rule_based_segments.from_raw(raw2)
1862+
raw3 = copy.deepcopy(raw)
1863+
raw3["name"] = "segment3"
1864+
segment3 = rule_based_segments.from_raw(raw3)
1865+
storage = InMemoryRuleBasedSegmentStorage()
1866+
storage.update([segment1, segment2, segment3], [], -1)
1867+
assert storage.contains(["segment1"])
1868+
assert storage.contains(["segment1", "segment3"])
1869+
assert not storage.contains(["segment5"])
18431870

18441871
class InMemoryRuleBasedSegmentStorageAsyncTests(object):
18451872
"""In memory rule based segment storage test cases."""
@@ -1874,3 +1901,29 @@ async def test_store_get_changenumber(self):
18741901
assert await storage.get_change_number() == -1
18751902
await storage.update([], [], 5)
18761903
assert await storage.get_change_number() == 5
1904+
1905+
@pytest.mark.asyncio
1906+
async def test_contains(self):
1907+
raw = {
1908+
"changeNumber": 123,
1909+
"name": "segment1",
1910+
"status": "ACTIVE",
1911+
"trafficTypeName": "user",
1912+
"excluded":{
1913+
"keys":[],
1914+
"segments":[]
1915+
},
1916+
"conditions": []
1917+
}
1918+
segment1 = rule_based_segments.from_raw(raw)
1919+
raw2 = copy.deepcopy(raw)
1920+
raw2["name"] = "segment2"
1921+
segment2 = rule_based_segments.from_raw(raw2)
1922+
raw3 = copy.deepcopy(raw)
1923+
raw3["name"] = "segment3"
1924+
segment3 = rule_based_segments.from_raw(raw3)
1925+
storage = InMemoryRuleBasedSegmentStorageAsync()
1926+
await storage.update([segment1, segment2, segment3], [], -1)
1927+
assert await storage.contains(["segment1"])
1928+
assert await storage.contains(["segment1", "segment3"])
1929+
assert not await storage.contains(["segment5"])

0 commit comments

Comments
 (0)