@@ -43,8 +43,7 @@ def _parse(self, version):
4343 """
4444 Parse the string in self.version to update the other internal variables
4545 """
46- without_metadata = self .remove_metadata_if_exists (version )
47-
46+ without_metadata = self ._remove_metadata_if_exists (version )
4847 index = without_metadata .find (self ._PRE_RELEASE_DELIMITER )
4948 if index == - 1 :
5049 self ._is_stable = True
@@ -56,9 +55,9 @@ def _parse(self, version):
5655 without_metadata = without_metadata [:index ]
5756 self ._pre_release = pre_release_data .split (self ._VALUE_DELIMITER )
5857
59- self .set_major_minor_and_patch (without_metadata )
58+ self ._set_major_minor_and_patch (without_metadata )
6059
61- def remove_metadata_if_exists (self , version ):
60+ def _remove_metadata_if_exists (self , version ):
6261 """
6362 Check if there is any metadata characters in self.version.
6463
@@ -75,7 +74,7 @@ def remove_metadata_if_exists(self, version):
7574
7675 return version [:index ]
7776
78- def set_major_minor_and_patch (self , version ):
77+ def _set_major_minor_and_patch (self , version ):
7978 """
8079 Set the major, minor and patch internal variables based on string passed.
8180
@@ -362,3 +361,55 @@ def __str__(self):
362361 def _add_matcher_specific_properties_to_json (self ):
363362 """Add matcher specific properties to base dict before returning it."""
364363 return {'matcherType' : 'BETWEEN_SEMVER' , 'betweenStringMatcherData' : self ._data }
364+
365+ class InListSemverMatcher (Matcher ):
366+ """A matcher for Semver in list."""
367+
368+ def _build (self , raw_matcher ):
369+ """
370+ Build a InListSemverMatcher.
371+
372+ :param raw_matcher: raw matcher as fetched from splitChanges response.
373+ :type raw_matcher: dict
374+ """
375+ self ._data = raw_matcher .get ('whitelistMatcherData' )
376+ if self ._data is not None :
377+ self ._data = self ._data .get ('whitelist' )
378+
379+ self ._semver_list = [Semver .build (item ) if item is not None else None for item in self ._data ] if self ._data is not None else []
380+
381+ def _match (self , key , attributes = None , context = None ):
382+ """
383+ Evaluate user input against a matcher and return whether the match is successful.
384+
385+ :param key: User key.
386+ :type key: str.
387+ :param attributes: Custom user attributes.
388+ :type attributes: dict.
389+ :param context: Evaluation context
390+ :type context: dict
391+
392+ :returns: Wheter the match is successful.
393+ :rtype: bool
394+ """
395+ if self ._data is None :
396+ _LOGGER .error ("whitelistMatcherData is required for IN_LIST_SEMVER matcher type" )
397+ return False
398+
399+ matching_data = Sanitizer .ensure_string (self ._get_matcher_input (key , attributes ))
400+ if matching_data is None :
401+ return False
402+
403+ matching_semver = Semver .build (matching_data )
404+ if matching_semver is None :
405+ return False
406+
407+ return any ([item .version == matching_semver .version if item is not None else False for item in self ._semver_list ])
408+
409+ def __str__ (self ):
410+ """Return string Representation."""
411+ return 'in list semver {data}' .format (data = self ._data )
412+
413+ def _add_matcher_specific_properties_to_json (self ):
414+ """Add matcher specific properties to base dict before returning it."""
415+ return {'matcherType' : 'IN_LIST_SEMVER' , 'whitelistMatcherData' : {'whitelist' : self ._data }}
0 commit comments