| # Copyright 2023 The Bazel Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """ |
| A starlark implementation of a Wheel filename parsing. |
| """ |
| |
| def parse_whl_name(file): |
| """Parse whl file name into a struct of constituents. |
| |
| Args: |
| file (str): The file name of a wheel |
| |
| Returns: |
| A struct with the following attributes: |
| distribution: the distribution name |
| version: the version of the distribution |
| build_tag: the build tag for the wheel. None if there was no |
| build_tag in the given string. |
| python_tag: the python tag for the wheel |
| abi_tag: the ABI tag for the wheel |
| platform_tag: the platform tag |
| """ |
| if not file.endswith(".whl"): |
| fail("not a valid wheel: {}".format(file)) |
| |
| file = file[:-len(".whl")] |
| |
| # Parse the following |
| # {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl |
| # |
| # For more info, see the following standards: |
| # https://packaging.python.org/en/latest/specifications/binary-distribution-format/#binary-distribution-format |
| # https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/ |
| head, _, platform_tag = file.rpartition("-") |
| if not platform_tag: |
| fail("cannot extract platform tag from the whl filename: {}".format(file)) |
| head, _, abi_tag = head.rpartition("-") |
| if not abi_tag: |
| fail("cannot extract abi tag from the whl filename: {}".format(file)) |
| head, _, python_tag = head.rpartition("-") |
| if not python_tag: |
| fail("cannot extract python tag from the whl filename: {}".format(file)) |
| head, _, version = head.rpartition("-") |
| if not version: |
| fail("cannot extract version from the whl filename: {}".format(file)) |
| distribution, _, maybe_version = head.partition("-") |
| |
| if maybe_version: |
| version, build_tag = maybe_version, version |
| else: |
| build_tag = None |
| |
| return struct( |
| distribution = distribution, |
| version = version, |
| build_tag = build_tag, |
| python_tag = python_tag, |
| abi_tag = abi_tag, |
| platform_tag = platform_tag, |
| ) |