-
Notifications
You must be signed in to change notification settings - Fork 10
/
tryopenapi.py
150 lines (119 loc) · 4.17 KB
/
tryopenapi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import json
import yaml
import dnode
from eave import *
openapi_yaml = open('openapi.yaml').read()
openapi_json = open('openapi.json').read()
yaml_data = yaml.safe_load(openapi_yaml)
json_data = json.loads(openapi_json)
assert yaml_data == json_data
class DNode(dnode.DNode):
def __getattr__(self, item):
if item not in self.fields:
return None
return super().__getattr__(item)
root = DNode(json_data)
doc = Doc()
info = root.info
if info:
doc.title = info.title or ''
doc.version = info.version or doc.version
doc.description = info.description or ''
servers = root.servers
if servers:
hosts = []
for server in servers:
h = server.url
description = server.description
if description:
h += f'({description})'
hosts.append(h)
doc.host = ', '.join(hosts)
paths = root.paths
for path, operations in root.paths.items():
# print(path)
for method, operation in operations.items():
operation = DNode(operation)
# print(method)
# print(operation)
api = Api()
api.url = path
api.title = operation.summary or operation.description or operation.operationId
api.description = operation.description
api.method = method.upper()
api.params = []
api.content_types = []
parameters = operation.parameters or []
requestBody = operation.requestBody
responses = operation.responses or []
for parameter in parameters:
category = parameter.get('in')
name = parameter.name
required = parameter.required or False
description = parameter.description or ''
# todo: support deprecated and allowEmptyValue
deprecated = parameter.deprecated
allowEmptyValue = parameter.allowEmptyValue
type = 'string'
example = ''
schema = parameter.schema
if schema:
type = schema.type or type
example = schema.example or example
# in: "path", "query", "cookie", "header"
p = None
if category == 'path':
p = PathParam()
elif category == 'query':
p = QueryParam()
p.required = required
elif category == 'cookie':
# todo: support cookie parameters
pass
elif category == 'header':
# todo: support header parameters
pass
if p:
p.name = name
p.description = description
p.type = type
p.example = example
p.default = ''
api.params.append(p)
if requestBody and requestBody.content:
param_names = []
for content_type, value in requestBody.content.items():
content = DNode(value)
api.content_types.append(content_type)
properties = content.schema and content.schema.properties or {}
required_names = content.schema and content.schema.required or []
for param_name, value in properties.items():
if param_name in param_names:
continue
param = DNode(value)
p = BodyParam()
p.name = param_name
p.type = param.type
p.description = param.description or ''
p.required = param_name in required_names
api.params.append(p)
param_names.append(param_name)
api.make_body_example()
# todo: support response
response_description = ''
response_example = ''
doc.add_api(api)
doc.build('openapi.html', 'zh')
# todo: support more
# root.security
# root.externalDocs
# root.components
# root.components.schemas
# root.components.responses
# root.components.parameters
# root.components.examples
# root.components.requestBodies
# root.components.headers
# root.components.securitySchemes
# root.components.links
# root.components.callbacks