Robot Framework
jsonbuilder.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 import json
17 import os.path
18 
19 from robot.running import ArgInfo
20 from robot.errors import DataError
21 
22 from .datatypes import EnumMember, TypedDictItem, TypeDoc
23 from .model import LibraryDoc, KeywordDoc
24 
25 
27 
28  def build(self, path):
29  spec = self._parse_spec_json_parse_spec_json(path)
30  return self.build_from_dictbuild_from_dict(spec)
31 
32  def build_from_dict(self, spec):
33  libdoc = LibraryDoc(name=spec['name'],
34  doc=spec['doc'],
35  version=spec['version'],
36  type=spec['type'],
37  scope=spec['scope'],
38  doc_format=spec['docFormat'],
39  source=spec['source'],
40  lineno=int(spec.get('lineno', -1)))
41  libdoc.inits = [self._create_keyword_create_keyword(kw) for kw in spec['inits']]
42  libdoc.keywords = [self._create_keyword_create_keyword(kw) for kw in spec['keywords']]
43  # RF >= 5 have 'typedocs', RF >= 4 have 'dataTypes', older/custom may have neither.
44  if 'typedocs' in spec:
45  libdoc.type_docs = self._parse_type_docs_parse_type_docs(spec['typedocs'])
46  elif 'dataTypes' in spec:
47  libdoc.type_docs = self._parse_data_types_parse_data_types(spec['dataTypes'])
48  return libdoc
49 
50  def _parse_spec_json(self, path):
51  if not os.path.isfile(path):
52  raise DataError(f"Spec file '{path}' does not exist.")
53  with open(path) as json_source:
54  libdoc_dict = json.load(json_source)
55  return libdoc_dict
56 
57  def _create_keyword(self, data):
58  kw = KeywordDoc(name=data.get('name'),
59  doc=data['doc'],
60  shortdoc=data['shortdoc'],
61  tags=data['tags'],
62  private=data.get('private', False),
63  deprecated=data.get('deprecated', False),
64  source=data['source'],
65  lineno=int(data.get('lineno', -1)))
66  self._create_arguments_create_arguments(data['args'], kw)
67  return kw
68 
69  def _create_arguments(self, arguments, kw: KeywordDoc):
70  spec = kw.args
71  setters = {
72  ArgInfo.POSITIONAL_ONLY: spec.positional_only.append,
73  ArgInfo.POSITIONAL_ONLY_MARKER: lambda value: None,
74  ArgInfo.POSITIONAL_OR_NAMED: spec.positional_or_named.append,
75  ArgInfo.VAR_POSITIONAL: lambda value: setattr(spec, 'var_positional', value),
76  ArgInfo.NAMED_ONLY_MARKER: lambda value: None,
77  ArgInfo.NAMED_ONLY: spec.named_only.append,
78  ArgInfo.VAR_NAMED: lambda value: setattr(spec, 'var_named', value),
79  }
80  for arg in arguments:
81  name = arg['name']
82  setters[arg['kind']](name)
83  default = arg.get('defaultValue')
84  if default is not None:
85  spec.defaults[name] = default
86  arg_types = arg['types']
87  if not spec.types:
88  spec.types = {}
89  spec.types[name] = tuple(arg_types)
90  kw.type_docs[name] = arg.get('typedocs', {})
91 
92  def _parse_type_docs(self, type_docs):
93  for data in type_docs:
94  doc = TypeDoc(data['type'], data['name'], data['doc'], data['accepts'],
95  data['usages'])
96  if doc.type == TypeDoc.ENUM:
97  doc.members = [EnumMember(d['name'], d['value'])
98  for d in data['members']]
99  if doc.type == TypeDoc.TYPED_DICT:
100  doc.items = [TypedDictItem(d['key'], d['type'], d['required'])
101  for d in data['items']]
102  yield doc
103 
104  # Code below used for parsing legacy 'dataTypes'.
105 
106  def _parse_data_types(self, data_types):
107  for obj in data_types['enums']:
108  yield self._create_enum_doc_create_enum_doc(obj)
109  for obj in data_types['typedDicts']:
110  yield self._create_typed_dict_doc_create_typed_dict_doc(obj)
111 
112  def _create_enum_doc(self, data):
113  return TypeDoc(TypeDoc.ENUM, data['name'], data['doc'],
114  members=[EnumMember(member['name'], member['value'])
115  for member in data['members']])
116 
117  def _create_typed_dict_doc(self, data):
118  return TypeDoc(TypeDoc.TYPED_DICT, data['name'], data['doc'],
119  items=[TypedDictItem(item['key'], item['type'], item['required'])
120  for item in data['items']])
def _create_arguments(self, arguments, KeywordDoc kw)
Definition: jsonbuilder.py:69
Documentation for a single keyword or an initializer.
Definition: model.py:156
Documentation for a library, a resource file or a suite file.
Definition: model.py:30