@@ -298,50 +298,58 @@ def _help_group_arguments(
298298 """
299299 Returns help page groupings for a list of POST/PUT arguments.
300300 """
301+ args = [arg for arg in args if not arg .read_only ]
301302 args_sorted = sorted (args , key = lambda a : a .path )
302303
303- groups_tmp = defaultdict (list )
304+ paths = {tuple (arg .path .split ("." )) for arg in args_sorted }
305+ path_to_args = defaultdict (list )
304306
305- # Initial grouping by root parent
306307 for arg in args_sorted :
307- if arg .read_only :
308- continue
308+ arg_path = tuple (arg .path .split ("." ))
309+
310+ if not arg .is_parent :
311+ # Parent arguments are grouped in with their children
312+ arg_path = arg_path [:- 1 ]
313+
314+ # Find first common parent
315+ while len (arg_path ) > 1 and arg_path not in paths :
316+ arg_path = arg_path [:- 1 ]
309317
310- groups_tmp [ arg . path . split ( "." , 1 )[ 0 ] ].append (arg )
318+ path_to_args [ arg_path ].append (arg )
311319
312320 group_required = []
313321 groups = []
314322 ungrouped = []
315323
316- for group in groups_tmp .values ():
317- # If the group has more than one element,
318- # leave it as is in the result
319- if len (group ) > 1 :
324+ for k , group in sorted (
325+ path_to_args .items (), key = lambda a : (len (a [0 ]), a [0 ], len (a [1 ]))
326+ ):
327+ if len (k ) > 0 and len (group ) > 1 :
328+ # This is a named subgroup
320329 groups .append (
321330 # Args should be ordered by least depth -> required -> path
322331 sorted (group , key = lambda v : (v .depth , not v .required , v .path )),
323332 )
324333 continue
325334
326- target_arg = group [0 ]
327-
328335 # If the group's argument is required,
329- # add it to the required group
330- if target_arg .required :
331- group_required .append (target_arg )
332- continue
336+ # add it to the top-level required group
337+ for arg in group :
338+ if arg .required :
339+ group_required .append (arg )
340+ continue
333341
334- # Add ungrouped arguments (single value groups) to the
335- # "ungrouped" group.
336- ungrouped .append (target_arg )
342+ # Add ungrouped arguments (single value groups) to the
343+ # "ungrouped" group.
344+ ungrouped .append (arg )
337345
338346 result = []
339347
340348 if len (group_required ) > 0 :
341- result .append (group_required )
349+ result .append (sorted ( group_required , key = lambda v : v . path ) )
342350
343351 if len (ungrouped ) > 0 :
344- result .append (ungrouped )
352+ result .append (sorted ( ungrouped , key = lambda v : v . path ) )
345353
346354 result += groups
347355
0 commit comments