1# Copyright 2024 The Bazel Authors. All rights reserved. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15"""A function to convert a dist name to a valid bazel repo name. 16""" 17 18load("//python/private:normalize_name.bzl", "normalize_name") 19load(":parse_whl_name.bzl", "parse_whl_name") 20 21def whl_repo_name(prefix, filename, sha256): 22 """Return a valid whl_library repo name given a distribution filename. 23 24 Args: 25 prefix: {type}`str` the prefix of the whl_library. 26 filename: {type}`str` the filename of the distribution. 27 sha256: {type}`str` the sha256 of the distribution. 28 29 Returns: 30 a string that can be used in {obj}`whl_library`. 31 """ 32 parts = [prefix] 33 34 if not filename.endswith(".whl"): 35 # Then the filename is basically foo-3.2.1.<ext> 36 parts.append(normalize_name(filename.rpartition("-")[0])) 37 parts.append("sdist") 38 else: 39 parsed = parse_whl_name(filename) 40 name = normalize_name(parsed.distribution) 41 python_tag, _, _ = parsed.python_tag.partition(".") 42 abi_tag, _, _ = parsed.abi_tag.partition(".") 43 platform_tag, _, _ = parsed.platform_tag.partition(".") 44 45 parts.append(name) 46 parts.append(python_tag) 47 parts.append(abi_tag) 48 parts.append(platform_tag) 49 50 parts.append(sha256[:8]) 51 52 return "_".join(parts) 53 54def pypi_repo_name(prefix, whl_name, *target_platforms): 55 """Return a valid whl_library given a requirement line. 56 57 Args: 58 prefix: {type}`str` the prefix of the whl_library. 59 whl_name: {type}`str` the whl_name to use. 60 *target_platforms: {type}`list[str]` the target platforms to use in the name. 61 62 Returns: 63 {type}`str` that can be used in {obj}`whl_library`. 64 """ 65 parts = [ 66 prefix, 67 normalize_name(whl_name), 68 ] 69 parts.extend([p.partition("_")[-1] for p in target_platforms]) 70 71 return "_".join(parts) 72