1414
1515"A semver version parser"
1616
17- def _key (version ):
18- return (
19- version .major ,
20- version .minor or 0 ,
21- version .patch or 0 ,
22- # non pre-release versions are higher
23- version .pre_release == "" ,
24- # then we compare each element of the pre_release tag separately
25- tuple ([
26- (
27- i if not i .isdigit () else "" ,
28- # digit values take precedence
29- int (i ) if i .isdigit () else 0 ,
30- )
31- for i in version .pre_release .split ("." )
32- ]) if version .pre_release else None ,
33- # And build info is just alphabetic
34- version .build ,
35- )
17+ load (":version.bzl" , "version" )
3618
3719def _to_dict (self ):
3820 return {
@@ -43,7 +25,7 @@ def _to_dict(self):
4325 "pre_release" : self .pre_release ,
4426 }
4527
46- def _new (* , major , minor , patch , pre_release , build , version = None ):
28+ def _new (* , major , minor , patch , pre_release , build , ver = None ):
4729 # buildifier: disable=uninitialized
4830 self = struct (
4931 major = int (major ),
@@ -53,33 +35,35 @@ def _new(*, major, minor, patch, pre_release, build, version = None):
5335 pre_release = pre_release ,
5436 build = build ,
5537 # buildifier: disable=uninitialized
56- key = lambda : _key ( self ),
57- str = lambda : version ,
38+ key = lambda : version . key ( ver ),
39+ str = lambda : ver . string ,
5840 to_dict = lambda : _to_dict (self ),
5941 )
6042 return self
6143
62- def semver (version ):
44+ def semver (version_str ):
6345 """Parse the semver version and return the values as a struct.
6446
6547 Args:
66- version : {type}`str` the version string.
48+ version_str : {type}`str` the version string.
6749
6850 Returns:
6951 A {type}`struct` with `major`, `minor`, `patch` and `build` attributes.
7052 """
7153
72- # Implement the https://semver.org/ spec
73- major , _ , tail = version .partition ("." )
74- minor , _ , tail = tail .partition ("." )
75- patch , _ , build = tail .partition ("+" )
76- patch , _ , pre_release = patch .partition ("-" )
54+ # Shim the version
55+ ver = version .parse (version_str , strict = True )
56+ major = ver .release [0 ]
57+ minor = ver .release [1 ] if len (ver .release ) > 1 else None
58+ patch = ver .release [2 ] if len (ver .release ) > 2 else None
59+ build = ver .local
60+ pre_release = ver .pre
7761
7862 return _new (
79- major = int ( major ) ,
80- minor = int ( minor ) if minor . isdigit () else None ,
81- patch = int ( patch ) if patch . isdigit () else None ,
63+ major = major ,
64+ minor = minor ,
65+ patch = patch ,
8266 build = build ,
8367 pre_release = pre_release ,
84- version = version ,
68+ ver = ver ,
8569 )
0 commit comments