Skip to content

Commit 21f15c3

Browse files
author
Bilal Al
committed
added semver equalto matcher
1 parent 24fd1f7 commit 21f15c3

File tree

3 files changed

+91
-1
lines changed

3 files changed

+91
-1
lines changed

splitio/models/grammar/matchers/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +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
1112

1213

1314
MATCHER_TYPE_ALL_KEYS = 'ALL_KEYS'
@@ -27,6 +28,7 @@
2728
MATCHER_TYPE_IN_SPLIT_TREATMENT = 'IN_SPLIT_TREATMENT'
2829
MATCHER_TYPE_EQUAL_TO_BOOLEAN = 'EQUAL_TO_BOOLEAN'
2930
MATCHER_TYPE_MATCHES_STRING = 'MATCHES_STRING'
31+
MATCHER_TYPE_EQUAL_TO_SEMVER = 'EQUAL_TO_SEMVER'
3032

3133

3234
_MATCHER_BUILDERS = {
@@ -46,7 +48,9 @@
4648
MATCHER_TYPE_CONTAINS_STRING: ContainsStringMatcher,
4749
MATCHER_TYPE_IN_SPLIT_TREATMENT: DependencyMatcher,
4850
MATCHER_TYPE_EQUAL_TO_BOOLEAN: BooleanMatcher,
49-
MATCHER_TYPE_MATCHES_STRING: RegexMatcher
51+
MATCHER_TYPE_MATCHES_STRING: RegexMatcher,
52+
MATCHER_TYPE_EQUAL_TO_SEMVER: EqualToSemverMatcher
53+
5054
}
5155

5256

splitio/models/grammar/matchers/semver.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
"""Semver matcher classes."""
22
import abc
3+
import logging
4+
5+
from splitio.models.grammar.matchers.base import Matcher
6+
from splitio.models.grammar.matchers.string import Sanitizer
7+
8+
_LOGGER = logging.getLogger(__name__)
39

410
class Semver(object, metaclass=abc.ABCMeta):
511
"""Semver class."""
@@ -136,3 +142,48 @@ def _compare_vars(self, var1, var2):
136142
if var1 > var2:
137143
return 1
138144
return -1
145+
146+
class EqualToSemverMatcher(Matcher):
147+
"""A matcher that always returns True."""
148+
149+
def _build(self, raw_matcher):
150+
"""
151+
Build an AllKeysMatcher.
152+
153+
:param raw_matcher: raw matcher as fetched from splitChanges response.
154+
:type raw_matcher: dict
155+
"""
156+
self._data = raw_matcher['stringMatcherData']
157+
self._semver = Semver(self._data)
158+
159+
def _match(self, key, attributes=None, context=None):
160+
"""
161+
Evaluate user input against a matcher and return whether the match is successful.
162+
163+
:param key: User key.
164+
:type key: str.
165+
:param attributes: Custom user attributes.
166+
:type attributes: dict.
167+
:param context: Evaluation context
168+
:type context: dict
169+
170+
:returns: Wheter the match is successful.
171+
:rtype: bool
172+
"""
173+
if self._data is None:
174+
_LOGGER.error("stringMatcherData is required for EQUAL_TO_SEMVER matcher type")
175+
return None
176+
177+
matching_data = Sanitizer.ensure_string(self._get_matcher_input(key, attributes))
178+
if matching_data is None:
179+
return False
180+
181+
return self._semver.compare(Semver(matching_data)) == 0
182+
183+
def __str__(self):
184+
"""Return string Representation."""
185+
return 'equal semver {self._data}'
186+
187+
def _add_matcher_specific_properties_to_json(self):
188+
"""Add matcher specific properties to base dict before returning it."""
189+
return {'matcherType': 'EQUAL_TO_SEMVER', 'stringMatcherData': self._data}

tests/models/grammar/test_matchers.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from datetime import datetime
1111

1212
from splitio.models.grammar import matchers
13+
from splitio.models.grammar.matchers.semver import Semver
1314
from splitio.storage import SegmentStorage
1415
from splitio.engine.evaluator import Evaluator
1516

@@ -884,3 +885,37 @@ def test_to_json(self):
884885
as_json = matchers.RegexMatcher(self.raw).to_json()
885886
assert as_json['matcherType'] == 'MATCHES_STRING'
886887
assert as_json['stringMatcherData'] == "^[a-z][A-Z][0-9]$"
888+
889+
class EqualToSemverMatcherTests(MatcherTestsBase):
890+
"""Regex matcher test cases."""
891+
892+
raw = {
893+
'negate': False,
894+
'matcherType': 'EQUAL_TO_SEMVER',
895+
'stringMatcherData': "2.1.8"
896+
}
897+
898+
def test_from_raw(self, mocker):
899+
"""Test parsing from raw json/dict."""
900+
parsed = matchers.from_raw(self.raw)
901+
assert isinstance(parsed, matchers.EqualToSemverMatcher)
902+
assert parsed._data == "2.1.8"
903+
assert isinstance(parsed._semver, Semver)
904+
assert parsed._semver._major == 2
905+
assert parsed._semver._minor == 1
906+
assert parsed._semver._patch == 8
907+
assert parsed._semver._pre_release == []
908+
909+
def test_matcher_behaviour(self, mocker):
910+
"""Test if the matcher works properly."""
911+
parsed = matchers.from_raw(self.raw)
912+
assert parsed._match("2.1.8+rc")
913+
assert parsed._match("2.1.8")
914+
assert not parsed._match("2.1.5")
915+
assert not parsed._match("2.1.5-rc1")
916+
917+
def test_to_json(self):
918+
"""Test that the object serializes to JSON properly."""
919+
as_json = matchers.EqualToSemverMatcher(self.raw).to_json()
920+
assert as_json['matcherType'] == 'EQUAL_TO_SEMVER'
921+
assert as_json['stringMatcherData'] == "2.1.8"

0 commit comments

Comments
 (0)