Skip to content

Commit 5d03848

Browse files
author
Bilal Al
committed
added greater or equal to semver matcher
1 parent 7ff9cee commit 5d03848

File tree

3 files changed

+89
-5
lines changed

3 files changed

+89
-5
lines changed

splitio/models/grammar/matchers/__init__.py

Lines changed: 4 additions & 5 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
11+
from splitio.models.grammar.matchers.semver import EqualToSemverMatcher, GreaterThanOrEqualToSemverMatcher
1212

1313

1414
MATCHER_TYPE_ALL_KEYS = 'ALL_KEYS'
@@ -29,7 +29,7 @@
2929
MATCHER_TYPE_EQUAL_TO_BOOLEAN = 'EQUAL_TO_BOOLEAN'
3030
MATCHER_TYPE_MATCHES_STRING = 'MATCHES_STRING'
3131
MATCHER_TYPE_EQUAL_TO_SEMVER = 'EQUAL_TO_SEMVER'
32-
32+
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER = 'GREATER_THAN_OR_EQUAL_TO_SEMVER'
3333

3434
_MATCHER_BUILDERS = {
3535
MATCHER_TYPE_ALL_KEYS: AllKeysMatcher,
@@ -49,11 +49,10 @@
4949
MATCHER_TYPE_IN_SPLIT_TREATMENT: DependencyMatcher,
5050
MATCHER_TYPE_EQUAL_TO_BOOLEAN: BooleanMatcher,
5151
MATCHER_TYPE_MATCHES_STRING: RegexMatcher,
52-
MATCHER_TYPE_EQUAL_TO_SEMVER: EqualToSemverMatcher
53-
52+
MATCHER_TYPE_EQUAL_TO_SEMVER: EqualToSemverMatcher,
53+
MATCHER_GREATER_THAN_OR_EQUAL_TO_SEMVER: GreaterThanOrEqualToSemverMatcher
5454
}
5555

56-
5756
def from_raw(raw_matcher):
5857
"""
5958
Parse a condition from a JSON portion of splitChanges.

splitio/models/grammar/matchers/semver.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,48 @@ def __str__(self):
187187
def _add_matcher_specific_properties_to_json(self):
188188
"""Add matcher specific properties to base dict before returning it."""
189189
return {'matcherType': 'EQUAL_TO_SEMVER', 'stringMatcherData': self._data}
190+
191+
class GreaterThanOrEqualToSemverMatcher(Matcher):
192+
"""A matcher for Semver greater than or equal to."""
193+
194+
def _build(self, raw_matcher):
195+
"""
196+
Build a GreaterThanOrEqualToSemverMatcher.
197+
198+
:param raw_matcher: raw matcher as fetched from splitChanges response.
199+
:type raw_matcher: dict
200+
"""
201+
self._data = raw_matcher['stringMatcherData']
202+
self._semver = Semver(self._data)
203+
204+
def _match(self, key, attributes=None, context=None):
205+
"""
206+
Evaluate user input against a matcher and return whether the match is successful.
207+
208+
:param key: User key.
209+
:type key: str.
210+
:param attributes: Custom user attributes.
211+
:type attributes: dict.
212+
:param context: Evaluation context
213+
:type context: dict
214+
215+
:returns: Wheter the match is successful.
216+
:rtype: bool
217+
"""
218+
if self._data is None:
219+
_LOGGER.error("stringMatcherData is required for GREATER_THAN_OR_EQUAL_TO_SEMVER matcher type")
220+
return None
221+
222+
matching_data = Sanitizer.ensure_string(self._get_matcher_input(key, attributes))
223+
if matching_data is None:
224+
return False
225+
226+
return self._semver.compare(Semver(matching_data)) in [0, 1]
227+
228+
def __str__(self):
229+
"""Return string Representation."""
230+
return 'greater than or equal to semver {data}'.format(data=self._data)
231+
232+
def _add_matcher_specific_properties_to_json(self):
233+
"""Add matcher specific properties to base dict before returning it."""
234+
return {'matcherType': 'GREATER_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
@@ -924,3 +924,43 @@ def test_to_str(self):
924924
"""Test that the object serializes to str properly."""
925925
as_str = matchers.EqualToSemverMatcher(self.raw)
926926
assert str(as_str) == "equal semver 2.1.8"
927+
928+
class GreaterThanOrEqualToSemverMatcherTests(MatcherTestsBase):
929+
"""Semver greater or equalto matcher test cases."""
930+
931+
raw = {
932+
'negate': False,
933+
'matcherType': 'GREATER_THAN_OR_EQUAL_TO_SEMVER',
934+
'stringMatcherData': "2.1.8"
935+
}
936+
937+
def test_from_raw(self, mocker):
938+
"""Test parsing from raw json/dict."""
939+
parsed = matchers.from_raw(self.raw)
940+
assert isinstance(parsed, matchers.GreaterThanOrEqualToSemverMatcher)
941+
assert parsed._data == "2.1.8"
942+
assert isinstance(parsed._semver, Semver)
943+
assert parsed._semver._major == 2
944+
assert parsed._semver._minor == 1
945+
assert parsed._semver._patch == 8
946+
assert parsed._semver._pre_release == []
947+
948+
def test_matcher_behaviour(self, mocker):
949+
"""Test if the matcher works properly."""
950+
parsed = matchers.from_raw(self.raw)
951+
assert parsed._match("2.1.8+rc")
952+
assert parsed._match("2.1.8")
953+
assert not parsed._match("2.1.11")
954+
assert parsed._match("2.1.5")
955+
assert parsed._match("2.1.5-rc1")
956+
957+
def test_to_json(self):
958+
"""Test that the object serializes to JSON properly."""
959+
as_json = matchers.GreaterThanOrEqualToSemverMatcher(self.raw).to_json()
960+
assert as_json['matcherType'] == 'GREATER_THAN_OR_EQUAL_TO_SEMVER'
961+
assert as_json['stringMatcherData'] == "2.1.8"
962+
963+
def test_to_str(self):
964+
"""Test that the object serializes to str properly."""
965+
as_str = matchers.GreaterThanOrEqualToSemverMatcher(self.raw)
966+
assert str(as_str) == "greater than or equal to semver 2.1.8"

0 commit comments

Comments
 (0)