Skip to content

Commit e10a0fb

Browse files
committed
refactor: remove semver class consolidate version parsing
This PR removes all of the custom version parsing functions where we try to make sense about the version (e.g. extracting major/minor versions).
1 parent c383c3b commit e10a0fb

10 files changed

+35
-251
lines changed

python/private/BUILD.bazel

+2-7
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ bzl_library(
139139
name = "config_settings_bzl",
140140
srcs = ["config_settings.bzl"],
141141
deps = [
142-
":semver_bzl",
142+
":version_bzl",
143143
"@bazel_skylib//lib:selects",
144144
"@bazel_skylib//rules:common_settings",
145145
],
@@ -249,9 +249,9 @@ bzl_library(
249249
":python_register_toolchains_bzl",
250250
":pythons_hub_bzl",
251251
":repo_utils_bzl",
252-
":semver_bzl",
253252
":toolchains_repo_bzl",
254253
":util_bzl",
254+
":version_bzl",
255255
"@bazel_features//:features",
256256
],
257257
)
@@ -610,11 +610,6 @@ bzl_library(
610610
],
611611
)
612612

613-
bzl_library(
614-
name = "semver_bzl",
615-
srcs = ["semver.bzl"],
616-
)
617-
618613
bzl_library(
619614
name = "sentinel_bzl",
620615
srcs = ["sentinel.bzl"],

python/private/config_settings.bzl

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
load("@bazel_skylib//lib:selects.bzl", "selects")
1919
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
2020
load("//python/private:text_util.bzl", "render")
21-
load(":semver.bzl", "semver")
21+
load(":version.bzl", "version")
2222

2323
_PYTHON_VERSION_FLAG = Label("//python/config_settings:python_version")
2424
_PYTHON_VERSION_MAJOR_MINOR_FLAG = Label("//python/config_settings:python_version_major_minor")
@@ -154,8 +154,8 @@ _python_version_flag = rule(
154154
def _python_version_major_minor_flag_impl(ctx):
155155
input = _flag_value(ctx.attr._python_version_flag)
156156
if input:
157-
version = semver(input)
158-
value = "{}.{}".format(version.major, version.minor)
157+
v = version.parse(input, strict = True)
158+
value = "{}.{}".format(v.release[0], v.release[1])
159159
else:
160160
value = ""
161161

python/private/hermetic_runtime_repo_setup.bzl

+10-6
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ load("//python:py_runtime_pair.bzl", "py_runtime_pair")
2020
load("//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain")
2121
load(":glob_excludes.bzl", "glob_excludes")
2222
load(":py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain")
23-
load(":semver.bzl", "semver")
23+
load(":version.bzl", "version")
2424

2525
_IS_FREETHREADED = Label("//python/config_settings:is_py_freethreaded")
2626

@@ -53,8 +53,11 @@ def define_hermetic_runtime_toolchain_impl(
5353
use.
5454
"""
5555
_ = name # @unused
56-
version_info = semver(python_version)
57-
version_dict = version_info.to_dict()
56+
version_info = version.parse(python_version, strict = True)
57+
version_dict = {
58+
"major": version_info.release[0],
59+
"minor": version_info.release[1],
60+
}
5861
native.filegroup(
5962
name = "files",
6063
srcs = native.glob(
@@ -198,9 +201,10 @@ def define_hermetic_runtime_toolchain_impl(
198201
files = [":files"],
199202
interpreter = python_bin,
200203
interpreter_version_info = {
201-
"major": str(version_info.major),
202-
"micro": str(version_info.patch),
203-
"minor": str(version_info.minor),
204+
# TODO @aignas 2025-05-13: we can add even more things here
205+
"major": str(version_info.release[0]),
206+
"micro": str(version_info.release[1]),
207+
"minor": str(version_info.release[2]),
204208
},
205209
coverage_tool = select({
206210
# Convert empty string to None

python/private/pypi/BUILD.bazel

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ bzl_library(
116116
":whl_target_platforms_bzl",
117117
"//python/private:full_version_bzl",
118118
"//python/private:normalize_name_bzl",
119-
"//python/private:semver_bzl",
119+
"//python/private:version_bzl",
120120
"//python/private:version_label_bzl",
121121
"@bazel_features//:features",
122122
"@pythons_hub//:interpreters_bzl",
@@ -260,7 +260,7 @@ bzl_library(
260260
srcs = ["pep508_evaluate.bzl"],
261261
deps = [
262262
"//python/private:enum_bzl",
263-
"//python/private:semver_bzl",
263+
"//python/private:version_bzl",
264264
],
265265
)
266266

python/private/pypi/extension.bzl

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ load("//python/private:auth.bzl", "AUTH_ATTRS")
2121
load("//python/private:full_version.bzl", "full_version")
2222
load("//python/private:normalize_name.bzl", "normalize_name")
2323
load("//python/private:repo_utils.bzl", "repo_utils")
24-
load("//python/private:semver.bzl", "semver")
24+
load("//python/private:version.bzl", "version")
2525
load("//python/private:version_label.bzl", "version_label")
2626
load(":attrs.bzl", "use_isolated")
2727
load(":evaluate_markers.bzl", "evaluate_markers_py", EVALUATE_MARKERS_SRCS = "SRCS")
@@ -35,9 +35,9 @@ load(":whl_config_setting.bzl", "whl_config_setting")
3535
load(":whl_library.bzl", "whl_library")
3636
load(":whl_repo_name.bzl", "pypi_repo_name", "whl_repo_name")
3737

38-
def _major_minor_version(version):
39-
version = semver(version)
40-
return "{}.{}".format(version.major, version.minor)
38+
def _major_minor_version(v):
39+
v = version.parse(v)
40+
return "{}.{}".format(v.release[0], v.release[1])
4141

4242
def _whl_mods_impl(whl_mods_dict):
4343
"""Implementation of the pip.whl_mods tag class.

python/private/python.bzl

+13-13
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ load(":full_version.bzl", "full_version")
2121
load(":python_register_toolchains.bzl", "python_register_toolchains")
2222
load(":pythons_hub.bzl", "hub_repo")
2323
load(":repo_utils.bzl", "repo_utils")
24-
load(":semver.bzl", "semver")
2524
load(":text_util.bzl", "render")
2625
load(":toolchains_repo.bzl", "multi_toolchain_aliases")
2726
load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER")
27+
load(":version.bzl", "version")
2828

2929
# This limit can be increased essentially arbitrarily, but doing so will cause a rebuild of all
3030
# targets using any of these toolchains due to the changed repository name.
@@ -412,16 +412,16 @@ def _fail_multiple_default_toolchains(first, second):
412412
second = second,
413413
))
414414

415-
def _validate_version(*, version, _fail = fail):
416-
parsed = semver(version)
417-
if parsed.patch == None or parsed.build or parsed.pre_release:
418-
_fail("The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '{}'".format(version))
415+
def _validate_version(*, version_string, _fail = fail):
416+
parsed = version.parse(version_string, strict = True)
417+
if len(parsed.release) != 3 or parsed.pre or parsed.local or parsed.post:
418+
_fail("The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '{}'".format(parsed.string))
419419
return False
420420

421421
return True
422422

423423
def _process_single_version_overrides(*, tag, _fail = fail, default):
424-
if not _validate_version(version = tag.python_version, _fail = _fail):
424+
if not _validate_version(version_string = tag.python_version, _fail = _fail):
425425
return
426426

427427
available_versions = default["tool_versions"]
@@ -471,7 +471,7 @@ def _process_single_version_overrides(*, tag, _fail = fail, default):
471471
kwargs.setdefault(tag.python_version, {})["distutils"] = tag.distutils
472472

473473
def _process_single_version_platform_overrides(*, tag, _fail = fail, default):
474-
if not _validate_version(version = tag.python_version, _fail = _fail):
474+
if not _validate_version(version_string = tag.python_version, _fail = _fail):
475475
return
476476

477477
available_versions = default["tool_versions"]
@@ -512,11 +512,11 @@ def _process_global_overrides(*, tag, default, _fail = fail):
512512

513513
if tag.minor_mapping:
514514
for minor_version, full_version in tag.minor_mapping.items():
515-
parsed = semver(minor_version)
516-
if parsed.patch != None or parsed.build or parsed.pre_release:
515+
parsed = version.parse(minor_version, strict = True)
516+
if len(parsed.release) != 2 or parsed.pre or parsed.local or parsed.post:
517517
fail("Expected the key to be of `X.Y` format but got `{}`".format(minor_version))
518-
parsed = semver(full_version)
519-
if parsed.patch == None:
518+
parsed = version.parse(full_version, strict = True)
519+
if len(parsed.release) != 3 or parsed.pre or parsed.local or parsed.post:
520520
fail("Expected the value to at least be of `X.Y.Z` format but got `{}`".format(minor_version))
521521

522522
default["minor_mapping"] = tag.minor_mapping
@@ -605,8 +605,8 @@ def _get_toolchain_config(*, modules, _fail = fail):
605605

606606
versions = {}
607607
for version_string in available_versions:
608-
v = semver(version_string)
609-
versions.setdefault("{}.{}".format(v.major, v.minor), []).append((int(v.patch), version_string))
608+
v = version.parse(version_string, strict = True)
609+
versions.setdefault("{}.{}".format(v.release[0], v.release[1]), []).append((v.release[2], version_string))
610610

611611
minor_mapping = {
612612
major_minor: max(subset)[1]

python/private/semver.bzl

-85
This file was deleted.

tests/python/python_tests.bzl

+1-1
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ def _test_single_version_platform_override_errors(env):
781781
overrides = [
782782
_single_version_platform_override(python_version = "3.12", platform = "foo"),
783783
],
784-
want_error = "The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '3.12'",
784+
want_error = "The 'python_version' attribute needs to conform to PEP440 versions, got: '3.12'",
785785
),
786786
struct(
787787
overrides = [

tests/semver/BUILD.bazel

-17
This file was deleted.

0 commit comments

Comments
 (0)