Class: OpenApi::RSpec::SchemaParser
- Inherits:
-
Object
- Object
- OpenApi::RSpec::SchemaParser
- Defined in:
- lib/open_api/rspec/schema_parser.rb
Constant Summary collapse
- UUID_REGEX =
'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
Instance Attribute Summary collapse
-
#openapi_schema ⇒ Object
readonly
Returns the value of attribute openapi_schema.
-
#request ⇒ Object
readonly
Returns the value of attribute request.
-
#response ⇒ Object
readonly
Returns the value of attribute response.
-
#schema_for_url ⇒ Object
readonly
Returns the value of attribute schema_for_url.
Instance Method Summary collapse
- #deep_body_keys(name, hash) ⇒ Object
- #get_deep_keys(hash) ⇒ Object
- #has_documented_param_in_openapi_url_fragments(fragment) ⇒ Object
-
#initialize(openapi_schema, request, response) ⇒ SchemaParser
constructor
A new instance of SchemaParser.
- #openapi_body_params ⇒ Object
- #openapi_form_data_params ⇒ Object
- #openapi_path_params ⇒ Object
- #openapi_query_string_params ⇒ Object
- #openapi_request_params ⇒ Object
- #openapi_required_form_data_params ⇒ Object
- #openapi_required_path_params ⇒ Object
- #openapi_required_query_string_params ⇒ Object
- #openapi_url_fragment_name(fragment) ⇒ Object
- #request_params ⇒ Object
- #request_path_params ⇒ Object
- #schema_for_url_and_request_method ⇒ Object
- #schema_for_url_and_request_method_and_response_status ⇒ Object
- #schema_for_url_and_request_method_body_parameters ⇒ Object
- #schema_for_url_and_request_method_form_data_parameters ⇒ Object
- #schema_for_url_and_request_method_parameters ⇒ Object
- #schema_for_url_and_request_method_path_parameters ⇒ Object
- #schema_for_url_and_request_method_query_string_parameters ⇒ Object
Constructor Details
#initialize(openapi_schema, request, response) ⇒ SchemaParser
Returns a new instance of SchemaParser.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/open_api/rspec/schema_parser.rb', line 9 def initialize(openapi_schema, request, response) @openapi_schema = openapi_schema @request = request @response = response url = request.path.gsub(@openapi_schema['basePath'], '') url_fragments = url.split('/') @openapi_schema['paths'].each do |path, | path_fragments = path.to_s.split('/') next if path_fragments.count != url_fragments.count mismatch = false @request_path_params = {} path_fragments.each_with_index do |a, i| if has_documented_param_in_openapi_url_fragments(a) openapi_for_http_method = [request.method.to_s.downcase.to_s] unless openapi_for_http_method mismatch = true break end openapi_params = openapi_for_http_method['parameters'] unless openapi_params mismatch = true break end openapi_path_params = openapi_params.select do |path_param| path_param['in'].to_s == 'path' end unless openapi_path_params mismatch = true break end = openapi_path_params.find do |path_param| path_param['name'].to_s == openapi_url_fragment_name(a).to_s end if case ['type'].to_s when 'integer' if (url_fragments[i] =~ /\d/) != 0 mismatch = true break else @request_path_params[a.delete('{').delete('}')] = url_fragments[i] next end when 'string' if (url_fragments[i] =~ /#{UUID_REGEX}/) != 0 && (url_fragments[i] =~ /[a-zA-Z]+/) != 0 mismatch = true break else @request_path_params[a.delete('{').delete('}')] = url_fragments[i] next end else mismatch = true break end else mismatch = true break end end mismatch = a != url_fragments[i] break if mismatch end next if mismatch @schema_for_url = break end end |
Instance Attribute Details
#openapi_schema ⇒ Object (readonly)
Returns the value of attribute openapi_schema.
6 7 8 |
# File 'lib/open_api/rspec/schema_parser.rb', line 6 def openapi_schema @openapi_schema end |
#request ⇒ Object (readonly)
Returns the value of attribute request.
6 7 8 |
# File 'lib/open_api/rspec/schema_parser.rb', line 6 def request @request end |
#response ⇒ Object (readonly)
Returns the value of attribute response.
6 7 8 |
# File 'lib/open_api/rspec/schema_parser.rb', line 6 def response @response end |
#schema_for_url ⇒ Object (readonly)
Returns the value of attribute schema_for_url.
6 7 8 |
# File 'lib/open_api/rspec/schema_parser.rb', line 6 def schema_for_url @schema_for_url end |
Instance Method Details
#deep_body_keys(name, hash) ⇒ Object
166 167 168 169 170 171 172 173 174 175 176 177 178 |
# File 'lib/open_api/rspec/schema_parser.rb', line 166 def deep_body_keys(name, hash) if hash['type'] == 'object' hash['properties'].flat_map do |p_name, p_hash| parent = name.to_s.camelize(:lower).to_s sub_keys = deep_body_keys(p_name, p_hash) sub_keys.flat_map do |sub| "#{parent}##{sub}".to_s end end else [name.to_s.camelize(:lower).to_s] end end |
#get_deep_keys(hash) ⇒ Object
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/open_api/rspec/schema_parser.rb', line 213 def get_deep_keys(hash) return [] if hash.empty? hash.flat_map do |k, v| if v.is_a? Hash parent = k.to_s.camelize(:lower).to_s sub_keys = get_deep_keys(v) sub_keys.map do |sub| "#{parent}##{sub}".to_s end else k.to_s.camelize(:lower).to_s end end end |
#has_documented_param_in_openapi_url_fragments(fragment) ⇒ Object
87 88 89 |
# File 'lib/open_api/rspec/schema_parser.rb', line 87 def has_documented_param_in_openapi_url_fragments(fragment) (fragment =~ /^{.+}$/) == 0 end |
#openapi_body_params ⇒ Object
152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/open_api/rspec/schema_parser.rb', line 152 def openapi_body_params schema_for_url_and_request_method_body_parameters.flat_map do |p| if p['schema'].present? scheme = p['schema']['$ref'].tr('/', ' ')[2..-1].strip.split.map(&:to_s) body = @openapi_schema.dig(*scheme) body['properties'].flat_map do |k, v| deep_body_keys(k, v) end else p['name'].to_s end end end |
#openapi_form_data_params ⇒ Object
148 149 150 |
# File 'lib/open_api/rspec/schema_parser.rb', line 148 def openapi_form_data_params schema_for_url_and_request_method_form_data_parameters.map { |p| p['name'].to_s } end |
#openapi_path_params ⇒ Object
144 145 146 |
# File 'lib/open_api/rspec/schema_parser.rb', line 144 def openapi_path_params schema_for_url_and_request_method_path_parameters.map { |p| p['name'].to_s } end |
#openapi_query_string_params ⇒ Object
140 141 142 |
# File 'lib/open_api/rspec/schema_parser.rb', line 140 def openapi_query_string_params schema_for_url_and_request_method_query_string_parameters.map { |p| p['name'].to_s } end |
#openapi_request_params ⇒ Object
180 181 182 183 184 185 186 187 |
# File 'lib/open_api/rspec/schema_parser.rb', line 180 def openapi_request_params [ openapi_query_string_params, openapi_path_params, openapi_form_data_params, openapi_body_params ].flatten.compact end |
#openapi_required_form_data_params ⇒ Object
189 190 191 192 193 |
# File 'lib/open_api/rspec/schema_parser.rb', line 189 def openapi_required_form_data_params schema_for_url_and_request_method_form_data_parameters .select { |p| p['required'] == true } .map { |p| p['name'].to_s } end |
#openapi_required_path_params ⇒ Object
195 196 197 198 199 |
# File 'lib/open_api/rspec/schema_parser.rb', line 195 def openapi_required_path_params schema_for_url_and_request_method_path_parameters .select { |p| p['required'] == true } .map { |p| p['name'].to_s } end |
#openapi_required_query_string_params ⇒ Object
201 202 203 204 205 |
# File 'lib/open_api/rspec/schema_parser.rb', line 201 def openapi_required_query_string_params schema_for_url_and_request_method_query_string_parameters .select { |p| p['required'] == true } .map { |p| p['name'].to_s } end |
#openapi_url_fragment_name(fragment) ⇒ Object
91 92 93 |
# File 'lib/open_api/rspec/schema_parser.rb', line 91 def openapi_url_fragment_name(fragment) fragment.match(/^{(.+)}$/).captures.first end |
#request_params ⇒ Object
207 208 209 210 211 |
# File 'lib/open_api/rspec/schema_parser.rb', line 207 def request_params valid_params = get_deep_keys(request.params.except('format', 'action', 'controller')) valid_params - request_path_params end |
#request_path_params ⇒ Object
95 96 97 |
# File 'lib/open_api/rspec/schema_parser.rb', line 95 def request_path_params @request_path_params.map { |k, _| k.to_s } end |
#schema_for_url_and_request_method ⇒ Object
99 100 101 102 103 104 105 |
# File 'lib/open_api/rspec/schema_parser.rb', line 99 def schema_for_url_and_request_method if schema_for_url schema_for_url[request.method.to_s.downcase.to_s] else {} end end |
#schema_for_url_and_request_method_and_response_status ⇒ Object
131 132 133 134 135 136 137 138 |
# File 'lib/open_api/rspec/schema_parser.rb', line 131 def schema_for_url_and_request_method_and_response_status if schema_for_url_and_request_method['responses'] schema = schema_for_url_and_request_method['responses'][response.status.to_s] schema else {} end end |
#schema_for_url_and_request_method_body_parameters ⇒ Object
126 127 128 129 |
# File 'lib/open_api/rspec/schema_parser.rb', line 126 def schema_for_url_and_request_method_body_parameters schema_for_url_and_request_method_parameters .select { |p| p['in'].to_s == 'body' } end |
#schema_for_url_and_request_method_form_data_parameters ⇒ Object
121 122 123 124 |
# File 'lib/open_api/rspec/schema_parser.rb', line 121 def schema_for_url_and_request_method_form_data_parameters schema_for_url_and_request_method_parameters .select { |p| p['in'].to_s == 'formData' } end |
#schema_for_url_and_request_method_parameters ⇒ Object
107 108 109 |
# File 'lib/open_api/rspec/schema_parser.rb', line 107 def schema_for_url_and_request_method_parameters schema_for_url_and_request_method['parameters'] || [{}] end |
#schema_for_url_and_request_method_path_parameters ⇒ Object
116 117 118 119 |
# File 'lib/open_api/rspec/schema_parser.rb', line 116 def schema_for_url_and_request_method_path_parameters schema_for_url_and_request_method_parameters .select { |p| p['in'].to_s == 'path' } end |
#schema_for_url_and_request_method_query_string_parameters ⇒ Object
111 112 113 114 |
# File 'lib/open_api/rspec/schema_parser.rb', line 111 def schema_for_url_and_request_method_query_string_parameters schema_for_url_and_request_method_parameters .select { |p| p['in'].to_s == 'query' } end |