16 from itertools
import chain
19 ExitForLoop, ContinueForLoop, DataError,
20 PassExecution, ReturnFromKeyword,
21 UserKeywordExecutionFailed, VariableError)
26 from .arguments
import DefaultValue
27 from .statusreporter
import StatusReporter
28 from .steprunner
import StepRunner
29 from .timeouts
import KeywordTimeout
36 self.
namename = name
or handler.name
42 libname = self.
_handler_handler.libname
43 return '%s.%s' % (libname, self.
namename)
if libname
else self.
namename
55 return self.
_handler_handler.arguments
57 def run(self, kw, context):
58 assignment = VariableAssignment(kw.assign)
59 result = self.
_get_result_get_result(kw, assignment, context.variables)
61 with assignment.assigner(context)
as assigner:
62 return_value = self.
_run_run(context, kw.args, result)
63 assigner.assign(return_value)
68 doc = variables.replace_string(handler.doc, ignore_errors=
True)
70 tags = variables.replace_list(handler.tags, ignore_errors=
True) + tags
71 return KeywordResult(kwname=self.
namename,
72 libname=handler.libname,
75 assign=tuple(assignment),
79 def _run(self, context, args, result):
80 variables = context.variables
82 with context.user_keyword:
85 if timeout
is not None:
86 result.timeout = str(timeout)
87 with context.timeout(timeout):
88 exception, return_ = self.
_execute_execute(context)
89 if exception
and not exception.can_continue(context.in_teardown):
93 exception.return_value = return_value
98 timeout = self.
_handler_handler.timeout
101 timeout =
KeywordTimeout(timeout.value, timeout.message, variables)
108 positional, named = arguments
109 variables = context.variables
111 replace_defaults=
False)
119 for name, value
in chain(zip(spec.positional, args), kwonly):
120 if isinstance(value, DefaultValue):
121 value = value.resolve(variables)
122 variables[
'${%s}' % name] = value
124 variables[
'@{%s}' % spec.varargs] = varargs
126 variables[
'&{%s}' % spec.kwargs] = DotDict(kwargs)
132 return args[:positional], args[positional:]
137 for name, value
in all_kwargs:
139 target.append((name, value))
140 return kwonly, kwargs
151 args = [
'%s=%s' % (name,
prepr(variables[name]))
for name
in args]
152 return 'Arguments: [ %s ]' %
' | '.join(args)
156 if not (handler.keywords
or handler.return_value):
157 raise DataError(
"User keyword '%s' contains no keywords." % self.
namename)
158 if context.dry_run
and 'robot:no-dry-run' in handler.tags:
160 error = return_ = pass_ =
None
162 StepRunner(context).run_steps(handler.keywords)
163 except ReturnFromKeyword
as exception:
165 error = exception.earlier_failures
166 except (ExitForLoop, ContinueForLoop)
as exception:
168 except ExecutionPassed
as exception:
170 error = exception.earlier_failures
172 error.continue_on_failure =
False
173 except ExecutionFailed
as exception:
175 with context.keyword_teardown(error):
177 if error
or td_error:
179 return error
or pass_, return_
182 ret = self.
_handler_handler.return_value
if not return_
else return_.return_value
185 contains_list_var = any(
is_list_var(item)
for item
in ret)
187 ret = variables.replace_list(ret)
188 except DataError
as err:
189 raise VariableError(
'Replacing variables from keyword return value '
190 'failed: %s' % err.message)
191 if len(ret) != 1
or contains_list_var:
196 if not self.
_handler_handler.teardown:
199 name = context.variables.replace_string(self.
_handler_handler.teardown.name)
200 except DataError
as err:
202 if name.upper()
in (
'',
'NONE'):
206 except PassExecution:
208 except ExecutionStatus
as err:
213 assignment = VariableAssignment(kw.assign)
214 result = self.
_get_result_get_result(kw, assignment, context.variables)
216 assignment.validate_assignment()
217 self.
_dry_run_dry_run(context, kw.args, result)
221 with context.user_keyword:
224 result.timeout = str(timeout)
225 error, _ = self.
_execute_execute(context)
233 UserKeywordRunner.__init__(self, handler, name)
234 match = handler.embedded_name.match(name)
236 raise ValueError(
'Does not match given name')
237 self.
embedded_argsembedded_args = list(zip(handler.embedded_args, match.groups()))
244 return [(n, variables.replace_scalar(v))
for n, v
in self.
embedded_argsembedded_args]
247 variables = context.variables
248 for name, value
in embedded_args:
249 variables[
'${%s}' % name] = value
253 args = [
'${%s}' % arg
for arg, _
in self.
embedded_argsembedded_args]
Used when variable does not exist.
Used for communicating failures in test execution.
Used when no keyword is found or there is more than one match.
def __init__(self, handler, name)
def _resolve_arguments(self, args, variables=None)
def _trace_log_args_message(self, variables)
def _set_arguments(self, embedded_args, context)
def _get_result(self, kw, assignment, variables)
def _get_return_value(self, variables, return_)
def _execute(self, context)
def __init__(self, handler, name=None)
def _split_args_and_varargs(self, args)
def _set_arguments(self, arguments, context)
def _get_timeout(self, variables=None)
def _set_variables(self, positional, kwargs, variables)
def _format_trace_log_args_message(self, args, variables)
def _resolve_arguments(self, arguments, variables=None)
def _split_kwonly_and_kwargs(self, all_kwargs)
def _run(self, context, args, result)
def run(self, kw, context)
def _dry_run(self, context, args, result)
def dry_run(self, kw, context)
def _run_teardown(self, context)
def _trace_log_args_message(self, variables)
def getshortdoc(doc_or_item, linesep='\n')
def split_tags_from_doc(doc)
def prepr(item, width=80)