Skip to content

Commit 15054e6

Browse files
Remove child class gotcha
1 parent 6a4a173 commit 15054e6

File tree

7 files changed

+22
-37
lines changed

7 files changed

+22
-37
lines changed

lib/rspec_api_documentation/open_api/example.rb

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/rspec_api_documentation/open_api/headers.rb

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/rspec_api_documentation/open_api/node.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,21 @@ def initialize(opts = {})
3636
opts.each do |name, value|
3737
if name.to_s == 'hide'
3838
self.hide = value
39-
elsif self.class::CHILD_CLASS
40-
add_setting name, :value => self.class::CHILD_CLASS === true ? value : self.class::CHILD_CLASS.new(value)
4139
elsif setting_exist?(name.to_sym)
4240
schema = setting_schema(name)
4341
converted =
44-
case
45-
when schema.is_a?(Array) && schema[0] <= Node then value.map { |v| v.is_a?(schema[0]) ? v : schema[0].new(v) }
46-
when schema <= Node then value.is_a?(schema) ? value : schema.new(value)
42+
if schema.is_a?(Hash) && schema.values[0] <= Node
43+
Hash[value.map { |k, v| [k, v.is_a?(schema.values[0]) ? v : schema.values[0].new(v)] }]
44+
elsif schema.is_a?(Array) && schema[0] <= Node
45+
value.map { |v| v.is_a?(schema[0]) ? v : schema[0].new(v) }
46+
elsif schema <= Node
47+
value.is_a?(schema) ? value : schema.new(value)
4748
else
4849
value
4950
end
5051
assign_setting(name, converted)
52+
elsif self.class::CHILD_CLASS
53+
add_setting name, :value => self.class::CHILD_CLASS === true ? value : self.class::CHILD_CLASS.new(value)
5154
else
5255
public_send("#{name}=", value) if respond_to?("#{name}=")
5356
end
@@ -94,6 +97,8 @@ def as_json
9497
when value.is_a?(Array) && value[0].is_a?(Node)
9598
tmp = value.select { |v| !v.hide }.map { |v| v.as_json }
9699
hash[name] = tmp unless tmp.empty?
100+
when value.is_a?(Hash) && value.values[0].is_a?(Node)
101+
hash[name] = Hash[value.map { |k, v| [k, v.as_json] }]
97102
else
98103
hash[name] = value
99104
end unless value.nil?

lib/rspec_api_documentation/open_api/paths.rb

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/rspec_api_documentation/open_api/response.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ module OpenApi
33
class Response < Node
44
add_setting :description, :required => true, :default => 'Successful operation'
55
add_setting :schema, :schema => Schema
6-
add_setting :headers, :schema => Headers
7-
add_setting :examples, :schema => Example
6+
add_setting :headers, :schema => { "" => Header }
7+
add_setting :examples
88
end
99
end
1010
end

lib/rspec_api_documentation/open_api/root.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class Root < Node
88
add_setting :schemes, :default => %w(http https)
99
add_setting :consumes, :default => %w(application/json application/xml)
1010
add_setting :produces, :default => %w(application/json application/xml)
11-
add_setting :paths, :default => Paths.new, :required => true, :schema => Paths
11+
add_setting :paths, :default => {}, :required => true, :schema => { "" => Path }
1212
add_setting :definitions
1313
add_setting :parameters
1414
add_setting :responses

lib/rspec_api_documentation/writers/open_api_writer.rb

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,12 @@ def add_tags!
8080
end
8181

8282
def add_paths!
83-
specs.safe_assign_setting(:paths, OpenApi::Paths.new)
83+
specs.safe_assign_setting(:paths, {})
8484
examples.each do |example|
85-
specs.paths.add_setting example.route, :value => OpenApi::Path.new
85+
route = example.route.to_s
86+
specs.paths[route] = OpenApi::Path.new
8687

87-
operation = specs.paths.setting(example.route).setting(example.http_method) || OpenApi::Operation.new
88+
operation = specs.paths[route].setting(example.http_method) || OpenApi::Operation.new
8889

8990
operation.safe_assign_setting(:tags, [example.resource_name])
9091
operation.safe_assign_setting(:summary, example.respond_to?(:route_summary) ? example.route_summary : '')
@@ -97,7 +98,7 @@ def add_paths!
9798

9899
process_responses(operation.responses, example)
99100

100-
specs.paths.setting(example.route).assign_setting(example.http_method, operation)
101+
specs.paths[route].assign_setting(example.http_method, operation)
101102
end
102103
end
103104

@@ -110,16 +111,16 @@ def process_responses(responses, example)
110111
)
111112

112113
if request[:response_headers]
113-
response.safe_assign_setting(:headers, OpenApi::Headers.new)
114+
response.safe_assign_setting(:headers, {})
114115
request[:response_headers].each do |header, value|
115-
response.headers.add_setting header, :value => OpenApi::Header.new('x-example-value' => value)
116+
response.headers[header.to_s] = OpenApi::Header.new('x-example-value' => value)
116117
end
117118
end
118119

119120
if /\A(?<response_content_type>[^;]+)/ =~ request[:response_content_type]
120-
response.safe_assign_setting(:examples, OpenApi::Example.new)
121+
response.safe_assign_setting(:examples, {})
121122
response_body = JSON.parse(request[:response_body]) rescue nil
122-
response.examples.add_setting response_content_type, :value => response_body
123+
response.examples[response_content_type.to_s] = response_body
123124
end
124125
responses.add_setting "#{request[:response_status]}", :value => response
125126
end

0 commit comments

Comments
 (0)