1010
1111class 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
349380def main ():
0 commit comments