From 7286c6bdc98a50c0a08bb58c08adac5d5c8d53a8 Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 08:46:47 +0100 Subject: [PATCH 1/7] Extract function get_new_requirement_line to make it testable --- tests/tools/wheelmaker_test.py | 10 +++++++++ tools/wheelmaker.py | 37 ++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/tests/tools/wheelmaker_test.py b/tests/tools/wheelmaker_test.py index 288dde720a..4bb0bd52df 100644 --- a/tests/tools/wheelmaker_test.py +++ b/tests/tools/wheelmaker_test.py @@ -71,5 +71,15 @@ def test_arcname_from(self) -> None: self.assertEqual(got, want) +class GetNewRequirementLineTest(unittest.TestCase): + def test_requirement(self): + result = wheelmaker.get_new_requirement_line("requests>=2.0", "") + self.assertEqual(result, "Requires-Dist: requests>=2.0") + + def test_requirement_and_extra(self): + result = wheelmaker.get_new_requirement_line("requests>=2.0", "extra=='dev'") + self.assertEqual(result, "Requires-Dist: requests>=2.0; extra=='dev'") + + if __name__ == "__main__": unittest.main() diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index 4390df3445..72a6ab2434 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -330,9 +330,7 @@ def add_wheelfile(self): Wheel-Version: 1.0 Generator: bazel-wheelmaker 1.0 Root-Is-Purelib: {} -""".format( - "true" if self._platform == "any" else "false" - ) +""".format("true" if self._platform == "any" else "false") for tag in self.disttags(): wheel_contents += "Tag: %s\n" % tag self._whlfile.add_string(self.distinfo_path("WHEEL"), wheel_contents) @@ -365,6 +363,24 @@ def get_files_to_package(input_files): return files +def get_new_requirement_line(reqs_text, extra): + from packaging.requirements import Requirement + + req = Requirement(reqs_text.strip()) + req_extra_deps = f"[{','.join(req.extras)}]" if req.extras else "" + if req.marker: + if extra: + return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; ({req.marker}) and {extra}" + else: + return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; {req.marker}" + else: + return ( + f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; {extra}".strip( + " ;" + ) + ) + + def resolve_argument_stamp( argument: str, volatile_status_stamp: Path, stable_status_stamp: Path ) -> str: @@ -430,7 +446,7 @@ def parse_args() -> argparse.Namespace: output_group.add_argument( "--name_file", type=Path, - help="A file where the canonical name of the " "wheel will be written", + help="A file where the canonical name of the wheel will be written", ) output_group.add_argument( @@ -578,19 +594,6 @@ def main() -> None: # Search for any `Requires-Dist` entries that refer to other files and # expand them. - def get_new_requirement_line(reqs_text, extra): - req = Requirement(reqs_text.strip()) - req_extra_deps = f"[{','.join(req.extras)}]" if req.extras else "" - if req.marker: - if extra: - return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; ({req.marker}) and {extra}" - else: - return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; {req.marker}" - else: - return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; {extra}".strip( - " ;" - ) - for meta_line in metadata.splitlines(): if not meta_line.startswith("Requires-Dist: "): continue From 600fafbad0a12ccfab8cb68dadd06a81de62fca0 Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 08:51:25 +0100 Subject: [PATCH 2/7] Add test for Requires-Dist with url git --- tests/tools/wheelmaker_test.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/tools/wheelmaker_test.py b/tests/tools/wheelmaker_test.py index 4bb0bd52df..a2d4c951dd 100644 --- a/tests/tools/wheelmaker_test.py +++ b/tests/tools/wheelmaker_test.py @@ -80,6 +80,15 @@ def test_requirement_and_extra(self): result = wheelmaker.get_new_requirement_line("requests>=2.0", "extra=='dev'") self.assertEqual(result, "Requires-Dist: requests>=2.0; extra=='dev'") + def test_requirement_with_url(self): + result = wheelmaker.get_new_requirement_line( + "requests @ git+https://github.com/psf/requests.git@3aa6386c3", "" + ) + self.assertEqual( + result, + "Requires-Dist: requests @ git+https://github.com/psf/requests.git@3aa6386c3", + ) + if __name__ == "__main__": unittest.main() From 31a44c6704b664e677387d5d8483f6ffd86933ec Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 11:06:17 +0100 Subject: [PATCH 3/7] Add tests for marker and marker+extra --- tests/tools/wheelmaker_test.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/tools/wheelmaker_test.py b/tests/tools/wheelmaker_test.py index a2d4c951dd..85094af9b8 100644 --- a/tests/tools/wheelmaker_test.py +++ b/tests/tools/wheelmaker_test.py @@ -89,6 +89,23 @@ def test_requirement_with_url(self): "Requires-Dist: requests @ git+https://github.com/psf/requests.git@3aa6386c3", ) + def test_requirement_with_marker(self): + result = wheelmaker.get_new_requirement_line( + "requests>=2.0; python_version>='3.6'", "" + ) + self.assertEqual( + result, 'Requires-Dist: requests>=2.0; python_version >= "3.6"' + ) + + def test_requirement_with_marker_and_extra(self): + result = wheelmaker.get_new_requirement_line( + "requests>=2.0; python_version>='3.6'", "extra=='dev'" + ) + self.assertEqual( + result, + "Requires-Dist: requests>=2.0; (python_version >= \"3.6\") and extra=='dev'", + ) + if __name__ == "__main__": unittest.main() From c9138f189617d80a94eae6679b324ef308cb0787 Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 08:52:48 +0100 Subject: [PATCH 4/7] Implement url handling for requirements --- tools/wheelmaker.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index 72a6ab2434..6c43a1d84d 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -368,16 +368,21 @@ def get_new_requirement_line(reqs_text, extra): req = Requirement(reqs_text.strip()) req_extra_deps = f"[{','.join(req.extras)}]" if req.extras else "" + + # Handle URL requirements (PEP 508) + if req.url: + req_spec = f" @ {req.url}" + else: + req_spec = str(req.specifier) + if req.marker: if extra: - return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; ({req.marker}) and {extra}" + return f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}; ({req.marker}) and {extra}" else: - return f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; {req.marker}" + return f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}; {req.marker}" else: - return ( - f"Requires-Dist: {req.name}{req_extra_deps}{req.specifier}; {extra}".strip( - " ;" - ) + return f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}; {extra}".strip( + " ;" ) From e3ec4135ab5de3bb0535d14a3f4661a1cdbce1bf Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 08:54:43 +0100 Subject: [PATCH 5/7] Add docstring --- tools/wheelmaker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index 6c43a1d84d..20e2efadc7 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -364,6 +364,7 @@ def get_files_to_package(input_files): def get_new_requirement_line(reqs_text, extra): + """Formats a requirement text into a Requires-Dist metadata line.""" from packaging.requirements import Requirement req = Requirement(reqs_text.strip()) From cba2c3ce3fa1e1bd7ca949fa4ea6e98911c24df3 Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 11:08:03 +0100 Subject: [PATCH 6/7] Reduce code duplication --- tools/wheelmaker.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index 20e2efadc7..b4151022b8 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -376,15 +376,17 @@ def get_new_requirement_line(reqs_text, extra): else: req_spec = str(req.specifier) + base = f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}" + if req.marker: if extra: - return f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}; ({req.marker}) and {extra}" + return f"{base}; ({req.marker}) and {extra}" else: - return f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}; {req.marker}" + return f"{base}; {req.marker}" + elif extra: + return f"{base}; {extra}" else: - return f"Requires-Dist: {req.name}{req_extra_deps}{req_spec}; {extra}".strip( - " ;" - ) + return base def resolve_argument_stamp( From f0e0e5d44cd44dccaaf18a1e356e1dc7b3815656 Mon Sep 17 00:00:00 2001 From: martin4861 Date: Fri, 6 Feb 2026 11:33:06 +0100 Subject: [PATCH 7/7] Add type annotations --- tools/wheelmaker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index b4151022b8..7124ae7c9d 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -363,7 +363,7 @@ def get_files_to_package(input_files): return files -def get_new_requirement_line(reqs_text, extra): +def get_new_requirement_line(reqs_text: str, extra: str) -> str: """Formats a requirement text into a Requires-Dist metadata line.""" from packaging.requirements import Requirement