10
10
#
11
11
12
12
import json
13
- import sys
14
13
from typing import List
15
14
16
15
import click
34
33
35
34
36
35
@click .command ()
36
+ @click .pass_context
37
37
@click .option (
38
38
"-r" ,
39
39
"--requirement" ,
99
99
"--json" ,
100
100
"json_output" ,
101
101
type = FileOptionType (mode = "w" , encoding = "utf-8" , lazy = True ),
102
- required = True ,
102
+ required = False ,
103
103
metavar = "FILE" ,
104
104
help = "Write output as pretty-printed JSON to FILE. "
105
105
"Use the special '-' file name to print results on screen/stdout." ,
106
106
)
107
+ @click .option (
108
+ "--json-pdt" ,
109
+ "pdt_output" ,
110
+ type = FileOptionType (mode = "w" , encoding = "utf-8" , lazy = True ),
111
+ required = False ,
112
+ metavar = "FILE" ,
113
+ help = "Write output as pretty-printed JSON to FILE as a tree in the style of pipdeptree. "
114
+ "Use the special '-' file name to print results on screen/stdout." ,
115
+ )
107
116
@click .option (
108
117
"--max-rounds" ,
109
118
"max_rounds" ,
124
133
"--index-url are ignored when this option is active." ,
125
134
)
126
135
@click .option (
127
- "--debug " ,
136
+ "--verbose " ,
128
137
is_flag = True ,
129
138
hidden = True ,
130
139
help = "Enable debug output." ,
131
140
)
132
141
@click .help_option ("-h" , "--help" )
133
142
def resolve_dependencies (
143
+ ctx ,
134
144
requirement_files ,
135
145
netrc_file ,
136
146
specifiers ,
137
147
python_version ,
138
148
operating_system ,
139
149
index_urls ,
140
150
json_output ,
151
+ pdt_output ,
141
152
max_rounds ,
142
153
use_cached_index = False ,
143
154
use_pypi_json_api = False ,
144
- debug = TRACE ,
155
+ verbose = TRACE ,
145
156
):
146
157
"""
147
158
Resolve the dependencies of the packages listed in REQUIREMENT-FILE(s) file
@@ -161,7 +172,15 @@ def resolve_dependencies(
161
172
162
173
dad --spec "flask==2.1.2" --json -
163
174
"""
164
- if debug :
175
+ if not (json_output or pdt_output ):
176
+ click .secho ("No output file specified. Use --json or --json-pdt." , err = True )
177
+ ctx .exit (1 )
178
+
179
+ if json_output and pdt_output :
180
+ click .secho ("Only one of --json or --json-pdt can be used." , err = True )
181
+ ctx .exit (1 )
182
+
183
+ if verbose :
165
184
click .secho (f"Resolving dependencies..." )
166
185
167
186
netrc = None
@@ -184,11 +203,10 @@ def resolve_dependencies(
184
203
direct_dependencies .append (dep )
185
204
186
205
if not direct_dependencies :
187
- if debug :
188
- click .secho ("Error: no requirements requested." )
189
- sys .exit (1 )
206
+ click .secho ("Error: no requirements requested." )
207
+ ctx .exit (1 )
190
208
191
- if debug :
209
+ if verbose :
192
210
click .secho ("direct_dependencies:" )
193
211
for dep in direct_dependencies :
194
212
click .secho (f" { dep } " )
@@ -198,7 +216,7 @@ def resolve_dependencies(
198
216
python_version = python_version , operating_system = operating_system
199
217
)
200
218
201
- if debug :
219
+ if verbose :
202
220
click .secho (f"environment: { environment } " )
203
221
204
222
repos = []
@@ -224,7 +242,7 @@ def resolve_dependencies(
224
242
)
225
243
repos .append (repo )
226
244
227
- if debug :
245
+ if verbose :
228
246
click .secho ("repos:" )
229
247
for repo in repos :
230
248
click .secho (f" { repo } " )
@@ -236,7 +254,8 @@ def resolve_dependencies(
236
254
repos = repos ,
237
255
as_tree = False ,
238
256
max_rounds = max_rounds ,
239
- debug = debug ,
257
+ verbose = verbose ,
258
+ pdt_output = pdt_output ,
240
259
)
241
260
242
261
cli_options = [f"--requirement { rf } " for rf in requirement_files ]
@@ -262,19 +281,35 @@ def resolve_dependencies(
262
281
errors = [],
263
282
)
264
283
265
- write_output (
266
- headers = headers ,
267
- requirements = requirements ,
268
- resolved_dependencies = resolved_dependencies ,
269
- json_output = json_output ,
270
- )
271
-
272
- if debug :
284
+ if json_output :
285
+ write_output (
286
+ headers = headers ,
287
+ requirements = requirements ,
288
+ resolved_dependencies = resolved_dependencies ,
289
+ json_output = json_output ,
290
+ )
291
+
292
+ else :
293
+ write_output (
294
+ headers = headers ,
295
+ requirements = requirements ,
296
+ resolved_dependencies = resolved_dependencies ,
297
+ json_output = pdt_output ,
298
+ pdt_output = True ,
299
+ )
300
+
301
+ if verbose :
273
302
click .secho ("done!" )
274
303
275
304
276
305
def resolve (
277
- direct_dependencies , environment , repos = tuple (), as_tree = False , max_rounds = 200000 , debug = False
306
+ direct_dependencies ,
307
+ environment ,
308
+ repos = tuple (),
309
+ as_tree = False ,
310
+ max_rounds = 200000 ,
311
+ verbose = False ,
312
+ pdt_output = False ,
278
313
):
279
314
"""
280
315
Resolve dependencies given a ``direct_dependencies`` list of
@@ -292,7 +327,8 @@ def resolve(
292
327
repos = repos ,
293
328
as_tree = as_tree ,
294
329
max_rounds = max_rounds ,
295
- debug = debug ,
330
+ verbose = verbose ,
331
+ pdt_output = pdt_output ,
296
332
)
297
333
298
334
initial_requirements = [d .to_dict () for d in direct_dependencies ]
@@ -312,16 +348,19 @@ def get_requirements_from_direct_dependencies(
312
348
yield Requirement (requirement_string = dependency .extracted_requirement )
313
349
314
350
315
- def write_output (headers , requirements , resolved_dependencies , json_output ):
351
+ def write_output (headers , requirements , resolved_dependencies , json_output , pdt_output = False ):
316
352
"""
317
353
Write headers, requirements and resolved_dependencies as JSON to ``json_output``.
318
354
Return the output data.
319
355
"""
320
- output = dict (
321
- headers = headers ,
322
- requirements = requirements ,
323
- resolved_dependencies = resolved_dependencies ,
324
- )
356
+ if not pdt_output :
357
+ output = dict (
358
+ headers = headers ,
359
+ requirements = requirements ,
360
+ resolved_dependencies = resolved_dependencies ,
361
+ )
362
+ else :
363
+ output = resolved_dependencies
325
364
326
365
json .dump (output , json_output , indent = 2 )
327
366
return output
0 commit comments