@@ -324,44 +324,55 @@ def _build_output_type_by_subresource_selector(subresource_selector):
324324
325325
326326def handle_duplicated_options (arguments , has_subresource , operation_id ):
327+ def can_be_replaced (arg1 , arg2 ):
328+ # check whether you need to replace argument
329+ ret = False
330+ if _compare_argument (arg1 , arg2 , has_subresource ):
331+ arg2 .ref_schema .arg = arg1 .var
332+ dropped_args .add (arg2 .var )
333+ ret = False
334+
335+ elif _compare_argument (arg2 , arg1 , has_subresource ):
336+ arg1 .ref_schema .arg = arg2 .var
337+ dropped_args .add (arg1 .var )
338+ ret = True
339+
340+ else :
341+ # warning developer handle duplicated options
342+ logger .warning (
343+ f"Duplicated Option Value: { set (arg1 .options ).intersection (arg2 .options )} : "
344+ f"{ arg1 .var } with { arg2 .var } : { operation_id } "
345+ )
346+
347+ return ret
348+
327349 # check argument with duplicated option names
328350 dropped_args = set ()
329351 used_args = set ()
330352 for arg in arguments .values ():
331353 used_args .add (arg .var )
332354 if arg .var in dropped_args or not arg .options :
333355 continue
334- r_arg = None
356+
335357 for v in arguments .values ():
336358 if v .var in used_args or v .var in dropped_args or arg .var == v .var or not v .options :
337359 continue
360+
338361 if not set (arg .options ).isdisjoint (v .options ):
339- r_arg = v
340- break
341- if r_arg :
342- # check whether you need to replace argument
343- if _can_replace_argument (r_arg , arg , has_subresource ):
344- arg .ref_schema .arg = r_arg .var
345- dropped_args .add (arg .var )
346- elif _can_replace_argument (arg , r_arg , has_subresource ):
347- r_arg .ref_schema .arg = arg .var
348- dropped_args .add (r_arg .var )
349- else :
350- # warning developer handle duplicated options
351- logger .warning (
352- f"Duplicated Option Value: { set (arg .options ).intersection (r_arg .options )} : "
353- f"{ arg .var } with { r_arg .var } : { operation_id } "
354- )
362+ if can_be_replaced (arg , v ):
363+ break
355364
356365 return [arg for var , arg in arguments .items () if var not in dropped_args ]
357366
358367
359- def _can_replace_argument (arg , old_arg , has_subresource ):
368+ def _compare_argument (arg , old_arg , has_subresource ):
360369 arg_prefix = arg .var .split ('.' )[0 ]
361370 old_prefix = old_arg .var .split ('.' )[0 ]
362371
363- if old_prefix in (CMDArgBuildPrefix .Query , CMDArgBuildPrefix .Header , CMDArgBuildPrefix .Path ):
364- # replace argument should only be in body
372+ if old_prefix in (CMDArgBuildPrefix .Query , CMDArgBuildPrefix .Header ):
373+ return True
374+
375+ if old_prefix == CMDArgBuildPrefix .Path :
365376 return False
366377
367378 if arg_prefix in (CMDArgBuildPrefix .Query , CMDArgBuildPrefix .Header ):
0 commit comments