16 from ast
import NodeVisitor
21 from .settings
import Defaults, TestSettings
31 self.
suitesuite.doc = node.value
34 self.
suitesuite.metadata[node.name] = node.value
37 self.
suitesuite.setup.config(name=node.name, args=node.args,
41 self.
suitesuite.teardown.config(name=node.name, args=node.args,
46 'name': node.name,
'args': node.args,
'lineno': node.lineno
51 'name': node.name,
'args': node.args,
'lineno': node.lineno
55 self.
defaultsdefaults.timeout = node.value
58 self.
defaultsdefaults.default_tags = node.values
61 self.
defaultsdefaults.force_tags = node.values
64 self.
defaultsdefaults.keyword_tags = node.values
67 self.
defaultsdefaults.template = node.value
70 self.
suitesuite.resource.imports.create(type=
'Resource', name=node.name,
74 self.
suitesuite.resource.imports.create(type=
'Library', name=node.name,
75 args=node.args, alias=node.alias,
79 self.
suitesuite.resource.imports.create(type=
'Variables', name=node.name,
80 args=node.args, lineno=node.lineno)
92 class SuiteBuilder(NodeVisitor):
102 self.suite.resource.variables.create(name=node.name,
121 self.
resourceresource.doc = node.value
124 self.
defaultsdefaults.keyword_tags = node.values
127 self.
resourceresource.imports.create(type=
'Library', name=node.name,
128 args=node.args, alias=node.alias,
132 self.
resourceresource.imports.create(type=
'Resource', name=node.name,
136 self.
resourceresource.imports.create(type=
'Variables', name=node.name,
137 args=node.args, lineno=node.lineno)
140 self.
resourceresource.variables.create(name=node.name,
157 self.
testtest = self.
suitesuite.tests.create(name=node.name, lineno=node.lineno)
158 self.generic_visit(node)
163 test.setup.config(**settings.setup)
164 if settings.teardown:
165 test.teardown.config(**settings.teardown)
167 test.timeout = settings.timeout
169 test.tags = settings.tags
170 if settings.template:
171 test.template = settings.template
175 for item
in parent.body:
176 if item.type == item.FOR:
178 elif item.type == item.IF_ELSE_ROOT:
179 for branch
in item.body:
181 elif item.type == item.KEYWORD:
187 variables = VariableIterator(template, identifiers=
'$')
188 count = len(variables)
189 if count == 0
or count != len(arguments):
190 return template, arguments
192 for (before, _, after), arg
in zip(variables, arguments):
193 temp.extend([before, arg])
195 return ''.join(temp), ()
210 self.
testtest.body.create_keyword(args=node.args, lineno=node.lineno)
213 self.
testtest.doc = node.value
217 'name': node.name,
'args': node.args,
'lineno': node.lineno
222 'name': node.name,
'args': node.args,
'lineno': node.lineno
226 self.
settingssettings.timeout = node.value
230 self.
settingssettings.tags = node.values
233 self.
settingssettings.template = node.value
236 self.
testtest.body.create_keyword(name=node.keyword, args=node.args,
237 assign=node.assign, lineno=node.lineno)
240 self.
testtest.body.create_return(node.values, lineno=node.lineno,
244 self.
testtest.body.create_continue(lineno=node.lineno,
248 self.
testtest.body.create_break(lineno=node.lineno,
260 self.
kwkw = self.
resourceresource.keywords.create(name=node.name,
261 tags=self.
defaultsdefaults.keyword_tags,
263 self.generic_visit(node)
266 self.
kwkw.doc = node.value
269 self.
kwkw.args = node.values
272 self.
kwkw.error = f
'Invalid argument specification: {error}'
276 self.
kwkw.tags.add(node.values)
279 self.
kwkw.return_ = node.values
282 self.
kwkw.timeout = node.value
285 self.
kwkw.teardown.config(name=node.name, args=node.args,
289 self.
kwkw.body.create_keyword(name=node.keyword, args=node.args,
290 assign=node.assign, lineno=node.lineno)
293 self.
kwkw.body.create_return(node.values, lineno=node.lineno,
297 self.
kwkw.body.create_continue(lineno=node.lineno,
301 self.
kwkw.body.create_break(lineno=node.lineno,
325 self.
modelmodel = self.
parentparent.body.create_for(
326 node.variables, node.flavor, node.values, lineno=node.lineno, error=error
328 for step
in node.body:
330 return self.
modelmodel
333 errors = node.header.errors + node.errors
335 errors += node.end.errors
339 self.
modelmodel.body.create_keyword(name=node.keyword, args=node.args,
340 assign=node.assign, lineno=node.lineno)
343 self.
modelmodel.body.create_keyword(args=node.args, lineno=node.lineno)
358 self.
modelmodel.body.create_return(node.values, lineno=node.lineno,
362 self.
modelmodel.body.create_continue(lineno=node.lineno,
366 self.
modelmodel.body.create_break(lineno=node.lineno,
377 root = self.
parentparent.body.create_if(lineno=node.lineno,
382 node_type = node.type
if node.type !=
'INLINE IF' else 'IF'
383 self.
modelmodel = root.body.create_branch(node_type, node.condition,
385 for step
in node.body:
388 for item
in self.
modelmodel.body:
391 if hasattr(item,
'assign'):
395 if assign
and node_type !=
'ELSE':
396 root.body.create_branch(
'ELSE').body.create_keyword(
397 assign=assign, name=
'BuiltIn.Set Variable', args=[
'${NONE}']
402 errors = node.header.errors + node.errors
406 errors += node.end.errors
410 self.
modelmodel.body.create_keyword(name=node.keyword, args=node.args,
411 assign=node.assign, lineno=node.lineno)
414 self.
modelmodel.body.create_keyword(args=node.args, lineno=node.lineno)
429 self.
modelmodel.body.create_return(node.values, lineno=node.lineno,
433 self.
modelmodel.body.create_continue(lineno=node.lineno,
437 self.
modelmodel.body.create_break(lineno=node.lineno,
449 root = self.
parentparent.body.create_try(lineno=node.lineno)
452 self.
modelmodel = root.body.create_branch(node.type, node.patterns,
453 node.pattern_type, node.variable,
455 for step
in node.body:
465 errors = node.header.errors + node.errors
469 errors += node.end.errors
485 self.
modelmodel.body.create_return(node.values, lineno=node.lineno,
489 self.
modelmodel.body.create_continue(lineno=node.lineno,
493 self.
modelmodel.body.create_break(lineno=node.lineno,
497 self.
modelmodel.body.create_keyword(name=node.keyword, args=node.args,
498 assign=node.assign, lineno=node.lineno)
501 self.
template_errortemplate_error =
'Templates cannot be used with TRY.'
512 self.
modelmodel = self.
parentparent.body.create_while(
513 node.condition, node.limit, lineno=node.lineno, error=error
515 for step
in node.body:
517 return self.
modelmodel
520 errors = node.header.errors + node.errors
522 errors += node.end.errors
526 self.
modelmodel.body.create_keyword(name=node.keyword, args=node.args,
527 assign=node.assign, lineno=node.lineno)
530 self.
modelmodel.body.create_keyword(args=node.args, lineno=node.lineno)
545 self.
modelmodel.body.create_return(node.values, lineno=node.lineno,
560 return '\n- '.join((
'Multiple errors:',) + errors)
564 for tag
in node.values:
565 if tag.startswith(
'-'):
567 f
"Error in file '{source}' on line {node.lineno}: "
568 f
"Settings tags starting with a hyphen using the '[Tags]' setting "
569 f
"is deprecated. In Robot Framework 6.1 this syntax will be used "
570 f
"for removing tags. Escape '{tag}' like '\\{tag}' to use the "
571 f
"literal value and to avoid this warning."