Skip to content

Commit f82e3dc

Browse files
authored
doc(pip_parse_vendored): fix the example (#1942)
With this change we are now again generating a working `requirements.bzl` file which broke during our switch to using the `hub` repo. Fixes #1918.
1 parent 7de43d1 commit f82e3dc

File tree

5 files changed

+72
-18
lines changed

5 files changed

+72
-18
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ A brief description of the categories of changes:
8080
autodetection would match a different toolchain than expected. This may yield
8181
to toolchain selection failures when the python toolchain is not registered,
8282
but is requested via `//python/config_settings:python_version` flag setting.
83+
* (doc) Fix the `WORKSPACE` requirement vendoring example. Fixes
84+
[#1918](https://github.com/bazelbuild/rules_python/issues/1918).
8385

8486
### Added
8587
* (rules) Precompiling Python source at build time is available. but is
Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
load("@bazel_skylib//rules:build_test.bzl", "build_test")
12
load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
23
load("@bazel_skylib//rules:write_file.bzl", "write_file")
4+
load("@rules_python//python:defs.bzl", "py_test")
35
load("@rules_python//python:pip.bzl", "compile_pip_requirements")
6+
load("//:requirements.bzl", "all_data_requirements", "all_requirements", "all_whl_requirements", "requirement")
47

58
# This rule adds a convenient way to update the requirements.txt
69
# lockfile based on the requirements.in.
@@ -9,6 +12,29 @@ compile_pip_requirements(
912
src = "requirements.in",
1013
)
1114

15+
# The requirements.bzl file is using the hub repo to access packages via the
16+
# `requirement` macro and when the requirements.bzl is vendored, the hub
17+
# repo won't be present. As a result, we have to adjust the label scheme in
18+
# the requirements.bzl to make sure that they continue to work.
19+
genrule(
20+
name = "requirement_bzl",
21+
srcs = ["@pip_deps_to_be_vendored//:requirements.bzl"],
22+
outs = ["requirements.clean.bzl"],
23+
cmd = " | ".join([
24+
"cat $<",
25+
# Substitute the name of the hub to ensure that the dependencies do
26+
# not require the hub repo initialized in the WORKSPACE.
27+
"sed -e 's/pip_deps_to_be_vendored/my_project_pip_deps_vendored/g'",
28+
# Change the labels from using the hub repo to using the spoke repos
29+
# directly.
30+
"sed -e 's|//\\([^:]*\\):pkg|_\\1//:pkg|g'",
31+
"sed -e 's|//\\([^:]*\\):whl|_\\1//:whl|g'",
32+
"sed -e 's|//\\([^:]*\\):data|_\\1//:data|g'",
33+
# Change the convenience macros to use the same naming.
34+
"sed -e 's|//{}:{}|_{}//:{}|g' >$@",
35+
]),
36+
)
37+
1238
write_file(
1339
name = "gen_update",
1440
out = "update.sh",
@@ -17,14 +43,14 @@ write_file(
1743
"#!/usr/bin/env bash",
1844
# Bazel gives us a way to access the source folder!
1945
"cd $BUILD_WORKSPACE_DIRECTORY",
20-
"cp -fv bazel-pip_parse_vendored/external/pip/requirements.bzl requirements.bzl",
46+
"cp -fv bazel-bin/requirements.clean.bzl requirements.bzl",
2147
],
2248
)
2349

2450
sh_binary(
2551
name = "vendor_requirements",
2652
srcs = ["update.sh"],
27-
data = ["@pip//:requirements.bzl"],
53+
data = [":requirement_bzl"],
2854
)
2955

3056
# Similarly ensures that the requirements.bzl file is updated
@@ -33,5 +59,18 @@ diff_test(
3359
name = "test_vendored",
3460
failure_message = "Please run: bazel run //:vendor_requirements",
3561
file1 = "requirements.bzl",
36-
file2 = "@pip//:requirements.bzl",
62+
file2 = "requirement_bzl",
63+
)
64+
65+
py_test(
66+
name = "test_dependency_usage",
67+
srcs = ["test_dependency_usage.py"],
68+
deps = [
69+
requirement("requests"),
70+
],
71+
)
72+
73+
build_test(
74+
name = "test_requirement_lists",
75+
targets = all_requirements + all_whl_requirements + all_data_requirements,
3776
)

examples/pip_parse_vendored/WORKSPACE

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
workspace(name = "pip_repository_annotations_example")
1+
workspace(name = "pip_parse_vendored_example")
22

33
local_repository(
44
name = "rules_python",
@@ -23,7 +23,8 @@ load("@rules_python//python:pip.bzl", "pip_parse")
2323
# verify by inspection; the environment variables at a later time, when we download the
2424
# packages, will be the ones that take effect.
2525
pip_parse(
26-
name = "pip",
26+
# We choose a unique name here to make sure we can do some cleanup on it.
27+
name = "pip_deps_to_be_vendored",
2728
envsubst = ["PIP_RETRIES"],
2829
extra_pip_args = ["--retries=${PIP_RETRIES:-5}"],
2930
python_interpreter_target = "@python39_host//:python",

examples/pip_parse_vendored/requirements.bzl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,34 @@
66
load("@rules_python//python:pip.bzl", "pip_utils")
77
load("@rules_python//python/pip_install:pip_repository.bzl", "group_library", "whl_library")
88

9-
all_requirements = ["@pip//certifi:pkg", "@pip//charset_normalizer:pkg", "@pip//idna:pkg", "@pip//requests:pkg", "@pip//urllib3:pkg"]
9+
all_requirements = ["@my_project_pip_deps_vendored_certifi//:pkg", "@my_project_pip_deps_vendored_charset_normalizer//:pkg", "@my_project_pip_deps_vendored_idna//:pkg", "@my_project_pip_deps_vendored_requests//:pkg", "@my_project_pip_deps_vendored_urllib3//:pkg"]
1010

11-
all_whl_requirements_by_package = {"certifi": "@pip//certifi:whl", "charset_normalizer": "@pip//charset_normalizer:whl", "idna": "@pip//idna:whl", "requests": "@pip//requests:whl", "urllib3": "@pip//urllib3:whl"}
11+
all_whl_requirements_by_package = {"certifi": "@my_project_pip_deps_vendored_certifi//:whl", "charset_normalizer": "@my_project_pip_deps_vendored_charset_normalizer//:whl", "idna": "@my_project_pip_deps_vendored_idna//:whl", "requests": "@my_project_pip_deps_vendored_requests//:whl", "urllib3": "@my_project_pip_deps_vendored_urllib3//:whl"}
1212

1313
all_whl_requirements = all_whl_requirements_by_package.values()
1414

15-
all_data_requirements = ["@pip//certifi:data", "@pip//charset_normalizer:data", "@pip//idna:data", "@pip//requests:data", "@pip//urllib3:data"]
15+
all_data_requirements = ["@my_project_pip_deps_vendored_certifi//:data", "@my_project_pip_deps_vendored_charset_normalizer//:data", "@my_project_pip_deps_vendored_idna//:data", "@my_project_pip_deps_vendored_requests//:data", "@my_project_pip_deps_vendored_urllib3//:data"]
1616

17-
_packages = [("pip_certifi", "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"), ("pip_charset_normalizer", "charset-normalizer==2.1.1 --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"), ("pip_idna", "idna==3.4 --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"), ("pip_requests", "requests==2.28.1 --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"), ("pip_urllib3", "urllib3==1.26.13 --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8")]
18-
_config = {"download_only": False, "enable_implicit_namespace_pkgs": False, "environment": {}, "envsubst": ["PIP_RETRIES"], "extra_pip_args": ["--retries=${PIP_RETRIES:-5}"], "isolated": True, "pip_data_exclude": [], "python_interpreter": "python3", "python_interpreter_target": "@python39_host//:python", "quiet": True, "repo": "pip", "repo_prefix": "pip_", "timeout": 600}
17+
_packages = [("my_project_pip_deps_vendored_certifi", "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"), ("my_project_pip_deps_vendored_charset_normalizer", "charset-normalizer==2.1.1 --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"), ("my_project_pip_deps_vendored_idna", "idna==3.4 --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"), ("my_project_pip_deps_vendored_requests", "requests==2.28.1 --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"), ("my_project_pip_deps_vendored_urllib3", "urllib3==1.26.13 --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8")]
18+
_config = {"download_only": False, "enable_implicit_namespace_pkgs": False, "environment": {}, "envsubst": ["PIP_RETRIES"], "extra_pip_args": ["--retries=${PIP_RETRIES:-5}"], "isolated": True, "pip_data_exclude": [], "python_interpreter": "python3", "python_interpreter_target": "@python39_host//:python", "quiet": True, "repo": "my_project_pip_deps_vendored", "repo_prefix": "my_project_pip_deps_vendored_", "timeout": 600}
1919
_annotations = {}
2020

2121
def requirement(name):
22-
return "@pip//{}:{}".format(pip_utils.normalize_name(name), "pkg")
22+
return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "pkg")
2323

2424
def whl_requirement(name):
25-
return "@pip//{}:{}".format(pip_utils.normalize_name(name), "whl")
25+
return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "whl")
2626

2727
def data_requirement(name):
28-
return "@pip//{}:{}".format(pip_utils.normalize_name(name), "data")
28+
return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "data")
2929

3030
def dist_info_requirement(name):
31-
return "@pip//{}:{}".format(pip_utils.normalize_name(name), "dist_info")
31+
return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "dist_info")
3232

