diff --git a/src/aaz_dev/command/model/configuration/_command.py b/src/aaz_dev/command/model/configuration/_command.py index 7785bf80..eff6dbe6 100644 --- a/src/aaz_dev/command/model/configuration/_command.py +++ b/src/aaz_dev/command/model/configuration/_command.py @@ -324,6 +324,28 @@ def _build_output_type_by_subresource_selector(subresource_selector): def handle_duplicated_options(arguments, has_subresource, operation_id): + def can_be_replaced(arg1, arg2): + # check whether you need to replace argument + ret = False + if _compare_argument(arg1, arg2, has_subresource): + arg2.ref_schema.arg = arg1.var + dropped_args.add(arg2.var) + ret = False + + elif _compare_argument(arg2, arg1, has_subresource): + arg1.ref_schema.arg = arg2.var + dropped_args.add(arg1.var) + ret = True + + else: + # warning developer handle duplicated options + logger.warning( + f"Duplicated Option Value: {set(arg1.options).intersection(arg2.options)} : " + f"{arg1.var} with {arg2.var} : {operation_id}" + ) + + return ret + # check argument with duplicated option names dropped_args = set() used_args = set() @@ -331,37 +353,26 @@ def handle_duplicated_options(arguments, has_subresource, operation_id): used_args.add(arg.var) if arg.var in dropped_args or not arg.options: continue - r_arg = None + for v in arguments.values(): if v.var in used_args or v.var in dropped_args or arg.var == v.var or not v.options: continue + if not set(arg.options).isdisjoint(v.options): - r_arg = v - break - if r_arg: - # check whether you need to replace argument - if _can_replace_argument(r_arg, arg, has_subresource): - arg.ref_schema.arg = r_arg.var - dropped_args.add(arg.var) - elif _can_replace_argument(arg, r_arg, has_subresource): - r_arg.ref_schema.arg = arg.var - dropped_args.add(r_arg.var) - else: - # warning developer handle duplicated options - logger.warning( - f"Duplicated Option Value: {set(arg.options).intersection(r_arg.options)} : " - f"{arg.var} with {r_arg.var} : {operation_id}" - ) + if can_be_replaced(arg, v): + break return [arg for var, arg in arguments.items() if var not in dropped_args] -def _can_replace_argument(arg, old_arg, has_subresource): +def _compare_argument(arg, old_arg, has_subresource): arg_prefix = arg.var.split('.')[0] old_prefix = old_arg.var.split('.')[0] - if old_prefix in (CMDArgBuildPrefix.Query, CMDArgBuildPrefix.Header, CMDArgBuildPrefix.Path): - # replace argument should only be in body + if old_prefix in (CMDArgBuildPrefix.Query, CMDArgBuildPrefix.Header): + return True + + if old_prefix == CMDArgBuildPrefix.Path: return False if arg_prefix in (CMDArgBuildPrefix.Query, CMDArgBuildPrefix.Header):