azdev/operations/linter/rules/command_group_rules.py (58 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. # ----------------------------------------------------------------------------- # pylint: disable=duplicate-code from azdev.operations.constant import DISALLOWED_HTML_TAG_RULE_LINK from ..rule_decorators import CommandGroupRule from ..linter import RuleError, LinterSeverity from ..util import has_illegal_html_tag, has_broken_site_links @CommandGroupRule(LinterSeverity.HIGH) def missing_group_help(linter, command_group_name): if not linter.get_command_group_help(command_group_name) and not linter.command_group_expired(command_group_name) \ and command_group_name != '': raise RuleError('Missing help') @CommandGroupRule(LinterSeverity.HIGH) def expired_command_group(linter, command_group_name): if linter.command_group_expired(command_group_name): raise RuleError("Deprecated command group is expired and should be removed.") @CommandGroupRule(LinterSeverity.MEDIUM) def require_wait_command_if_no_wait(linter, command_group_name): # If any command within a command group or subgroup exposes the --no-wait parameter, # the wait command should be exposed. # find commands under this group. A command in this group has one more token than the group name. group_command_names = [cmd for cmd in linter.commands if cmd.startswith(command_group_name) and len(cmd.split()) == len(command_group_name.split()) + 1] # if one of the commands in this group ends with wait we are good for cmd in group_command_names: cmds = cmd.split() if cmds[-1].lower() == "wait": return # otherwise there is no wait command. If a command in this group has --no-wait, then error out. for cmd in group_command_names: if linter.get_command_metadata(cmd).supports_no_wait: raise RuleError("Group does not have a 'wait' command, yet '{}' exposes '--no-wait'".format(cmd)) @CommandGroupRule(LinterSeverity.HIGH) def disallowed_html_tag_from_command_group(linter, command_group_name): if command_group_name == '' or not linter.get_loaded_help_entry(command_group_name): return help_entry = linter.get_loaded_help_entry(command_group_name) if help_entry.short_summary and (disallowed_tags := has_illegal_html_tag(help_entry.short_summary, linter.diffed_lines)): raise RuleError("Disallowed html tags {} in short summary. " "If the content is a placeholder, please remove <> or wrap it with backtick. " "For example: 1) <Name>-res.yaml -> `<Name>-res.yaml`; " "2) http://<URL>:<PORT> -> `http://<URL>:<PORT>`. " "For more info please refer to: {}".format(disallowed_tags, DISALLOWED_HTML_TAG_RULE_LINK)) if help_entry.long_summary and (disallowed_tags := has_illegal_html_tag(help_entry.long_summary, linter.diffed_lines)): raise RuleError("Disallowed html tags {} in long summary. " "If content is a placeholder, please remove <> or wrap it with backtick. " "For example: 1) <Name>-res.yaml -> `<Name>-res.yaml`; " "2) http://<URL>:<PORT> -> `http://<URL>:<PORT>`. " "For more info please refer to: {}".format(disallowed_tags, DISALLOWED_HTML_TAG_RULE_LINK)) @CommandGroupRule(LinterSeverity.MEDIUM) def broken_site_link_from_command_group(linter, command_group_name): if command_group_name == '' or not linter.get_loaded_help_entry(command_group_name): return help_entry = linter.get_loaded_help_entry(command_group_name) if help_entry.short_summary and (broken_links := has_broken_site_links(help_entry.short_summary, linter.diffed_lines)): raise RuleError("Broken links {} in short summary. " "If link is an example, please wrap it with backtick. ".format(broken_links)) if help_entry.long_summary and (broken_links := has_broken_site_links(help_entry.long_summary, linter.diffed_lines)): raise RuleError("Broken links {} in long summary. " "If link is an example, please wrap it with backtick. ".format(broken_links))