@@ -519,6 +519,13 @@ def parameters_to_tuples(self, params, collection_formats):
519519 new_params .append ((k , v ))
520520 return new_params
521521
522+ def explode_query_object (self , name , obj ):
523+ """form style, explode: one query parameter per entry, keyed by the property name; a list repeats the name, None is left out"""
524+ obj = self .sanitize_for_serialization (obj )
525+ if not isinstance (obj , dict ):
526+ obj = {name : obj }
527+ return [(k , item ) for k , v in obj .items () for item in (v if isinstance (v , (list , tuple )) else [v ]) if item is not None ]
528+
522529 def parameters_to_url_query (self , params , collection_formats ):
523530 """Get parameters as list of tuples, formatting collections.
524531
@@ -537,11 +544,12 @@ def parameters_to_url_query(self, params, collection_formats):
537544 if isinstance (v , dict ):
538545 v = json .dumps (v )
539546
540- if k in collection_formats :
547+ # a collection format applies only to a list; an exploded entry may share a declared array parameter's name
548+ if k in collection_formats and isinstance (v , (list , tuple )):
541549 collection_format = collection_formats [k ]
542550 if collection_format == 'multi' :
543551 new_params .extend (
544- (k , quote (str (value ).lower () if isinstance (value , bool ) else str (value )))
552+ (quote ( str ( k )) , quote (str (value ).lower () if isinstance (value , bool ) else str (value )))
545553 for value in v
546554 )
547555 else :
@@ -554,12 +562,13 @@ def parameters_to_url_query(self, params, collection_formats):
554562 else : # csv is the default
555563 delimiter = ','
556564 new_params .append (
557- (k , delimiter .join (
565+ (quote ( str ( k )) , delimiter .join (
558566 quote (str (value ).lower () if isinstance (value , bool ) else str (value ))
559567 for value in v ))
560568 )
561569 else :
562- new_params .append ((k , quote (str (v ))))
570+ # names are quoted too: an exploded object's names are runtime data
571+ new_params .append ((quote (str (k )), quote (str (v ))))
563572
564573 return "&" .join (["=" .join (map (str , item )) for item in new_params ])
565574
0 commit comments