55from inspect import getsource
66
77from .base import Code , CodeGenerator
8- from .parser import schema_var_name
8+ from .parser import RefNode
99
1010
1111class Schema (Code ):
@@ -89,10 +89,8 @@ def build_data(swagger):
8989 scopes [(endpoint , method )] = list (security .values ()).pop ()
9090 break
9191
92- schemas = OrderedDict ([(schema_var_name (path ), swagger .get (path )) for path in swagger .definitions ])
93-
9492 data = dict (
95- schemas = schemas ,
93+ definitions = { 'definitions' : swagger . origin_data . get ( 'definitions' , {})} ,
9694 validators = validators ,
9795 filters = filters ,
9896 scopes = scopes ,
@@ -109,7 +107,7 @@ def _process(self):
109107 yield Schema (build_data (self .swagger ))
110108
111109
112- def merge_default (schema , value , get_first = True ):
110+ def merge_default (schema , value , get_first = True , resolver = None ):
113111 # TODO: more types support
114112 type_defaults = {
115113 'integer' : 9573 ,
@@ -119,17 +117,17 @@ def merge_default(schema, value, get_first=True):
119117 'boolean' : False
120118 }
121119
122- results = normalize (schema , value , type_defaults )
120+ results = normalize (schema , value , type_defaults , resolver = resolver )
123121 if get_first :
124122 return results [0 ]
125123 return results
126124
127125
128- def build_default (schema ):
129- return merge_default (schema , None )
126+ def build_default (schema , resolver = None ):
127+ return merge_default (schema , None , resolver = resolver )
130128
131129
132- def normalize (schema , data , required_defaults = None ):
130+ def normalize (schema , data , required_defaults = None , resolver = None ):
133131 if required_defaults is None :
134132 required_defaults = {}
135133 errors = []
@@ -217,7 +215,7 @@ def _normalize_dict(schema, data):
217215
218216 def _normalize_list (schema , data ):
219217 result = []
220- if hasattr (data , '__iter__' ) and not isinstance (data , dict ):
218+ if hasattr (data , '__iter__' ) and not isinstance (data , ( dict , RefNode ) ):
221219 for item in data :
222220 result .append (_normalize (schema .get ('items' ), item ))
223221 elif 'default' in schema :
@@ -230,6 +228,15 @@ def _normalize_default(schema, data):
230228 else :
231229 return data
232230
231+ def _normalize_ref (schema , data ):
232+ if resolver == None :
233+ raise TypeError ("resolver must be provided" )
234+ ref = schema .get (u"$ref" )
235+ scope , resolved = resolver .resolve (ref )
236+ return _normalize (resolved , data )
237+
238+
239+
233240 def _normalize (schema , data ):
234241 if schema is True or schema == {}:
235242 return data
@@ -239,10 +246,13 @@ def _normalize(schema, data):
239246 'object' : _normalize_dict ,
240247 'array' : _normalize_list ,
241248 'default' : _normalize_default ,
249+ 'ref' : _normalize_ref
242250 }
243251 type_ = schema .get ('type' , 'object' )
244252 if type_ not in funcs :
245253 type_ = 'default'
254+ if schema .get (u'$ref' , None ):
255+ type_ = 'ref'
246256
247257 return funcs [type_ ](schema , data )
248258
0 commit comments