Skip to content

Commit d9bbce4

Browse files
committed
Added FallbackTreatmentsConfiguration class
1 parent caacb33 commit d9bbce4

File tree

3 files changed

+84
-44
lines changed

3 files changed

+84
-44
lines changed

splitio/client/config.py

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from splitio.engine.impressions import ImpressionsMode
77
from splitio.client.input_validator import validate_flag_sets, validate_fallback_treatment, validate_regex_name
8-
from splitio.models.fallback_config import FallbackConfig
8+
from splitio.models.fallback_config import FallbackConfig, FallbackTreatmentsConfiguration
99

1010
_LOGGER = logging.getLogger(__name__)
1111
DEFAULT_DATA_SAMPLING = 1
@@ -71,7 +71,7 @@ class AuthenticateScheme(Enum):
7171
'httpAuthenticateScheme': AuthenticateScheme.NONE,
7272
'kerberosPrincipalUser': None,
7373
'kerberosPrincipalPassword': None,
74-
'fallbackConfig': FallbackConfig(None, None)
74+
'fallbackTreatmentsConfiguration': FallbackTreatmentsConfiguration(None)
7575
}
7676

7777
def _parse_operation_mode(sdk_key, config):
@@ -170,26 +170,37 @@ def sanitize(sdk_key, config):
170170
' Defaulting to `none` mode.')
171171
processed["httpAuthenticateScheme"] = authenticate_scheme
172172

173-
if config.get('fallbackConfig') is not None:
174-
if not isinstance(config['fallbackConfig'], FallbackConfig):
175-
_LOGGER.warning('Config: fallbackConfig parameter should be of `FallbackConfig` structure.')
176-
processed['fallbackConfig'] = FallbackConfig(None, None)
177-
return processed
178-
179-
if config['fallbackConfig'].global_fallback_treatment is not None and not validate_fallback_treatment(config['fallbackConfig'].global_fallback_treatment):
180-
_LOGGER.warning('Config: global fallbacktreatment parameter is discarded.')
181-
processed['fallbackConfig'].global_fallback_treatment = None
182-
return processed
183-
184-
if config['fallbackConfig'].by_flag_fallback_treatment is not None:
185-
sanitized_flag_fallback_treatments = {}
186-
for feature_name in config['fallbackConfig'].by_flag_fallback_treatment.keys():
187-
if not validate_regex_name(feature_name) or not validate_fallback_treatment(config['fallbackConfig'].by_flag_fallback_treatment[feature_name]):
188-
_LOGGER.warning('Config: fallback treatment parameter for feature flag %s is discarded.', feature_name)
189-
continue
190-
191-
sanitized_flag_fallback_treatments[feature_name] = config['fallbackConfig'].by_flag_fallback_treatment[feature_name]
192-
193-
processed['fallbackConfig'] = FallbackConfig(config['fallbackConfig'].global_fallback_treatment, sanitized_flag_fallback_treatments)
173+
processed = _sanitize_fallback_config(config, processed)
194174

