refactor(pypi): move absolute_url to whl_library (#3652)

With this PR we move the processing of the `index_url` to the
`whl_library` as a preparatory step for easier `facts` implementation.
The motivation is many-fold:
1. Do not have too much duplication in the facts file by potentially
   naturally eliminating the `index_url` prefix from the `whls` if it
   appears like so on the index contents.
2. Avoid doing `envsubst` too early and have logic that has to deal with
   it.
3. Make the cache just return fact values from the lock file in the
   future instead of needing to change to an absolute URL and do
   envsubst on it.
4. We should have a better performance because we should be doing way
   fewer calls to make the URL absolute during parsing of the index.
5. With the `index_url` passed to the `whl_library`, we can help out the
   `purl` construction as what has been discussed in #3531 about wheels
   from non-public indexes.

Summary:
- Attempt to put the `index_url` in the fewest structs possible.
- Extract the `urllib` utilities file for manipulation of the URLs.
- Simplify tests testing the `absolute_url` logic.

Work towards #2731
14 files changed
tree: f876d34da67249fa1f8c8a4a5f352cbb97058022
  1. .bazelci/
  2. .bcr/
  3. .ci/
  4. .github/
  5. command_line_option/
  6. docs/
  7. examples/
  8. gazelle/
  9. private/
  10. python/
  11. sphinxdocs/
  12. tests/
  13. tools/
  14. .bazelignore
  15. .bazelrc
  16. .bazelrc.deleted_packages
  17. .bazelversion
  18. .editorconfig
  19. .git-blame-ignore-revs
  20. .gitattributes
  21. .gitignore
  22. .pre-commit-config.yaml
  23. .python-version
  24. .readthedocs.yml
  25. addlicense.sh
  26. AGENTS.md
  27. AUTHORS
  28. BUILD.bazel
  29. BZLMOD_SUPPORT.md
  30. CHANGELOG.md
  31. CONTRIBUTING.md
  32. CONTRIBUTORS
  33. GEMINI.md
  34. internal_dev_deps.bzl
  35. internal_dev_setup.bzl
  36. LICENSE
  37. MODULE.bazel
  38. README.md
  39. RELEASING.md
  40. version.bzl
  41. WORKSPACE
  42. WORKSPACE.bzlmod
README.md

Python Rules for Bazel

Build status

Overview

This repository is the home of the core Python rules -- py_library, py_binary, py_test, and related symbols that provide the basis for Python support in Bazel. It also contains package installation rules for integrating with PyPI and other indices.

Documentation for rules_python is at https://rules-python.readthedocs.io and in the Bazel Build Encyclopedia.

Examples live in the examples directory.

The core rules are stable. Their implementation is subject to Bazel's backward compatibility policy. This repository aims to follow semantic versioning.

The Bazel community maintains this repository. Neither Google nor the Bazel team provides support for the code. However, this repository is part of the test suite used to vet new Bazel releases. See How to contribute page for information on our development workflow.

Documentation

For detailed documentation, see https://rules-python.readthedocs.io

Bzlmod support

See Bzlmod support for more details.