11"""Semver matcher classes."""
2- import abc
32import logging
43
54from splitio .models .grammar .matchers .base import Matcher
65from splitio .models .grammar .matchers .string import Sanitizer
76
87_LOGGER = logging .getLogger (__name__ )
98
10- class Semver (object , metaclass = abc . ABCMeta ):
9+ class Semver (object ):
1110 """Semver class."""
1211
1312 _METADATA_DELIMITER = "+"
@@ -26,14 +25,25 @@ def __init__(self, version):
2625 self ._patch = 0
2726 self ._pre_release = []
2827 self ._is_stable = False
29- self ._old_version = version
30- self ._parse ()
28+ self .version = ""
29+ self ._metadata = ""
30+ self ._parse (version )
31+
32+ @classmethod
33+ def build (cls , version ):
34+ try :
35+ self = cls (version )
36+ except RuntimeError as e :
37+ _LOGGER .error ("Failed to parse Semver data, incorrect data type: %s" , e )
38+ return None
39+
40+ return self
3141
32- def _parse (self ):
42+ def _parse (self , version ):
3343 """
34- Parse the string in self._old_version to update the other internal variables
44+ Parse the string in self.version to update the other internal variables
3545 """
36- without_metadata = self .remove_metadata_if_exists ()
46+ without_metadata = self .remove_metadata_if_exists (version )
3747
3848 index = without_metadata .find (self ._PRE_RELEASE_DELIMITER )
3949 if index == - 1 :
@@ -45,18 +55,19 @@ def _parse(self):
4555
4656 self .set_major_minor_and_patch (without_metadata )
4757
48- def remove_metadata_if_exists (self ):
58+ def remove_metadata_if_exists (self , version ):
4959 """
50- Check if there is any metadata characters in self._old_version .
60+ Check if there is any metadata characters in self.version .
5161
5262 :returns: The semver string without the metadata
5363 :rtype: str
5464 """
55- index = self . _old_version .find (self ._METADATA_DELIMITER )
65+ index = version .find (self ._METADATA_DELIMITER )
5666 if index == - 1 :
57- return self . _old_version
67+ return version
5868
59- return self ._old_version [:index ]
69+ self ._metadata = version [index :]
70+ return version [:index ]
6071
6172 def set_major_minor_and_patch (self , version ):
6273 """
@@ -74,6 +85,12 @@ def set_major_minor_and_patch(self, version):
7485 self ._minor = int (parts [1 ])
7586 self ._patch = int (parts [2 ])
7687
88+ self .version = "{major}{DELIMITER}{minor}{DELIMITER}{patch}" .format (major = self ._major , DELIMITER = self ._VALUE_DELIMITER ,
89+ minor = self ._minor , patch = self ._patch )
90+ self .version += "{DELIMITER}{pre_release}" .format (DELIMITER = self ._PRE_RELEASE_DELIMITER ,
91+ pre_release = '.' .join (self ._pre_release )) if len (self ._pre_release ) > 0 else ""
92+ self .version += "{DELIMITER}{metadata}" .format (DELIMITER = self ._METADATA_DELIMITER , metadata = self ._metadata ) if self ._metadata != "" else ""
93+
7794 def compare (self , to_compare ):
7895 """
7996 Compare the current Semver object to a given Semver object, return:
@@ -87,7 +104,7 @@ def compare(self, to_compare):
87104 :returns: integer based on comparison
88105 :rtype: int
89106 """
90- if self ._old_version == to_compare ._old_version :
107+ if self .version == to_compare .version :
91108 return 0
92109
93110 # Compare major, minor, and patch versions numerically
@@ -178,7 +195,7 @@ def _match(self, key, attributes=None, context=None):
178195 if matching_data is None :
179196 return False
180197
181- return self ._semver .compare ( Semver ( matching_data )) == 0
198+ return self ._semver .version == Semver ( matching_data ). version
182199
183200 def __str__ (self ):
184201 """Return string Representation."""
0 commit comments