Skip to content

Commit 3692161

Browse files
authored
Merge pull request #570 from splitio/prereq-models
Added models
2 parents 0043805 + c093206 commit 3692161

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

splitio/models/splits.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
SplitView = namedtuple(
1212
'SplitView',
13-
['name', 'traffic_type', 'killed', 'treatments', 'change_number', 'configs', 'default_treatment', 'sets', 'impressions_disabled']
13+
['name', 'traffic_type', 'killed', 'treatments', 'change_number', 'configs', 'default_treatment', 'sets', 'impressions_disabled', 'prerequisites']
1414
)
1515

1616
_DEFAULT_CONDITIONS_TEMPLATE = {
@@ -40,7 +40,28 @@
4040
"label": "targeting rule type unsupported by sdk"
4141
}
4242

43+
class Prerequisites(object):
44+
"""Prerequisites."""
45+
def __init__(self, feature_flag_name, treatments):
46+
self._feature_flag_name = feature_flag_name
47+
self._treatments = treatments
48+
49+
@property
50+
def feature_flag_name(self):
51+
"""Return featur eflag name."""
52+
return self._feature_flag_name
4353

54+
@property
55+
def treatments(self):
56+
"""Return treatments."""
57+
return self._treatments
58+
59+
def to_json(self):
60+
to_return = []
61+
for feature_flag_name in self._feature_flag_name:
62+
to_return.append({"n": feature_flag_name, "ts": [treatment for treatment in self._treatments]})
63+
64+
return to_return
4465

4566
class Status(Enum):
4667
"""Split status."""
@@ -74,7 +95,8 @@ def __init__( # pylint: disable=too-many-arguments
7495
traffic_allocation_seed=None,
7596
configurations=None,
7697
sets=None,
77-
impressions_disabled=None
98+
impressions_disabled=None,
99+
prerequisites = None
78100
):
79101
"""
80102
Class constructor.
@@ -99,6 +121,8 @@ def __init__( # pylint: disable=too-many-arguments
99121
:type sets: list
100122
:pram impressions_disabled: track impressions flag
101123
:type impressions_disabled: boolean
124+
:pram prerequisites: prerequisites
125+
:type prerequisites: List of Preqreuisites
102126
"""
103127
self._name = name
104128
self._seed = seed
@@ -129,6 +153,7 @@ def __init__( # pylint: disable=too-many-arguments
129153
self._configurations = configurations
130154
self._sets = set(sets) if sets is not None else set()
131155
self._impressions_disabled = impressions_disabled if impressions_disabled is not None else False
156+
self._prerequisites = prerequisites if prerequisites is not None else []
132157

133158
@property
134159
def name(self):
@@ -194,6 +219,11 @@ def sets(self):
194219
def impressions_disabled(self):
195220
"""Return impressions_disabled of the split."""
196221
return self._impressions_disabled
222+
223+
@property
224+
def prerequisites(self):
225+
"""Return prerequisites of the split."""
226+
return self._prerequisites
197227

198228
def get_configurations_for(self, treatment):
199229
"""Return the mapping of treatments to configurations."""
@@ -224,7 +254,8 @@ def to_json(self):
224254
'conditions': [c.to_json() for c in self.conditions],
225255
'configurations': self._configurations,
226256
'sets': list(self._sets),
227-
'impressionsDisabled': self._impressions_disabled
257+
'impressionsDisabled': self._impressions_disabled,
258+
'prerequisites': [prerequisite.to_json() for prerequisite in self._prerequisites]
228259
}
229260

230261
def to_split_view(self):
@@ -243,7 +274,8 @@ def to_split_view(self):
243274
self._configurations if self._configurations is not None else {},
244275
self._default_treatment,
245276
list(self._sets) if self._sets is not None else [],
246-
self._impressions_disabled
277+
self._impressions_disabled,
278+
self._prerequisites
247279
)
248280

249281
def local_kill(self, default_treatment, change_number):
@@ -300,5 +332,13 @@ def from_raw(raw_split):
300332
traffic_allocation_seed=raw_split.get('trafficAllocationSeed'),
301333
configurations=raw_split.get('configurations'),
302334
sets=set(raw_split.get('sets')) if raw_split.get('sets') is not None else [],
303-
impressions_disabled=raw_split.get('impressionsDisabled') if raw_split.get('impressionsDisabled') is not None else False
335+
impressions_disabled=raw_split.get('impressionsDisabled') if raw_split.get('impressionsDisabled') is not None else False,
336+
prerequisites=from_raw_prerequisites(raw_split.get('prerequisites')) if raw_split.get('prerequisites') is not None else []
304337
)
338+
339+
def from_raw_prerequisites(raw_prerequisites):
340+
to_return = []
341+
for prerequisite in raw_prerequisites:
342+
to_return.append(Prerequisites(prerequisite['n'], prerequisite['ts']))
343+
344+
return to_return

tests/models/test_splits.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ class SplitTests(object):
1111
'changeNumber': 123,
1212
'trafficTypeName': 'user',
1313
'name': 'some_name',
14+
'prerequisites': [
15+
{ 'n': 'flag1', 'ts': ['on','v1'] },
16+
{ 'n': 'flag2', 'ts': ['off'] }
17+
],
1418
'trafficAllocation': 100,
1519
'trafficAllocationSeed': 123456,
1620
'seed': 321654,
@@ -83,14 +87,26 @@ def test_from_raw(self):
8387
assert parsed._configurations == {'on': '{"color": "blue", "size": 13}'}
8488
assert parsed.sets == {'set1', 'set2'}
8589
assert parsed.impressions_disabled == False
86-
90+
assert len(parsed.prerequisites) == 2
91+
flag1 = False
92+
flag2 = False
93+
for prerequisite in parsed.prerequisites:
94+
if prerequisite.feature_flag_name == 'flag1':
95+
flag1 = True
96+
assert prerequisite.treatments == ['on','v1']
97+
if prerequisite.feature_flag_name == 'flag2':
98+
flag2 = True
99+
assert prerequisite.treatments == ['off']
100+
assert flag1
101+
assert flag2
102+
87103
def test_get_segment_names(self, mocker):
88104
"""Test fetching segment names."""
89105
cond1 = mocker.Mock(spec=Condition)
90106
cond2 = mocker.Mock(spec=Condition)
91107
cond1.get_segment_names.return_value = ['segment1', 'segment2']
92108
cond2.get_segment_names.return_value = ['segment3', 'segment4']
93-
split1 = splits.Split( 'some_split', 123, False, 'off', 'user', 'ACTIVE', 123, [cond1, cond2])
109+
split1 = splits.Split( 'some_split', 123, False, 'off', 'user', 'ACTIVE', 123, [cond1, cond2], None)
94110
assert split1.get_segment_names() == ['segment%d' % i for i in range(1, 5)]
95111

96112
def test_to_json(self):

0 commit comments

Comments
 (0)