rspec-openapi 0.4.6 → 0.5.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 +4 -4
- data/.github/workflows/test.yml +13 -5
- data/CHANGELOG.md +15 -0
- data/Gemfile +1 -1
- data/README.md +11 -0
- data/lib/rspec/openapi/hooks.rb +4 -2
- data/lib/rspec/openapi/schema_builder.rb +6 -0
- data/lib/rspec/openapi/schema_merger.rb +11 -10
- data/lib/rspec/openapi/version.rb +1 -1
- data/lib/rspec/openapi.rb +2 -1
- metadata +2 -3
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b35634b5756cb3719f38bdb5bbb501033b69472d0680615b5e1dcdba2251f41f
|
|
4
|
+
data.tar.gz: 6600c602466bf0ea6a468c22a2762c6717086ed2ee1ae89c4d132b7d5edc21cc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 13c6e8ad06467426186336d53a387e7e92207d5caf5c6838a076275674e3f334a490185cbf20d889f59b04160d6ec056b3030e35862217d6425f88ccef7fc97c
|
|
7
|
+
data.tar.gz: 4393d139ac38acd1ccf1b8404482671932b39491eed44ab69cbf57c28e06a186cdf452cb610b01377d2237f28ee4fe024fd43e28780b8662e8c76626be414332
|
data/.github/workflows/test.yml
CHANGED
|
@@ -15,11 +15,19 @@ jobs:
|
|
|
15
15
|
strategy:
|
|
16
16
|
fail-fast: false
|
|
17
17
|
matrix:
|
|
18
|
-
|
|
19
|
-
- ruby:2.5
|
|
20
|
-
- ruby:2.6
|
|
21
|
-
- ruby:2.7
|
|
22
|
-
- ruby:3.0
|
|
18
|
+
include:
|
|
19
|
+
- ruby: ruby:2.5
|
|
20
|
+
- ruby: ruby:2.6
|
|
21
|
+
- ruby: ruby:2.7
|
|
22
|
+
- ruby: ruby:3.0
|
|
23
|
+
- ruby: ruby:3.1
|
|
24
|
+
rails: 6.0.5
|
|
25
|
+
- ruby: ruby:3.1
|
|
26
|
+
rails: 6.1.6
|
|
27
|
+
- ruby: ruby:3.1
|
|
28
|
+
rails: 7.0.3
|
|
29
|
+
env:
|
|
30
|
+
RAILS_VERSION: ${{ matrix.rails == '' && '6.1.6' || matrix.rails }}
|
|
23
31
|
steps:
|
|
24
32
|
- uses: actions/checkout@v2
|
|
25
33
|
- name: bundle install
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
## v0.5.0
|
|
2
|
+
|
|
3
|
+
* Overwrite fields in an existing schema file instead of leaving all existing fields as is
|
|
4
|
+
[#55](https://github.com/k0kubun/rspec-openapi/pull/55)
|
|
5
|
+
|
|
6
|
+
## v0.4.8
|
|
7
|
+
|
|
8
|
+
* Fix a bug in nested parameters handling
|
|
9
|
+
[#46](https://github.com/k0kubun/rspec-openapi/pull/46)
|
|
10
|
+
|
|
11
|
+
## v0.4.7
|
|
12
|
+
|
|
13
|
+
* Add `info` config hash
|
|
14
|
+
[#43](https://github.com/k0kubun/rspec-openapi/pull/43)
|
|
15
|
+
|
|
1
16
|
## v0.4.6
|
|
2
17
|
|
|
3
18
|
* Fix "No route matched for" error in engine routes
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -105,6 +105,8 @@ and the schema file can be used as an input of [Swagger UI](https://github.com/s
|
|
|
105
105
|
The following configurations are optional.
|
|
106
106
|
|
|
107
107
|
```rb
|
|
108
|
+
require 'rspec/openapi'
|
|
109
|
+
|
|
108
110
|
# Change the path to generate schema from `doc/openapi.yaml`
|
|
109
111
|
RSpec::OpenAPI.path = 'doc/schema.yaml'
|
|
110
112
|
|
|
@@ -126,6 +128,15 @@ RSpec::OpenAPI.enable_example = false
|
|
|
126
128
|
# Change `info.version`
|
|
127
129
|
RSpec::OpenAPI.application_version = '1.0.0'
|
|
128
130
|
|
|
131
|
+
# Set the info header details
|
|
132
|
+
RSpec::OpenAPI.info = {
|
|
133
|
+
description: 'My beautiful API',
|
|
134
|
+
license: {
|
|
135
|
+
'name': 'Apache 2.0',
|
|
136
|
+
'url': 'https://www.apache.org/licenses/LICENSE-2.0.html'
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
129
140
|
# Set `headers` - generate parameters with headers for a request
|
|
130
141
|
RSpec::OpenAPI.request_headers = %w[X-Authorization-Token]
|
|
131
142
|
|
data/lib/rspec/openapi/hooks.rb
CHANGED
|
@@ -20,10 +20,12 @@ RSpec.configuration.after(:suite) do
|
|
|
20
20
|
title = File.basename(Dir.pwd)
|
|
21
21
|
path_records.each do |path, records|
|
|
22
22
|
RSpec::OpenAPI::SchemaFile.new(path).edit do |spec|
|
|
23
|
-
|
|
23
|
+
schema = RSpec::OpenAPI::DefaultSchema.build(title)
|
|
24
|
+
schema[:info].merge!(RSpec::OpenAPI.info)
|
|
25
|
+
RSpec::OpenAPI::SchemaMerger.merge!(spec, schema)
|
|
24
26
|
records.each do |record|
|
|
25
27
|
begin
|
|
26
|
-
RSpec::OpenAPI::SchemaMerger.
|
|
28
|
+
RSpec::OpenAPI::SchemaMerger.merge!(spec, RSpec::OpenAPI::SchemaBuilder.build(record))
|
|
27
29
|
rescue StandardError, NotImplementedError => e # e.g. SchemaBuilder raises a NotImplementedError
|
|
28
30
|
error_records[e] = record # Avoid failing the build
|
|
29
31
|
end
|
|
@@ -158,9 +158,15 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
|
|
|
158
158
|
def build_example(value)
|
|
159
159
|
return nil if value.nil?
|
|
160
160
|
value = value.dup
|
|
161
|
+
adjust_params(value)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def adjust_params(value)
|
|
161
165
|
value.each do |key, v|
|
|
162
166
|
if v.is_a?(ActionDispatch::Http::UploadedFile)
|
|
163
167
|
value[key] = v.original_filename
|
|
168
|
+
elsif v.is_a?(Hash)
|
|
169
|
+
adjust_params(v)
|
|
164
170
|
end
|
|
165
171
|
end
|
|
166
172
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
class << RSpec::OpenAPI::SchemaMerger = Object.new
|
|
2
2
|
# @param [Hash] base
|
|
3
3
|
# @param [Hash] spec
|
|
4
|
-
def
|
|
4
|
+
def merge!(base, spec)
|
|
5
5
|
spec = normalize_keys(spec)
|
|
6
|
-
|
|
6
|
+
merge_schema!(base, spec)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
private
|
|
@@ -22,25 +22,26 @@ class << RSpec::OpenAPI::SchemaMerger = Object.new
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
# Not doing `base.replace(deep_merge(base, spec))` to preserve key orders.
|
|
25
|
-
# Also this needs to be aware of OpenAPI details
|
|
26
|
-
#
|
|
25
|
+
# Also this needs to be aware of OpenAPI details because a Hash-like structure
|
|
26
|
+
# may be an array whose Hash elements have a key name.
|
|
27
27
|
#
|
|
28
|
-
# TODO: Perform more intelligent merges like rerouting edits / merging types
|
|
29
28
|
# TODO: Should we probably force-merge `summary` regardless of manual modifications?
|
|
30
|
-
def
|
|
29
|
+
def merge_schema!(base, spec)
|
|
31
30
|
spec.each do |key, value|
|
|
32
31
|
if base[key].is_a?(Hash) && value.is_a?(Hash)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
if !base[key].key?("$ref")
|
|
33
|
+
merge_schema!(base[key], value)
|
|
34
|
+
end
|
|
36
35
|
elsif base[key].is_a?(Array) && value.is_a?(Array)
|
|
37
36
|
# parameters need to be merged as if `name` and `in` were the Hash keys.
|
|
38
37
|
if key == 'parameters'
|
|
39
38
|
base[key] |= value
|
|
40
39
|
base[key].uniq! { |param| param.slice('name', 'in') }
|
|
40
|
+
else
|
|
41
|
+
base[key] = value
|
|
41
42
|
end
|
|
42
43
|
else
|
|
43
|
-
|
|
44
|
+
base[key] = value
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
base
|
data/lib/rspec/openapi.rb
CHANGED
|
@@ -6,12 +6,13 @@ module RSpec::OpenAPI
|
|
|
6
6
|
@comment = nil
|
|
7
7
|
@enable_example = true
|
|
8
8
|
@description_builder = -> (example) { example.description }
|
|
9
|
+
@info = {}
|
|
9
10
|
@application_version = '1.0.0'
|
|
10
11
|
@request_headers = []
|
|
11
12
|
@server_urls = []
|
|
12
13
|
@example_types = %i[request]
|
|
13
14
|
|
|
14
15
|
class << self
|
|
15
|
-
attr_accessor :path, :comment, :enable_example, :description_builder, :application_version, :request_headers, :server_urls, :example_types
|
|
16
|
+
attr_accessor :path, :comment, :enable_example, :description_builder, :info, :application_version, :request_headers, :server_urls, :example_types
|
|
16
17
|
end
|
|
17
18
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rspec-openapi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Takashi Kokubun
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-05-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: actionpack
|
|
@@ -49,7 +49,6 @@ files:
|
|
|
49
49
|
- ".github/workflows/test.yml"
|
|
50
50
|
- ".gitignore"
|
|
51
51
|
- ".rspec"
|
|
52
|
-
- ".travis.yml"
|
|
53
52
|
- CHANGELOG.md
|
|
54
53
|
- Gemfile
|
|
55
54
|
- LICENSE.txt
|