Skip to content

Commit 0b9ee7a

Browse files
committed
refactor: use PEP440 version in semver
1 parent 61b5a8d commit 0b9ee7a

File tree

3 files changed

+27
-49
lines changed

3 files changed

+27
-49
lines changed

python/private/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@ bzl_library(
613613
bzl_library(
614614
name = "semver_bzl",
615615
srcs = ["semver.bzl"],
616+
deps = [":version_bzl"],
616617
)
617618

618619
bzl_library(

python/private/semver.bzl

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,7 @@
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

3719
def _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
)

tests/semver/semver_test.bzl

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def _test_semver_from_major(env):
2424
env.expect.that_int(actual.major).equals(3)
2525
env.expect.that_int(actual.minor).equals(None)
2626
env.expect.that_int(actual.patch).equals(None)
27-
env.expect.that_str(actual.build).equals("")
27+
env.expect.that_str(actual.build).equals(None)
2828

2929
_tests.append(_test_semver_from_major)
3030

@@ -33,7 +33,7 @@ def _test_semver_from_major_minor_version(env):
3333
env.expect.that_int(actual.major).equals(4)
3434
env.expect.that_int(actual.minor).equals(9)
3535
env.expect.that_int(actual.patch).equals(None)
36-
env.expect.that_str(actual.build).equals("")
36+
env.expect.that_str(actual.build).equals(None)
3737

3838
_tests.append(_test_semver_from_major_minor_version)
3939

@@ -42,28 +42,22 @@ def _test_semver_with_build_info(env):
4242
env.expect.that_int(actual.major).equals(1)
4343
env.expect.that_int(actual.minor).equals(2)
4444
env.expect.that_int(actual.patch).equals(3)
45-
env.expect.that_str(actual.build).equals("mybuild")
45+
env.expect.that_str(actual.build[0]).equals("mybuild")
4646

4747
_tests.append(_test_semver_with_build_info)
4848

4949
def _test_semver_with_build_info_multiple_pluses(env):
50-
actual = semver("1.2.3-rc0+build+info")
50+
actual = semver("1.2.3-rc0+buildinfo")
5151
env.expect.that_int(actual.major).equals(1)
5252
env.expect.that_int(actual.minor).equals(2)
5353
env.expect.that_int(actual.patch).equals(3)
54-
env.expect.that_str(actual.pre_release).equals("rc0")
55-
env.expect.that_str(actual.build).equals("build+info")
54+
env.expect.that_str(actual.pre_release[0]).equals("rc")
55+
env.expect.that_int(actual.pre_release[1]).equals(0)
5656

57-
_tests.append(_test_semver_with_build_info_multiple_pluses)
58-
59-
def _test_semver_alpha_beta(env):
60-
actual = semver("1.2.3-alpha.beta")
61-
env.expect.that_int(actual.major).equals(1)
62-
env.expect.that_int(actual.minor).equals(2)
63-
env.expect.that_int(actual.patch).equals(3)
64-
env.expect.that_str(actual.pre_release).equals("alpha.beta")
57+
# We normalize with PEP440
58+
env.expect.that_str(actual.build[0]).equals("buildinfo")
6559

66-
_tests.append(_test_semver_alpha_beta)
60+
_tests.append(_test_semver_with_build_info_multiple_pluses)
6761

6862
def _test_semver_sort(env):
6963
want = [
@@ -77,7 +71,6 @@ def _test_semver_sort(env):
7771
"0.9.12",
7872
"1.0.0-alpha",
7973
"1.0.0-alpha.1",
80-
"1.0.0-alpha.beta",
8174
"1.0.0-beta",
8275
"1.0.0-beta.2",
8376
"1.0.0-beta.11",

0 commit comments

Comments
 (0)