Skip to content

Commit

Permalink
jsmodelbuilder: do not use deprecated attrs
Browse files Browse the repository at this point in the history
part of #4846
  • Loading branch information
yanne committed Sep 14, 2023
1 parent 1d4e98f commit dafc3d4
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 99 deletions.
103 changes: 87 additions & 16 deletions src/robot/reporting/jsmodelbuilders.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

from .jsbuildingcontext import JsBuildingContext
from .jsexecutionresult import JsExecutionResult

from ..result import ForIteration, Keyword, For, IfBranch, Return, TryBranch, While, Break, Error

STATUSES = {'FAIL': 0, 'PASS': 1, 'SKIP': 2, 'NOT RUN': 3}
KEYWORD_TYPES = {'KEYWORD': 0, 'SETUP': 1, 'TEARDOWN': 2,
Expand Down Expand Up @@ -151,23 +151,94 @@ def build(self, item, split=False):

def build_keyword(self, kw, split=False):
self._context.check_expansion(kw)
with self._context.prune_input(kw.body):
from robot.result import Continue
if isinstance (kw, Keyword):
return self.build_kw(kw, split)
elif isinstance(kw, For):
return self.build_for(kw, split)
elif isinstance(kw, ForIteration):
return self.build_for_iteration(kw, split)
elif isinstance(kw, IfBranch):
return self.build_if_branch(kw, split)
elif isinstance(kw, Return):
return self.build_return(kw, split)
elif isinstance(kw, TryBranch):
return self.build_try_branch(kw, split)
elif isinstance(kw, While):
return self.build_while(kw, split)
elif isinstance(kw, Continue):
return self._b(kw, split=split)
elif isinstance(kw, Break):
return self._b(kw, split=split)
elif isinstance(kw, Error):
return self.build_error(kw, split=split)

def build_kw(self, kw: Keyword, split: bool):
items = kw.body.flatten()
if getattr(kw, 'has_teardown', False):
if kw.has_teardown:
items.append(kw.teardown)
with self._context.prune_input(kw.body):
# Hack to avoid new `For.assign` or `Try.assign` to be used here.
# Can be removed when building doesn't expect everything to be keywords.
assign = kw.assign if kw.type in ('KEYWORD', 'SETUP', 'TEARDOWN') else ()
return (KEYWORD_TYPES[kw.type],
self._string(kw.kwname, attr=True),
self._string(kw.libname, attr=True),
self._string(kw.timeout),
self._html(kw.doc),
self._string(', '.join(kw.args)),
self._string(', '.join(assign)),
self._string(', '.join(kw.tags)),
self._get_status(kw),
self._build_keywords(items, split))
return self._b(kw, kw.kwname, kw.libname, kw.timeout, kw.doc, kw.args, kw.assign, kw.tags, split=split)

def build_for(self, kw, split):
assign = ' | '.join(kw.assign)
values = ' | '.join(kw.values)
for name, value in [('start', kw.start),
('mode', kw.mode),
('fill', kw.fill)]:
if value is not None:
values += f' | {name}={value}'
name = f'{assign} {kw.flavor} [ {values} ]'
return self._b(kw, name, split=split)

def build_for_iteration(self, kw, split):
name = ', '.join('%s = %s' % item for item in kw.assign.items())
return self._b(kw, name, split=split)

def build_if_branch(self, kw, split):
return self._b(kw, kw.condition or '', split=split)

def build_return(self, kw, split):
return self._b(kw, args=kw.values, split=split)

def build_try_branch(self, kw, split):
patterns = list(kw.patterns)
if kw.pattern_type:
patterns.append(f'type={kw.pattern_type}')
parts = []
if patterns:
parts.append(' | '.join(patterns))
if kw.assign:
parts.append(f'AS {kw.assign}')
return self._b(kw, ' '.join(parts), split=split)

def build_while(self, kw, split):
parts = []
if kw.condition:
parts.append(kw.condition)
if kw.limit:
parts.append(f'limit={kw.limit}')
if kw.on_limit:
parts.append(f'on_limit={kw.on_limit}')
if kw.on_limit_message:
parts.append(f'on_limit_message={kw.on_limit_message}')
return self._b(kw, ' | '.join(parts), split=split)

def build_error(self, kw, split):
return self._b(kw, kw.values[0], args=kw.values[1:], split=split)

def _b(self, kw, kwname: str = '', libname: str = '', timeout: str = '', doc: str = '',
args=(), assign=(), tags=(), items=None, split: bool = False):
return (KEYWORD_TYPES[kw.type],
self._string(kwname, attr=True),
self._string(libname, attr=True),
self._string(timeout),
self._html(doc),
self._string(', '.join(args)),
self._string(', '.join(assign)),
self._string(', '.join(tags)),
self._get_status(kw),
self._build_keywords(items if items is not None else kw.body.flatten(), split))


class MessageBuilder(_Builder):
Expand Down
79 changes: 0 additions & 79 deletions src/robot/result/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,11 +322,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body:
def visit(self, visitor: SuiteVisitor):
visitor.visit_for_iteration(self)

@property
@deprecated
def name(self) -> str:
return ', '.join('%s = %s' % item for item in self.assign.items())


@Body.register
class For(model.For, StatusMixin, DeprecatedAttributesMixin):
Expand Down Expand Up @@ -357,18 +352,6 @@ def __init__(self, assign: Sequence[str] = (),
def body(self, iterations: 'Sequence[ForIteration|DataDict]') -> iterations_class:
return self.iterations_class(self.iteration_class, self, iterations)

@property
@deprecated
def name(self) -> str:
assign = ' | '.join(self.assign)
values = ' | '.join(self.values)
for name, value in [('start', self.start),
('mode', self.mode),
('fill', self.fill)]:
if value is not None:
values += f' | {name}={value}'
return f'{assign} {self.flavor} [ {values} ]'


class WhileIteration(BodyItem, StatusMixin, DeprecatedAttributesMixin):
"""Represents one WHILE loop iteration."""
Expand Down Expand Up @@ -397,11 +380,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body:
def visit(self, visitor: SuiteVisitor):
visitor.visit_while_iteration(self)

@property
@deprecated
def name(self) -> str:
return ''


@Body.register
class While(model.While, StatusMixin, DeprecatedAttributesMixin):
Expand Down Expand Up @@ -430,20 +408,6 @@ def __init__(self, condition: 'str|None' = None,
def body(self, iterations: 'Sequence[WhileIteration|DataDict]') -> iterations_class:
return self.iterations_class(self.iteration_class, self, iterations)

@property
@deprecated
def name(self) -> str:
parts = []
if self.condition:
parts.append(self.condition)
if self.limit:
parts.append(f'limit={self.limit}')
if self.on_limit:
parts.append(f'on_limit={self.on_limit}')
if self.on_limit_message:
parts.append(f'on_limit_message={self.on_limit_message}')
return ' | '.join(parts)


class IfBranch(model.IfBranch, StatusMixin, DeprecatedAttributesMixin):
body_class = Body
Expand All @@ -464,11 +428,6 @@ def __init__(self, type: str = BodyItem.IF,
self.elapsed_time = elapsed_time
self.doc = doc

@property
@deprecated
def name(self) -> str:
return self.condition or ''


@Body.register
class If(model.If, StatusMixin, DeprecatedAttributesMixin):
Expand Down Expand Up @@ -511,19 +470,6 @@ def __init__(self, type: str = BodyItem.TRY,
self.elapsed_time = elapsed_time
self.doc = doc

@property
@deprecated
def name(self) -> str:
patterns = list(self.patterns)
if self.pattern_type:
patterns.append(f'type={self.pattern_type}')
parts = []
if patterns:
parts.append(' | '.join(patterns))
if self.assign:
parts.append(f'AS {self.assign}')
return ' '.join(parts)


@Body.register
class Try(model.Try, StatusMixin, DeprecatedAttributesMixin):
Expand Down Expand Up @@ -573,11 +519,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body:
"""
return self.body_class(self, body)

@property
@deprecated
def args(self) -> 'tuple[str, ...]':
return self.values

@property
@deprecated
def doc(self) -> str:
Expand Down Expand Up @@ -611,11 +552,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body:
"""
return self.body_class(self, body)

@property
@deprecated
def args(self) -> 'tuple[str, ...]':
return ()

@property
@deprecated
def doc(self) -> str:
Expand Down Expand Up @@ -649,11 +585,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body:
"""
return self.body_class(self, body)

@property
@deprecated
def args(self) -> 'tuple[str, ...]':
return ()

@property
@deprecated
def doc(self) -> str:
Expand Down Expand Up @@ -686,16 +617,6 @@ def body(self, body: 'Sequence[BodyItem|DataDict]') -> Body:
"""
return self.body_class(self, body)

@property
@deprecated
def kwname(self) -> str:
return self.values[0]

@property
@deprecated
def args(self) -> 'tuple[str, ...]':
return self.values[1:]

@property
@deprecated
def doc(self) -> 'str':
Expand Down
8 changes: 4 additions & 4 deletions utest/reporting/test_jsmodelbuilders.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pathlib import Path

from robot.utils.asserts import assert_equal, assert_true
from robot.result import Keyword, Message, TestCase, TestSuite
from robot.result import Keyword, Message, TestCase, TestSuite, For
from robot.result.executionerrors import ExecutionErrors
from robot.model import Statistics, BodyItem
from robot.reporting.jsmodelbuilders import (
Expand Down Expand Up @@ -135,11 +135,11 @@ def test_nested_structure(self):
suite.tests = [TestCase(), TestCase(status='PASS')]
S1 = self._verify_suite(suite.suites[0],
status=0, tests=(t,), stats=(1, 0, 1, 0))
suite.tests[0].body = [Keyword(type=Keyword.FOR), Keyword()]
suite.tests[0].body = [For(assign=['${x}'], flavor='IN', values=['1', '2']), Keyword()]
suite.tests[0].body[0].body = [Keyword(type=Keyword.ITERATION), Message()]
k = self._verify_keyword(suite.tests[0].body[0].body[0], type=4)
m = self._verify_message(suite.tests[0].body[0].messages[0])
k1 = self._verify_keyword(suite.tests[0].body[0], type=3, body=(k, m))
m = self._verify_message(suite.tests[0].body[0].body[1])
k1 = self._verify_keyword(suite.tests[0].body[0], type=3, body=(k, m), kwname='${x} IN [ 1 | 2 ]')
suite.tests[0].body[1].body = [Message(), Message('msg', level='TRACE')]
m1 = self._verify_message(suite.tests[0].body[1].messages[0])
m2 = self._verify_message(suite.tests[0].body[1].messages[1], 'msg', level=0)
Expand Down

0 comments on commit dafc3d4

Please sign in to comment.