16 from inspect
import isclass
19 from robot.utils import getdoc, Sortable, typeddict_types, type_name
22 from .standardtypes
import STANDARD_TYPE_DOCS
30 TYPED_DICT =
'TypedDict'
34 def __init__(self, type, name, doc, accepts=(), usages=
None,
35 members=
None, items=
None):
38 self.
docdoc = doc
or ''
49 return self.
namename.lower()
53 if isinstance(type_hint, EnumType):
54 return cls.
for_enumfor_enum(type_hint)
55 if isinstance(type_hint, typeddict_types):
57 converter = TypeConverter.converter_for(type_hint, converters)
60 elif not converter.type:
61 return cls(cls.
CUSTOMCUSTOM, converter.type_name, converter.doc,
62 converter.value_types)
66 return cls(cls.
STANDARDSTANDARD,
type(converter).type_name,
67 STANDARD_TYPE_DOCS[converter.type], converter.value_types)
71 accepts = (str, int)
if issubclass(enum, int)
else (str,)
72 return cls(cls.
ENUMENUM, enum.__name__,
getdoc(enum), accepts,
74 for name, member
in enum.__members__.items()])
79 required_keys = list(getattr(typed_dict,
'__required_keys__', []))
80 optional_keys = list(getattr(typed_dict,
'__optional_keys__', []))
81 for key, value
in typed_dict.__annotations__.items():
82 typ = value.__name__
if isclass(value)
else str(value)
83 required = key
in required_keys
if required_keys
or optional_keys
else None
85 return cls(cls.
TYPED_DICTTYPED_DICT, typed_dict.__name__,
getdoc(typed_dict),
86 accepts=(str,), items=items)
90 'type': self.
typetype,
91 'name': self.
namename,
95 data[
'usages'] = self.
usagesusages
96 data[
'accepts'] = self.
acceptsaccepts
97 if self.
membersmembers
is not None:
98 data[
'members'] = [m.to_dictionary()
for m
in self.
membersmembers]
99 if self.
itemsitems
is not None:
100 data[
'items'] = [i.to_dictionary()
for i
in self.
itemsitems]
112 return {
'key': self.
keykey,
'type': self.
typetype,
'required': self.
requiredrequired}
122 return {
'name': self.
namename,
'value': self.
valuevalue}
def __init__(self, name, value)
def for_typed_dict(cls, typed_dict)
def to_dictionary(self, legacy=False)
def for_type(cls, type_hint, converters)
def __init__(self, type, name, doc, accepts=(), usages=None, members=None, items=None)
def __init__(self, key, type, required=None)
def type_name(item, capitalize=False)
Return "non-technical" type name for objects and types.