@@ -241,7 +241,6 @@ def output_callback(out, processStatus):
241
241
242
242
return final_output [0 ]
243
243
244
-
245
244
class FSAction (argparse .Action ):
246
245
objclass = None # type: Text
247
246
@@ -293,22 +292,15 @@ class FileAppendAction(FSAppendAction):
293
292
class DirectoryAppendAction (FSAppendAction ):
294
293
objclass = "Directory"
295
294
296
- def generate_parser (toolparser , tool , namemap ):
297
- # type: (argparse.ArgumentParser, Process, Dict[Text, Text]) -> argparse.ArgumentParser
298
- toolparser .add_argument ("job_order" , nargs = "?" , help = "Job input json file" )
299
- namemap ["job_order" ] = "job_order"
300
295
301
- for inp in tool .tool ["inputs" ]:
302
- name = shortname (inp ["id" ])
296
+ def add_argument (toolparser , name , inptype , records , description = "" ,
297
+ default = None ):
298
+ # type: (argparse.ArgumentParser, Text, Any, List[Text], Text, Any) -> None
303
299
if len (name ) == 1 :
304
300
flag = "-"
305
301
else :
306
302
flag = "--"
307
303
308
- namemap [name .replace ("-" , "_" )] = name
309
-
310
- inptype = inp ["type" ]
311
-
312
304
required = True
313
305
if isinstance (inptype , list ):
314
306
if inptype [0 ] == "null" :
@@ -319,10 +311,9 @@ def generate_parser(toolparser, tool, namemap):
319
311
_logger .debug (u"Can't make command line argument from %s" , inptype )
320
312
return None
321
313
322
- ahelp = inp . get ( " description" , "" ) .replace ("%" , "%%" )
314
+ ahelp = description .replace ("%" , "%%" )
323
315
action = None # type: Union[argparse.Action, Text]
324
316
atype = None # type: Any
325
- default = None # type: Any
326
317
327
318
if inptype == "File" :
328
319
action = cast (argparse .Action , FileAction )
@@ -337,6 +328,16 @@ def generate_parser(toolparser, tool, namemap):
337
328
action = "append"
338
329
elif isinstance (inptype , dict ) and inptype ["type" ] == "enum" :
339
330
atype = Text
331
+ elif isinstance (inptype , dict ) and inptype ["type" ] == "record" :
332
+ records .append (name )
333
+ for field in inptype ['fields' ]:
334
+ fieldname = name + "." + shortname (field ['name' ])
335
+ fieldtype = field ['type' ]
336
+ fielddescription = field .get ("doc" , "" )
337
+ add_argument (
338
+ toolparser , fieldname , fieldtype , records ,
339
+ fielddescription )
340
+ return
340
341
if inptype == "string" :
341
342
atype = Text
342
343
elif inptype == "int" :
@@ -348,8 +349,7 @@ def generate_parser(toolparser, tool, namemap):
348
349
elif inptype == "boolean" :
349
350
action = "store_true"
350
351
351
- if "default" in inp :
352
- default = inp ["default" ]
352
+ if default :
353
353
required = False
354
354
355
355
if not atype and not action :
@@ -365,6 +365,20 @@ def generate_parser(toolparser, tool, namemap):
365
365
flag + name , required = required , help = ahelp , action = action ,
366
366
default = default , ** typekw )
367
367
368
+
369
+ def generate_parser (toolparser , tool , namemap , records ):
370
+ # type: (argparse.ArgumentParser, Process, Dict[Text, Text], List[Text]) -> argparse.ArgumentParser
371
+ toolparser .add_argument ("job_order" , nargs = "?" , help = "Job input json file" )
372
+ namemap ["job_order" ] = "job_order"
373
+
374
+ for inp in tool .tool ["inputs" ]:
375
+ name = shortname (inp ["id" ])
376
+ namemap [name .replace ("-" , "_" )] = name
377
+ inptype = inp ["type" ]
378
+ description = inp .get ("doc" , "" )
379
+ default = inp .get ("default" , None )
380
+ add_argument (toolparser , name , inptype , records , description , default )
381
+
368
382
return toolparser
369
383
370
384
@@ -406,12 +420,23 @@ def load_job_order(args, t, stdin, print_input_deps=False, relative_deps=False,
406
420
else :
407
421
input_basedir = args .basedir if args .basedir else os .getcwd ()
408
422
namemap = {} # type: Dict[Text, Text]
409
- toolparser = generate_parser (argparse .ArgumentParser (prog = args .workflow ), t , namemap )
423
+ records = [] # type: List[Text]
424
+ toolparser = generate_parser (
425
+ argparse .ArgumentParser (prog = args .workflow ), t , namemap , records )
410
426
if toolparser :
411
427
if args .tool_help :
412
428
toolparser .print_help ()
413
429
return 0
414
430
cmd_line = vars (toolparser .parse_args (args .job_order ))
431
+ for record_name in records :
432
+ record = {}
433
+ record_items = {
434
+ k :v for k ,v in cmd_line .iteritems ()
435
+ if k .startswith (record_name )}
436
+ for key , value in record_items .iteritems ():
437
+ record [key [len (record_name )+ 1 :]] = value
438
+ del cmd_line [key ]
439
+ cmd_line [str (record_name )] = record
415
440
416
441
if cmd_line ["job_order" ]:
417
442
try :
0 commit comments