Skip to content

Commit d28f9ef

Browse files
authored
Fix MergeAndOrderSections trailing EOL in inline IF handling (#272)
* Fix MergeAndOrderSections trailing EOL in inline IF handling * Prepare Github Actions for RF5 * Remove not used imports * Extra empty line
1 parent b5d815d commit d28f9ef

File tree

14 files changed

+103
-30
lines changed

14 files changed

+103
-30
lines changed

.github/workflows/unit-tests.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@ jobs:
1616
include:
1717
- os: 'windows-latest'
1818
python-version: '3.9'
19-
rf-version: 'recent'
19+
rf-version: 'stable5'
2020
- os: 'ubuntu-latest'
2121
python-version: '3.6'
2222
rf-version: 'stable4'
2323
- os: 'ubuntu-latest'
2424
python-version: '3.7'
25-
rf-version: 'recent'
25+
rf-version: 'stable4'
2626
- os: 'ubuntu-latest'
2727
python-version: '3.8'
28-
rf-version: 'recent'
28+
rf-version: 'stable5'
2929
- os: 'ubuntu-latest'
3030
python-version: '3.9'
31-
rf-version: 'alpha5'
31+
rf-version: 'stable5'
3232
- os: 'ubuntu-latest'
3333
python-version: '3.10'
34-
rf-version: 'recent'
34+
rf-version: 'stable5'
3535
runs-on: ${{ matrix.os }}
3636

3737
steps:

robotidy/transformers/MergeAndOrderSections.py

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
from robot.parsing.model.statements import Statement
33

44
from robotidy.exceptions import InvalidParameterValueError
5-
import click
5+
6+
try:
7+
from robot.api.parsing import InlineIfHeader
8+
except ImportError:
9+
InlineIfHeader = None
610

711

812
class MergeAndOrderSections(ModelTransformer):
@@ -103,7 +107,15 @@ def visit_File(self, node): # noqa
103107
return node
104108

105109
@staticmethod
106-
def from_last_section(node):
110+
def normalize_eol(tokens):
111+
new_tokens = []
112+
for tok in tokens:
113+
if tok.type == Token.EOL:
114+
tok.value = "\n"
115+
new_tokens.append(tok)
116+
return new_tokens
117+
118+
def from_last_section(self, node):
107119
"""Last node use different logic for new line marker. It is not possible to preserve all empty lines but
108120
we need at least ensure that following code::
109121
@@ -114,27 +126,35 @@ def from_last_section(node):
114126
*** Variables ****** Test Case ***
115127
116128
"""
117-
if node.body:
118-
last_statement = node.body[-1]
119-
new_line = [Token(Token.EOL, "\n")]
120-
if hasattr(last_statement, "body"):
121-
if not last_statement.body:
122-
node.body[-1].body.append(EmptyLine.from_params(eol="\n"))
123-
else:
124-
last_statement = last_statement.body[-1]
125-
if hasattr(last_statement, "end"):
126-
if last_statement.end:
127-
node.body[-1].body[-1].end = Statement.from_tokens(
128-
list(last_statement.end.tokens[:-1]) + new_line
129-
)
130-
else:
131-
node.body[-1].body[-1] = Statement.from_tokens(list(last_statement.tokens[:-1]) + new_line)
132-
else:
133-
node.body[-1] = Statement.from_tokens(list(last_statement.tokens[:-1]) + new_line)
129+
# Empty sections, just *** Test Cases *** etc
130+
if not node.body:
131+
node.header.tokens = self.normalize_eol(node.header.tokens)
132+
return node
133+
134+
# Settings, Variables or Comments
135+
if not hasattr(node.body[-1], "body"):
136+
node.body[-1].tokens = self.normalize_eol(node.body[-1].tokens)
137+
return node
138+
139+
# Last keyword or test case
140+
if not node.body[-1].body:
141+
node.body[-1].body.append(EmptyLine.from_params())
142+
return node
143+
144+
last_statement = node.body[-1].body[-1]
145+
if hasattr(last_statement, "end"):
146+
if (
147+
InlineIfHeader
148+
and hasattr(last_statement, "header")
149+
and isinstance(last_statement.header, InlineIfHeader)
150+
):
151+
if not last_statement.errors:
152+
node.body[-1].body[-1].body[-1].tokens = self.normalize_eol(last_statement.body[-1].tokens)
153+
return node
154+
if last_statement.end: # not end if parsing errors
155+
node.body[-1].body[-1].end.tokens = self.normalize_eol(last_statement.end.tokens)
134156
else:
135-
last_token = node.header.tokens[-1]
136-
if last_token.type == Token.EOL:
137-
node.header = Statement.from_tokens(list(node.header.tokens[:-1]) + [Token(Token.EOL, "\n")])
157+
node.body[-1].body[-1] = Statement.from_tokens(self.normalize_eol(last_statement.tokens))
138158
return node
139159

140160
def get_section_type(self, section):
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*** Test Cases ***
2+
foo
3+
No Operation
4+
5+
*** Keywords ***
6+
Bar
7+
IF ${True} No Operation
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*** Test Cases ***
2+
foo
3+
No Operation
4+
5+
*** Keywords ***
6+
Bar
7+
IF ${True} No Operation

tests/atest/transformers/MergeAndOrderSections/test_transformer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,6 @@ def test_invalid_order_parameter(self, parameter):
6767
"order=comments,settings,variables,testcases,variables\n"
6868
)
6969
assert expected_output == result.output
70+
71+
def test_inline_if(self):
72+
self.compare("inline_if.robot")
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*** Test Cases ***
2+
foo
3+
No Operation
4+
5+
*** Keywords ***
6+
Bar
7+
IF ${True} No Operation
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*** Test Cases ***
2+
foo
3+
No Operation
4+
5+
*** Keywords ***
6+
Bar
7+
IF ${True} No Operation
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*** Test Cases ***
2+
foo
3+
No Operation
4+
5+
*** Keywords ***
6+
Bar
7+
IF ${True} No Operation
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
*** Test Cases ***
2+
foo
3+
No Operation
4+
5+
*** Keywords ***
6+
Bar
7+
IF ${True} No Operation
8+

tests/atest/transformers/NormalizeNewLines/test_transformer.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,11 @@ def test_consecutive_empty_lines(self, empty_lines):
4747
expected=f"consecutive_empty_lines_{empty_lines}line.robot",
4848
config=f":consecutive_lines={empty_lines}",
4949
)
50+
51+
@pytest.mark.parametrize("trailing_lines", [0, 1, 2])
52+
def test_inline_if(self, trailing_lines):
53+
self.compare(
54+
source=f"inline_if_{trailing_lines}_lines.robot",
55+
expected="inline_if.robot",
56+
target_version=5
57+
)

0 commit comments

Comments
 (0)