16 from robot.utils import getdoc, is_union, seq2str, type_name
18 from .argumentparser
import PythonArgumentParser
29 for type_, conv
in converters.items():
31 info = ConverterInfo.for_converter(type_, conv)
32 except TypeError
as err:
33 error_reporter(str(err))
39 if isinstance(type_, type):
41 if issubclass(type_, conv.type):
54 def __init__(self, type, converter, value_types):
73 if not isinstance(type_, type):
74 raise TypeError(f
'Custom converters must be specified using types, '
75 f
'got {type_name(type_)} {type_!r}.')
78 raise TypeError(f
'Only {type_.__name__} instances are accepted, '
79 f
'got {type_name(arg)}.')
80 if not callable(converter):
81 raise TypeError(f
'Custom converters must be callable, converter for '
82 f
'{type_name(type_)} is {type_name(converter)}.')
87 accepts = arg_type.__args__
88 elif hasattr(arg_type,
'__origin__'):
89 accepts = (arg_type.__origin__,)
92 return cls(type_, converter, accepts)
98 required =
seq2str([a
for a
in spec.positional
if a
not in spec.defaults])
99 raise TypeError(f
"Custom converters cannot have more than one mandatory "
100 f
"argument, '{converter.__name__}' has {required}.")
101 if not spec.positional:
102 raise TypeError(f
"Custom converters must accept one positional argument, "
103 f
"'{converter.__name__}' accepts none.")
104 if spec.named_only
and set(spec.named_only) - set(spec.defaults):
105 required =
seq2str(sorted(set(spec.named_only) - set(spec.defaults)))
106 raise TypeError(f
"Custom converters cannot have mandatory keyword-only "
107 f
"arguments, '{converter.__name__}' has {required}.")
108 return spec.types.get(spec.positional[0])
def __init__(self, type, converter, value_types)
def _get_arg_type(cls, converter)
def for_converter(cls, type_, converter)
def from_dict(cls, converters, error_reporter)
def get_converter_info(self, type_)
def __init__(self, converters)
def seq2str(sequence, quote="'", sep=', ', lastsep=' and ')
Returns sequence in format ‘'item 1’, 'item 2' and 'item 3'`.
def type_name(item, capitalize=False)
Return "non-technical" type name for objects and types.
def is_union(item, allow_tuple=False)