16 from inspect
import isclass, signature, Parameter
17 from typing
import get_type_hints
20 from robot.utils import is_string, split_from_equals
23 from .argumentspec
import ArgumentSpec
28 def __init__(self, type='Keyword', error_reporter=None):
32 def parse(self, source, name=None):
33 raise NotImplementedError
39 raise DataError(
'Invalid argument specification: %s' % error)
44 def parse(self, handler, name=None):
52 sig = signature(handler)
54 spec.var_positional =
'args'
56 parameters = list(sig.parameters.values())
61 if getattr(handler,
'__name__',
None) ==
'__init__':
62 parameters = parameters[1:]
64 Parameter.POSITIONAL_ONLY: spec.positional_only.append,
65 Parameter.POSITIONAL_OR_KEYWORD: spec.positional_or_named.append,
66 Parameter.VAR_POSITIONAL:
lambda name: setattr(spec,
'var_positional', name),
67 Parameter.KEYWORD_ONLY: spec.named_only.append,
68 Parameter.VAR_KEYWORD:
lambda name: setattr(spec,
'var_named', name),
70 for param
in parameters:
71 setters[param.kind](param.name)
72 if param.default
is not param.empty:
73 spec.defaults[param.name] = param.default
80 handler = handler.__init__
81 robot_types = getattr(handler,
'robot_types', ())
82 if robot_types
or robot_types
is None:
83 spec.types = robot_types
89 return get_type_hints(handler)
93 return getattr(handler,
'__annotations__', {})
98 def parse(self, argspec, name=None):
104 self.
_report_error_report_error(
'Only last argument can be kwargs.')
105 elif isinstance(arg, tuple):
107 arg = self.
_add_arg_add_arg(spec, arg, named_only)
108 spec.defaults[arg] = default
113 self.
_report_error_report_error(
'Cannot have multiple varargs.')
117 elif spec.defaults
and not named_only:
118 self.
_report_error_report_error(
'Non-default argument after default arguments.')
120 self.
_add_arg_add_arg(spec, arg, named_only)
124 raise NotImplementedError
127 raise NotImplementedError
130 raise NotImplementedError
133 raise NotImplementedError
136 raise NotImplementedError
139 raise NotImplementedError
146 target = spec.positional_or_named
if not named_only
else spec.named_only
154 if isinstance(arg, tuple):
156 self.
_report_error_report_error(
'Invalid argument "%s".' % (arg,))
161 return tuple(arg.split(
'=', 1))
167 or (arg[0].startswith(
'*')
and len(arg) > 1))
170 return arg.startswith(
'**')
176 return arg.startswith(
'*')
190 self.
_report_error_report_error(
"Invalid argument syntax '%s'." % arg)
194 typ =
'list' if arg[0] ==
'@' else 'dictionary'
195 self.
_report_error_report_error(
"Only normal arguments accept default values, "
196 "%s arguments like '%s' do not." % (typ, arg))
200 return arg
and arg[0] ==
'&'
206 return arg
and arg[0] ==
'@'
def _validate_arg(self, arg)
def _is_varargs(self, arg)
def _format_kwargs(self, kwargs)
def _is_kwargs(self, arg)
def _is_invalid_tuple(self, arg)
def _is_kw_only_separator(self, arg)
def _format_varargs(self, varargs)
def _set_args(self, spec, handler)
def _get_type_hints(self, handler)
def _set_types(self, spec, handler)
def parse(self, handler, name=None)
def _validate_arg(self, arg)
def _is_varargs(self, arg)
def _format_kwargs(self, kwargs)
def _format_varargs(self, varargs)
def _format_arg(self, arg)
def _is_kwargs(self, arg)
def _is_kw_only_separator(self, arg)
def parse(self, source, name=None)
def _report_error(self, error)
def __init__(self, type='Keyword', error_reporter=None)
def _format_kwargs(self, kwargs)
def _add_arg(self, spec, arg, named_only=False)
def _format_varargs(self, varargs)
def _is_varargs(self, arg)
def _validate_arg(self, arg)
def parse(self, argspec, name=None)
def _is_kwargs(self, arg)
def _is_kw_only_separator(self, arg)
def _format_arg(self, arg)
def split_from_equals(string)
def is_scalar_assign(string, allow_assign_mark=False)
def is_assign(string, identifiers='$@&', allow_assign_mark=False)