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)
Example #2
0
 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)
Example #3
0
    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)
Example #5
0
 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)
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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}.*",
         )
Example #10
0
    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)
Example #12
0
 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)