def msg_0102_0204(): return { "0102": Rule(rule_id="0102", name="other-message", msg="""this is description""", severity=RuleSeverity.ERROR), "0204": Rule( rule_id="0204", name="another-message", msg=f"Message with meaning {4}", severity=RuleSeverity.INFO ), }
def warning_msg(): return Rule( RuleParam(name="param_name", converter=int, default=1, desc=""), rule_id="0102", name="warning-message", msg="Some description", severity=RuleSeverity.WARNING, )
def valid_msg_with_conf(): return Rule( RuleParam(name="param_name", converter=int, default=1, desc=""), rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING, )
def error_msg(): return Rule( RuleParam(name="param_name", converter=int, default=1, desc=""), rule_id="0101", name="error-message", msg="Some description", severity=RuleSeverity.ERROR, )
def msg_0102_0204_config(): return { "0102": Rule( RuleParam(name="conf_param1", converter=int, default=0, desc=""), rule_id="0102", name="other-message", msg="""this is description""", severity=RuleSeverity.ERROR, ), "0204": Rule( RuleParam(name="conf_param2", converter=int, default=0, desc=""), rule_id="0204", name="another-message", msg=f"Message with meaning {4}", severity=RuleSeverity.INFO, ), }
def info_msg(): return Rule( RuleParam(name="param_name", converter=int, default=1, desc=""), rule_id="0103", name="info-message", msg="Some description", severity=RuleSeverity.INFO, )
def test_parse_invalid_configurable(self, configurable): msg = ("some-message", "Some description", RuleSeverity.WARNING) body = msg + tuple(configurable) with pytest.raises( robocop.exceptions.InvalidRuleConfigurableError) as err: Rule('0101', body) assert rf"Fatal error: Rule '0101' has invalid configurable:\n{body}" in str( err)
def test_parse_valid_configurable(self): rule = Rule( RuleParam(name="Some", default="5", converter=int, desc=""), rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING, ) assert rule.config["Some"].value == 5
def msg_0101_config(): return { "0101": Rule( RuleParam(name="conf_param", converter=int, default=0, desc=""), rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING, ) }
def get_message_with_id_sev(rule_id, sev): for severity in RuleSeverity: rule_id = rule_id.replace(severity.value, "") return Rule( RuleParam(name="param_name", converter=int, default=1, desc=""), rule_id="0101", name=f"some-message-{rule_id}", msg="Some description", severity=sev, )
def test_parse_invalid_configurable(self): with pytest.raises(robocop.exceptions.RuleParamFailedInitError) as err: Rule( RuleParam(name="Some", default="s", converter=int, desc=""), rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING, ) assert ( rf"Failed to configure param `Some` with value `s`. " rf"Received error `invalid literal for int() with base 10: 's'`.\n Parameter type: <class 'int'>\n" in str(err) )
def test_prepare_message_with_jinja(self, kwargs, msg, exp): # noqa node = ast.AST() node.lineno = 10 rule = Rule(rule_id="0101", name="some-message", msg=msg, severity=RuleSeverity.WARNING) msg = rule.prepare_message( source="file1.robot", node=node, lineno=None, col=None, end_lineno=None, end_col=None, ext_disablers=None, **kwargs, ) assert msg.desc == exp
def test_get_non_existing_param(self): checker = ValidChecker() checker.rules = { "some-message": Rule( RuleParam(name="param", converter=int, default=5, desc="This is desc"), rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING, ) } with pytest.raises(robocop.exceptions.RuleParamNotFoundError): checker.param("some-message", "param2")
def message(): rule = Rule( RuleParam(name="param_name", converter=int, default=1, desc=""), rule_id="1010", name="somerule", msg="Some description", severity=RuleSeverity.WARNING, ) return Message( rule=rule, msg=rule.get_message(), source=None, node=None, lineno=None, col=None, end_lineno=None, end_col=None, )
def test_get_param_with_non_existing_rule(self, robocop_instance): checker = ValidChecker() checker.rules = { "some-message": Rule( RuleParam(name="param", converter=int, default=5, desc="This is desc"), rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING, ) } with pytest.raises(robocop.exceptions.RuleNotFoundError) as err: checker.param("idontexist", "param") assert "ValidChecker checker does not contain rule `idontexist`. Available rules: some-message" in str( err)
def message(): msg = ("somerule", "Some description", RuleSeverity.WARNING) return Rule('1010', msg)
def message(): msg = ("some-message", "Some description", RuleSeverity.WARNING, ('param_name', 'param_priv_name', int)) return Rule('0101', msg)
from collections import Counter from robot.api import Token from robot.parsing.model.blocks import Keyword, TestCase from robot.parsing.model.statements import Comment, EmptyLine from robot.parsing.model.visitor import ModelVisitor from robocop.checkers import RawFileChecker, VisitorChecker from robocop.rules import Rule, RuleParam, RuleSeverity from robocop.utils import get_errors, get_section_name, token_col rules = { "1001": Rule( rule_id="1001", name="trailing-whitespace", msg="Trailing whitespace at the end of line", severity=RuleSeverity.WARNING, ), "1002": Rule( rule_id="1002", name="missing-trailing-blank-line", msg="Missing trailing blank line at the end of file", severity=RuleSeverity.WARNING, ), "1003": Rule( RuleParam( name="empty_lines", default=2, converter=int,
def register_rules(self, rules): for key, value in rules.items(): rule = Rule(key, value) if rule.name in self.rules_map: raise DuplicatedRuleError('name', rule.name, self, self) self.rules_map[rule.name] = rule
from robocop.checkers import VisitorChecker from robocop.rules import Rule, RuleSeverity rules = { "1102": Rule(rule_id="1102", name="smth2", msg="Keyword call after [Return] statement", severity=RuleSeverity.ERROR) } class SmthChecker(VisitorChecker): """Checker for keyword calls after [Return] statement.""" reports = ("smth2", ) def visit_Keyword(self, node): # noqa self.report("smth", node=node)
token_col, ) rules = { "0301": Rule( RuleParam( name="pattern", default=re.compile(r"[\.\?]"), converter=pattern_type, desc="pattern defining characters (not) allowed in a name", ), rule_id="0301", name="not-allowed-char-in-name", msg= "Not allowed character '{{ character }}' found in {{ block_name }} name", severity=RuleSeverity.WARNING, docs=""" Reports not allowed pattern found in Test Case or Keyword names. By default it's dot (`.`). You can configure what patterns are reported by calling:: robocop --configure not-allowed-char-in-name:pattern:regex_pattern `regex_pattern` should define regex pattern not allowed in names. For example `[@\[]` pattern reports any occurrence of `@[` characters. """, ), "0302": Rule( RuleParam( name="convention", default="each_word_capitalized",
def valid_msg(): return Rule(rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING)
def get_message_with_id(rule_id): rule_id = Config.replace_severity_values(rule_id) return Rule(rule_id=rule_id, name=f"some-message-{rule_id}", msg="Some description", severity=RuleSeverity.WARNING)
def get_message_with_id(rule_id): for char in RuleSeverity: rule_id = rule_id.replace(char.value, '') msg = (f"some-message-{rule_id}", "Some description", RuleSeverity.WARNING) return Rule(rule_id, msg)
def msg_0101(): return {"0101": Rule(rule_id="0101", name="some-message", msg="Some description", severity=RuleSeverity.WARNING)}
def msg_disabled_for_4(): return { "9999": Rule( rule_id="9999", name="disabled-in-four", msg="This is desc", severity=RuleSeverity.WARNING, version="<4.0" ) }
def valid_msg(): msg = ("some-message", "Some description", RuleSeverity.WARNING) return Rule('0101', msg)
def test_parse_invalid_body(self, msg): with pytest.raises(robocop.exceptions.InvalidRuleBodyError) as err: Rule('0101', msg) assert rf"Fatal error: Rule '0101' has invalid body:\n{msg}" in str( err)
from robot.parsing.model.blocks import CommentSection, TestCase from robot.parsing.model.statements import Arguments, Comment, EmptyLine, KeywordCall from robocop.checkers import RawFileChecker, VisitorChecker from robocop.rules import Rule, RuleParam, RuleSeverity from robocop.utils import get_section_name, last_non_empty_line, normalize_robot_name, pattern_type rules = { "0501": Rule( RuleParam(name="max_len", default=40, converter=int, desc="number of lines allowed in a keyword"), rule_id="0501", name="too-long-keyword", msg= "Keyword '{{ keyword_name }}' is too long ({{ keyword_length }}/{{ allowed_length}})", severity=RuleSeverity.WARNING, ), "0502": Rule( RuleParam(name="min_calls", default=1, converter=int, desc="number of keyword calls required in a keyword"), rule_id="0502", name="too-few-calls-in-keyword", msg= "Keyword '{{ keyword_name }}' has too few keywords inside ({{ keyword_count }}/{{ min_allowed_count }})",
def test_parse_valid_configurable(self, configurable): msg = ("some-message", "Some description", RuleSeverity.WARNING) body = msg + tuple(configurable) rule = Rule('0101', body) assert rule.configurable == configurable