Skip to content

Commit c52971b

Browse files
author
Bilal Al
committed
added in list semver matcher
1 parent a2257b7 commit c52971b

File tree

3 files changed

+99
-2
lines changed

3 files changed

+99
-2
lines changed

splitio/models/grammar/matchers/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from splitio.models.grammar.matchers.string import ContainsStringMatcher, \
99
EndsWithMatcher, RegexMatcher, StartsWithMatcher, WhitelistMatcher
1010
from splitio.models.grammar.matchers.misc import BooleanMatcher, DependencyMatcher
11-
from splitio.models.grammar.matchers.semver import EqualToSemverMatcher, GreaterThanOrEqualToSemverMatcher, LessThanOrEqualToSemverMatcher, BetweenSemverMatcher
11+
from splitio.models.grammar.matchers.semver import EqualToSemverMatcher, GreaterThanOrEqualToSemverMatcher, LessThanOrEqualToSemverMatcher, \
12+
BetweenSemverMatcher, InListSemverMatcher
1213

1314

1415
MATCHER_TYPE_ALL_KEYS = 'ALL_KEYS'
@@ -32,6 +33,8 @@
3233
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER = 'GREATER_THAN_OR_EQUAL_TO_SEMVER'
3334
MATCHER_LESS_THAN_OR_EQUAL_TO_SEMVER = 'LESS_THAN_OR_EQUAL_TO_SEMVER'
3435
MATCHER_BETWEEN_SEMVER = 'BETWEEN_SEMVER'
36+
MATCHER_INLIST_SEMVER = 'INLIST_SEMVER'
37+
3538

3639
_MATCHER_BUILDERS = {
3740
MATCHER_TYPE_ALL_KEYS: AllKeysMatcher,
@@ -54,7 +57,8 @@
5457
MATCHER_TYPE_EQUAL_TO_SEMVER: EqualToSemverMatcher,
5558
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER: GreaterThanOrEqualToSemverMatcher,
5659
MATCHER_LESS_THAN_OR_EQUAL_TO_SEMVER: LessThanOrEqualToSemverMatcher,
57-
MATCHER_BETWEEN_SEMVER: BetweenSemverMatcher
60+
MATCHER_BETWEEN_SEMVER: BetweenSemverMatcher,
61+
MATCHER_INLIST_SEMVER: InListSemverMatcher
5862
}
5963

6064
def from_raw(raw_matcher):

splitio/models/grammar/matchers/semver.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,3 +323,51 @@ def __str__(self):
323323
def _add_matcher_specific_properties_to_json(self):
324324
"""Add matcher specific properties to base dict before returning it."""
325325
return {'matcherType': 'BETWEEN_SEMVER', 'betweenStringMatcherData': self._data}
326+
327+
class InListSemverMatcher(Matcher):
328+
"""A matcher for Semver in list."""
329+
330+
def _build(self, raw_matcher):
331+
"""
332+
Build a InListSemverMatcher.
333+
334+
:param raw_matcher: raw matcher as fetched from splitChanges response.
335+
:type raw_matcher: dict
336+
"""
337+
self._data = raw_matcher.get('whitelistMatcherData')
338+
if self._data is not None:
339+
self._data = self._data.get('whitelist')
340+
341+
self._semver_list = [Semver(item) if item is not None else None for item in self._data] if self._data is not None else []
342+
343+
def _match(self, key, attributes=None, context=None):
344+
"""
345+
Evaluate user input against a matcher and return whether the match is successful.
346+
347+
:param key: User key.
348+
:type key: str.
349+
:param attributes: Custom user attributes.
350+
:type attributes: dict.
351+
:param context: Evaluation context
352+
:type context: dict
353+
354+
:returns: Wheter the match is successful.
355+
:rtype: bool
356+
"""
357+
if self._data is None:
358+
_LOGGER.error("whitelistMatcherData is required for INLIST_SEMVER matcher type")
359+
return None
360+
361+
matching_data = Sanitizer.ensure_string(self._get_matcher_input(key, attributes))
362+
if matching_data is None:
363+
return False
364+
365+
return any([item.compare(Semver(matching_data)) == 0 if item is not None else False for item in self._semver_list])
366+
367+
def __str__(self):
368+
"""Return string Representation."""
369+
return 'in list semver {data}'.format(data=self._data)
370+
371+
def _add_matcher_specific_properties_to_json(self):
372+
"""Add matcher specific properties to base dict before returning it."""
373+
return {'matcherType': 'INLIST_SEMVER', 'whitelistMatcherData': {'whitelist': self._data}}

tests/models/grammar/test_matchers.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,3 +1050,48 @@ def test_to_str(self):
10501050
"""Test that the object serializes to str properly."""
10511051
as_str = matchers.BetweenSemverMatcher(self.raw)
10521052
assert str(as_str) == "between semver 2.1.8 and 2.1.11"
1053+
1054+
class InListSemverMatcherTests(MatcherTestsBase):
1055+
"""Semver inlist matcher test cases."""
1056+
1057+
raw = {
1058+
'negate': False,
1059+
'matcherType': 'INLIST_SEMVER',
1060+
'whitelistMatcherData': {"whitelist": ["2.1.8", "2.1.11"]}
1061+
}
1062+
1063+
def test_from_raw(self, mocker):
1064+
"""Test parsing from raw json/dict."""
1065+
parsed = matchers.from_raw(self.raw)
1066+
assert isinstance(parsed, matchers.InListSemverMatcher)
1067+
assert parsed._data == ["2.1.8", "2.1.11"]
1068+
assert [isinstance(item, Semver) for item in parsed._semver_list]
1069+
assert parsed._semver_list[0]._major == 2
1070+
assert parsed._semver_list[0]._minor == 1
1071+
assert parsed._semver_list[0]._patch == 8
1072+
assert parsed._semver_list[0]._pre_release == []
1073+
1074+
assert parsed._semver_list[1]._major == 2
1075+
assert parsed._semver_list[1]._minor == 1
1076+
assert parsed._semver_list[1]._patch == 11
1077+
assert parsed._semver_list[1]._pre_release == []
1078+
1079+
def test_matcher_behaviour(self, mocker):
1080+
"""Test if the matcher works properly."""
1081+
parsed = matchers.from_raw(self.raw)
1082+
assert parsed._match("2.1.8+rc")
1083+
assert not parsed._match("2.1.8-rc1")
1084+
assert not parsed._match("2.1.11-rc12")
1085+
assert parsed._match("2.1.11")
1086+
assert not parsed._match("2.1.7")
1087+
1088+
def test_to_json(self):
1089+
"""Test that the object serializes to JSON properly."""
1090+
as_json = matchers.InListSemverMatcher(self.raw).to_json()
1091+
assert as_json['matcherType'] == 'INLIST_SEMVER'
1092+
assert as_json['whitelistMatcherData'] == {"whitelist": ["2.1.8", "2.1.11"]}
1093+
1094+
def test_to_str(self):
1095+
"""Test that the object serializes to str properly."""
1096+
as_str = matchers.InListSemverMatcher(self.raw)
1097+
assert str(as_str) == "in list semver ['2.1.8', '2.1.11']"

0 commit comments

Comments
 (0)