Skip to content

Commit 6b7ec7f

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 f554c7b commit 6b7ec7f

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
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 = "$(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),
8384
"//%s:%s.update" % (native.package_name(), name),
8485
]

python/pip_install/tools/dependency_resolver/dependency_resolver.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ def _select_golden_requirements_file(
6969

7070

7171
@click.command(context_settings={"ignore_unknown_options": True})
72-
@click.argument("requirements_in")
72+
@click.option("--in", "requirements_ins", multiple=True, required=True)
7373
@click.argument("requirements_txt")
7474
@click.argument("update_target_label")
7575
@click.option("--requirements-linux")
7676
@click.option("--requirements-darwin")
7777
@click.option("--requirements-windows")
7878
@click.argument("extra_args", nargs=-1, type=click.UNPROCESSED)
7979
def main(
80-
requirements_in: str,
80+
requirements_ins: Tuple[str, ...],
8181
requirements_txt: str,
8282
update_target_label: str,
8383
requirements_linux: Optional[str],
@@ -87,8 +87,8 @@ def main(
8787
) -> None:
8888
# The requirements_in file could be generated, so we will need to remove the
8989
# absolute prefixes in the locked requirements output file.
90-
requirements_in_path = Path(requirements_in)
91-
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]
9292

9393
# Before loading click, set the locale for its parser.
9494
# If it leaks through to the system setting, it may fail:
@@ -126,11 +126,16 @@ def main(
126126

127127
argv.append("--generate-hashes")
128128
argv.append(f"--output-file={requirements_txt if UPDATE else requirements_out}")
129-
argv.append(
130-
requirements_in if requirements_in_path.exists() else resolved_requirements_in
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+
)
131134
)
132135
argv.extend(extra_args)
133136

137+
argv.extend(extra_args)
138+
134139
if UPDATE:
135140
print("Updating " + requirements_txt)
136141
if "BUILD_WORKSPACE_DIRECTORY" in os.environ:
@@ -156,7 +161,7 @@ def main(
156161
print(
157162
"pip-compile exited with code 2. This means that pip-compile found "
158163
"incompatible requirements or could not find a version that matches "
159-
f"the install requirement in {requirements_in}.",
164+
f"the install requirement in one of {requirements_ins}.",
160165
file=sys.stderr,
161166
)
162167
sys.exit(1)

0 commit comments

Comments
 (0)