rspec-openapi 0.3.11 → 0.3.16

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: 07e405e19fc7324fbfb0c67f18643ef3a924441f75971920e29dcb074c5fee41
4
- data.tar.gz: 55ed7e046ef1dccb8e51d5d9d04012f32007a22da8d20217a582e14112eadc64
3
+ metadata.gz: 799f75b4bb5607dff7ab4a556b5d27d72b587af88636e7b510533724a1ede97a
4
+ data.tar.gz: 71aedf1e1610f23106dd778a2b9d9f4677c73c280127ff61300afa024068bef8
5
5
  SHA512:
6
- metadata.gz: d8784246f9827274f9a16ad7e70201f0470a63c9568109ae8e5f02a6a154a02829d6ae8e34d6e4b767ec92afa470a3b72be2bf32dcb2c51b6a628b0fdfa3c8fe
7
- data.tar.gz: b690fb8885f58626825f072cd75e740649faa05e1b398bf26480a2b8b6013f51f0596c177c92ed57c23fa7c5e49d92d3110c6af406c17bf0f570a8fdcc50f272
6
+ metadata.gz: e65865ca2d26e66f6fa560fe3fc157a491786ba7243d267dcdd4f22e3e5c28c29895384a32b8b19c095317a0447453ad292bfe91ff4059395f8ee08f0763f738
7
+ data.tar.gz: fda7f3678e952359a356069353d0756890edd7da50e4cd422489db091f9223439e1385d7939f27bd55d4c4afc7e6760bd55805275f932345273e6d5528a2b036
@@ -0,0 +1 @@
1
+ github: k0kubun
data/CHANGELOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ ## v0.3.16
2
+
3
+ * Use `media_type` instead of `content_type` for Rails 6.1
4
+ [#26](https://github.com/k0kubun/rspec-openapi/pull/26)
5
+ * Avoid crashing the after suite hook when it fails to build schema
6
+ [#27](https://github.com/k0kubun/rspec-openapi/pull/27)
7
+
8
+ ## v0.3.15
9
+
10
+ * Fix an error when Content-Disposition header is inline
11
+ [#24](https://github.com/k0kubun/rspec-openapi/pull/24)
12
+
13
+ ## v0.3.14
14
+
15
+ * Avoid an error when an application calls `request.body.read`
16
+ [#20](https://github.com/k0kubun/rspec-openapi/pull/20)
17
+
18
+ ## v0.3.13
19
+
20
+ * Avoid crashing when there's no request made in a spec
21
+ [#19](https://github.com/k0kubun/rspec-openapi/pull/19)
22
+
23
+ ## v0.3.12
24
+
25
+ * Generate `nullable: true` for null fields in schema
26
+ [#18](https://github.com/k0kubun/rspec-openapi/pull/18)
27
+
1
28
  ## v0.3.11
2
29
 
3
30
  * Show a filename as an `example` for `ActionDispatch::Http::UploadedFile`
@@ -6,6 +6,7 @@ require 'rspec/openapi/schema_file'
6
6
  require 'rspec/openapi/schema_merger'
7
7
 
8
8
  records = []
9
+ records_errors = []
9
10
 
10
11
  RSpec.configuration.after(:each) do |example|
11
12
  if example.metadata[:type] == :request && example.metadata[:openapi] != false
@@ -19,7 +20,21 @@ RSpec.configuration.after(:suite) do
19
20
  RSpec::OpenAPI::SchemaFile.new(RSpec::OpenAPI.path).edit do |spec|
20
21
  RSpec::OpenAPI::SchemaMerger.reverse_merge!(spec, RSpec::OpenAPI::DefaultSchema.build(title))
21
22
  records.each do |record|
22
- RSpec::OpenAPI::SchemaMerger.reverse_merge!(spec, RSpec::OpenAPI::SchemaBuilder.build(record))
23
+ begin
24
+ RSpec::OpenAPI::SchemaMerger.reverse_merge!(spec, RSpec::OpenAPI::SchemaBuilder.build(record))
25
+ rescue => e # e.g. SchemaBuilder raises a NotImplementedError
26
+ # NOTE: Don't fail the build
27
+ records_errors << [e, record]
28
+ end
23
29
  end
24
30
  end
31
+ if records_errors.any?
32
+ error_message = <<~EOS
33
+ RSpec::OpenAPI got errors building #{records_errors.size} requests
34
+
35
+ #{records_errors.map {|e, record| "#{e.inspect}: #{record.inspect}" }.join("\n")}
36
+ EOS
37
+ colorizer = ::RSpec::Core::Formatters::ConsoleCodes
38
+ RSpec.configuration.reporter.message colorizer.wrap(error_message, :failure)
39
+ end
25
40
  end
@@ -11,5 +11,6 @@ RSpec::OpenAPI::Record = Struct.new(
11
11
  :status, # @param [Integer] - 200
12
12
  :response_body, # @param [Object] - {"status" => "ok"}
13
13
  :response_content_type, # @param [String] - "application/json"
14
+ :response_content_disposition, # @param [String] - "inline"
14
15
  keyword_init: true,
15
16
  )
@@ -8,11 +8,13 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
8
8
  def build(context, example:)
9
9
  if rack_test?(context)
10
10
  request = ActionDispatch::Request.new(context.last_request.env)
11
+ request.body.rewind if request.body.respond_to?(:rewind)
11
12
  response = ActionDispatch::TestResponse.new(*context.last_response.to_a)
12
13
  else
13
14
  request = context.request
14
15
  response = context.response
15
16
  end
17
+ return if request.nil?
16
18
 
17
19
  # Generate `path` and `summary` in a framework-friendly manner when possible
18
20
  if rails?
@@ -38,13 +40,14 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
38
40
  path_params: raw_path_params(request),
39
41
  query_params: request.query_parameters,
40
42
  request_params: raw_request_params(request),
41
- request_content_type: request.content_type,
43
+ request_content_type: request.media_type,
42
44
  summary: summary,
43
45
  tags: tags,
44
46
  description: RSpec::OpenAPI.description_builder.call(example),
45
47
  status: response.status,
46
48
  response_body: response_body,
47
- response_content_type: response.content_type,
49
+ response_content_type: response.media_type,
50
+ response_content_disposition: response.header["Content-Disposition"],
48
51
  ).freeze
49
52
  end
50
53
 
@@ -7,10 +7,11 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
7
7
  }
8
8
 
9
9
  if record.response_body
10
+ disposition = normalize_content_disposition(record.response_content_disposition)
10
11
  response[:content] = {
11
12
  normalize_content_type(record.response_content_type) => {
12
- schema: build_property(record.response_body),
13
- example: (record.response_body if example_enabled?),
13
+ schema: build_property(record.response_body, disposition: disposition),
14
+ example: response_example(record, disposition: disposition),
14
15
  }.compact,
15
16
  }
16
17
  end
@@ -34,6 +35,12 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
34
35
 
35
36
  private
36
37
 
38
+ def response_example(record, disposition:)
39
+ return nil if !example_enabled? || disposition
40
+
41
+ record.response_body
42
+ end
43
+
37
44
  def example_enabled?
38
45
  RSpec::OpenAPI.enable_example
39
46
  end
@@ -78,8 +85,8 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
78
85
  }
79
86
  end
80
87
 
81
- def build_property(value)
82
- property = build_type(value)
88
+ def build_property(value, disposition: nil)
89
+ property = build_type(value, disposition)
83
90
 
84
91
  case value
85
92
  when Array
@@ -94,7 +101,9 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
94
101
  property
95
102
  end
96
103
 
97
- def build_type(value)
104
+ def build_type(value, disposition)
105
+ return { type: 'string', format: 'binary' } if disposition
106
+
98
107
  case value
99
108
  when String
100
109
  { type: 'string' }
@@ -111,7 +120,7 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
111
120
  when ActionDispatch::Http::UploadedFile
112
121
  { type: 'string', format: 'binary' }
113
122
  when NilClass
114
- { type: 'null' }
123
+ { nullable: true }
115
124
  else
116
125
  raise NotImplementedError, "type detection is not implemented for: #{value.inspect}"
117
126
  end
@@ -143,4 +152,8 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
143
152
  def normalize_content_type(content_type)
144
153
  content_type&.sub(/;.+\z/, '')
145
154
  end
155
+
156
+ def normalize_content_disposition(content_disposition)
157
+ content_disposition&.sub(/;.+\z/, '')
158
+ end
146
159
  end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module OpenAPI
3
- VERSION = '0.3.11'
3
+ VERSION = '0.3.16'
4
4
  end
5
5
  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.3.11
4
+ version: 0.3.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-27 00:00:00.000000000 Z
11
+ date: 2021-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -45,6 +45,7 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - ".github/FUNDING.yml"
48
49
  - ".github/workflows/test.yml"
49
50
  - ".gitignore"
50
51
  - ".rspec"
@@ -74,7 +75,7 @@ metadata:
74
75
  homepage_uri: https://github.com/k0kubun/rspec-openapi
75
76
  source_code_uri: https://github.com/k0kubun/rspec-openapi
76
77
  changelog_uri: https://github.com/k0kubun/rspec-openapi/blob/master/CHANGELOG.md
77
- post_install_message:
78
+ post_install_message:
78
79
  rdoc_options: []
79
80
  require_paths:
80
81
  - lib
@@ -89,8 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
90
  - !ruby/object:Gem::Version
90
91
  version: '0'
91
92
  requirements: []
92
- rubygems_version: 3.2.6
93
- signing_key:
93
+ rubygems_version: 3.1.6
94
+ signing_key:
94
95
  specification_version: 4
95
96
  summary: Generate OpenAPI schema from RSpec request specs
96
97
  test_files: []