Skip to content

Commit 7c6b1eb

Browse files
committed
moved flagset and flagset filter classes to storage
1 parent c15e337 commit 7c6b1eb

File tree

11 files changed

+149
-204
lines changed

11 files changed

+149
-204
lines changed

splitio/models/flag_sets.py

Lines changed: 0 additions & 124 deletions
This file was deleted.

splitio/storage/__init__.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Base storage interfaces."""
22
import abc
3+
import threading
34

45

56
class SplitStorage(object, metaclass=abc.ABCMeta):
@@ -315,3 +316,42 @@ def record_bur_time_out(self):
315316
316317
"""
317318
pass
319+
320+
class FlagSetsFilter(object):
321+
"""Config Flagsets Filter storage."""
322+
323+
def __init__(self, flag_sets=[]):
324+
"""Constructor."""
325+
self.flag_sets = set(flag_sets)
326+
self.should_filter = any(flag_sets)
327+
328+
def set_exist(self, flag_set):
329+
"""
330+
Check if a flagset exist in flagset filter
331+
332+
:param flag_set: set name
333+
:type flag_set: str
334+
335+
:rtype: bool
336+
"""
337+
if not self.should_filter:
338+
return True
339+
if not isinstance(flag_set, str) or flag_set == '':
340+
return False
341+
342+
return any(self.flag_sets.intersection(set([flag_set])))
343+
344+
def intersect(self, flag_sets):
345+
"""
346+
Check if a set exist in config flagset filter
347+
348+
:param flag_set: set of flagsets
349+
:type flag_set: set
350+
351+
:rtype: bool
352+
"""
353+
if not self.should_filter:
354+
return True
355+
if not isinstance(flag_sets, set) or len(flag_sets) == 0:
356+
return False
357+
return any(self.flag_sets.intersection(flag_sets))

splitio/storage/inmemmory.py

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,97 @@
66

77
from splitio.models.segments import Segment
88
from splitio.models.telemetry import HTTPErrors, HTTPLatencies, MethodExceptions, MethodLatencies, LastSynchronization, StreamingEvents, TelemetryConfig, TelemetryCounters, CounterConstants
9-
from splitio.models.flag_sets import FlagSets, FlagSetsFilter
9+
from splitio.storage import FlagSetsFilter
1010
from splitio.storage import SplitStorage, SegmentStorage, ImpressionStorage, EventStorage, TelemetryStorage
1111

1212
MAX_SIZE_BYTES = 5 * 1024 * 1024
1313
MAX_TAGS = 10
1414

1515
_LOGGER = logging.getLogger(__name__)
1616

17+
class FlagSets(object):
18+
"""InMemory Flagsets storage."""
19+
20+
def __init__(self, flag_sets=[]):
21+
"""Constructor."""
22+
self._lock = threading.RLock()
23+
self.sets_feature_flag_map = {}
24+
for flag_set in flag_sets:
25+
self.sets_feature_flag_map[flag_set] = set()
26+
27+
def flag_set_exist(self, flag_set):
28+
"""
29+
Check if a flagset exist in stored flagset
30+
31+
:param flag_set: set name
32+
:type flag_set: str
33+
34+
:rtype: bool
35+
"""
36+
with self._lock:
37+
return flag_set in self.sets_feature_flag_map.keys()
38+
39+
def get_flag_set(self, flag_set):
40+
"""
41+
fetch feature flags stored in a flag set
42+
43+
:param flag_set: set name
44+
:type flag_set: str
45+
46+
:rtype: list(str)
47+
"""
48+
with self._lock:
49+
return self.sets_feature_flag_map.get(flag_set)
50+
51+
def add_flag_set(self, flag_set):
52+
"""
53+
Add new flag set to storage
54+
55+
:param flag_set: set name
56+
:type flag_set: str
57+
"""
58+
with self._lock:
59+
if not self.flag_set_exist(flag_set):
60+
self.sets_feature_flag_map[flag_set] = set()
61+
62+
def remove_flag_set(self, flag_set):
63+
"""
64+
Remove existing flag set from storage
65+
66+
:param flag_set: set name
67+
:type flag_set: str
68+
"""
69+
with self._lock:
70+
if self.flag_set_exist(flag_set):
71+
del self.sets_feature_flag_map[flag_set]
72+
73+
def add_feature_flag_to_flag_set(self, flag_set, feature_flag):
74+
"""
75+
Add a feature flag to existing flag set
76+
77+
:param flag_set: set name
78+
:type flag_set: str
79+
:param feature_flag: feature flag name
80+
:type feature_flag: str
81+
"""
82+
with self._lock:
83+
if self.flag_set_exist(flag_set):
84+
self.sets_feature_flag_map[flag_set].add(feature_flag)
85+
86+
def remove_feature_flag_to_flag_set(self, flag_set, feature_flag):
87+
"""
88+
Remove a feature flag from existing flag set
89+
90+
:param flag_set: set name
91+
:type flag_set: str
92+
:param feature_flag: feature flag name
93+
:type feature_flag: str
94+
"""
95+
with self._lock:
96+
if self.flag_set_exist(flag_set):
97+
self.sets_feature_flag_map[flag_set].remove(feature_flag)
98+
99+
17100
class InMemorySplitStorage(SplitStorage):
18101
"""InMemory implementation of a feature flag storage."""
19102

splitio/storage/pluggable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from splitio.models import splits, segments
88
from splitio.models.impressions import Impression
99
from splitio.models.telemetry import MethodExceptions, MethodLatencies, TelemetryConfig, MAX_TAGS, get_latency_bucket_index
10-
from splitio.models.flag_sets import FlagSetsFilter
10+
from splitio.storage import FlagSetsFilter
1111
from splitio.storage import SplitStorage, SegmentStorage, ImpressionStorage, EventStorage, TelemetryStorage
1212
from splitio.util.storage_helper import get_valid_flag_sets, combine_valid_flag_sets
1313

splitio/storage/redis.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from splitio.models.impressions import Impression
77
from splitio.models import splits, segments
88
from splitio.models.telemetry import MethodExceptions, MethodLatencies, TelemetryConfig, get_latency_bucket_index
9-
from splitio.models.flag_sets import FlagSetsFilter
9+
from splitio.storage import FlagSetsFilter
1010
from splitio.storage import SplitStorage, SegmentStorage, ImpressionStorage, EventStorage, \
1111
ImpressionPipelinedStorage, TelemetryStorage
1212
from splitio.storage.adapters.redis import RedisAdapterException

tests/models/test_flag_sets.py

Lines changed: 0 additions & 59 deletions
This file was deleted.

tests/storage/test_flag_sets.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from splitio.storage import FlagSetsFilter
2+
3+
class FlagSetsFilterTests(object):
4+
"""Flag sets filter storage tests."""
5+
6+
def test_flag_set_filter(self):
7+
flag_set_filter = FlagSetsFilter()
8+
assert flag_set_filter.flag_sets == set()
9+
assert not flag_set_filter.should_filter
10+
11+
flag_set_filter = FlagSetsFilter(['set1', 'set2'])
12+
assert flag_set_filter.flag_sets == set({'set1', 'set2'})
13+
assert flag_set_filter.should_filter
14+
assert flag_set_filter.intersect(set({'set1', 'set2'}))
15+
assert flag_set_filter.intersect(set({'set1', 'set2', 'set5'}))
16+
assert not flag_set_filter.intersect(set({'set4'}))
17+
assert not flag_set_filter.set_exist('set4')
18+
assert flag_set_filter.set_exist('set1')

0 commit comments

Comments
 (0)