Skip to content

Commit 6b9d2b6

Browse files
committed
tidy: make all formatting changes to parsing model
This allows also programmatic access to the tidied AST
1 parent 5916caa commit 6b9d2b6

File tree

7 files changed

+252
-94
lines changed

7 files changed

+252
-94
lines changed

src/robot/parsing/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@ def print_suite(suite):
5151

5252
from .builders import get_model, get_resource_model
5353
from .lexer import get_tokens, get_resource_tokens, Token
54-
from .model import ModelVisitor
54+
from .model import ModelTransformer
5555
from .suitestructure import SuiteStructureBuilder, SuiteStructureVisitor

src/robot/parsing/builders.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ class TestCaseSectionBuilder(SectionBuilder):
9090

9191
def statement(self, statement):
9292
if statement.type == Token.EOL:
93+
if self.model.body.items:
94+
self.model.body.add(statement)
9395
return self
9496
model = TestCase(statement)
9597
self.model.body.add(model)
@@ -100,6 +102,8 @@ class KeywordSectionBuilder(SectionBuilder):
100102

101103
def statement(self, statement):
102104
if statement.type == Token.EOL:
105+
if self.model.body.items:
106+
self.model.body.add(statement)
103107
return self
104108
model = Keyword(statement)
105109
self.model.body.add(model)

src/robot/parsing/model/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@
1616
from .blocks import (File, SettingSection, VariableSection, TestCaseSection,
1717
KeywordSection, CommentSection, TestCase, Keyword, ForLoop)
1818
from .statements import get_statements
19-
from .visitor import ModelVisitor
19+
from .visitor import ModelTransformer

src/robot/parsing/model/statements.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,12 @@ def _tokens(self, *types):
7777

7878
@property
7979
def lines(self):
80-
if self.type in Token.SETTING_TOKENS and len(self.tokens) == 1:
81-
return
8280
line = []
8381
for token in self.tokens:
84-
if token.type != Token.CONTINUATION:
85-
line.append(token)
86-
else:
82+
line.append(token)
83+
if token.type == Token.EOL:
8784
yield line
88-
line = [token]
85+
line = []
8986
if line:
9087
yield line
9188

@@ -424,4 +421,4 @@ def error(self):
424421

425422

426423
class EmptyLine(Statement):
427-
pass
424+
type = Token.EOL

src/robot/parsing/model/visitor.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@
1616
import ast
1717

1818

19-
class ModelVisitor(ast.NodeVisitor):
20-
21-
def visit(self, node):
22-
visitor = self._find_visitor(type(node)) or self.generic_visit
23-
return visitor(node)
19+
class VisitorFinder(object):
2420

2521
def _find_visitor(self, cls):
2622
if cls is ast.AST:
@@ -32,3 +28,17 @@ def _find_visitor(self, cls):
3228
visitor = self._find_visitor(base)
3329
if visitor:
3430
return visitor
31+
32+
33+
class ModelVisitor(ast.NodeVisitor, VisitorFinder):
34+
35+
def visit(self, node):
36+
visitor = self._find_visitor(type(node)) or self.generic_visit
37+
visitor(node)
38+
39+
40+
class ModelTransformer(ast.NodeTransformer, VisitorFinder):
41+
42+
def visit(self, node):
43+
visitor = self._find_visitor(type(node)) or self.generic_visit
44+
return visitor(node)

src/robot/tidypkg/datafilewriter.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from robot.errors import DataError
1717
from robot.utils import file_writer
1818

19-
from .transformers import Aligner, Cleaner, Formatter, SeparatorRemover
19+
from .transformers import Aligner, Cleaner, Formatter, SeparatorCleaner, PipeAdder, NewlineAdder
2020

2121

2222
class DataFileWriter(object):
@@ -39,8 +39,12 @@ def write(self, model):
3939
"""
4040

4141
with WritingContext(model, **self._options) as ctx:
42-
SeparatorRemover().visit(model)
4342
Cleaner().visit(model)
43+
NewlineAdder().visit(model)
44+
if ctx.pipe_separated:
45+
PipeAdder().visit(model)
46+
else:
47+
SeparatorCleaner(ctx).visit(model)
4448
Aligner(ctx).visit(model)
4549
Formatter(ctx, RowWriter(ctx)).visit(model)
4650

@@ -112,24 +116,7 @@ class RowWriter(object):
112116

113117
def __init__(self, ctx):
114118
self.output = ctx.output
115-
self.pipes = ctx.pipe_separated
116-
self.separator, self.indent_string = self.get_separator_and_indent(ctx)
117119

118-
def get_separator_and_indent(self, ctx):
119-
if ctx.pipe_separated:
120-
return ' | ', ' | '
121-
separator = ' ' * ctx.txt_separating_spaces
122-
return separator, separator
123-
124-
def write(self, tokens, indent):
125-
indent = indent * self.indent_string
120+
def write(self, tokens):
126121
values = [t.value for t in tokens]
127-
row = indent + self.separator.join(values)
128-
if self.pipes:
129-
row = '| ' + row + ' |'
130-
else:
131-
row = row.rstrip()
132-
self.output.write(row)
133-
134-
def write_newline(self):
135-
self.output.write('\n')
122+
self.output.write(''.join(values).rstrip(' '))

0 commit comments

Comments
 (0)