rswag-specs 2.5.1 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 335cddedc6446301252f26bb28a0874072ebecfb5c8b35e5a2d94559a6606fcc
|
4
|
+
data.tar.gz: 3a2e60364a2a6e6ee463163eee2caa628ecf28c3ba9975ea239aa1106d4cd179
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 436935923dcf3a446290c2bdf0160b399c5ba270096dc4019b1f47e2308f4e9ca66af8684fa09c6fc63f5b18069cf49b24ae124f19756480f5cff998873c26b5
|
7
|
+
data.tar.gz: 0c123c3e98481381a606a68c59b9cc5f0b8626a70f81c76c3d825bc3a6a46874e9524155da085baaf66abb2872c23f76a0f0931b390d669feeaccf1ba4da875d
|
@@ -69,13 +69,34 @@ module Rswag
|
|
69
69
|
# NOTE: Similar to 'description', 'examples' need to handle the case when
|
70
70
|
# being invoked with no params to avoid overriding 'examples' method of
|
71
71
|
# rspec-core ExampleGroup
|
72
|
-
def examples(
|
73
|
-
return super() if
|
72
|
+
def examples(examples = nil)
|
73
|
+
return super() if examples.nil?
|
74
|
+
# should we add a deprecation warning?
|
75
|
+
examples.each_with_index do |(mime, example_object), index|
|
76
|
+
example(mime, "example_#{index}", example_object)
|
77
|
+
end
|
78
|
+
end
|
74
79
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
80
|
+
def example(mime, name, value, summary=nil, description=nil)
|
81
|
+
# Todo - move initialization of metadata somewhere else.
|
82
|
+
if metadata[:response][:content].blank?
|
83
|
+
metadata[:response][:content] = {}
|
84
|
+
end
|
85
|
+
|
86
|
+
if metadata[:response][:content][mime].blank?
|
87
|
+
metadata[:response][:content][mime] = {}
|
88
|
+
metadata[:response][:content][mime][:examples] = {}
|
89
|
+
end
|
90
|
+
|
91
|
+
example_object = {
|
92
|
+
value: value,
|
93
|
+
summary: summary,
|
94
|
+
description: description
|
95
|
+
}.select { |_, v| v.present? }
|
96
|
+
# TODO, issue a warning if example is being overridden with the same key
|
97
|
+
metadata[:response][:content][mime][:examples].merge!(
|
98
|
+
{ name.to_sym => example_object }
|
99
|
+
)
|
79
100
|
end
|
80
101
|
|
81
102
|
def run_test!(&block)
|
@@ -85,7 +106,7 @@ module Rswag
|
|
85
106
|
submit_request(example.metadata)
|
86
107
|
end
|
87
108
|
|
88
|
-
it "returns a #{metadata[:response][:code]} response" do
|
109
|
+
it "returns a #{metadata[:response][:code]} response", rswag: true do
|
89
110
|
assert_response_matches_metadata(metadata)
|
90
111
|
block.call(response) if block_given?
|
91
112
|
end
|
@@ -94,7 +115,7 @@ module Rswag
|
|
94
115
|
submit_request(example.metadata)
|
95
116
|
end
|
96
117
|
|
97
|
-
it "returns a #{metadata[:response][:code]} response" do |example|
|
118
|
+
it "returns a #{metadata[:response][:code]} response", rswag: true do |example|
|
98
119
|
assert_response_matches_metadata(example.metadata, &block)
|
99
120
|
example.instance_exec(response, &block) if block_given?
|
100
121
|
end
|
@@ -7,14 +7,11 @@ module Rswag
|
|
7
7
|
class ExtendedSchema < JSON::Schema::Draft4
|
8
8
|
def initialize
|
9
9
|
super
|
10
|
-
@attributes['type'] = ExtendedTypeAttribute
|
11
10
|
@uri = URI.parse('http://tempuri.org/rswag/specs/extended_schema')
|
12
11
|
@names = ['http://tempuri.org/rswag/specs/extended_schema']
|
13
12
|
end
|
14
|
-
end
|
15
13
|
|
16
|
-
|
17
|
-
def self.validate(current_schema, data, fragments, processor, validator, options = {})
|
14
|
+
def validate(current_schema, data, *)
|
18
15
|
return if data.nil? && (current_schema.schema['nullable'] == true || current_schema.schema['x-nullable'] == true)
|
19
16
|
|
20
17
|
super
|
@@ -106,18 +106,57 @@ module Rswag
|
|
106
106
|
|
107
107
|
request[:path] = template.tap do |path_template|
|
108
108
|
parameters.select { |p| p[:in] == :path }.each do |p|
|
109
|
+
unless example.respond_to?(p[:name])
|
110
|
+
raise ArgumentError.new("`#{p[:name].to_s}` parameter key present, but not defined within example group"\
|
111
|
+
"(i. e `it` or `let` block)")
|
112
|
+
end
|
109
113
|
path_template.gsub!("{#{p[:name]}}", example.send(p[:name]).to_s)
|
110
114
|
end
|
111
115
|
|
112
116
|
parameters.select { |p| p[:in] == :query }.each_with_index do |p, i|
|
113
117
|
path_template.concat(i.zero? ? '?' : '&')
|
114
|
-
path_template.concat(build_query_string_part(p, example.send(p[:name])))
|
118
|
+
path_template.concat(build_query_string_part(p, example.send(p[:name]), swagger_doc))
|
115
119
|
end
|
116
120
|
end
|
117
121
|
end
|
118
122
|
|
119
|
-
def build_query_string_part(param, value)
|
123
|
+
def build_query_string_part(param, value, swagger_doc)
|
120
124
|
name = param[:name]
|
125
|
+
|
126
|
+
# OAS 3: https://swagger.io/docs/specification/serialization/
|
127
|
+
if swagger_doc && doc_version(swagger_doc).start_with?('3') && param[:schema]
|
128
|
+
style = param[:style]&.to_sym || :form
|
129
|
+
explode = param[:explode].nil? ? true : param[:explode]
|
130
|
+
|
131
|
+
case param[:schema][:type].to_sym
|
132
|
+
when :object
|
133
|
+
case style
|
134
|
+
when :deepObject
|
135
|
+
return { name => value }.to_query
|
136
|
+
when :form
|
137
|
+
if explode
|
138
|
+
return value.to_query
|
139
|
+
else
|
140
|
+
return "#{CGI.escape(name.to_s)}=" + value.to_a.flatten.map{|v| CGI.escape(v.to_s) }.join(',')
|
141
|
+
end
|
142
|
+
end
|
143
|
+
when :array
|
144
|
+
case explode
|
145
|
+
when true
|
146
|
+
return value.to_a.flatten.map{|v| "#{CGI.escape(name.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
|
147
|
+
else
|
148
|
+
separator = case style
|
149
|
+
when :form then ','
|
150
|
+
when :spaceDelimited then '%20'
|
151
|
+
when :pipeDelimited then '|'
|
152
|
+
end
|
153
|
+
return "#{CGI.escape(name.to_s)}=" + value.to_a.flatten.map{|v| CGI.escape(v.to_s) }.join(separator)
|
154
|
+
end
|
155
|
+
else
|
156
|
+
return "#{name}=#{value}"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
121
160
|
type = param[:type] || param.dig(:schema, :type)
|
122
161
|
return "#{name}=#{value}" unless type&.to_sym == :array
|
123
162
|
|
@@ -154,8 +193,8 @@ module Rswag
|
|
154
193
|
tuples << ['Content-Type', content_type]
|
155
194
|
end
|
156
195
|
|
157
|
-
# Rails test infrastructure requires
|
158
|
-
|
196
|
+
# Rails test infrastructure requires rack-formatted headers
|
197
|
+
rack_formatted_tuples = tuples.map do |pair|
|
159
198
|
[
|
160
199
|
case pair[0]
|
161
200
|
when 'Accept' then 'HTTP_ACCEPT'
|
@@ -167,7 +206,7 @@ module Rswag
|
|
167
206
|
]
|
168
207
|
end
|
169
208
|
|
170
|
-
request[:headers] = Hash[
|
209
|
+
request[:headers] = Hash[rack_formatted_tuples]
|
171
210
|
end
|
172
211
|
|
173
212
|
def add_payload(request, parameters, example)
|
@@ -53,7 +53,7 @@ module Rswag
|
|
53
53
|
return unless errors.any?
|
54
54
|
|
55
55
|
raise UnexpectedResponse,
|
56
|
-
"Expected response body to match schema: #{errors
|
56
|
+
"Expected response body to match schema: #{errors.join("\n")}\n" \
|
57
57
|
"Response body: #{JSON.pretty_generate(JSON.parse(body))}"
|
58
58
|
end
|
59
59
|
|
@@ -60,6 +60,7 @@ module Rswag
|
|
60
60
|
if value && schema_param && mime_list
|
61
61
|
value[:requestBody] = { content: {} } unless value.dig(:requestBody, :content)
|
62
62
|
value[:requestBody][:required] = true if schema_param[:required]
|
63
|
+
value[:requestBody][:description] = schema_param[:description] if schema_param[:description]
|
63
64
|
mime_list.each do |mime|
|
64
65
|
value[:requestBody][:content][mime] = { schema: schema_param[:schema] }
|
65
66
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rswag-specs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richie Morris
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -67,8 +67,8 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '2.2'
|
69
69
|
description: 'Simplify API integration testing with a succinct rspec DSL and generate
|
70
|
-
OpenAPI specification files directly from your
|
71
|
-
here: http://spec.openapis.org/'
|
70
|
+
OpenAPI specification files directly from your rspec tests. More about the OpenAPI
|
71
|
+
initiative here: http://spec.openapis.org/'
|
72
72
|
email:
|
73
73
|
- domaindrivendev@gmail.com
|
74
74
|
executables: []
|