11from __future__ import absolute_import
2- from os import path
2+ from os import path , listdir
33import codecs
4+
5+ from swagger_py_codegen .jsonschema import Schema
6+
47try :
58 import simplejson as json
69except ImportError :
710 import json
811from os import makedirs
9- from os .path import join , exists , dirname
12+ from os .path import join , exists , dirname , isdir
1013
1114import six
1215import yaml
@@ -29,8 +32,7 @@ def get_ref_filepath(filename, ref_file):
2932 return ref_file
3033
3134
32- def spec_load (filename ):
33- spec_data = {}
35+ def get_loader (filename ):
3436 if filename .endswith ('.json' ):
3537 loader = json .load
3638 elif filename .endswith ('.yml' ) or filename .endswith ('.yaml' ):
@@ -43,20 +45,67 @@ def spec_load(filename):
4345 loader = json .load
4446 else :
4547 loader = yaml .load
48+ return loader
49+
50+
51+ def load_file (filename , spec_data ):
52+ loader = get_loader (filename )
4653 with codecs .open (filename , 'r' , 'utf-8' ) as f :
4754 data = loader (f )
55+ # modify_spec_data(spec_data, data)
4856 spec_data .update (data )
4957 for field , values in six .iteritems (data ):
5058 if field not in ['definitions' , 'parameters' , 'paths' ]:
5159 continue
5260 if not isinstance (values , dict ):
5361 continue
5462 for _field , value in six .iteritems (values ):
63+ # _field is the endpoint for paths when the api of paths contains $ref
5564 if _field == '$ref' and value .endswith ('.yml' ):
5665 _filepath = get_ref_filepath (filename , value )
5766 field_data = spec_load (_filepath )
67+ # modify_spec_data(field, spec_data, field_data)
5868 spec_data [field ] = field_data
59- return spec_data
69+ elif '$ref' in value :
70+ v = value .pop ('$ref' , '' )
71+ if not v :
72+ continue
73+ _filepath = get_ref_filepath (filename , v )
74+ field_data = spec_load (_filepath )
75+ modify_spec_data (field , spec_data , field_data )
76+ # spec_data[field][_field] = field_data.values()
77+
78+
79+ def dump_file (filename , data ):
80+ if not filename .endswith ('.yml' ):
81+ return None
82+ if not exists (filename ):
83+ dirs = filename .rsplit ('/' , 1 )[0 ]
84+ # dirs, fn = '/'.join(paths[:-1]), paths[-1]
85+ if not exists (dirs ):
86+ makedirs (dirs )
87+ with codecs .open (filename , 'w' , 'utf-8' ) as f :
88+ yaml .dump (data , f , default_flow_style = False , allow_unicode = True )
89+
90+
91+ def modify_spec_data (field , spec_data , data ):
92+ if not isinstance (spec_data , dict ) or not isinstance (data , dict ):
93+ return None
94+ for k , v in data .items ():
95+ if k in spec_data [field ]:
96+ spec_data [field ][k ].update (v )
97+ else :
98+ spec_data [field ][k ] = v
99+
100+
101+ def spec_load (filename ):
102+ spec_data = {}
103+ files = listdir (filename ) if isdir (filename ) else [filename ]
104+ for f in files :
105+ if f != filename :
106+ f = filename + '/' + f
107+ load_file (f , spec_data )
108+ return spec_data
60109
61110
62111def write (dist , content ):
@@ -124,6 +173,7 @@ def generate(destination, swagger_doc, force=False, package=None,
124173 click .echo ("Validation passed" )
125174 except ValidationError as e :
126175 raise click .ClickException (str (e ))
176+ #print 'data ',data
127177 swagger = Swagger (data )
128178 if templates == 'tornado' :
129179 generator = TornadoGenerator (swagger )
0 commit comments