[docs]defvisualize_change_set(change_set:ChangeSet,bsm:T.Optional["BotoSesManager"]=None,include_nested_stack:bool=False,_verbose:bool=True,):""" Ref: - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudformation.html#CloudFormation.Client.describe_change_set """print_header(f" >>> Change for stack {Fore.CYAN}{change_set.stack_name}{Style.RESET_ALL} <<<"," ",80,)print(f"stack id = {Fore.CYAN}{change_set.stack_id}{Style.RESET_ALL}")print(f"change set id = {Fore.CYAN}{change_set.change_set_id}{Style.RESET_ALL}")resource_change_list=list(sort_changes([ResourceChange.from_dict(d["ResourceChange"])fordinchange_set.changes]))action_counter=Counter([resource_change.actionforresource_changeinresource_change_list])# --- Statisticsif_verbose:# pragma: no coverprint_header("Change Set Statistics","-",80,"+")forchange_actioninChangeActionEnum:ifchange_action.valueinaction_counter:icon=icon_mapper[change_action.value]count=action_counter[change_action.value]ifcount>1:# pragma: no coverres_="Resources"else:res_="Resource"if_verbose:# pragma: no coverprint(f"| {icon}{change_action.value:<10}{count}{res_}")if_verbose:# pragma: no coverprint("|")print("+"+"-"*80)# --- Detailsif_verbose:# pragma: no coverprint_header("Changes","-",80,"+")iflen(resource_change_list):max_logic_resource_id_length=max([len(resource_change.logical_resource_id)forresource_changeinresource_change_list])forresource_changeinresource_change_list:action=resource_change.actionicon=icon_mapper[action]logical_resource_id=resource_change.logical_resource_idresource_type=resource_change.resource_typeif_verbose:# pragma: no coveraction_=f"{action} Resource:"print(f"| {icon} 📦 {action_:<21}{Fore.CYAN}{logical_resource_id:<{max_logic_resource_id_length+4}}{Style.RESET_ALL}{resource_type}")fordetailinresource_change.details:attribute=detail.target.attributename=detail.target.nameif_verbose:key=attribute+":"ifname:identifier=f"{resource_type}.{Fore.CYAN}{name}{Style.RESET_ALL}"else:identifier=resource_typeprint(f"| {icon} 💡 {key:<17}{logical_resource_id:<{max_logic_resource_id_length+4}}{identifier}")if_verbose:# pragma: no coverprint("|")print("+"+"-"*80)# --- Nested stackifinclude_nested_stack:forresource_changeinresource_change_list:ifresource_change.change_set_idisnotNone:change_set=describe_change_set_with_paginator(bsm=bsm,change_set_name=resource_change.change_set_id,)visualize_change_set(change_set=change_set,bsm=bsm,include_nested_stack=include_nested_stack,)