@@ -18,7 +18,7 @@ def build(record)
1818 if has_content
1919 response [ :content ] = {
2020 normalize_content_type ( record . response_content_type ) => {
21- schema : build_property ( record . response_body , disposition : disposition ) ,
21+ schema : build_property ( record . response_body , disposition : disposition , record : record ) ,
2222 example : response_example ( record , disposition : disposition ) ,
2323 } . compact ,
2424 }
@@ -73,7 +73,7 @@ def build_parameters(record)
7373 name : build_parameter_name ( key , value ) ,
7474 in : 'path' ,
7575 required : true ,
76- schema : build_property ( try_cast ( value ) ) ,
76+ schema : build_property ( try_cast ( value ) , key : key , record : record ) ,
7777 example : ( try_cast ( value ) if example_enabled? ) ,
7878 } . compact
7979 end
@@ -83,7 +83,7 @@ def build_parameters(record)
8383 name : build_parameter_name ( key , value ) ,
8484 in : 'query' ,
8585 required : record . required_request_params . include? ( key ) ,
86- schema : build_property ( try_cast ( value ) ) ,
86+ schema : build_property ( try_cast ( value ) , key : key , record : record ) ,
8787 example : ( try_cast ( value ) if example_enabled? ) ,
8888 } . compact
8989 end
@@ -93,7 +93,7 @@ def build_parameters(record)
9393 name : build_parameter_name ( key , value ) ,
9494 in : 'header' ,
9595 required : true ,
96- schema : build_property ( try_cast ( value ) ) ,
96+ schema : build_property ( try_cast ( value ) , key : key , record : record ) ,
9797 example : ( try_cast ( value ) if example_enabled? ) ,
9898 } . compact
9999 end
@@ -110,7 +110,7 @@ def build_response_headers(record)
110110
111111 record . response_headers . each do |key , value |
112112 headers [ key ] = {
113- schema : build_property ( try_cast ( value ) ) ,
113+ schema : build_property ( try_cast ( value ) , key : key , record : record ) ,
114114 } . compact
115115 end
116116
@@ -134,36 +134,38 @@ def build_request_body(record)
134134 {
135135 content : {
136136 normalize_content_type ( record . request_content_type ) => {
137- schema : build_property ( record . request_params ) ,
137+ schema : build_property ( record . request_params , record : record ) ,
138138 example : ( build_example ( record . request_params ) if example_enabled? ) ,
139139 } . compact ,
140140 } ,
141141 }
142142 end
143143
144- def build_property ( value , disposition : nil )
145- property = build_type ( value , disposition )
144+ def build_property ( value , disposition : nil , key : nil , record : nil )
145+ format = disposition ? 'binary' : infer_format ( key , record )
146+
147+ property = build_type ( value , format : format )
146148
147149 case value
148150 when Array
149151 property [ :items ] = if value . empty?
150152 { } # unknown
151153 else
152- build_property ( value . first )
154+ build_property ( value . first , record : record )
153155 end
154156 when Hash
155157 property [ :properties ] = { } . tap do |properties |
156158 value . each do |key , v |
157- properties [ key ] = build_property ( v )
159+ properties [ key ] = build_property ( v , record : record , key : key )
158160 end
159161 end
160162 property = enrich_with_required_keys ( property )
161163 end
162164 property
163165 end
164166
165- def build_type ( value , disposition )
166- return { type : 'string' , format : 'binary' } if disposition
167+ def build_type ( value , format : nil )
168+ return { type : 'string' , format : format } if format
167169
168170 case value
169171 when String
@@ -187,6 +189,12 @@ def build_type(value, disposition)
187189 end
188190 end
189191
192+ def infer_format ( key , record )
193+ return nil if !key || !record || !record . formats
194+
195+ record . formats [ key ]
196+ end
197+
190198 # Convert an always-String param to an appropriate type
191199 def try_cast ( value )
192200 Integer ( value )
0 commit comments