Skip to content

Commit 398f4b3

Browse files
committed
resolve references
1 parent cd05917 commit 398f4b3

File tree

1 file changed

+42
-11
lines changed

1 file changed

+42
-11
lines changed

src/serverless_openapi_generator/openapi_generator.py

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
class DefinitionGenerator:
1212
def __init__(self, serverless_config, serverless_yml_path, openapi_version='3.0.3'):
13-
self.serverless_config = serverless_config
1413
self.serverless_dir = os.path.dirname(serverless_yml_path)
14+
self.serverless_config = self._resolve_file_references(serverless_config)
1515
owasp.get_latest()
1616
self.open_api = {
1717
"openapi": openapi_version,
@@ -23,6 +23,24 @@ def __init__(self, serverless_config, serverless_yml_path, openapi_version='3.0.
2323
}
2424
self.schema_handler = SchemaHandler(self.serverless_config, self.open_api, self.serverless_dir)
2525

26+
def _resolve_file_references(self, value):
27+
if isinstance(value, dict):
28+
return {k: self._resolve_file_references(v) for k, v in value.items()}
29+
elif isinstance(value, list):
30+
return [self._resolve_file_references(item) for item in value]
31+
elif isinstance(value, str):
32+
match = re.match(r'\${file\((.*)\)}', value)
33+
if match:
34+
file_path = match.group(1).strip()
35+
abs_path = os.path.join(self.serverless_dir, file_path)
36+
try:
37+
with open(abs_path, 'r') as f:
38+
return yaml.safe_load(f)
39+
except (IOError, yaml.YAMLError) as e:
40+
print(f"Warning: Could not read or parse file reference {abs_path}: {e}")
41+
return value
42+
return value
43+
2644
def generate(self):
2745
self.schema_handler.add_models_to_openapi()
2846
self.create_info()
@@ -334,16 +352,29 @@ def create_servers(self):
334352

335353
def create_response_headers(self, headers_doc):
336354
headers = {}
337-
for header_name, header_details in headers_doc.items():
338-
header_obj = {
339-
'description': header_details.get('description', '')
340-
}
341-
if 'schema' in header_details:
342-
# Following the pattern of creating a schema in components for the header
343-
schema_ref = self.schema_handler.create_schema(header_name, header_details['schema'])
344-
header_obj['schema'] = {'$ref': schema_ref}
345-
346-
headers[header_name] = header_obj
355+
if isinstance(headers_doc, list):
356+
for header in headers_doc:
357+
header_name = header.get('name')
358+
if not header_name:
359+
continue
360+
header_obj = {
361+
'description': header.get('description', '')
362+
}
363+
if 'schema' in header:
364+
schema_ref = self.schema_handler.create_schema(header_name, header['schema'])
365+
header_obj['schema'] = {'$ref': schema_ref}
366+
headers[header_name] = header_obj
367+
elif isinstance(headers_doc, dict):
368+
for header_name, header_details in headers_doc.items():
369+
header_obj = {
370+
'description': header_details.get('description', '')
371+
}
372+
if 'schema' in header_details:
373+
# Following the pattern of creating a schema in components for the header
374+
schema_ref = self.schema_handler.create_schema(header_name, header_details['schema'])
375+
header_obj['schema'] = {'$ref': schema_ref}
376+
377+
headers[header_name] = header_obj
347378
return headers
348379

349380
def main():

0 commit comments

Comments
 (0)