def check_keyword_naming(self, keyword_name, node): # noqa if not keyword_name or keyword_name.lstrip().startswith('#'): return if keyword_name == r'/': # old for loop, / are interpreted as keywords return if keyword_name.startswith('...'): self.report("not-enough-whitespace-after-newline-marker", node=node) return if '_' in keyword_name: self.report("underscore-in-keyword-name", node=node) if normalize_robot_name(keyword_name) == 'runkeywordif': for token in node.data_tokens: if (token.value.lower() in self.else_if) and not token.value.isupper(): self.report("keyword-name-is-reserved-word", token.value, self.prepare_reserved_word_rule_message( token.value, 'Run Keyword If'), node=node) elif self.check_if_keyword_is_reserved(keyword_name, node): return words = keyword_name.replace('_', ' ').split(' ') if any(not (word.istitle() or word.isupper()) for word in words if not self.is_variable(word)): self.report("not-capitalized-keyword-name", node=node)
def check_keyword_naming(self, keyword_name, node): # noqa if not keyword_name or keyword_name.lstrip().startswith('#'): return if keyword_name == r'/': # old for loop, / are interpreted as keywords return if keyword_name.startswith('...'): self.report("not-enough-whitespace-after-newline-marker", node=node) return if normalize_robot_name(keyword_name) == 'runkeywordif': for token in node.data_tokens: if (token.value.lower() in self.else_if) and not token.value.isupper(): self.report("keyword-name-is-reserved-word", token.value, self.prepare_reserved_word_rule_message( token.value, 'Run Keyword If'), node=node) elif self.check_if_keyword_is_reserved(keyword_name, node): return keyword_name = keyword_name.split('.')[ -1] # remove any imports ie ExternalLib.SubLib.Log -> Log keyword_name = self.var_pattern.sub( '', keyword_name) # remove any embedded variables from name keyword_name = keyword_name.replace("'", '') # replace ' apostrophes if '_' in keyword_name: self.report("underscore-in-keyword-name", node=node) words = self.letter_pattern.sub(' ', keyword_name).split(' ') if any(word[0].islower() for word in words if word): self.report("not-capitalized-keyword-name", node=node)
def visit_KeywordCall(self, node): # noqa if not node.keyword: return normalized_name = normalize_robot_name(node.keyword) if normalized_name == 'returnfromkeyword': self.check_node_returns(len(node.args), node) elif normalized_name == 'returnfromkeywordif': self.check_node_returns(len(node.args) - 1, node)
def visit_KeywordCall(self, node): # noqa if not node.keyword: return normalized_name = normalize_robot_name(node.keyword, remove_prefix="builtin.") if normalized_name == "returnfromkeyword": self.check_node_returns(len(node.args), node) elif normalized_name == "returnfromkeywordif": self.check_node_returns(len(node.args) - 1, node)
def visit_KeywordCall(self, node): # noqa if not node.keyword: return if normalize_robot_name(node.keyword) in self.run_keyword_variants: col = 0 for token in node.data_tokens: if token.type == Token.KEYWORD: col = token.col_offset + 1 break self.report("if-can-be-used", node.keyword, node=node, col=col)
def visit_KeywordCall(self, node): # noqa if not node.keyword: return if normalize_robot_name(node.keyword) in self.set_variable_variants: if len(node.data_tokens) < 2: return token = node.data_tokens[1] if token.type == Token.ARGUMENT and not token.value.isupper(): self.report("non-local-variables-should-be-uppercase", node=node, col=token.col_offset + 1)
def visit_KeywordCall(self, node): # noqa if not node.keyword: return if normalize_robot_name( node.keyword, remove_prefix="builtin.") in self.run_keyword_variants: col = keyword_col(node) self.report("if-can-be-used", run_keyword=node.keyword, node=node, col=col)
def visit_KeywordCall(self, node): # noqa if node.errors or self.loops: return if normalize_robot_name(node.keyword, remove_prefix="builtin.") in self.for_keyword: self.report( "statement-outside-loop", name=f"'{node.keyword}'", statement_type="keyword", node=node, col=keyword_col(node), )
def check_if_keyword_is_deprecated(self, keyword_name, node): normalized_keyword_name = normalize_robot_name( keyword_name, remove_prefix="builtin.") deprecated_statements = self.deprecated_keywords.get( ROBOT_VERSION.major, {}) if normalized_keyword_name in deprecated_statements: alternative = deprecated_statements[normalized_keyword_name] col = token_col(node, Token.NAME, Token.KEYWORD) self.report( "deprecated-statement", statement_name=keyword_name, alternative=alternative, node=node, col=col, version=f"{ROBOT_VERSION.major}.*", )
def visit_Keyword(self, node): # noqa return_setting_node = None keyword_after_return = False return_from = False error = "" for child in node.body: if isinstance(child, Return): return_setting_node = child error = ( "[Return] is not defined at the end of keyword. " "Note that [Return] does not quit from keyword but only set variables to be returned" ) if not child.values: self.report("empty-return", node=child, col=child.end_col_offset) elif ReturnStatement and isinstance( child, ReturnStatement): # type: ignore[arg-type] return_setting_node = child error = "RETURN is not defined at the end of keyword" elif not isinstance(child, (EmptyLine, Comment, Teardown)): if return_setting_node is not None: keyword_after_return = True if isinstance(child, KeywordCall): if return_from: keyword_after_return = True return_setting_node = child error = "Keyword call after 'Return From Keyword'" elif normalize_robot_name( child.keyword, remove_prefix="builtin.") == "returnfromkeyword": return_from = True if keyword_after_return: token = return_setting_node.data_tokens[0] self.report("keyword-after-return", error_msg=error, node=token, col=token.col_offset + 1) self.generic_visit(node)
def check_keyword_naming(self, keyword_name, node): # noqa if not keyword_name or keyword_name.lstrip().startswith("#"): return if keyword_name == r"/": # old for loop, / are interpreted as keywords return if (isinstance(node, KeywordCall) and normalize_robot_name( keyword_name, remove_prefix="builtin.") == "runkeywordif"): for token in node.data_tokens: if (token.value.lower() in self.else_statements) and not token.value.isupper(): self.report( "keyword-name-is-reserved-word", keyword_name=token.value, error_msg=reserved_error_msg(token.value, "'Run Keyword If'"), node=node, col=token.col_offset + 1, ) elif self.check_if_keyword_is_reserved(keyword_name, node): return self.check_bdd_keywords(keyword_name, node) normalized = remove_robot_vars(keyword_name) normalized = self.param("wrong-case-in-keyword-name", "pattern").sub("", normalized) normalized = normalized.split(".")[ -1] # remove any imports ie ExternalLib.SubLib.Log -> Log normalized = normalized.replace("'", "") # replace ' apostrophes if "_" in normalized: self.report("underscore-in-keyword-name", keyword_name=keyword_name, node=node) words = self.letter_pattern.sub(" ", normalized).split(" ") if self.param("wrong-case-in-keyword-name", "convention") == "first_word_capitalized": words = words[:1] if any(word[0].islower() for word in words if word): self.report("wrong-case-in-keyword-name", keyword_name=keyword_name, node=node)
def visit_Keyword(self, node): # noqa return_setting_node = None keyword_after_return = False return_from = False for child in node.body: if isinstance(child, Return): return_setting_node = child if not child.values: self.report("empty-return", node=child, col=child.end_col_offset) elif isinstance(child, KeywordCall): if return_setting_node is not None: keyword_after_return = True if return_from: self.report("keyword-after-return-from", node=child) if normalize_robot_name(child.keyword) == 'returnfromkeyword': return_from = True if keyword_after_return: self.report("keyword-after-return", node=return_setting_node, col=return_setting_node.end_col_offset)
def visit_KeywordCall(self, node): # noqa for token in node.get_tokens(Token.ASSIGN): if "-" in token.value: self.report( "hyphen-in-variable-name", variable_name=token.value, lineno=token.lineno, col=token.col_offset + 1, ) if not node.keyword: return if normalize_robot_name( node.keyword, remove_prefix="builtin.") in self.set_variable_variants: if len(node.data_tokens) < 2: return token = node.data_tokens[1] if token.type == Token.ARGUMENT and not token.value.isupper(): self.report( "non-local-variables-should-be-uppercase", node=node, col=token.col_offset + 1, )
def visit_Variable(self, node): # noqa if not node.name: return var_name = normalize_robot_name(self.replace_chars(node.name, '${}@&')) self.variables[var_name].append(node)
def visit_Keyword(self, node): # noqa keyword_name = normalize_robot_name(node.name) self.keywords[keyword_name].append(node)
def visit_TestCase(self, node): # noqa testcase_name = normalize_robot_name(node.name) self.test_cases[testcase_name].append(node)