22 from .datatypes
import EnumMember, TypedDictItem, TypeDoc
23 from .model
import LibraryDoc, KeywordDoc
31 type=spec.get(
'type').upper(),
32 version=spec.find(
'version').text
or '',
33 doc=spec.find(
'doc').text
or '',
34 scope=spec.get(
'scope'),
35 doc_format=spec.get(
'format')
or 'ROBOT',
36 source=spec.get(
'source'),
37 lineno=int(spec.get(
'lineno'))
or -1)
38 libdoc.inits = self.
_create_keywords_create_keywords(spec,
'inits/init', libdoc.source)
39 libdoc.keywords = self.
_create_keywords_create_keywords(spec,
'keywords/kw', libdoc.source)
41 if spec.find(
'typedocs')
is not None:
48 if not os.path.isfile(path):
49 raise DataError(f
"Spec file '{path}' does not exist.")
50 with ETSource(path)
as source:
51 root = ET.parse(source).getroot()
52 if root.tag !=
'keywordspec':
53 raise DataError(f
"Invalid spec file '{path}'.")
54 version = root.get(
'specversion')
55 if version
not in (
'3',
'4'):
56 raise DataError(f
"Invalid spec file version '{version}'. "
57 f
"Supported versions are 3 and 4.")
61 return [self.
_create_keyword_create_keyword(elem, lib_source)
for elem
in spec.findall(path)]
65 doc=elem.find(
'doc').text
or '',
66 shortdoc=elem.find(
'shortdoc').text
or '',
67 tags=[t.text
for t
in elem.findall(
'tags/tag')],
68 private=elem.get(
'private',
'false') ==
'true',
69 deprecated=elem.get(
'deprecated',
'false') ==
'true',
70 source=elem.get(
'source')
or lib_source,
71 lineno=int(elem.get(
'lineno', -1)))
78 ArgInfo.POSITIONAL_ONLY: spec.positional_only.append,
79 ArgInfo.POSITIONAL_ONLY_MARKER:
lambda value:
None,
80 ArgInfo.POSITIONAL_OR_NAMED: spec.positional_or_named.append,
81 ArgInfo.VAR_POSITIONAL:
lambda value: setattr(spec,
'var_positional', value),
82 ArgInfo.NAMED_ONLY_MARKER:
lambda value:
None,
83 ArgInfo.NAMED_ONLY: spec.named_only.append,
84 ArgInfo.VAR_NAMED:
lambda value: setattr(spec,
'var_named', value),
86 for arg
in elem.findall(
'arguments/arg'):
87 name_elem = arg.find(
'name')
91 setters[arg.get(
'kind')](name)
92 default_elem = arg.find(
'default')
93 if default_elem
is not None:
94 spec.defaults[name] = default_elem.text
or ''
99 for typ
in arg.findall(
'type'):
100 types.append(typ.text)
101 if typ.get(
'typedoc'):
102 type_docs[typ.text] = typ.get(
'typedoc')
103 spec.types[name] = tuple(types)
104 kw.type_docs[name] = type_docs
107 for elem
in spec.findall(
'typedocs/type'):
108 doc =
TypeDoc(elem.get(
'type'), elem.get(
'name'), elem.find(
'doc').text,
109 [e.text
for e
in elem.findall(
'accepts/type')],
110 [e.text
for e
in elem.findall(
'usages/usage')])
111 if doc.type == TypeDoc.ENUM:
113 if doc.type == TypeDoc.TYPED_DICT:
118 return [
EnumMember(member.get(
'name'), member.get(
'value'))
119 for member
in elem.findall(
'members/member')]
122 def get_required(item):
123 required = item.get(
'required',
None)
124 return None if required
is None else required ==
'true'
125 return [
TypedDictItem(item.get(
'key'), item.get(
'type'), get_required(item))
126 for item
in elem.findall(
'items/item')]
131 for elem
in spec.findall(
'datatypes/enums/enum'):
133 for elem
in spec.findall(
'datatypes/typeddicts/typeddict'):
137 return TypeDoc(TypeDoc.ENUM, elem.get(
'name'), elem.find(
'doc').text,
141 return TypeDoc(TypeDoc.TYPED_DICT, elem.get(
'name'), elem.find(
'doc').text,
Documentation for a single keyword or an initializer.
Documentation for a library, a resource file or a suite file.
def _parse_spec(self, path)
def _parse_data_types(self, spec)
def _create_typed_dict_doc(self, elem)
def _create_arguments(self, elem, KeywordDoc kw)
def _parse_members(self, elem)
def _parse_items(self, elem)
def _parse_type_docs(self, spec)
def _create_keyword(self, elem, lib_source)
def _create_keywords(self, spec, path, lib_source)
def _create_enum_doc(self, elem)