Skip to content

Commit 688e527

Browse files
author
Bilal Al
committed
added less than or equal semver matcher
1 parent 5d03848 commit 688e527

File tree

3 files changed

+89
-2
lines changed

3 files changed

+89
-2
lines changed

splitio/models/grammar/matchers/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
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
11+
from splitio.models.grammar.matchers.semver import EqualToSemverMatcher, GreaterThanOrEqualToSemverMatcher, LessThanOrEqualToSemverMatcher
1212

1313

1414
MATCHER_TYPE_ALL_KEYS = 'ALL_KEYS'
@@ -30,6 +30,7 @@
3030
MATCHER_TYPE_MATCHES_STRING = 'MATCHES_STRING'
3131
MATCHER_TYPE_EQUAL_TO_SEMVER = 'EQUAL_TO_SEMVER'
3232
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER = 'GREATER_THAN_OR_EQUAL_TO_SEMVER'
33+
MATCHER_LESS_THAN_OR_EQUAL_TO_SEMVER = 'LESS_THAN_OR_EQUAL_TO_SEMVER'
3334

3435
_MATCHER_BUILDERS = {
3536
MATCHER_TYPE_ALL_KEYS: AllKeysMatcher,
@@ -50,7 +51,8 @@
5051
MATCHER_TYPE_EQUAL_TO_BOOLEAN: BooleanMatcher,
5152
MATCHER_TYPE_MATCHES_STRING: RegexMatcher,
5253
MATCHER_TYPE_EQUAL_TO_SEMVER: EqualToSemverMatcher,
53-
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER: GreaterThanOrEqualToSemverMatcher
54+
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER: GreaterThanOrEqualToSemverMatcher,
55+
MATCHER_LESS_THAN_OR_EQUAL_TO_SEMVER: LessThanOrEqualToSemverMatcher
5456
}
5557

5658
def from_raw(raw_matcher):

splitio/models/grammar/matchers/semver.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,48 @@ def __str__(self):
232232
def _add_matcher_specific_properties_to_json(self):
233233
"""Add matcher specific properties to base dict before returning it."""
234234
return {'matcherType': 'GREATER_THAN_OR_EQUAL_TO_SEMVER', 'stringMatcherData': self._data}
235+
236+
class LessThanOrEqualToSemverMatcher(Matcher):
237+
"""A matcher for Semver less than or equal to."""
238+
239+
def _build(self, raw_matcher):
240+
"""
241+
Build a LessThanOrEqualToSemverMatcher.
242+
243+
:param raw_matcher: raw matcher as fetched from splitChanges response.
244+
:type raw_matcher: dict
245+
"""
246+
self._data = raw_matcher['stringMatcherData']
247+
self._semver = Semver(self._data)
248+
249+
def _match(self, key, attributes=None, context=None):
250+
"""
251+
Evaluate user input against a matcher and return whether the match is successful.
252+
253+
:param key: User key.
254+
:type key: str.
255+
:param attributes: Custom user attributes.
256+
:type attributes: dict.
257+
:param context: Evaluation context
258+
:type context: dict
259+
260+
:returns: Wheter the match is successful.
261+
:rtype: bool
262+
"""
263+
if self._data is None:
264+
_LOGGER.error("stringMatcherData is required for LESS_THAN_OR_EQUAL_TO_SEMVER matcher type")
265+
return None
266+
267+
matching_data = Sanitizer.ensure_string(self._get_matcher_input(key, attributes))
268+
if matching_data is None:
269+
return False
270+
271+
return self._semver.compare(Semver(matching_data)) in [0, -1]
272+
273+
def __str__(self):
274+
"""Return string Representation."""
275+
return 'less than or equal to semver {data}'.format(data=self._data)
276+
277+
def _add_matcher_specific_properties_to_json(self):
278+
"""Add matcher specific properties to base dict before returning it."""
279+
return {'matcherType': 'LESS_THAN_OR_EQUAL_TO_SEMVER', 'stringMatcherData': self._data}

tests/models/grammar/test_matchers.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,3 +964,43 @@ def test_to_str(self):
964964
"""Test that the object serializes to str properly."""
965965
as_str = matchers.GreaterThanOrEqualToSemverMatcher(self.raw)
966966
assert str(as_str) == "greater than or equal to semver 2.1.8"
967+
968+
class LessThanOrEqualToSemverMatcherTests(MatcherTestsBase):
969+
"""Semver less or equalto matcher test cases."""
970+
971+
raw = {
972+
'negate': False,
973+
'matcherType': 'LESS_THAN_OR_EQUAL_TO_SEMVER',
974+
'stringMatcherData': "2.1.8"
975+
}
976+
977+
def test_from_raw(self, mocker):
978+
"""Test parsing from raw json/dict."""
979+
parsed = matchers.from_raw(self.raw)
980+
assert isinstance(parsed, matchers.LessThanOrEqualToSemverMatcher)
981+
assert parsed._data == "2.1.8"
982+
assert isinstance(parsed._semver, Semver)
983+
assert parsed._semver._major == 2
984+
assert parsed._semver._minor == 1
985+
assert parsed._semver._patch == 8
986+
assert parsed._semver._pre_release == []
987+
988+
def test_matcher_behaviour(self, mocker):
989+
"""Test if the matcher works properly."""
990+
parsed = matchers.from_raw(self.raw)
991+
assert parsed._match("2.1.8+rc")
992+
assert parsed._match("2.1.8")
993+
assert parsed._match("2.1.11")
994+
assert not parsed._match("2.1.5")
995+
assert not parsed._match("2.1.5-rc1")
996+
997+
def test_to_json(self):
998+
"""Test that the object serializes to JSON properly."""
999+
as_json = matchers.LessThanOrEqualToSemverMatcher(self.raw).to_json()
1000+
assert as_json['matcherType'] == 'LESS_THAN_OR_EQUAL_TO_SEMVER'
1001+
assert as_json['stringMatcherData'] == "2.1.8"
1002+
1003+
def test_to_str(self):
1004+
"""Test that the object serializes to str properly."""
1005+
as_str = matchers.LessThanOrEqualToSemverMatcher(self.raw)
1006+
assert str(as_str) == "less than or equal to semver 2.1.8"

0 commit comments

Comments
 (0)