Robot Framework
xmlwriter.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 from robot.utils import XmlWriter
17 
18 from .output import get_generation_time
19 
20 
22 
23  def write(self, libdoc, outfile):
24  writer = XmlWriter(outfile, usage='Libdoc spec')
25  self._write_start_write_start(libdoc, writer)
26  self._write_keywords_write_keywords('inits', 'init', libdoc.inits, libdoc.source, writer)
27  self._write_keywords_write_keywords('keywords', 'kw', libdoc.keywords, libdoc.source, writer)
28  # Write deprecated '<datatypes>' element.
29  self._write_data_types_write_data_types(libdoc.type_docs, writer)
30  # Write new '<types>' element.
31  self._write_type_docs_write_type_docs(libdoc.type_docs, writer)
32  self._write_end_write_end(writer)
33 
34  def _write_start(self, libdoc, writer):
35  attrs = {'name': libdoc.name,
36  'type': libdoc.type,
37  'format': libdoc.doc_format,
38  'scope': libdoc.scope,
39  'generated': get_generation_time(),
40  'specversion': '4'}
41  self._add_source_info_add_source_info(attrs, libdoc)
42  writer.start('keywordspec', attrs)
43  writer.element('version', libdoc.version)
44  writer.element('doc', libdoc.doc)
45  self._write_tags_write_tags(libdoc.all_tags, writer)
46 
47  def _add_source_info(self, attrs, item, lib_source=None):
48  if item.source and item.source != lib_source:
49  attrs['source'] = item.source
50  if item.lineno and item.lineno > 0:
51  attrs['lineno'] = str(item.lineno)
52 
53  def _write_keywords(self, list_name, kw_type, keywords, lib_source, writer):
54  writer.start(list_name)
55  for kw in keywords:
56  attrs = self._get_start_attrs_get_start_attrs(kw, lib_source)
57  writer.start(kw_type, attrs)
58  self._write_arguments_write_arguments(kw, writer)
59  writer.element('doc', kw.doc)
60  writer.element('shortdoc', kw.shortdoc)
61  if kw_type == 'kw' and kw.tags:
62  self._write_tags_write_tags(kw.tags, writer)
63  writer.end(kw_type)
64  writer.end(list_name)
65 
66  def _write_tags(self, tags, writer):
67  writer.start('tags')
68  for tag in tags:
69  writer.element('tag', tag)
70  writer.end('tags')
71 
72  def _write_arguments(self, kw, writer):
73  writer.start('arguments', {'repr': str(kw.args)})
74  for arg in kw.args:
75  writer.start('arg', {'kind': arg.kind,
76  'required': 'true' if arg.required else 'false',
77  'repr': str(arg)})
78  if arg.name:
79  writer.element('name', arg.name)
80  type_docs = kw.type_docs[arg.name]
81  for type_repr in arg.types_reprs:
82  if type_repr in type_docs:
83  attrs = {'typedoc': type_docs[type_repr]}
84  else:
85  attrs = {}
86  writer.element('type', type_repr, attrs)
87  if arg.default is not arg.NOTSET:
88  writer.element('default', arg.default_repr)
89  writer.end('arg')
90  writer.end('arguments')
91 
92  def _get_start_attrs(self, kw, lib_source):
93  attrs = {'name': kw.name}
94  if kw.private:
95  attrs['private'] = 'true'
96  if kw.deprecated:
97  attrs['deprecated'] = 'true'
98  self._add_source_info_add_source_info(attrs, kw, lib_source)
99  return attrs
100 
101  def _write_data_types(self, types, writer):
102  enums = sorted(t for t in types if t.type == 'Enum')
103  typed_dicts = sorted(t for t in types if t.type == 'TypedDict')
104  writer.start('datatypes')
105  if enums:
106  writer.start('enums')
107  for enum in enums:
108  writer.start('enum', {'name': enum.name})
109  writer.element('doc', enum.doc)
110  self._write_enum_members_write_enum_members(enum, writer)
111  writer.end('enum')
112  writer.end('enums')
113  if typed_dicts:
114  writer.start('typeddicts')
115  for typ_dict in typed_dicts:
116  writer.start('typeddict', {'name': typ_dict.name})
117  writer.element('doc', typ_dict.doc)
118  self._write_typed_dict_items_write_typed_dict_items(typ_dict, writer)
119  writer.end('typeddict')
120  writer.end('typeddicts')
121  writer.end('datatypes')
122 
123  def _write_type_docs(self, type_docs, writer):
124  writer.start('typedocs')
125  for doc in sorted(type_docs):
126  writer.start('type', {'name': doc.name, 'type': doc.type})
127  writer.element('doc', doc.doc)
128  writer.start('accepts')
129  for typ in doc.accepts:
130  writer.element('type', typ)
131  writer.end('accepts')
132  writer.start('usages')
133  for usage in doc.usages:
134  writer.element('usage', usage)
135  writer.end('usages')
136  if doc.type == 'Enum':
137  self._write_enum_members_write_enum_members(doc, writer)
138  if doc.type == 'TypedDict':
139  self._write_typed_dict_items_write_typed_dict_items(doc, writer)
140  writer.end('type')
141  writer.end('typedocs')
142 
143  def _write_enum_members(self, enum, writer):
144  writer.start('members')
145  for member in enum.members:
146  writer.element('member', attrs={'name': member.name,
147  'value': member.value})
148  writer.end('members')
149 
150  def _write_typed_dict_items(self, typed_dict, writer):
151  writer.start('items')
152  for item in typed_dict.items:
153  attrs = {'key': item.key, 'type': item.type}
154  if item.required is not None:
155  attrs['required'] = 'true' if item.required else 'false'
156  writer.element('item', attrs=attrs)
157  writer.end('items')
158 
159  def _write_end(self, writer):
160  writer.end('keywordspec')
161  writer.close()
def _write_data_types(self, types, writer)
Definition: xmlwriter.py:101
def _add_source_info(self, attrs, item, lib_source=None)
Definition: xmlwriter.py:47
def _write_typed_dict_items(self, typed_dict, writer)
Definition: xmlwriter.py:150
def _write_arguments(self, kw, writer)
Definition: xmlwriter.py:72
def _write_type_docs(self, type_docs, writer)
Definition: xmlwriter.py:123
def _write_start(self, libdoc, writer)
Definition: xmlwriter.py:34
def _write_keywords(self, list_name, kw_type, keywords, lib_source, writer)
Definition: xmlwriter.py:53
def _write_enum_members(self, enum, writer)
Definition: xmlwriter.py:143
def _write_tags(self, tags, writer)
Definition: xmlwriter.py:66
def write(self, libdoc, outfile)
Definition: xmlwriter.py:23
def _get_start_attrs(self, kw, lib_source)
Definition: xmlwriter.py:92
def get_generation_time()
Return a timestamp that honors SOURCE_DATE_EPOCH.
Definition: output.py:52