rspec-openapi 0.3.18 → 0.4.1
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/CHANGELOG.md +20 -0
- data/README.md +14 -4
- data/lib/rspec/openapi/default_schema.rb +1 -0
- data/lib/rspec/openapi/hooks.rb +2 -2
- data/lib/rspec/openapi/record.rb +1 -0
- data/lib/rspec/openapi/record_builder.rb +7 -0
- data/lib/rspec/openapi/schema_builder.rb +10 -0
- data/lib/rspec/openapi/schema_file.rb +13 -2
- data/lib/rspec/openapi/version.rb +1 -1
- data/lib/rspec/openapi.rb +4 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3032d3fed3b9bdc2b2a8512db3d1645679163539106650c1ad05069a15ab59cd
|
4
|
+
data.tar.gz: d1d3e85b467226a857b30bfe95b5643a1a37df2c0a925e509bdd893ae3017177
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c65c74db1ada24cf360545bda34830ca82d9cbd11b6e862a0563f9fc2bf244d65a96ec74e8223c182d1a2bff72b237e30c5884c2818576f9c142585d177351b
|
7
|
+
data.tar.gz: 397cfcddeaf3c1f683b9a1cd75960bf7d61e24adfcc9988bea2533c7a781acd42f43178b2ffb45deb5b3e821090f979d18af041a078f9ca3c2c7cd124cb4aff2
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## v0.4.1
|
2
|
+
|
3
|
+
* Add `RSpec::OpenAPI.example_types` to hook types other than `type: :request`.
|
4
|
+
[#32](https://github.com/k0kubun/rspec-openapi/pull/32)
|
5
|
+
|
6
|
+
## v0.4.0
|
7
|
+
|
8
|
+
* Drop `RSpec::OpenAPI.output` introduced in v0.3.20
|
9
|
+
* Guess whether it's JSON or not by the extension of `RSpec::OpenAPI.path`
|
10
|
+
|
11
|
+
## v0.3.20
|
12
|
+
|
13
|
+
* Add `RSpec::OpenAPI.output` config to output JSON
|
14
|
+
[#31](https://github.com/k0kubun/rspec-openapi/pull/31)
|
15
|
+
|
16
|
+
## v0.3.19
|
17
|
+
|
18
|
+
* Add `server_urls` and `request_headers` configs
|
19
|
+
[#30](https://github.com/k0kubun/rspec-openapi/pull/30)
|
20
|
+
|
1
21
|
## v0.3.18
|
2
22
|
|
3
23
|
* Support nested query parameters
|
data/README.md
CHANGED
@@ -108,12 +108,23 @@ The following configurations are optional.
|
|
108
108
|
# Change the path to generate schema from `doc/openapi.yaml`
|
109
109
|
RSpec::OpenAPI.path = 'doc/schema.yaml'
|
110
110
|
|
111
|
+
# Change the output type to JSON
|
112
|
+
RSpec::OpenAPI.path = 'doc/schema.json'
|
113
|
+
|
111
114
|
# Disable generating `example`
|
112
115
|
RSpec::OpenAPI.enable_example = false
|
113
116
|
|
114
117
|
# Change `info.version`
|
115
118
|
RSpec::OpenAPI.application_version = '1.0.0'
|
116
119
|
|
120
|
+
# Set `headers` - generate parameters with headers for a request
|
121
|
+
RSpec::OpenAPI.request_headers = %w[X-Authorization-Token]
|
122
|
+
|
123
|
+
# Set `server_urls` - generate servers of a schema file
|
124
|
+
RSpec::OpenAPI.server_urls = %w[
|
125
|
+
http://localhost:3000
|
126
|
+
]
|
127
|
+
|
117
128
|
# Generate a comment on top of a schema file
|
118
129
|
RSpec::OpenAPI.comment = <<~EOS
|
119
130
|
This file is auto-generated by rspec-openapi https://github.com/k0kubun/rspec-openapi
|
@@ -124,6 +135,9 @@ EOS
|
|
124
135
|
|
125
136
|
# Generate a custom description, given an RSpec example
|
126
137
|
RSpec::OpenAPI.description_builder = -> (example) { example.description }
|
138
|
+
|
139
|
+
# Change the example type(s) that will generate schema
|
140
|
+
RSpec::OpenAPI.example_types = %i[request]
|
127
141
|
```
|
128
142
|
|
129
143
|
### How can I add information which can't be generated from RSpec?
|
@@ -155,10 +169,6 @@ Beta
|
|
155
169
|
|
156
170
|
Basic features are there, and some people are already using this.
|
157
171
|
|
158
|
-
### Current limitation
|
159
|
-
|
160
|
-
* Generating a JSON file is not supported yet
|
161
|
-
|
162
172
|
### Other missing features with notes
|
163
173
|
|
164
174
|
* Delete obsoleted endpoints
|
data/lib/rspec/openapi/hooks.rb
CHANGED
@@ -9,7 +9,7 @@ records = []
|
|
9
9
|
records_errors = []
|
10
10
|
|
11
11
|
RSpec.configuration.after(:each) do |example|
|
12
|
-
if example.metadata[:type]
|
12
|
+
if RSpec::OpenAPI.example_types.include?(example.metadata[:type]) && example.metadata[:openapi] != false
|
13
13
|
record = RSpec::OpenAPI::RecordBuilder.build(self, example: example)
|
14
14
|
records << record if record
|
15
15
|
end
|
@@ -31,7 +31,7 @@ RSpec.configuration.after(:suite) do
|
|
31
31
|
if records_errors.any?
|
32
32
|
error_message = <<~EOS
|
33
33
|
RSpec::OpenAPI got errors building #{records_errors.size} requests
|
34
|
-
|
34
|
+
|
35
35
|
#{records_errors.map {|e, record| "#{e.inspect}: #{record.inspect}" }.join("\n")}
|
36
36
|
EOS
|
37
37
|
colorizer = ::RSpec::Core::Formatters::ConsoleCodes
|
data/lib/rspec/openapi/record.rb
CHANGED
@@ -5,6 +5,7 @@ RSpec::OpenAPI::Record = Struct.new(
|
|
5
5
|
:query_params, # @param [Hash] - {:query=>"string"}
|
6
6
|
:request_params, # @param [Hash] - {:request=>"body"}
|
7
7
|
:request_content_type, # @param [String] - "application/json"
|
8
|
+
:request_headers, # @param [Array] - [["header_key1", "header_value1"], ["header_key2", "header_value2"]]
|
8
9
|
:summary, # @param [String] - "v1/statuses #show"
|
9
10
|
:tags, # @param [Array] - ["Status"]
|
10
11
|
:description, # @param [String] - "returns a status"
|
@@ -34,6 +34,12 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
|
|
34
34
|
nil
|
35
35
|
end
|
36
36
|
|
37
|
+
request_headers = RSpec::OpenAPI.request_headers.each_with_object([]) do |header, headers_arr|
|
38
|
+
header_key = header.gsub(/-/, '_').upcase
|
39
|
+
header_value = request.get_header(['HTTP', header_key].join('_')) || request.get_header(header_key)
|
40
|
+
headers_arr << [header, header_value] if header_value
|
41
|
+
end
|
42
|
+
|
37
43
|
RSpec::OpenAPI::Record.new(
|
38
44
|
method: request.request_method,
|
39
45
|
path: path,
|
@@ -41,6 +47,7 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
|
|
41
47
|
query_params: request.query_parameters,
|
42
48
|
request_params: raw_request_params(request),
|
43
49
|
request_content_type: request.media_type,
|
50
|
+
request_headers: request_headers,
|
44
51
|
summary: summary,
|
45
52
|
tags: tags,
|
46
53
|
description: RSpec::OpenAPI.description_builder.call(example),
|
@@ -67,6 +67,16 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
|
|
67
67
|
}.compact
|
68
68
|
end
|
69
69
|
|
70
|
+
record.request_headers.each do |key, value|
|
71
|
+
parameters << {
|
72
|
+
name: build_parameter_name(key, value),
|
73
|
+
in: 'header',
|
74
|
+
required: true,
|
75
|
+
schema: build_property(try_cast(value)),
|
76
|
+
example: (try_cast(value) if example_enabled?),
|
77
|
+
}.compact
|
78
|
+
end
|
79
|
+
|
70
80
|
return nil if parameters.empty?
|
71
81
|
parameters
|
72
82
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'yaml'
|
3
|
+
require 'json'
|
3
4
|
|
4
5
|
# TODO: Support JSON
|
5
6
|
class RSpec::OpenAPI::SchemaFile
|
@@ -20,13 +21,19 @@ class RSpec::OpenAPI::SchemaFile
|
|
20
21
|
# @return [Hash]
|
21
22
|
def read
|
22
23
|
return {} unless File.exist?(@path)
|
23
|
-
YAML.load(File.read(@path))
|
24
|
+
YAML.load(File.read(@path)) # this can also parse JSON
|
24
25
|
end
|
25
26
|
|
26
27
|
# @param [Hash] spec
|
27
28
|
def write(spec)
|
28
29
|
FileUtils.mkdir_p(File.dirname(@path))
|
29
|
-
|
30
|
+
output =
|
31
|
+
if json?
|
32
|
+
JSON.pretty_generate(spec)
|
33
|
+
else
|
34
|
+
prepend_comment(YAML.dump(spec))
|
35
|
+
end
|
36
|
+
File.write(@path, output)
|
30
37
|
end
|
31
38
|
|
32
39
|
def prepend_comment(content)
|
@@ -38,4 +45,8 @@ class RSpec::OpenAPI::SchemaFile
|
|
38
45
|
end
|
39
46
|
"#{comment.gsub(/^/, '# ').gsub(/^# \n/, "#\n")}#{content}"
|
40
47
|
end
|
48
|
+
|
49
|
+
def json?
|
50
|
+
File.extname(@path) == '.json'
|
51
|
+
end
|
41
52
|
end
|
data/lib/rspec/openapi.rb
CHANGED
@@ -7,8 +7,11 @@ module RSpec::OpenAPI
|
|
7
7
|
@enable_example = true
|
8
8
|
@description_builder = -> (example) { example.description }
|
9
9
|
@application_version = '1.0.0'
|
10
|
+
@request_headers = []
|
11
|
+
@server_urls = []
|
12
|
+
@example_types = %i[request]
|
10
13
|
|
11
14
|
class << self
|
12
|
-
attr_accessor :path, :comment, :enable_example, :description_builder, :application_version
|
15
|
+
attr_accessor :path, :comment, :enable_example, :description_builder, :application_version, :request_headers, :server_urls, :example_types
|
13
16
|
end
|
14
17
|
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.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|