Skip to content

Commit c9db2b3

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 c40fb0e commit c9db2b3

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
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
@@ -51,7 +51,7 @@ def compile_pip_requirements(
5151
extra_deps: extra dependencies passed to pip-compile.
5252
py_binary: the py_binary rule to be used.
5353
py_test: the py_test rule to be used.
54-
requirements_in: file expressing desired dependencies.
54+
requirements_in: file(s) expressing desired dependencies.
5555
requirements_txt: result of "compiling" the requirements.in file.
5656
requirements_linux: File of linux specific resolve output to check validate if requirement.in has changes.
5757
requirements_darwin: File of darwin specific resolve output to check validate if requirement.in has changes.
@@ -72,16 +72,17 @@ def compile_pip_requirements(
7272
visibility = visibility,
7373
)
7474

75-
data = [name, requirements_in, requirements_txt] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None]
75+
if type(requirements_in) == "string":
76+
requirements_in = [requirements_in]
77+
data = [name] + requirements_in + [requirements_txt] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None]
7678

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

8183
loc = "$(rlocationpath {})"
8284

83-
args = [
84-
loc.format(requirements_in),
85+
args = ["--in={}".format(loc.format(f)) for f in requirements_in] + [
8586
loc.format(requirements_txt),
8687
"//%s:%s.update" % (native.package_name(), name),
8788
]

python/pip_install/tools/dependency_resolver/dependency_resolver.py

Lines changed: 15 additions & 10 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],
@@ -103,7 +103,7 @@ def main(
103103
requirements_darwin=requirements_darwin, requirements_windows=requirements_windows
104104
)
105105

106-
resolved_requirements_in = _locate(bazel_runfiles, requirements_in)
106+
resolved_requirements_ins = [_locate(bazel_runfiles, f) for f in requirements_ins]
107107
resolved_requirements_file = _locate(bazel_runfiles, requirements_file)
108108

109109
# Files in the runfiles directory has the following naming schema:
@@ -120,8 +120,8 @@ def main(
120120
# use the runfiles file first. Thus, we need to compute the relative path
121121
# from the execution root.
122122
# Note: Windows cannot reference generated files without runfiles support enabled.
123-
requirements_in_relative = requirements_in[len(repository_prefix):]
124-
requirements_file_relative = requirements_file[len(repository_prefix):]
123+
requirements_ins_relative = [f[len(repository_prefix) :] for f in requirements_ins]
124+
requirements_file_relative = requirements_file[len(repository_prefix) :]
125125

126126
# Before loading click, set the locale for its parser.
127127
# If it leaks through to the system setting, it may fail:
@@ -159,10 +159,15 @@ def main(
159159

160160
argv.append("--generate-hashes")
161161
argv.append(f"--output-file={requirements_file_relative if UPDATE else requirements_out}")
162-
argv.append(
163-
requirements_in_relative
164-
if Path(requirements_in_relative).exists()
165-
else resolved_requirements_in
162+
argv.extend(
163+
(
164+
requirements_in_relative
165+
if Path(requirements_in_relative).exists()
166+
else resolved_requirements_in
167+
)
168+
for requirements_in_relative, resolved_requirements_in
169+
in zip(requirements_ins_relative, resolved_requirements_ins)
170+
166171
)
167172
argv.extend(extra_args)
168173

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

0 commit comments

Comments
 (0)