1717from .process import Process , shortname
1818from .resolver import ga4gh_tool_registries
1919from .software_requirements import SOFTWARE_REQUIREMENTS_ENABLED
20- from .utils import DEFAULT_TMP_PREFIX
20+ from .utils import DEFAULT_TMP_PREFIX , CWLObjectType
2121
2222
2323class _env_var_table (Table ):
@@ -933,7 +933,7 @@ def __call__(
933933
934934
935935def add_argument (
936- toolparser : argparse .ArgumentParser ,
936+ toolparser : argparse .ArgumentParser | "argparse._ArgumentGroup" ,
937937 name : str ,
938938 inptype : Any ,
939939 records : list [str ],
@@ -1047,14 +1047,18 @@ def generate_parser(
10471047 toolparser .add_argument ("job_order" , nargs = "?" , help = "Job input json file" )
10481048 namemap ["job_order" ] = "job_order"
10491049
1050- for inp in tool .tool ["inputs" ]:
1051- name = shortname (inp ["id" ])
1050+ inps = tool .tool ["inputs" ]
1051+
1052+ def process_input (
1053+ inp : CWLObjectType , parser : argparse .ArgumentParser | "argparse._ArgumentGroup"
1054+ ) -> None :
1055+ name = shortname (cast (str , inp ["id" ]))
10521056 namemap [name .replace ("-" , "_" )] = name
10531057 inptype = inp ["type" ]
1054- description = inp .get ("doc" , inp .get ("label" , "" ))
1058+ description = cast ( str , inp .get ("doc" , inp .get ("label" , "" ) ))
10551059 default = inp .get ("default" , None )
10561060 add_argument (
1057- toolparser ,
1061+ parser ,
10581062 name ,
10591063 inptype ,
10601064 records ,
@@ -1065,6 +1069,31 @@ def generate_parser(
10651069 base_uri ,
10661070 )
10671071
1072+ if (groups_req := tool .get_requirement ("http://commonwl.org/cwltool#Groups" )[0 ]) is not None :
1073+ groups = cast (CWLObjectType , groups_req ["groups" ])
1074+ for group_name in groups .keys ():
1075+ group_inputs : list [CWLObjectType ] = []
1076+ group_definition = cast (CWLObjectType , groups [group_name ])
1077+ for input_name in cast (list [str ], group_definition ["groupMembers" ]):
1078+ new_inps : list [CWLObjectType ] = []
1079+ for inp in inps :
1080+ if shortname (inp ["id" ]) == input_name :
1081+ group_inputs .append (inp )
1082+ else :
1083+ new_inps .append (inp )
1084+ inps = new_inps
1085+
1086+ if len (group_inputs ) > 0 :
1087+ group = toolparser .add_argument_group (
1088+ title = cast (str , group_definition .get ("label" , group_name )),
1089+ description = cast (str | None , group_definition .get ("doc" , None )),
1090+ )
1091+ for inp in group_inputs :
1092+ process_input (inp , group )
1093+
1094+ for inp in inps :
1095+ process_input (inp , toolparser )
1096+
10681097 toolparser .add_argument (
10691098 "--generate-help-preview" ,
10701099 action = HelpPreviewAction ,
0 commit comments