19
19
import shutil
20
20
import sys
21
21
from pathlib import Path
22
+ from typing import Optional , Tuple
22
23
24
+ import click
23
25
import piptools .writer as piptools_writer
24
26
from piptools .scripts .compile import cli
25
27
@@ -77,24 +79,25 @@ def _locate(bazel_runfiles, file):
77
79
return bazel_runfiles .Rlocation (file )
78
80
79
81
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 :
89
99
bazel_runfiles = runfiles .Create ()
90
100
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
-
98
101
requirements_file = _select_golden_requirements_file (
99
102
requirements_txt = requirements_txt , requirements_linux = requirements_linux ,
100
103
requirements_darwin = requirements_darwin , requirements_windows = requirements_windows
@@ -128,6 +131,8 @@ def _locate(bazel_runfiles, file):
128
131
os .environ ["LC_ALL" ] = "C.UTF-8"
129
132
os .environ ["LANG" ] = "C.UTF-8"
130
133
134
+ argv = []
135
+
131
136
UPDATE = True
132
137
# Detect if we are running under `bazel test`.
133
138
if "TEST_TMPDIR" in os .environ :
@@ -136,8 +141,7 @@ def _locate(bazel_runfiles, file):
136
141
# to the real user cache, Bazel sandboxing makes the file read-only
137
142
# and we fail.
138
143
# 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' ]} " )
141
145
# Make a copy for pip-compile to read and mutate.
142
146
requirements_out = os .path .join (
143
147
os .environ ["TEST_TMPDIR" ], os .path .basename (requirements_file ) + ".out"
@@ -153,14 +157,13 @@ def _locate(bazel_runfiles, file):
153
157
os .environ ["CUSTOM_COMPILE_COMMAND" ] = update_command
154
158
os .environ ["PIP_CONFIG_FILE" ] = os .getenv ("PIP_CONFIG_FILE" ) or os .devnull
155
159
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 (
159
162
requirements_in_relative
160
163
if Path (requirements_in_relative ).exists ()
161
164
else resolved_requirements_in
162
165
)
163
- print ( sys . argv )
166
+ argv . extend ( extra_args )
164
167
165
168
if UPDATE :
166
169
print ("Updating " + requirements_file_relative )
@@ -176,7 +179,7 @@ def _locate(bazel_runfiles, file):
176
179
resolved_requirements_file , requirements_file_tree
177
180
)
178
181
)
179
- cli ()
182
+ cli (argv )
180
183
requirements_file_relative_path = Path (requirements_file_relative )
181
184
content = requirements_file_relative_path .read_text ()
182
185
content = content .replace (absolute_path_prefix , "" )
@@ -185,7 +188,7 @@ def _locate(bazel_runfiles, file):
185
188
# cli will exit(0) on success
186
189
try :
187
190
print ("Checking " + requirements_file )
188
- cli ()
191
+ cli (argv )
189
192
print ("cli() should exit" , file = sys .stderr )
190
193
sys .exit (1 )
191
194
except SystemExit as e :
@@ -219,3 +222,7 @@ def _locate(bazel_runfiles, file):
219
222
file = sys .stderr ,
220
223
)
221
224
sys .exit (1 )
225
+
226
+
227
+ if __name__ == "__main__" :
228
+ main ()
0 commit comments