· 5 years ago · Aug 06, 2020, 12:46 PM
1sourceFile = 'heimdall_web_api_endpoints.txt'
2targetFile = open('converted_api_spec.yml', 'w')
3
4endpoints = []
5values = []
6currentEndpoint = ''
7endpointStore = ''
8firstvalue = True
9notNulls = []
10
11def getRawPluralEndpoint(string):
12 return string.split(',')[0]
13
14def getPrettyPluralEndpoint(string):
15 return string.split(',')[0].title().replace("_", " ").replace("T ", "Transactions: ")
16
17def getOperationIdPluralEndpoint(string):
18 return 'inbound' + string.split(',')[0].title().replace("_", "")
19
20def getDefinitionSingularEndpoint(string):
21 return string.split(',')[1].title().replace("_", "")
22
23def writeEndpointValueAndCheckRequired(valueSplit, valueDescription, valueExample):
24 targetFile.write(' ' + valueSplit[0] + ':' + '\n')
25
26 if (valueSplit[1] == 'date'):
27 targetFile.write(' type: string' + '\n')
28 targetFile.write(' format: date' + '\n')
29 else:
30 targetFile.write(' type: ' + valueSplit[1] + '\n')
31
32 refersTo = [s for s in valueSplit if "ref -> " in s]
33 minimum = [s for s in valueSplit if "positive" in s]
34
35 print(valueSplit)
36
37 if (len(refersTo) == 1):
38 referenceString = " Reference to " + refersTo[0].split(" ")[-1].title() + '.\n'
39 targetFile.write(' description: ' + valueDescription + referenceString)
40 else:
41 targetFile.write(' description: ' + valueDescription + '\n')
42
43 if (len(minimum) == 1):
44 targetFile.write(' minimum: 0' + '\n')
45
46 targetFile.write(' example: ' + valueExample + '\n')
47
48 if (valueSplit[-1].startswith('enum')):
49 enumValues = valueSplit[-1].split(': ')[1].split('|')
50
51 targetFile.write(' enum: ' + '\n')
52 for enum in enumValues:
53 targetFile.write(' - ' + enum + '\n')
54 if ('NOT_NULL' in valueSplit):
55 notNulls.append(valueSplit[0].strip())
56
57with open(sourceFile, 'r') as f:
58 for line in f:
59 if (line.startswith('* ')):
60 currentEndpoint = line[2:-2]
61 endpoints.append(currentEndpoint)
62 elif (line.startswith(' ')):
63 values.append(currentEndpoint + "#" + line.strip())
64
65targetFile.write("swagger: '2.0'" + "\n")
66targetFile.write("info:" + "\n")
67targetFile.write(" version: draft" + "\n")
68targetFile.write(" title: Heimdall Web API" + "\n")
69targetFile.write(" description: Our first Heimdall web API" + "\n")
70targetFile.write("basePath: /v1" + "\n")
71targetFile.write("host: 'localhost'" + "\n")
72targetFile.write("tags:" + "\n")
73targetFile.write(" - name: session" + "\n")
74targetFile.write(" description: 'Manage sessions'" + "\n")
75
76for endpoint in endpoints:
77 targetFile.write(' - name: '+ '\'' + getPrettyPluralEndpoint(endpoint) + '\'' + '\n')
78 #targetFile.write(' description: ' + '\'' + getPrettyPluralEndpoint(endpoint) + '\'')
79 #targetFile.write('\n')
80
81targetFile.write("schemes:" + "\n")
82targetFile.write("- https" + "\n")
83targetFile.write("consumes:" + "\n")
84targetFile.write(" - application/json" + "\n")
85targetFile.write("produces:" + "\n")
86targetFile.write(" - application/json" + "\n")
87targetFile.write("" + "\n")
88targetFile.write("paths:" + "\n")
89targetFile.write(" #####################" + "\n")
90targetFile.write(" # Session endpoints #" + "\n")
91targetFile.write(" #####################" + "\n")
92targetFile.write(" /session/start:" + "\n")
93targetFile.write(" post:" + "\n")
94targetFile.write(" tags:" + "\n")
95targetFile.write(" - session" + "\n")
96targetFile.write(" summary: Start session" + "\n")
97targetFile.write(" description: Returns session entity containing ID which should be used when sending the data" + "\n")
98targetFile.write(" operationId: startSession" + "\n")
99targetFile.write(" parameters:" + "\n")
100targetFile.write(" - $ref: '#/parameters/Session'" + "\n")
101targetFile.write(" responses:" + "\n")
102targetFile.write(" '200':" + "\n")
103targetFile.write(" description: Successful operation" + "\n")
104targetFile.write(" schema:" + "\n")
105targetFile.write(" $ref: '#/definitions/Session'" + "\n")
106targetFile.write(" '401':" + "\n")
107targetFile.write(" $ref: '#/responses/UnauthorizedError'" + "\n")
108targetFile.write(" /session/end/{sessionId}:" + "\n")
109targetFile.write(" post:" + "\n")
110targetFile.write(" tags:" + "\n")
111targetFile.write(" - session" + "\n")
112targetFile.write(" summary: End session" + "\n")
113targetFile.write(" description: End session and add all uploaded data to job queue" + "\n")
114targetFile.write(" operationId: endSession" + "\n")
115targetFile.write(" parameters:" + "\n")
116targetFile.write(" - $ref: '#/parameters/SessionId'" + "\n")
117targetFile.write(" responses:" + "\n")
118targetFile.write(" '200':" + "\n")
119targetFile.write(" description: Successful operation" + "\n")
120targetFile.write(" '401':" + "\n")
121targetFile.write(" $ref: '#/responses/UnauthorizedError'" + "\n")
122targetFile.write(" '404':" + "\n")
123targetFile.write(" $ref: '#/responses/NoSessionError'" + "\n")
124targetFile.write("\n")
125targetFile.write(" ##################" + "\n")
126targetFile.write(" # Data endpoints #" + "\n")
127targetFile.write(" ##################" + "\n")
128
129for endpoint in endpoints:
130 targetFile.write(' /data/' + getRawPluralEndpoint(endpoint) + '/{sessionId}:' + '\n')
131 targetFile.write(' post:' + '\n')
132 targetFile.write(' tags:' + '\n')
133 targetFile.write(' - ' + '\'' + getPrettyPluralEndpoint(endpoint) + '\'' + '\n')
134 targetFile.write(' summary: ' + '\'' + getPrettyPluralEndpoint(endpoint) + '\'' + '\n')
135 targetFile.write(' operationId: ' + getOperationIdPluralEndpoint(endpoint) + '\n')
136 targetFile.write(' parameters:' + '\n')
137 targetFile.write(' - $ref: \'#/parameters/SessionId\'' + '\n')
138 targetFile.write(' - in: body' + '\n')
139 targetFile.write(' name: ' + getRawPluralEndpoint(endpoint) + '\n')
140 targetFile.write(' required: true' + '\n')
141 targetFile.write(' schema:' + '\n')
142 targetFile.write(' type: array' + '\n')
143 targetFile.write(' items:' + '\n')
144 targetFile.write(' $ref: \'#/definitions/' + getDefinitionSingularEndpoint(endpoint) + '\'' + '\n')
145 targetFile.write(' responses:' + '\n')
146 targetFile.write(' \'200\':' + '\n')
147 targetFile.write(' description: Successful operation' + '\n')
148 targetFile.write(' \'401\':' + '\n')
149 targetFile.write(' $ref: \'#/responses/UnauthorizedError\'' + '\n')
150 targetFile.write(' \'404\':' + '\n')
151 targetFile.write(' $ref: \'#/responses/NoSessionError\'' + '\n')
152
153for value in values:
154 if (firstvalue):
155 targetFile.write('definitions:' + '\n')
156 firstvalue = False
157
158 endpointOnRow,valueDefinitionTemp = value.split('#')
159 valueDefinition,valueDescriptionTemp = valueDefinitionTemp.split('?')
160 valueDescription,valueExample = valueDescriptionTemp.split('!')
161 valueSplit = valueDefinition.replace('\n','').replace('\r','').split(', ')
162
163 if (endpointOnRow != endpointStore):
164 if (len(notNulls) > 0):
165 targetFile.write(' required:' + '\n')
166 for value in notNulls:
167 targetFile.write(' ' + '- ' + value + '\n')
168 notNulls = []
169
170 targetFile.write(' ' + getDefinitionSingularEndpoint(endpointOnRow) + ':' + '\n')
171 targetFile.write(' type: object' + '\n')
172 targetFile.write(' properties:' + '\n')
173
174 writeEndpointValueAndCheckRequired(valueSplit, valueDescription, valueExample)
175
176 if (endpointOnRow == endpointStore):
177 writeEndpointValueAndCheckRequired(valueSplit, valueDescription, valueExample)
178
179 endpointStore = endpointOnRow
180
181if (len(notNulls) > 0):
182 targetFile.write(' required:' + '\n')
183 for value in notNulls:
184 targetFile.write(' ' + '- ' + value + '\n')
185 notNulls = []
186
187targetFile.write(" Session:" + "\n")
188targetFile.write(" type: object" + "\n")
189targetFile.write(" properties:" + "\n")
190targetFile.write(" id:" + "\n")
191targetFile.write(" type: string" + "\n")
192targetFile.write(" format: uuid" + "\n")
193targetFile.write(" keyword:" + "\n")
194targetFile.write(" type: string" + "\n")
195targetFile.write(" status:" + "\n")
196targetFile.write(" type: string" + "\n")
197targetFile.write(" enum:" + "\n")
198targetFile.write(" - STARTED" + "\n")
199targetFile.write(" - PROCESSING" + "\n")
200targetFile.write(" - FINISHED" + "\n")
201targetFile.write(" - FAILED" + "\n")
202targetFile.write(" - CANCELED" + "\n")
203targetFile.write(" messages:" + "\n")
204targetFile.write(" type: array" + "\n")
205targetFile.write(" items:" + "\n")
206targetFile.write(" type: string" + "\n")
207targetFile.write(" startTime:" + "\n")
208targetFile.write(" type: string" + "\n")
209targetFile.write(" format: date-time" + "\n")
210targetFile.write(" endTime:" + "\n")
211targetFile.write(" type: string" + "\n")
212targetFile.write(" format: date-time" + "\n")
213targetFile.write(" required:" + "\n")
214targetFile.write(" - id" + "\n")
215targetFile.write("\n")
216targetFile.write("\n")
217targetFile.write("responses:" + "\n")
218targetFile.write(" UnauthorizedError:" + "\n")
219targetFile.write(" description: API key is missing or invalid" + "\n")
220targetFile.write(" NoSessionError:" + "\n")
221targetFile.write(" description: A session with the specified ID was not found" + "\n")
222targetFile.write("\n")
223targetFile.write("\n")
224targetFile.write("parameters:" + "\n")
225targetFile.write(" Session:" + "\n")
226targetFile.write(" name: sessionData" + "\n")
227targetFile.write(" required: true" + "\n")
228targetFile.write(" in: body" + "\n")
229targetFile.write(" schema:" + "\n")
230targetFile.write(" $ref: '#/definitions/Session'" + "\n")
231targetFile.write(" SessionId:" + "\n")
232targetFile.write(" in: path" + "\n")
233targetFile.write(" name: sessionId" + "\n")
234targetFile.write(" description: Session to use" + "\n")
235targetFile.write(" required: true" + "\n")
236targetFile.write(" type: string" + "\n")
237targetFile.write(" format: uuid" + "\n")
238targetFile.write("\n")
239targetFile.write("securityDefinitions:" + "\n")
240targetFile.write(" ApiKeyAuth:" + "\n")
241targetFile.write(" type: apiKey" + "\n")
242targetFile.write(" in: header" + "\n")
243targetFile.write(" name: X-API-Key" + "\n")
244targetFile.write("\n")
245targetFile.write("security:" + "\n")
246targetFile.write(" - ApiKeyAuth: []" + "\n")