tools/automation/cli_linter/rule_decorators.py (43 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 .linter import RuleError def help_file_entry_rule(func): return _get_decorator(func, 'help_file_entries', 'Help-Entry: `{}`') def command_rule(func): return _get_decorator(func, 'commands', 'Command: `{}`') def command_group_rule(func): return _get_decorator(func, 'command_groups', 'Command-Group: `{}`') def parameter_rule(func): def add_to_linter(linter_manager): def wrapper(): linter = linter_manager.linter for command_name in linter.commands: for parameter_name in linter.get_command_parameters(command_name): exclusion_parameters = linter_manager.exclusions.get(command_name, {}).get('parameters', {}) exclusions = exclusion_parameters.get(parameter_name, {}).get('rule_exclusions', []) if func.__name__ not in exclusions: try: func(linter, command_name, parameter_name) except RuleError as ex: linter_manager.mark_rule_failure() yield _create_violation_msg(ex, 'Parameter: {}, `{}`', command_name, parameter_name) linter_manager.add_rule('params', func.__name__, wrapper) add_to_linter.linter_rule = True return add_to_linter def _get_decorator(func, rule_group, print_format): def add_to_linter(linter_manager): def wrapper(): linter = linter_manager.linter for iter_entity in getattr(linter, rule_group): exclusions = linter_manager.exclusions.get(iter_entity, {}).get('rule_exclusions', []) if func.__name__ not in exclusions: try: func(linter, iter_entity) except RuleError as ex: linter_manager.mark_rule_failure() yield _create_violation_msg(ex, print_format, iter_entity) linter_manager.add_rule(rule_group, func.__name__, wrapper) add_to_linter.linter_rule = True return add_to_linter def _create_violation_msg(ex, format_string, *format_args): violation_string = format_string.format(*format_args) return ' {} - {}'.format(violation_string, ex)