Skip to content

Commit bc45694

Browse files
committed
Merge remote-tracking branches 'origin/fix-isort-pre-commit' and 'origin/multiple-requirements-in' into merged
2 parents 3bad854 + 363a13f commit bc45694

File tree

9 files changed

+110
-39
lines changed

9 files changed

+110
-39
lines changed

docs/pip.md

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

python/pip_install/requirements.bzl

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def compile_pip_requirements(
4848
extra_deps: extra dependencies passed to pip-compile.
4949
py_binary: the py_binary rule to be used.
5050
py_test: the py_test rule to be used.
51-
requirements_in: file expressing desired dependencies.
51+
requirements_in: file(s) expressing desired dependencies.
5252
requirements_txt: result of "compiling" the requirements.in file.
5353
requirements_linux: File of linux specific resolve output to check validate if requirement.in has changes.
5454
requirements_darwin: File of darwin specific resolve output to check validate if requirement.in has changes.
@@ -69,23 +69,31 @@ def compile_pip_requirements(
6969
visibility = visibility,
7070
)
7171

72-
data = [name, requirements_in, requirements_txt] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None]
72+
if type(requirements_in) == "string":
73+
requirements_in = [requirements_in]
74+
data = [name] + requirements_in + [requirements_txt] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None]
7375

7476
# Use the Label constructor so this is expanded in the context of the file
7577
# where it appears, which is to say, in @rules_python
7678
pip_compile = Label("//python/pip_install/tools/dependency_resolver:dependency_resolver.py")
7779

7880
loc = "$(rootpath {})"
7981

80-
args = [
81-
loc.format(requirements_in),
82+
args = ["--in={}".format(loc.format(f)) for f in requirements_in] + [
8283
loc.format(requirements_txt),
83-
# String None is a placeholder for argv ordering.
84-
loc.format(requirements_linux) if requirements_linux else "None",
85-
loc.format(requirements_darwin) if requirements_darwin else "None",
86-
loc.format(requirements_windows) if requirements_windows else "None",
8784
"//%s:%s.update" % (native.package_name(), name),
88-
] + extra_args
85+
]
86+
87+
if requirements_linux:
88+
args.append("--requirements-linux={}".format(loc.format(requirements_linux)))
89+
90+
if requirements_darwin:
91+
args.append("--requirements-darwin={}".format(loc.format(requirements_darwin)))
92+
93+
if requirements_windows:
94+
args.append("--requirements-windows={}".format(loc.format(requirements_windows)))
95+
96+
args.extend(extra_args)
8997

