azure-cli-diff-tool/azure_cli_diff_tool/meta_change.py (300 lines of code) (raw):
# -----------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# -----------------------------------------------------------------------------
from .utils import get_change_rule_template, get_change_suggest_template, DiffLevel
from ._const import BREAKING_CHANE_RULE_LINK_URL_PREFIX, BREAKING_CHANE_RULE_LINK_URL_SUFFIX, \
SUBGROUP_PROPERTY_IGNORED_LIST, CMD_PROPERTY_IGNORED_LIST, PARA_NAME_IGNORED_LIST, \
PARA_PROPERTY_IGNORED_LIST, PARA_VALUE_IGNORED_LIST
class MetaChange:
def __init__(self, rule_id="1000", is_break=False, diff_level=DiffLevel.INFO, rule_message="", suggest_message="",
is_ignore=False, filter_key=None):
self.rule_id = rule_id
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = rule_message
self.suggest_message = suggest_message
self.rule_link_url = BREAKING_CHANE_RULE_LINK_URL_PREFIX + self.rule_id + BREAKING_CHANE_RULE_LINK_URL_SUFFIX
self.is_ignore = is_ignore
self.filter_key = filter_key
def __str__(self):
res = [self.rule_message, "diff_level: " + str(self.diff_level.value)]
if self.is_break:
res.append("is_break: {0}".format(self.is_break))
res.append(self.suggest_message)
return " | ".join([str(a) for a in res])
class SubgroupAdd(MetaChange):
def __init__(self, subgroup_name, is_break=False, diff_level=DiffLevel.INFO):
if not subgroup_name:
raise Exception("sub group name needed")
self.rule_id = "1011"
self.subgroup_name = subgroup_name
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.subgroup_name)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.subgroup_name) \
if self.is_break else ""
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message)
class SubgroupRemove(MetaChange):
def __init__(self, subgroup_name, is_break=True, diff_level=DiffLevel.BREAK):
if not subgroup_name:
raise Exception("sub group name needed")
self.rule_id = "1012"
self.subgroup_name = subgroup_name
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.subgroup_name)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.subgroup_name) \
if self.is_break else ""
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message)
class SubgroupPropAdd(MetaChange):
def __init__(self, subgroup_name, subgroup_property, is_break=False, diff_level=DiffLevel.INFO):
if not subgroup_name or not subgroup_property:
raise Exception("sub group name needed")
self.rule_id = "1013"
self.is_ignore = False
self.subgroup_name = subgroup_name
self.subgroup_property = subgroup_property
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.subgroup_name, self.subgroup_property)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.subgroup_property, self.subgroup_name) \
if self.is_break else ""
if subgroup_property in SUBGROUP_PROPERTY_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.subgroup_name, self.subgroup_property]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message, self.is_ignore,
self.filter_key)
class SubgroupPropRemove(MetaChange):
def __init__(self, subgroup_name, subgroup_property, is_break=False, diff_level=DiffLevel.BREAK):
if not subgroup_name or not subgroup_property:
raise Exception("sub group name needed")
self.rule_id = "1014"
self.is_ignore = False
self.subgroup_name = subgroup_name
self.subgroup_property = subgroup_property
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.subgroup_name, self.subgroup_property)
if self.is_break:
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.subgroup_property,
self.subgroup_name)
else:
self.suggest_message = ""
if subgroup_property in CMD_PROPERTY_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.subgroup_name, self.subgroup_property]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message,
self.is_ignore, self.filter_key)
class SubgroupPropUpdate(MetaChange):
def __init__(self, subgroup_name, subgroup_property, is_break=False, diff_level=DiffLevel.INFO,
old_value=None, new_value=None):
if not subgroup_name or not subgroup_property:
raise Exception("sub group name and sub group prop needed")
self.rule_id = "1015"
self.is_ignore = False
self.subgroup_name = subgroup_name
self.is_break = is_break
self.diff_level = diff_level
self.subgroup_prop_updated = subgroup_property
self.old_value = ""
self.new_value = ""
if old_value is not None:
self.old_value = old_value
if new_value is not None:
self.new_value = new_value
self.rule_message = get_change_rule_template(self.rule_id).format(self.subgroup_name,
self.subgroup_prop_updated,
self.old_value, self.new_value)
if self.is_break:
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.subgroup_prop_updated,
self.new_value, self.old_value,
self.subgroup_name)
else:
self.suggest_message = ""
if subgroup_property in SUBGROUP_PROPERTY_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.subgroup_name, self.subgroup_prop_updated]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message,
self.is_ignore, self.filter_key)
class CmdAdd(MetaChange):
def __init__(self, cmd_name, is_break=False, diff_level=DiffLevel.INFO):
if not cmd_name:
raise Exception("cmd name needed")
self.rule_id = "1001"
self.cmd_name = cmd_name
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.cmd_name) if self.is_break else ""
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message)
class CmdRemove(MetaChange):
def __init__(self, cmd_name, is_break=True, diff_level=DiffLevel.BREAK):
if not cmd_name:
raise Exception("cmd name needed")
self.cmd_name = cmd_name
self.rule_id = "1002"
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.cmd_name) if self.is_break else ""
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message)
class CmdPropAdd(MetaChange):
def __init__(self, cmd_name, cmd_property, is_break=False, diff_level=DiffLevel.INFO):
if not cmd_name or not cmd_property:
raise Exception("cmd name needed")
self.rule_id = "1003"
self.is_ignore = False
self.cmd_name = cmd_name
self.cmd_property = cmd_property
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.cmd_property)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.cmd_property, self.cmd_name) \
if self.is_break else ""
if cmd_property in CMD_PROPERTY_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.cmd_name, self.cmd_property]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message, self.is_ignore,
self.filter_key)
class CmdPropRemove(MetaChange):
def __init__(self, cmd_name, cmd_property, is_break=False, diff_level=DiffLevel.BREAK):
if not cmd_name or not cmd_property:
raise Exception("cmd name needed")
self.rule_id = "1004"
self.is_ignore = False
self.cmd_name = cmd_name
self.cmd_property = cmd_property
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.cmd_property)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.cmd_property, self.cmd_name) \
if self.is_break else ""
if cmd_property in CMD_PROPERTY_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.cmd_name, self.cmd_property]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message,
self.is_ignore, self.filter_key)
class CmdPropUpdate(MetaChange):
def __init__(self, cmd_name, cmd_property, is_break=False, diff_level=DiffLevel.INFO,
old_value=None, new_value=None):
if not cmd_name or not cmd_property:
raise Exception("cmd name and cmd prop needed")
self.rule_id = "1005"
self.is_ignore = False
self.cmd_name = cmd_name
self.is_break = is_break
self.diff_level = diff_level
self.cmd_prop_updated = cmd_property
self.old_value = ""
self.new_value = ""
if old_value is not None:
self.old_value = old_value
if new_value is not None:
self.new_value = new_value
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.cmd_prop_updated,
self.old_value, self.new_value)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.cmd_prop_updated,
self.new_value, self.old_value,
self.cmd_name) if self.is_break else ""
if cmd_property in CMD_PROPERTY_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.cmd_name, self.cmd_prop_updated]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message,
self.is_ignore, self.filter_key)
class ParaAdd(MetaChange):
def __init__(self, cmd_name, para_name, is_break=False, diff_level=DiffLevel.INFO):
if not cmd_name or not para_name:
raise Exception("cmd name, parameter name needed")
self.rule_id = "1006"
self.cmd_name = cmd_name
self.para_name = para_name
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.para_name)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.para_name,
self.cmd_name) if self.is_break else ""
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message)
class ParaRemove(MetaChange):
def __init__(self, cmd_name, para_name, is_break=False, diff_level=DiffLevel.BREAK):
if not cmd_name or not para_name:
raise Exception("cmd name, parameter name needed")
self.rule_id = "1007"
self.cmd_name = cmd_name
self.para_name = para_name
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.para_name)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.para_name,
self.cmd_name) if self.is_break else ""
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message)
class ParaPropAdd(MetaChange):
def __init__(self, cmd_name, para_name, para_property, para_prop_value, is_break=False, diff_level=DiffLevel.INFO):
if not cmd_name or not para_name or not para_property:
raise Exception("cmd name, parameter name and parameter property needed")
self.rule_id = "1008"
self.is_ignore = False
self.cmd_name = cmd_name
self.para_name = para_name
self.para_prop = para_property
self.para_prop_value = para_prop_value
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.para_name,
self.para_prop, self.para_prop_value)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.para_prop,
self.para_prop_value,
self.para_name,
self.cmd_name) if self.is_break else ""
if para_property in PARA_PROPERTY_IGNORED_LIST or para_name in PARA_NAME_IGNORED_LIST:
self.is_ignore = True
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message, self.is_ignore)
class ParaPropRemove(MetaChange):
def __init__(self, cmd_name, para_name, para_property, para_prop_value, is_break=False, diff_level=DiffLevel.BREAK):
if not cmd_name or not para_name or not para_property:
raise Exception("cmd name, parameter name and parameter property needed")
self.rule_id = "1009"
self.is_ignore = False
self.cmd_name = cmd_name
self.para_name = para_name
self.para_prop = para_property
self.para_prop_value = para_prop_value
self.is_break = is_break
self.diff_level = diff_level
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.para_name,
self.para_prop, self.para_prop_value)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.para_prop,
self.para_prop_value,
self.para_name,
self.cmd_name) if self.is_break else ""
if para_property in PARA_PROPERTY_IGNORED_LIST or para_name in PARA_NAME_IGNORED_LIST:
self.is_ignore = True
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message, self.is_ignore)
class ParaPropUpdate(MetaChange):
def __init__(self, cmd_name, para_name, para_property, is_break=False, diff_level=DiffLevel.INFO,
old_value=None, new_value=None):
if not cmd_name or not para_name or not para_property:
raise Exception("cmd name, parameter name and parameter property needed")
self.rule_id = "1010"
self.is_ignore = False
self.cmd_name = cmd_name
self.para_name = para_name
self.para_prop_updated = para_property
self.is_break = is_break
self.diff_level = diff_level
self.old_value = None
self.new_value = None
if old_value is not None:
self.old_value = old_value
if new_value is not None:
self.new_value = new_value
self.rule_message = get_change_rule_template(self.rule_id).format(self.cmd_name, self.para_name,
self.para_prop_updated,
self.old_value, self.new_value)
self.suggest_message = get_change_suggest_template(self.rule_id).format(self.para_prop_updated,
self.new_value, self.old_value,
self.para_name,
self.cmd_name) if self.is_break else ""
if para_property in PARA_PROPERTY_IGNORED_LIST or para_name in PARA_NAME_IGNORED_LIST:
self.is_ignore = True
if self.new_value in PARA_VALUE_IGNORED_LIST or self.old_value in PARA_VALUE_IGNORED_LIST:
self.is_ignore = True
self.filter_key = [self.rule_id, self.cmd_name, self.para_name, self.para_prop_updated]
super().__init__(self.rule_id, is_break, diff_level, self.rule_message, self.suggest_message,
self.is_ignore, self.filter_key)