Skip to content

Commit

Permalink
Fix after RF 7 [Return] model changes (#1019)
Browse files Browse the repository at this point in the history
  • Loading branch information
bhirsz committed Dec 26, 2023
1 parent 03e2704 commit e94d969
Show file tree
Hide file tree
Showing 10 changed files with 69 additions and 11 deletions.
12 changes: 12 additions & 0 deletions docs/releasenotes/unreleased/fixes.2.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[Return] setting deprecation
----------------------------

``[Return]`` setting is now visibly deprecated. The internal Robot Framework model also changed and several Robocop
rules had to be updated:

- W0306 ``setting-name-not-in-title-case``
- W0319 ``deprecated-statement``
- W0510 ``number-of-returned-values``
- W0903 ``empty-return``
- W0919 ``unused-argument``
- I0920 ``unused-variable``
2 changes: 1 addition & 1 deletion robocop/checkers/lengths.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ class NumberOfReturnedArgsChecker(VisitorChecker):
def visit_Return(self, node): # noqa
self.check_node_returns(len(node.values), node)

visit_ReturnStatement = visit_Return
visit_ReturnStatement = visit_ReturnSetting = visit_Return

def visit_KeywordCall(self, node): # noqa
if not node.keyword:
Expand Down
18 changes: 15 additions & 3 deletions robocop/checkers/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
from robot.api.parsing import Break, Continue, InlineIfHeader, ReturnStatement
except ImportError:
ReturnStatement, InlineIfHeader, Break, Continue = None, None, None, None
try:
from robot.api.parsing import ReturnSetting # RF 7.0 [Return]
except ImportError:
ReturnSetting = None

from robocop.checkers import VisitorChecker
from robocop.rules import Rule, RuleParam, RuleSeverity, SeverityThreshold
Expand Down Expand Up @@ -595,13 +599,17 @@ class ReturnChecker(VisitorChecker):
"empty-return",
)

def __init__(self):
self.return_class = Return if ROBOT_VERSION.major < 7 else ReturnSetting
super().__init__()

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):
if isinstance(child, self.return_class):
return_setting_node = child
error = (
"[Return] is not defined at the end of keyword. "
Expand Down Expand Up @@ -645,11 +653,15 @@ class UnreachableCodeChecker(VisitorChecker):

reports = ("unreachable-code",)

def __init__(self):
self.return_class = ReturnStatement if ROBOT_VERSION.major < 7 else Return
super().__init__()

def visit_Keyword(self, node): # noqa
statement_node = None

for child in node.body:
if ReturnStatement and isinstance(child, (ReturnStatement, Break, Continue)): # type: ignore[arg-type]
if isinstance(child, (self.return_class, Break, Continue)):
statement_node = child
elif not isinstance(child, (EmptyLine, Comment, Teardown)):
if statement_node is not None:
Expand Down Expand Up @@ -1211,7 +1223,7 @@ def visit_Return(self, node): # noqa
for token in node.get_tokens(Token.ARGUMENT):
self.find_not_nested_variable(token.value, is_var=False)

visit_ReturnStatement = visit_Teardown = visit_Timeout = visit_Return
visit_ReturnStatement = visit_ReturnSetting = visit_Teardown = visit_Timeout = visit_Return

def visit_TemplateArguments(self, node): # noqa
for argument in node.data_tokens:
Expand Down
12 changes: 10 additions & 2 deletions robocop/checkers/naming.py
Original file line number Diff line number Diff line change
Expand Up @@ -839,7 +839,9 @@ def visit_Setup(self, node): # noqa
visit_ResourceImport
) = (
visit_VariablesImport
) = visit_Documentation = visit_Tags = visit_Timeout = visit_Template = visit_Arguments = visit_Return = visit_Setup
) = (
visit_Documentation
) = visit_Tags = visit_Timeout = visit_Template = visit_Arguments = visit_ReturnSetting = visit_Return = visit_Setup

def visit_LibraryImport(self, node): # noqa
self.check_setting_name(node.data_tokens[0].value, node)
Expand Down Expand Up @@ -1275,8 +1277,14 @@ def visit_SuiteSetup(self, node): # noqa