9098
deps = [
9199
requirement("build"),

python/pip_install/tools/dependency_resolver/dependency_resolver.py

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import shutil
2020
import sys
2121
from pathlib import Path
22+
from typing import List, Optional, Tuple
2223

24+
import click
2325
import piptools.writer as piptools_writer
2426
from piptools.scripts.compile import cli
2527

@@ -66,27 +68,27 @@ def _select_golden_requirements_file(
6668
return requirements_txt
6769

6870

69-
if __name__ == "__main__":
70-
if len(sys.argv) < 4:
71-
print(
72-
"Expected at least two arguments: requirements_in requirements_out",
73-
file=sys.stderr,
74-
)
75-
sys.exit(1)
76-
77-
parse_str_none = lambda s: None if s == "None" else s
78-
79-
requirements_in = sys.argv.pop(1)
80-
requirements_txt = sys.argv.pop(1)
81-
requirements_linux = parse_str_none(sys.argv.pop(1))
82-
requirements_darwin = parse_str_none(sys.argv.pop(1))
83-
requirements_windows = parse_str_none(sys.argv.pop(1))
84-
update_target_label = sys.argv.pop(1)
85-
71+
@click.command(context_settings={"ignore_unknown_options": True})
72+
@click.option("--in", "requirements_ins", multiple=True, required=True)
73+
@click.argument("requirements_txt")
74+
@click.argument("update_target_label")
75+
@click.option("--requirements-linux")
76+
@click.option("--requirements-darwin")
77+
@click.option("--requirements-windows")
78+
@click.argument("extra_args", nargs=-1, type=click.UNPROCESSED)
79+
def main(
80+
requirements_ins: Tuple[str, ...],
81+
requirements_txt: str,
82+
update_target_label: str,
83+
requirements_linux: Optional[str],
84+
requirements_darwin: Optional[str],
85+
requirements_windows: Optional[str],
86+
extra_args: Tuple[str, ...],
87+
) -> None:
8688
# The requirements_in file could be generated, so we will need to remove the
8789
# absolute prefixes in the locked requirements output file.
88-
requirements_in_path = Path(requirements_in)
89-
resolved_requirements_in = str(requirements_in_path.resolve())
90+
requirements_in_paths = [Path(f) for f in requirements_ins]
91+
resolved_requirements_ins = [str(p.resolve()) for p in requirements_in_paths]
9092

9193
# Before loading click, set the locale for its parser.
9294
# If it leaks through to the system setting, it may fail:
@@ -96,6 +98,8 @@ def _select_golden_requirements_file(
9698
os.environ["LC_ALL"] = "C.UTF-8"
9799
os.environ["LANG"] = "C.UTF-8"
98100

101+
argv = []
102+
99103
UPDATE = True
100104
# Detect if we are running under `bazel test`.
101105
if "TEST_TMPDIR" in os.environ:
@@ -104,8 +108,7 @@ def _select_golden_requirements_file(
104108
# to the real user cache, Bazel sandboxing makes the file read-only
105109
# and we fail.
106110
# In theory this makes the test more hermetic as well.
107-
sys.argv.append("--cache-dir")
108-
sys.argv.append(os.environ["TEST_TMPDIR"])
111+
argv.append(f"--cache-dir={os.environ['TEST_TMPDIR']}")
109112
# Make a copy for pip-compile to read and mutate.
110113
requirements_out = os.path.join(
111114
os.environ["TEST_TMPDIR"], os.path.basename(requirements_txt) + ".out"
@@ -121,12 +124,17 @@ def _select_golden_requirements_file(
121124
os.environ["CUSTOM_COMPILE_COMMAND"] = update_command
122125
os.environ["PIP_CONFIG_FILE"] = os.getenv("PIP_CONFIG_FILE") or os.devnull
123126

124-
sys.argv.append("--generate-hashes")
125-
sys.argv.append("--output-file")
126-
sys.argv.append(requirements_txt if UPDATE else requirements_out)
127-
sys.argv.append(
128-
requirements_in if requirements_in_path.exists() else resolved_requirements_in
127+
argv.append("--generate-hashes")
128+
argv.append(f"--output-file={requirements_txt if UPDATE else requirements_out}")
129+
argv.extend(
130+
(req_in if req_in_path.exists() else resolved_req_in)
131+
for req_in, req_in_path, resolved_req_in in zip(
132+
requirements_ins, requirements_in_paths, resolved_requirements_ins
133+
)
129134
)
135+
argv.extend(extra_args)
136+
137+
argv.extend(extra_args)
130138

131139
if UPDATE:
132140
print("Updating " + requirements_txt)
@@ -140,20 +148,20 @@ def _select_golden_requirements_file(
140148
atexit.register(
141149
lambda: shutil.copy(requirements_txt, requirements_txt_tree)
142150
)
143-
cli()
151+
cli(argv)
144152
else:
145153
# cli will exit(0) on success
146154
try:
147155
print("Checking " + requirements_txt)
148-
cli()
156+
cli(argv)
149157
print("cli() should exit", file=sys.stderr)
150158
sys.exit(1)
151159
except SystemExit as e:
152160
if e.code == 2:
153161
print(
154162
"pip-compile exited with code 2. This means that pip-compile found "
155163
"incompatible requirements or could not find a version that matches "
156-
f"the install requirement in {requirements_in}.",
164+
f"the install requirement in one of {requirements_ins}.",
157165
file=sys.stderr,
158166
)
159167
sys.exit(1)
@@ -184,3 +192,7 @@ def _select_golden_requirements_file(
184192
file=sys.stderr,
185193
)
186194
sys.exit(1)
195+
196+
197+
if __name__ == "__main__":
198+
main()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
load("@rules_python//python:pip.bzl", "compile_pip_requirements")
2+
3+
compile_pip_requirements(
4+
name = "requirements",
5+
extra_args = [
6+
"--allow-unsafe",
7+
"--resolver=backtracking",
8+
],
9+
requirements_in = [
10+
"requirements_1.in",
11+
"requirements_2.in",
12+
],
13+
requirements_txt = "requirements.txt",
14+
)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# ignore_root_user_errors
2+
There are cases when we have to run Python targets with root, e.g., in Docker containers, requiring setting `ignore_root_user_error = True` when registering Python toolchain. This test makes sure that rules_python works in this case.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
workspace(name = "multiple_requirements_in")
2+
3+
local_repository(
4+
name = "rules_python",
5+
path = "../..",
6+
)
7+
8+
load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains")
9+
10+
py_repositories()
11+
12+
load("@rules_python//python/pip_install:repositories.bzl", "pip_install_dependencies")
13+
14+
pip_install_dependencies()
15+
16+
python_register_toolchains(
17+
name = "python39",
18+
python_version = "3.9",
19+
)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#
2+
# This file is autogenerated by pip-compile with Python 3.11
3+
# by the following command:
4+
#
5+
# bazel run //tests/multiple_requirements_in:requirements.update
6+
#
7+
attrs==22.2.0 \
8+
--hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \
9+
--hash=sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99
10+
# via -r tests/multiple_requirements_in/requirements_2.in
11+
urllib3==1.26.14 \
12+
--hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \
13+
--hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1
14+
# via -r tests/multiple_requirements_in/requirements_1.in
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
urllib3 ~= 1.26
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
attrs ~= 22.2

0 commit comments

Comments
 (0)