Skip to content

Commit e1c304a

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 5977727 commit e1c304a

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

python/pip_install/requirements.bzl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def compile_pip_requirements(
5353
generate_hashes: whether to put hashes in the requirements_txt file.
5454
py_binary: the py_binary rule to be used.
5555
py_test: the py_test rule to be used.
56-
requirements_in: file expressing desired dependencies.
56+
requirements_in: file(s) expressing desired dependencies.
5757
requirements_txt: result of "compiling" the requirements.in file.
5858
requirements_linux: File of linux specific resolve output to check validate if requirement.in has changes.
5959
requirements_darwin: File of darwin specific resolve output to check validate if requirement.in has changes.
@@ -74,16 +74,17 @@ def compile_pip_requirements(
7474
visibility = visibility,
7575
)
7676

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

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

8385
loc = "$(rlocationpath {})"
8486

85-
args = [
86-
loc.format(requirements_in),
87+
args = ["--in={}".format(loc.format(f)) for f in requirements_in] + [
8788
loc.format(requirements_txt),
8889
"//%s:%s.update" % (native.package_name(), name),
8990
"--resolver=backtracking",

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:
@@ -158,10 +158,15 @@ def main(
158158
os.environ["PIP_CONFIG_FILE"] = os.getenv("PIP_CONFIG_FILE") or os.devnull
159159

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

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

0 commit comments

Comments
 (0)