def visit_Return(self, node): # noqa
"""For RETURN use visit_ReturnStatement - visit_Return will most likely visit RETURN in the future"""
if ROBOT_VERSION.major < 5:
if ROBOT_VERSION.major not in (5, 6):
return
self.check_deprecated_return(node)

def visit_ReturnSetting(self, node): # noqa
self.check_deprecated_return(node)

def check_deprecated_return(self, node):
self.report(
"deprecated-statement",
statement_name="[Return]",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
force_tags.robot:2:1 [W] 0319 'Force Tags' is deprecated since Robot Framework version 6.0, use 'Test Tags' instead
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
test.robot:2:14 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:3:17 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:4:1 [W] 0319 'Force Tags' is deprecated since Robot Framework version 6.0, use 'Test Tags' instead
test.robot:6:13 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:7:16 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:11:14 [W] 0319 'Run Keyword Unless' is deprecated since Robot Framework version 5.*, use 'IF' instead
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,19 @@
force_tags.robot:2:1 [W] 0319 'Force Tags' is deprecated since Robot Framework version 6.0, use 'Test Tags' instead
test.robot:2:14 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:3:17 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:4:1 [W] 0319 'Force Tags' is deprecated since Robot Framework version 6.0, use 'Test Tags' instead
test.robot:6:13 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:7:16 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:11:14 [W] 0319 'Run Keyword Unless' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:12:17 [W] 0319 'Run Keyword Unless' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:13:5 [W] 0319 'Run Keyword Unless' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:14:5 [W] 0319 'Run Keyword If' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:15:5 [W] 0319 'run_keyword_unless' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:16:5 [W] 0319 'builtin.run_KeywoRD_UNLESS' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:17:5 [W] 0319 'BuiltIn.Run Keyword Unless' is deprecated since Robot Framework version 5.*, use 'IF' instead
test.robot:23:13 [W] 0319 'Continue For Loop' is deprecated since Robot Framework version 5.*, use 'CONTINUE' instead
test.robot:24:13 [W] 0319 'Continue For Loop If' is deprecated since Robot Framework version 5.*, use 'IF and CONTINUE' instead
test.robot:25:13 [W] 0319 'Exit For Loop If' is deprecated since Robot Framework version 5.*, use 'IF and BREAK' instead
test.robot:26:13 [W] 0319 'BuiltIn.Exit For Loop' is deprecated since Robot Framework version 5.*, use 'BREAK' instead
test.robot:31:5 [W] 0319 'Return From Keyword If' is deprecated since Robot Framework version 5.*, use 'IF and RETURN' instead
test.robot:32:5 [W] 0319 'BuiltIn.Return From Keyword' is deprecated since Robot Framework version 5.*, use 'RETURN' instead
test.robot:34:5 [W] 0319 '[Return]' is deprecated since Robot Framework version 5.*, use 'RETURN' instead
9 changes: 7 additions & 2 deletions tests/atest/rules/naming/deprecated_statement/test_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@

class TestRuleAcceptance(RuleAcceptance):
def test_rule(self):
self.check_rule(src_files=["test.robot"], expected_file="expected_output_rf5.txt", target_version="==5.0")
self.check_rule(src_files=["test.robot"], expected_file="expected_output_rf6.txt", target_version=">=6")

def test_rule_rf5(self):
self.check_rule(src_files=["test.robot"], expected_file="expected_output_rf5.txt", target_version="==5.*")

def test_pre_rf5(self):
self.check_rule(src_files=["test.robot"], expected_file=None, target_version="<5.0")

def test_force_tags(self):
self.check_rule(src_files=["force_tags.robot"], expected_file="expected_output_rf6.txt", target_version=">=6")
self.check_rule(
src_files=["force_tags.robot"], expected_file="expected_output_force_tags.txt", target_version=">=6"
)
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,6 @@ Keyword Uppercase Settings
Fail
[TEARDOWN] Teardown
[RETURN] value

New Return
RETURN
2 changes: 1 addition & 1 deletion tests/rf_versions_matrix/requirements_rf7.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
robotframework==7.0a1
robotframework==7.0rc1

0 comments on commit e94d969

Please sign in to comment.