195175
return processed
176+
177+
def _sanitize_fallback_config(config, processed):
178+
if config.get('fallbackTreatmentsConfiguration') is not None:
179+
if not isinstance(config['fallbackTreatmentsConfiguration'], FallbackTreatmentsConfiguration):
180+
_LOGGER.warning('Config: fallbackTreatmentsConfiguration parameter should be of `FallbackTreatmentsConfiguration` class.')
181+
processed['fallbackTreatmentsConfiguration'] = FallbackTreatmentsConfiguration(None)
182+
return processed
183+
184+
if config['fallbackTreatmentsConfiguration'].fallback_config != None:
185+
if not isinstance(config['fallbackTreatmentsConfiguration'].fallback_config, FallbackConfig):
186+
_LOGGER.warning('Config: fallback_config parameter should be of `FallbackConfig` class.')
187+
processed['fallbackTreatmentsConfiguration'].fallback_config = FallbackConfig(None, None)
188+
return processed
189+
190+
if config['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment is not None and not validate_fallback_treatment(config['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment):
191+
_LOGGER.warning('Config: global fallbacktreatment parameter is discarded.')
192+
processed['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment = None
193+
return processed
194+
195+
if config['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment is not None:
196+
sanitized_flag_fallback_treatments = {}
197+
for feature_name in config['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment.keys():
198+
if not validate_regex_name(feature_name) or not validate_fallback_treatment(config['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment[feature_name]):
199+
_LOGGER.warning('Config: fallback treatment parameter for feature flag %s is discarded.', feature_name)
200+
continue
201+
202+
sanitized_flag_fallback_treatments[feature_name] = config['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment[feature_name]
203+
204+
processed['fallbackTreatmentsConfiguration'].fallback_config = FallbackConfig(config['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment, sanitized_flag_fallback_treatments)
205+
206+
return processed

splitio/models/fallback_config.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,32 @@
11
"""Segment module."""
22

3+
class FallbackTreatmentsConfiguration(object):
4+
"""FallbackConfiguration object class."""
5+
6+
def __init__(self, fallback_config):
7+
"""
8+
Class constructor.
9+
10+
:param fallback_config: fallback config object.
11+
:type fallback_config: FallbackConfig
12+
13+
:param by_flag_fallback_treatment: Dict of flags and their fallback treatment
14+
:type by_flag_fallback_treatment: {str: FallbackTreatment}
15+
"""
16+
self._fallback_config = fallback_config
17+
18+
@property
19+
def fallback_config(self):
20+
"""Return fallback config."""
21+
return self._fallback_config
22+
23+
@fallback_config.setter
24+
def fallback_config(self, new_value):
25+
"""Set fallback config."""
26+
self._fallback_config = new_value
27+
328
class FallbackConfig(object):
4-
"""Segment object class."""
29+
"""FallbackConfig object class."""
530

631
def __init__(self, global_fallback_treatment=None, by_flag_fallback_treatment=None):
732
"""
@@ -23,7 +48,7 @@ def global_fallback_treatment(self):
2348

2449
@global_fallback_treatment.setter
2550
def global_fallback_treatment(self, new_value):
26-
"""Return global fallback treatment."""
51+
"""Set global fallback treatment."""
2752
self._global_fallback_treatment = new_value
2853

2954
@property
@@ -33,5 +58,5 @@ def by_flag_fallback_treatment(self):
3358

3459
@by_flag_fallback_treatment.setter
3560
def by_flag_fallback_treatment(self, new_value):
36-
"""Return global fallback treatment."""
61+
"""Set global fallback treatment."""
3762
self.by_flag_fallback_treatment = new_value

tests/client/test_config.py

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from splitio.client import config
55
from splitio.engine.impressions.impressions import ImpressionsMode
66
from splitio.models.fallback_treatment import FallbackTreatment
7-
from splitio.models.fallback_config import FallbackConfig
7+
from splitio.models.fallback_config import FallbackConfig, FallbackTreatmentsConfiguration
88

99
class ConfigSanitizationTests(object):
1010
"""Inmemory storage-based integration tests."""
@@ -92,28 +92,32 @@ def test_sanitize(self, mocker):
9292
assert processed['httpAuthenticateScheme'] is config.AuthenticateScheme.NONE
9393

9494
_logger.reset_mock()
95-
processed = config.sanitize('some', {'fallbackConfig': 'NONE'})
96-
assert processed['fallbackConfig'].global_fallback_treatment == None
97-
assert processed['fallbackConfig'].by_flag_fallback_treatment == None
98-
assert _logger.warning.mock_calls[1] == mocker.call("Config: fallbackConfig parameter should be of `FallbackConfig` structure.")
95+
processed = config.sanitize('some', {'fallbackTreatmentsConfiguration': 'NONE'})
96+
assert processed['fallbackTreatmentsConfiguration'].fallback_config == None
97+
assert _logger.warning.mock_calls[1] == mocker.call("Config: fallbackTreatmentsConfiguration parameter should be of `FallbackTreatmentsConfiguration` class.")
9998

10099
_logger.reset_mock()
101-
processed = config.sanitize('some', {'fallbackConfig': FallbackConfig(FallbackTreatment("123"))})
102-
assert processed['fallbackConfig'].global_fallback_treatment == None
100+
processed = config.sanitize('some', {'fallbackTreatmentsConfiguration': FallbackTreatmentsConfiguration(123)})
101+
assert processed['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment == None
102+
assert _logger.warning.mock_calls[1] == mocker.call("Config: fallback_config parameter should be of `FallbackConfig` class.")
103+
104+
_logger.reset_mock()
105+
processed = config.sanitize('some', {'fallbackTreatmentsConfiguration': FallbackTreatmentsConfiguration(FallbackConfig(FallbackTreatment("123")))})
106+
assert processed['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment == None
103107
assert _logger.warning.mock_calls[1] == mocker.call("Config: global fallbacktreatment parameter is discarded.")
104108

105-
fb = FallbackConfig(FallbackTreatment('on'))
106-
processed = config.sanitize('some', {'fallbackConfig': fb})
107-
assert processed['fallbackConfig'].global_fallback_treatment.treatment == fb.global_fallback_treatment.treatment
109+
fb = FallbackTreatmentsConfiguration(FallbackConfig(FallbackTreatment('on')))
110+
processed = config.sanitize('some', {'fallbackTreatmentsConfiguration': fb})
111+
assert processed['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment.treatment == fb.fallback_config.global_fallback_treatment.treatment
108112

109-
fb = FallbackConfig(FallbackTreatment('on'), {"flag": FallbackTreatment("off")})
110-
processed = config.sanitize('some', {'fallbackConfig': fb})
111-
assert processed['fallbackConfig'].global_fallback_treatment.treatment == fb.global_fallback_treatment.treatment
112-
assert processed['fallbackConfig'].by_flag_fallback_treatment["flag"] == fb.by_flag_fallback_treatment["flag"]
113+
fb = FallbackTreatmentsConfiguration(FallbackConfig(FallbackTreatment('on'), {"flag": FallbackTreatment("off")}))
114+
processed = config.sanitize('some', {'fallbackTreatmentsConfiguration': fb})
115+
assert processed['fallbackTreatmentsConfiguration'].fallback_config.global_fallback_treatment.treatment == fb.fallback_config.global_fallback_treatment.treatment
116+
assert processed['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment["flag"] == fb.fallback_config.by_flag_fallback_treatment["flag"]
113117

114118
_logger.reset_mock()
115-
fb = FallbackConfig(None, {"flag#%": FallbackTreatment("off"), "flag2": FallbackTreatment("on")})
116-
processed = config.sanitize('some', {'fallbackConfig': fb})
117-
assert len(processed['fallbackConfig'].by_flag_fallback_treatment) == 1
118-
assert processed['fallbackConfig'].by_flag_fallback_treatment.get("flag2") == fb.by_flag_fallback_treatment["flag2"]
119+
fb = FallbackTreatmentsConfiguration(FallbackConfig(None, {"flag#%": FallbackTreatment("off"), "flag2": FallbackTreatment("on")}))
120+
processed = config.sanitize('some', {'fallbackTreatmentsConfiguration': fb})
121+
assert len(processed['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment) == 1
122+
assert processed['fallbackTreatmentsConfiguration'].fallback_config.by_flag_fallback_treatment.get("flag2") == fb.fallback_config.by_flag_fallback_treatment["flag2"]
119123
assert _logger.warning.mock_calls[1] == mocker.call('Config: fallback treatment parameter for feature flag %s is discarded.', 'flag#%')

0 commit comments

Comments
 (0)