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,15 +157,14 @@ 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 ("--generate-hashes" )
157
- sys .argv .append ("--output-file" )
158
- sys .argv .append (requirements_file_relative if UPDATE else requirements_out )
159
- sys .argv .append (
160
+ argv .append ("--generate-hashes" )
161
+ argv .append (f"--output-file={ requirements_file_relative if UPDATE else requirements_out } " )
162
+ argv .append (
160
163
requirements_in_relative
161
164
if Path (requirements_in_relative ).exists ()
162
165
else resolved_requirements_in
163
166
)
164
- print ( sys . argv )
167
+ argv . extend ( extra_args )
165
168
166
169
if UPDATE :
167
170
print ("Updating " + requirements_file_relative )
@@ -177,7 +180,7 @@ def _locate(bazel_runfiles, file):
177
180
resolved_requirements_file , requirements_file_tree
178
181
)
179
182
)
180
- cli ()
183
+ cli (argv )
181
184
requirements_file_relative_path = Path (requirements_file_relative )
182
185
content = requirements_file_relative_path .read_text ()
183
186
content = content .replace (absolute_path_prefix , "" )
@@ -186,7 +189,7 @@ def _locate(bazel_runfiles, file):
186
189
# cli will exit(0) on success
187
190
try :
188
191
print ("Checking " + requirements_file )
189
- cli ()
192
+ cli (argv )
190
193
print ("cli() should exit" , file = sys .stderr )
191
194
sys .exit (1 )
192
195
except SystemExit as e :
@@ -220,3 +223,7 @@ def _locate(bazel_runfiles, file):
220
223
file = sys .stderr ,
221
224
)
222
225
sys .exit (1 )
226
+
227
+
228
+ if __name__ == "__main__" :
229
+ main ()
0 commit comments