1010from .process import Process , shortname
1111from .resolver import ga4gh_tool_registries
1212from .software_requirements import SOFTWARE_REQUIREMENTS_ENABLED
13- from .utils import DEFAULT_TMP_PREFIX
13+ from .utils import DEFAULT_TMP_PREFIX , CWLObjectType
1414
1515
1616def arg_parser () -> argparse .ArgumentParser :
@@ -845,7 +845,7 @@ def __call__(
845845
846846
847847def add_argument (
848- toolparser : argparse .ArgumentParser ,
848+ toolparser : Union [ argparse .ArgumentParser , "argparse._ArgumentGroup" ] ,
849849 name : str ,
850850 inptype : Any ,
851851 records : list [str ],
@@ -962,14 +962,18 @@ def generate_parser(
962962 toolparser .add_argument ("job_order" , nargs = "?" , help = "Job input json file" )
963963 namemap ["job_order" ] = "job_order"
964964
965- for inp in tool .tool ["inputs" ]:
966- name = shortname (inp ["id" ])
965+ inps = tool .tool ["inputs" ]
966+
967+ def process_input (
968+ inp : CWLObjectType , parser : Union [argparse .ArgumentParser , "argparse._ArgumentGroup" ]
969+ ) -> None :
970+ name = shortname (cast (str , inp ["id" ]))
967971 namemap [name .replace ("-" , "_" )] = name
968972 inptype = inp ["type" ]
969- description = inp .get ("doc" , inp .get ("label" , "" ))
973+ description = cast ( str , inp .get ("doc" , inp .get ("label" , "" ) ))
970974 default = inp .get ("default" , None )
971975 add_argument (
972- toolparser ,
976+ parser ,
973977 name ,
974978 inptype ,
975979 records ,
@@ -980,4 +984,29 @@ def generate_parser(
980984 base_uri ,
981985 )
982986
987+ if (groups_req := tool .get_requirement ("http://commonwl.org/cwltool#Groups" )[0 ]) is not None :
988+ groups = cast (CWLObjectType , groups_req ["groups" ])
989+ for group_name in groups .keys ():
990+ group_inputs : list [CWLObjectType ] = []
991+ group_definition = cast (CWLObjectType , groups [group_name ])
992+ for input_name in cast (list [str ], group_definition ["groupMembers" ]):
993+ new_inps : list [CWLObjectType ] = []
994+ for inp in inps :
995+ if shortname (inp ["id" ]) == input_name :
996+ group_inputs .append (inp )
997+ else :
998+ new_inps .append (inp )
999+ inps = new_inps
1000+
1001+ if len (group_inputs ) > 0 :
1002+ group = toolparser .add_argument_group (
1003+ title = cast (str , group_definition .get ("label" , group_name )),
1004+ description = cast (Optional [str ], group_definition .get ("doc" , None )),
1005+ )
1006+ for inp in group_inputs :
1007+ process_input (inp , group )
1008+
1009+ for inp in inps :
1010+ process_input (inp , toolparser )
1011+
9831012 return toolparser
0 commit comments