def visit_field(self, node):
"""
:param docutils.nodes.field node:
"""
idx = node.first_child_matching_class(nodes.field_name)
if idx is not None:
name_node = node[idx]
idx = node.first_child_matching_class(nodes.field_body)
value_node = node[idx]
name = name_node.astext()
if name == 'Status Codes':
visitor = StatusVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.add_response_codes(visitor.status_info)
elif name == 'Request Headers':
visitor = HeaderVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.add_request_headers(visitor.headers)
elif name == 'Response Headers':
visitor = HeaderVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.add_response_headers(visitor.headers)
elif name == 'Parameters':
visitor = ParameterVisitor(self.document,
{'in': 'path', 'required': True})
value_node.walkabout(visitor)
self.endpoint.parameters.extend(visitor.parameters)
elif name == 'Query Parameters':
visitor = ParameterVisitor(self.document, {'in': 'query'})
value_node.walkabout(visitor)
self.endpoint.parameters.extend(visitor.parameters)
elif name == 'Request JSON Object':
visitor = ParameterVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.parameters.append({
'name': 'request-body', 'in': 'body', 'required': True,
'description': 'A serialized request body',
'schema': visitor.get_schema()})
elif name == 'Request JSON Array of Objects':
visitor = ParameterVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.parameters.append({
'name': 'request-body', 'in': 'body', 'required': True,
'schema': {'type': 'array', 'items': visitor.get_schema()}
})
elif name == 'Response JSON Object':
visitor = ParameterVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.set_default_response_structure(visitor.parameters)
elif name == 'Response JSON Array of Objects':
visitor = ParameterVisitor(self.document)
value_node.walkabout(visitor)
self.endpoint.set_default_response_structure(
visitor.parameters, is_array=True)
else:
self.document.reporter.warning(
'unhandled field type: {}'.format(name), base_node=node)
raise nodes.SkipChildren
python类field_body()的实例源码
def make_node(self, lang='en'):
if lang not in texts.keys():
lang = 'en'
arg_map = texts[lang]["arg_map"]
task_title = texts[lang]["task_title"]
module_title = texts[lang]["module_title"]
module = ""
module_args = []
# first, search module
for arg, m in self.args.items():
if arg not in arg_map.keys():
module = arg
module_args.append(m)
item = nodes.admonition()
title = nodes.title(text=self.name)
item.append(title)
for m in module_args:
if isinstance(m, str):
item.append(nodes.paragraph(text=m))
else:
mlist = []
for k, v in m.items():
mlist.append("%s=%s" % (k, v))
item.append(nodes.paragraph(text=" ".join(mlist)))
field_list = nodes.field_list()
field_list.append(self.make_arg(module_title, module))
# second, create node tree
for arg, txt in arg_map.items():
if not txt: # skip name etc...
continue
if arg not in self.args:
continue
value = self.args[arg] # value of that task arg
if isinstance(value, list):
bl = nodes.bullet_list()
for v in value:
body = nodes.emphasis(text=v)
bl.append(nodes.list_item('', body))
name = nodes.field_name(text=txt)
body = nodes.field_body()
body.append(bl)
field = nodes.field()
field += [name, body]
field_list.append(field)
else:
field_list.append(self.make_arg(txt, value))
item.append(field_list)
return item