Skip to content

Commit 4e26bcd

Browse files
cj81499lpulley
andauthored
refactor: use click in dependency_resolver.py (#1071)
Using click makes it easier to parse arguments. Many args are now named arguments (options), and the need for using positional args with stub `"None"` values isn't necessary anymore. There is already a dependency on click via piptools, so this doesn't introduce a new dependency. Relates to #1067 Co-authored-by: Logan Pulley <lpulley@ocient.com>
1 parent 821a323 commit 4e26bcd

File tree

2 files changed

+41
-29
lines changed

2 files changed

+41
-29
lines changed

python/pip_install/requirements.bzl

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,19 @@ def compile_pip_requirements(
8585
args = [
8686
loc.format(requirements_in),
8787
loc.format(requirements_txt),
88-
# String None is a placeholder for argv ordering.
89-
loc.format(requirements_linux) if requirements_linux else "None",
90-
loc.format(requirements_darwin) if requirements_darwin else "None",
91-
loc.format(requirements_windows) if requirements_windows else "None",
9288
"//%s:%s.update" % (native.package_name(), name),
9389
"--resolver=backtracking",
9490
"--allow-unsafe",
95-
] + (["--generate-hashes"] if generate_hashes else []) + extra_args
91+
]
92+
if generate_hashes:
93+
args.append("--generate-hashes")
94+
if requirements_linux:
95+
args.append("--requirements-linux={}".format(loc.format(requirements_linux)))
96+
if requirements_darwin:
97+
args.append("--requirements-darwin={}".format(loc.format(requirements_darwin)))
98+
if requirements_windows:
99+
args.append("--requirements-windows={}".format(loc.format(requirements_windows)))
100+
args.extend(extra_args)
96101

97102
deps = [
98103
requirement("build"),

python/pip_install/tools/dependency_resolver/dependency_resolver.py

Lines changed: 31 additions & 24 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 Optional, Tuple
2223

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

@@ -77,24 +79,25 @@ def _locate(bazel_runfiles, file):
7779
return bazel_runfiles.Rlocation(file)
7880

7981

80-
if __name__ == "__main__":
81-
if len(sys.argv) < 4:
82-
print(
83-
"Expected at least two arguments: requirements_in requirements_out",
84-
file=sys.stderr,
85-
)
86-
sys.exit(1)
87-
88-
parse_str_none = lambda s: None if s == "None" else s
82+
@click.command(context_settings={"ignore_unknown_options": True})
83+
@click.argument("requirements_in")
84+
@click.argument("requirements_txt")
85+
@click.argument("update_target_label")
86+
@click.option("--requirements-linux")
87+
@click.option("--requirements-darwin")
88+
@click.option("--requirements-windows")
89+
@click.argument("extra_args", nargs=-1, type=click.UNPROCESSED)
90+
def main(
91+
requirements_in: str,
92+
requirements_txt: str,
93+
update_target_label: str,
94+
requirements_linux: Optional[str],
95+
requirements_darwin: Optional[str],
96+
requirements_windows: Optional[str],
97+
extra_args: Tuple[str, ...],
98+
) -> None:
8999
bazel_runfiles = runfiles.Create()
90100

91-
requirements_in = sys.argv.pop(1)
92-
requirements_txt = sys.argv.pop(1)
93-
requirements_linux = parse_str_none(sys.argv.pop(1))
94-
requirements_darwin = parse_str_none(sys.argv.pop(1))
95-
requirements_windows = parse_str_none(sys.argv.pop(1))
96-
update_target_label = sys.argv.pop(1)
97-
98101
requirements_file = _select_golden_requirements_file(
99102
requirements_txt=requirements_txt, requirements_linux=requirements_linux,
100103
requirements_darwin=requirements_darwin, requirements_windows=requirements_windows
@@ -128,6 +131,8 @@ def _locate(bazel_runfiles, file):
128131
os.environ["LC_ALL"] = "C.UTF-8"
129132
os.environ["LANG"] = "C.UTF-8"
130133

134+
argv = []
135+
131136
UPDATE = True
132137
# Detect if we are running under `bazel test`.
133138
if "TEST_TMPDIR" in os.environ:
@@ -136,8 +141,7 @@ def _locate(bazel_runfiles, file):
136141
# to the real user cache, Bazel sandboxing makes the file read-only
137142
# and we fail.
138143
# In theory this makes the test more hermetic as well.
139-
sys.argv.append("--cache-dir")
140-
sys.argv.append(os.environ["TEST_TMPDIR"])
144+
argv.append(f"--cache-dir={os.environ['TEST_TMPDIR']}")
141145
# Make a copy for pip-compile to read and mutate.
142146
requirements_out = os.path.join(
143147
os.environ["TEST_TMPDIR"], os.path.basename(requirements_file) + ".out"
@@ -153,14 +157,13 @@ def _locate(bazel_runfiles, file):
153157
os.environ["CUSTOM_COMPILE_COMMAND"] = update_command
154158
os.environ["PIP_CONFIG_FILE"] = os.getenv("PIP_CONFIG_FILE") or os.devnull
155159

156-
sys.argv.append("--output-file")
157-
sys.argv.append(requirements_file_relative if UPDATE else requirements_out)
158-
sys.argv.append(
160+
argv.append(f"--output-file={requirements_file_relative if UPDATE else requirements_out}")
161+
argv.append(
159162
requirements_in_relative
160163
if Path(requirements_in_relative).exists()
161164
else resolved_requirements_in
162165
)
163-
print(sys.argv)
166+
argv.extend(extra_args)
164167

165168
if UPDATE:
166169
print("Updating " + requirements_file_relative)
@@ -176,7 +179,7 @@ def _locate(bazel_runfiles, file):
176179
resolved_requirements_file, requirements_file_tree
177180
)
178181
)
179-
cli()
182+
cli(argv)
180183
requirements_file_relative_path = Path(requirements_file_relative)
181184
content = requirements_file_relative_path.read_text()
182185
content = content.replace(absolute_path_prefix, "")
@@ -185,7 +188,7 @@ def _locate(bazel_runfiles, file):
185188
# cli will exit(0) on success
186189
try:
187190
print("Checking " + requirements_file)
188-
cli()
191+
cli(argv)
189192
print("cli() should exit", file=sys.stderr)
190193
sys.exit(1)
191194
except SystemExit as e:
@@ -219,3 +222,7 @@ def _locate(bazel_runfiles, file):
219222
file=sys.stderr,
220223
)
221224
sys.exit(1)
225+
226+
227+
if __name__ == "__main__":
228+
main()

0 commit comments

Comments
 (0)