Skip to content

Commit 29d4fd5

Browse files
cj81499lpulley
andcommitted
add support for multiple requirement input files
Revise dependency_resolver.py to use `click` Avoid mutating `sys.argv` Co-authored-by: Logan Pulley <lpulley@ocient.com>
1 parent 74fd521 commit 29d4fd5

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
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: 5 additions & 4 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,16 +69,17 @@ 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 = "$(rlocationpath {})"
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),
8384
"//%s:%s.update" % (native.package_name(), name),
8485
]

python/pip_install/tools/dependency_resolver/dependency_resolver.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ def _locate(bazel_runfiles, file):
8080

8181

8282
@click.command(context_settings={"ignore_unknown_options": True})
83-
@click.argument("requirements_in")
83+
@click.option("--in", "requirements_ins", multiple=True, required=True)
8484
@click.argument("requirements_txt")
8585
@click.argument("update_target_label")
8686
@click.option("--requirements-linux")
8787
@click.option("--requirements-darwin")
8888
@click.option("--requirements-windows")
8989
@click.argument("extra_args", nargs=-1, type=click.UNPROCESSED)
9090
def main(
91-
requirements_in: str,
91+
requirements_ins: Tuple[str, ...],
9292
requirements_txt: str,
9393
update_target_label: str,
9494
requirements_linux: Optional[str],
@@ -98,7 +98,7 @@ def main(
9898
) -> None:
9999
bazel_runfiles = runfiles.Create()
100100

101-
resolved_requirements_in = _locate(bazel_runfiles, requirements_in)
101+
resolved_requirements_ins = [_locate(bazel_runfiles, f) for f in requirements_ins]
102102
resolved_requirements_txt = _locate(bazel_runfiles, requirements_txt)
103103

104104
# Files in the runfiles directory has the following naming schema:
@@ -115,7 +115,7 @@ def main(
115115
# use the runfiles file first. Thus, we need to compute the relative path
116116
# from the execution root.
117117
# Note: Windows cannot reference generated files without runfiles support enabled.
118-
requirements_in_relative = requirements_in[len(repository_prefix) :]
118+
requirements_ins_relative = [f[len(repository_prefix) :] for f in requirements_ins]
119119
requirements_txt_relative = requirements_txt[len(repository_prefix) :]
120120

121121
# Before loading click, set the locale for its parser.
@@ -154,10 +154,15 @@ def main(
154154

155155
argv.append("--generate-hashes")
156156
argv.append(f"--output-file={requirements_txt_relative if UPDATE else requirements_out}")
157-
argv.append(
158-
requirements_in_relative
159-
if Path(requirements_in_relative).exists()
160-
else resolved_requirements_in
157+
argv.extend(
158+
(
159+
requirements_in_relative
160+
if Path(requirements_in_relative).exists()
161+
else resolved_requirements_in
162+
)
163+
for requirements_in_relative, resolved_requirements_in
164+
in zip(requirements_ins_relative, resolved_requirements_ins)
165+
161166
)
162167
argv.extend(extra_args)
163168

@@ -192,7 +197,7 @@ def main(
192197
print(
193198
"pip-compile exited with code 2. This means that pip-compile found "
194199
"incompatible requirements or could not find a version that matches "
195-
f"the install requirement in {requirements_in_relative}.",
200+
f"the install requirement in one of {requirements_ins_relative}.",
196201
file=sys.stderr,
197202
)
198203
sys.exit(1)

0 commit comments

Comments
 (0)