77
88_LOGGER = logging .getLogger (__name__ )
99
10- class Semver (object , metaclass = abc . ABCMeta ):
10+ class Semver (object ):
1111 """Semver class."""
1212
1313 _METADATA_DELIMITER = "+"
@@ -26,14 +26,25 @@ def __init__(self, version):
2626 self ._patch = 0
2727 self ._pre_release = []
2828 self ._is_stable = False
29- self ._old_version = version
30- self ._parse ()
29+ self .version = ""
30+ self ._metadata = ""
31+ self ._parse (version )
32+
33+ @classmethod
34+ def build (cls , version ):
35+ try :
36+ self = cls (version )
37+ except RuntimeError as e :
38+ _LOGGER .error ("Failed to parse Semver data, incorrect data type: %s" , e )
39+ return None
40+
41+ return self
3142
32- def _parse (self ):
43+ def _parse (self , version ):
3344 """
34- Parse the string in self._old_version to update the other internal variables
45+ Parse the string in self.version to update the other internal variables
3546 """
36- without_metadata = self .remove_metadata_if_exists ()
47+ without_metadata = self .remove_metadata_if_exists (version )
3748
3849 index = without_metadata .find (self ._PRE_RELEASE_DELIMITER )
3950 if index == - 1 :
@@ -45,18 +56,19 @@ def _parse(self):
4556
4657 self .set_major_minor_and_patch (without_metadata )
4758
48- def remove_metadata_if_exists (self ):
59+ def remove_metadata_if_exists (self , version ):
4960 """
50- Check if there is any metadata characters in self._old_version .
61+ Check if there is any metadata characters in self.version .
5162
5263 :returns: The semver string without the metadata
5364 :rtype: str
5465 """
55- index = self . _old_version .find (self ._METADATA_DELIMITER )
66+ index = version .find (self ._METADATA_DELIMITER )
5667 if index == - 1 :
57- return self . _old_version
68+ return version
5869
59- return self ._old_version [:index ]
70+ self ._metadata = version [index :]
71+ return version [:index ]
6072
6173 def set_major_minor_and_patch (self , version ):
6274 """
@@ -74,6 +86,12 @@ def set_major_minor_and_patch(self, version):
7486 self ._minor = int (parts [1 ])
7587 self ._patch = int (parts [2 ])
7688
89+ self .version = "{major}{DELIMITER}{minor}{DELIMITER}{patch}" .format (major = self ._major , DELIMITER = self ._VALUE_DELIMITER ,
90+ minor = self ._minor , patch = self ._patch )
91+ self .version += "{DELIMITER}{pre_release}" .format (DELIMITER = self ._PRE_RELEASE_DELIMITER ,
92+ pre_release = '.' .join (self ._pre_release )) if len (self ._pre_release ) > 0 else ""
93+ self .version += "{DELIMITER}{metadata}" .format (DELIMITER = self ._METADATA_DELIMITER , metadata = self ._metadata ) if self ._metadata != "" else ""
94+
7795 def compare (self , to_compare ):
7896 """
7997 Compare the current Semver object to a given Semver object, return:
@@ -87,7 +105,7 @@ def compare(self, to_compare):
87105 :returns: integer based on comparison
88106 :rtype: int
89107 """
90- if self ._old_version == to_compare ._old_version :
108+ if self .version == to_compare .version :
91109 return 0
92110
93111 # Compare major, minor, and patch versions numerically
@@ -178,7 +196,7 @@ def _match(self, key, attributes=None, context=None):
178196 if matching_data is None :
179197 return False
180198
181- return self ._semver .compare ( Semver ( matching_data )) == 0
199+ return self ._semver .version == Semver ( matching_data ). version
182200
183201 def __str__ (self ):
184202 """Return string Representation."""
0 commit comments