Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/releasenotes/4.0.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -274,3 +274,8 @@ Bugs

- Keyword name will no longer be prefixed with continuation marks (``...``) if name was longer than line length limit (#494)
- It is now safe to use Tasks sections with ``MergeAndOrderSections`` transformer with Robot Framework 6.0+ (#490)
- It is now possible to use disabler in the first line and enable it later (previously the whole file was always ignored) (#479)::

# robotidy: off
# robotidy: on
*** Settings ***
22 changes: 10 additions & 12 deletions robotidy/disablers.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ def __init__(self, start_line, end_line, file_end):
self.lines = []
self.disabled_headers = set()

@property
def file_disabled(self):
"""Check if file is disabled. Whole file is only disabled if the first line contains one line disabler."""
if not self.lines:
return False
return self.lines[0] == (1, 1)

def add_disabler(self, start_line, end_line):
self.lines.append((start_line, end_line))

Expand Down Expand Up @@ -128,9 +135,9 @@ def visit_File(self, node): # noqa
self.disablers = DisabledLines(self.start_line, self.end_line, node.end_lineno)
self.disablers.parse_global_disablers()
self.stack = []
self.file_disabled = False
self.generic_visit(node)
self.disablers.sort_disablers()
self.file_disabled = self.disablers.file_disabled

def visit_SectionHeader(self, node): # noqa
for comment in node.get_tokens(Token.COMMENT):
Expand All @@ -143,26 +150,20 @@ def visit_SectionHeader(self, node): # noqa
def visit_TestCase(self, node): # noqa
self.stack.append(0)
self.generic_visit(node)
if self.file_disabled: # stop visiting if whole file is disabled
return
self.close_disabler(node.end_lineno)

def visit_Try(self, node): # noqa
self.generic_visit(node.header)
self.stack.append(0)
for statement in node.body:
self.visit(statement)
if self.file_disabled: # stop visiting if whole file is disabled
return
self.close_disabler(node.end_lineno)
tail = node
while tail.next:
self.generic_visit(tail.header)
self.stack.append(0)
for statement in tail.body:
self.visit(statement)
if self.file_disabled: # stop visiting if whole file is disabled
return
end_line = tail.next.lineno - 1 if tail.next else tail.end_lineno
self.close_disabler(end_line=end_line)
tail = tail.next
Expand All @@ -181,11 +182,8 @@ def visit_Statement(self, node): # noqa
return
self.disablers.add_disabler(self.stack[index], node.lineno)
self.stack[index] = 0
else:
if node.lineno == 1 and index == 0:
self.file_disabled = True
elif not self.stack[index]:
self.stack[index] = node.lineno
elif not self.stack[index]:
self.stack[index] = node.lineno
else:
# inline disabler
if self.any_disabler_open():
Expand Down
4 changes: 2 additions & 2 deletions tests/utest/test_disablers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import re
from pathlib import Path
from unittest.mock import Mock

Expand Down Expand Up @@ -52,7 +51,8 @@ def test_is_node_disabled(check_start, check_end, start_line, end_line, lines, f
@pytest.mark.parametrize(
"test_file, expected_lines, file_disabled, rf_version",
[
("file_disabled.robot", [(14, 15)], True, 4),
("file_disabled.robot", [(1, 1), (14, 15)], True, 4),
("file_disabled_and_enabled.robot", [(1, 2), (15, 16)], False, 4),
("test.robot", [(13, 14), (25, 37), (30, 33), (40, 41), (46, 48), (57, 58), (67, 67)], False, 5),
("open_disabler_in_section.robot", [(5, 8), (13, 15), (20, 23)], False, 4),
("empty.robot", [], False, 4),
Expand Down
24 changes: 24 additions & 0 deletions tests/utest/testdata/disablers/file_disabled_and_enabled.robot
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# robotidy: off
# robotidy: on
*** Settings ***
Library SeleniumLibrary

Metadata Key Value

*** Test Cases ***
Test
[Documentation] This is doc
Step
FOR ${var} IN RANGE 10
IF $condition
WHILE ${arg}
${return} Keyword ${value}
... ${other_value} # robotidy: off
END
ELSE IF
Step ${arg}
... value
Step 2
# comment
END
END