3333
def entry_point(pkg, script = None):
3434
if not script:
3535
script = pkg
36-
return "@pip_" + pip_utils.normalize_name(pkg) + "//:rules_python_wheel_entry_point_" + script
36+
return "@my_project_pip_deps_vendored_" + pip_utils.normalize_name(pkg) + "//:rules_python_wheel_entry_point_" + script
3737

3838
def _get_annotation(requirement):
3939
# This expects to parse `setuptools==58.2.0 --hash=sha256:2551203ae6955b9876741a26ab3e767bb3242dafe86a32a749ea0d78b6792f11`
@@ -58,10 +58,10 @@ def install_deps(**whl_library_kwargs):
5858
for requirement in group_requirements
5959
}
6060

61-
group_repo = "pip__groups"
61+
group_repo = "my_project_pip_deps_vendored__groups"
6262
group_library(
6363
name = group_repo,
64-
repo_prefix = "pip_",
64+
repo_prefix = "my_project_pip_deps_vendored_",
6565
groups = all_requirement_groups,
6666
)
6767

@@ -70,7 +70,7 @@ def install_deps(**whl_library_kwargs):
7070
whl_config.update(whl_library_kwargs)
7171

7272
for name, requirement in _packages:
73-
group_name = requirement_group_mapping.get(name.replace("pip_", ""))
73+
group_name = requirement_group_mapping.get(name.replace("my_project_pip_deps_vendored_", ""))
7474
group_deps = all_requirement_groups.get(group_name, [])
7575

7676
whl_library(
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import unittest
2+
3+
import requests
4+
5+
6+
class TestDependencies(unittest.TestCase):
7+
def test_import(self):
8+
self.assertIsNotNone(requests.get)
9+
10+
11+
if __name__ == "__main__":
12+
unittest.main()

0 commit comments

Comments
 (0)