rspec-openapi 0.19.0 → 0.20.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: f0fd8968099cf455a6ee1eabe6039c60955020493d97e584fb57b1ba79aca8d3
4
- data.tar.gz: 15ae08318ba0843a65cbd4bf418b82f2ce9d7c173600f0ea2d776763f4790819
3
+ metadata.gz: a94cc7be13ab8a500bf3eb4bb5831f1c06c7722e96f9f7157e424fa402f2f137
4
+ data.tar.gz: db6591ab069d1f7bd1d7f07b6f2c4d9be9ef86f90df497c28a2b8ed01ee1d5e4
5
5
  SHA512:
6
- metadata.gz: 2c15dc4a7d63f610cd654ea2718ffccbd15c59ec66bcc45f219352bdccbe7a6e49baa4810a866fefd483b34ec94992a7f48ce799d8cace7ced59f2dd5fb9db81
7
- data.tar.gz: 9306ae8e95e9d4dcb0aa40d20b716217c2712ad081448c7f61cb832dd210864883c6f93999257715347fd85b5eb9f1d5ccb0615db3102de112fdfddebeb78318
6
+ metadata.gz: 785d100550f4ecde118a8986ee7c98349e310de9c870a04067a9f84892d37b63cadf9a88d0ff2158012c153c561c3a0576a3c0c79860a645bb53bb295c64bbc5
7
+ data.tar.gz: 660bd242fa8c5686bc6fbead56f595be959f1f1cae465723ed89e93c0b0096ee6c86094c8561193cabf119cedb74762e84e6b9c3651d34fca7691b63317fc611
@@ -25,7 +25,7 @@ jobs:
25
25
 
26
26
  steps:
27
27
  - name: Checkout repository
28
- uses: actions/checkout@v4
28
+ uses: actions/checkout@v5
29
29
 
30
30
  - name: Initialize CodeQL
31
31
  uses: github/codeql-action/init@v3
@@ -14,7 +14,7 @@ jobs:
14
14
 
15
15
  steps:
16
16
  - name: Checkout repository
17
- uses: actions/checkout@v4
17
+ uses: actions/checkout@v5
18
18
 
19
19
  - name: Set up Ruby
20
20
  uses: ruby/setup-ruby@v1
@@ -32,7 +32,7 @@ jobs:
32
32
  RAILS_VERSION: ${{ matrix.rails == '' && '6.1.6' || matrix.rails }}
33
33
  COVERAGE: ${{ matrix.coverage || '' }}
34
34
  steps:
35
- - uses: actions/checkout@v4
35
+ - uses: actions/checkout@v5
36
36
  - name: bundle install
37
37
  run: bundle install -j$(nproc) --retry 3
38
38
  - run: bundle exec rspec
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+
14
+ spec/apps/rails/log/
@@ -56,7 +56,7 @@ class << RSpec::OpenAPI::Extractors::Hanami = Object.new
56
56
 
57
57
  return RSpec::OpenAPI::Extractors::Rack.request_attributes(request, example) unless route.routable?
58
58
 
59
- metadata = example.metadata[:openapi] || {}
59
+ metadata = merge_openapi_metadata(example.metadata)
60
60
  summary = metadata[:summary] || RSpec::OpenAPI.summary_builder.call(example)
61
61
  tags = metadata[:tags] || RSpec::OpenAPI.tags_builder.call(example)
62
62
  formats = metadata[:formats] || RSpec::OpenAPI.formats_builder.curry.call(example)
@@ -100,6 +100,26 @@ class << RSpec::OpenAPI::Extractors::Hanami = Object.new
100
100
  [request, response]
101
101
  end
102
102
 
103
+ private
104
+
105
+ def merge_openapi_metadata(metadata)
106
+ collect_openapi_metadata(metadata).reduce({}, &:merge)
107
+ end
108
+
109
+ def collect_openapi_metadata(metadata)
110
+ [].tap do |result|
111
+ current = metadata
112
+
113
+ while current
114
+ [current[:example_group], current].each do |meta|
115
+ result.unshift(meta[:openapi]) if meta&.dig(:openapi)
116
+ end
117
+
118
+ current = current[:parent_example_group]
119
+ end
120
+ end
121
+ end
122
+
103
123
  def add_id(path, route)
104
124
  return path if route.params.empty?
105
125
 
@@ -6,7 +6,7 @@ class << RSpec::OpenAPI::Extractors::Rack = Object.new
6
6
  # @param [RSpec::Core::Example] example
7
7
  # @return Array
8
8
  def request_attributes(request, example)
9
- metadata = example.metadata[:openapi] || {}
9
+ metadata = merge_openapi_metadata(example.metadata)
10
10
  summary = metadata[:summary] || RSpec::OpenAPI.summary_builder.call(example)
11
11
  tags = metadata[:tags] || RSpec::OpenAPI.tags_builder.call(example)
12
12
  formats = metadata[:formats] || RSpec::OpenAPI.formats_builder.curry.call(example)
@@ -40,4 +40,24 @@ class << RSpec::OpenAPI::Extractors::Rack = Object.new
40
40
 
41
41
  [request, response]
42
42
  end
43
+
44
+ private
45
+
46
+ def merge_openapi_metadata(metadata)
47
+ collect_openapi_metadata(metadata).reduce({}, &:merge)
48
+ end
49
+
50
+ def collect_openapi_metadata(metadata)
51
+ [].tap do |result|
52
+ current = metadata
53
+
54
+ while current
55
+ [current[:example_group], current].each do |meta|
56
+ result.unshift(meta[:openapi]) if meta&.dig(:openapi)
57
+ end
58
+
59
+ current = current[:parent_example_group]
60
+ end
61
+ end
62
+ end
43
63
  end
@@ -16,7 +16,7 @@ class << RSpec::OpenAPI::Extractors::Rails = Object.new
16
16
 
17
17
  raise "No route matched for #{fixed_request.request_method} #{fixed_request.path_info}" if route.nil?
18
18
 
19
- metadata = example.metadata[:openapi] || {}
19
+ metadata = merge_openapi_metadata(example.metadata)
20
20
  summary = metadata[:summary] || RSpec::OpenAPI.summary_builder.call(example)
21
21
  tags = metadata[:tags] || RSpec::OpenAPI.tags_builder.call(example)
22
22
  formats = metadata[:formats] || RSpec::OpenAPI.formats_builder.curry.call(example)
@@ -55,6 +55,26 @@ class << RSpec::OpenAPI::Extractors::Rails = Object.new
55
55
  [context.request, context.response]
56
56
  end
57
57
 
58
+ private
59
+
60
+ def merge_openapi_metadata(metadata)
61
+ collect_openapi_metadata(metadata).reduce({}, &:merge)
62
+ end
63
+
64
+ def collect_openapi_metadata(metadata)
65
+ [].tap do |result|
66
+ current = metadata
67
+
68
+ while current
69
+ [current[:example_group], current].each do |meta|
70
+ result.unshift(meta[:openapi]) if meta&.dig(:openapi)
71
+ end
72
+
73
+ current = current[:parent_example_group]
74
+ end
75
+ end
76
+ end
77
+
58
78
  # @param [ActionDispatch::Request] request
59
79
  def find_rails_route(request, app: Rails.application, path_prefix: '')
60
80
  app.routes.router.recognize(request) do |route, _parameters|
@@ -4,6 +4,9 @@ require 'fileutils'
4
4
  require 'yaml'
5
5
  require 'json'
6
6
 
7
+ # For Ruby 2.7
8
+ require 'date'
9
+
7
10
  # TODO: Support JSON
8
11
  class RSpec::OpenAPI::SchemaFile
9
12
  # @param [String] path
@@ -24,7 +27,12 @@ class RSpec::OpenAPI::SchemaFile
24
27
  def read
25
28
  return {} unless File.exist?(@path)
26
29
 
27
- RSpec::OpenAPI::KeyTransformer.symbolize(YAML.safe_load(File.read(@path))) # this can also parse JSON
30
+ RSpec::OpenAPI::KeyTransformer.symbolize(
31
+ YAML.safe_load(
32
+ File.read(@path),
33
+ permitted_classes: [Date, Time],
34
+ ),
35
+ ) # this can also parse JSON
28
36
  end
29
37
 
30
38
  # @param [Hash] spec
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module OpenAPI
5
- VERSION = '0.19.0'
5
+ VERSION = '0.20.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-openapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  - TATSUNO Yasuhiro
9
- autorequire:
10
9
  bindir: exe
11
10
  cert_chain: []
12
- date: 2025-05-12 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: actionpack
@@ -109,9 +108,8 @@ licenses:
109
108
  metadata:
110
109
  homepage_uri: https://github.com/exoego/rspec-openapi
111
110
  source_code_uri: https://github.com/exoego/rspec-openapi
112
- changelog_uri: https://github.com/exoego/rspec-openapi/releases/tag/v0.19.0
111
+ changelog_uri: https://github.com/exoego/rspec-openapi/releases/tag/v0.20.0
113
112
  rubygems_mfa_required: 'true'
114
- post_install_message:
115
113
  rdoc_options: []
116
114
  require_paths:
117
115
  - lib
@@ -126,8 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
124
  - !ruby/object:Gem::Version
127
125
  version: '0'
128
126
  requirements: []
129
- rubygems_version: 3.4.19
130
- signing_key:
127
+ rubygems_version: 3.6.9
131
128
  specification_version: 4
132
129
  summary: Generate OpenAPI schema from RSpec request specs
133
130
  test_files: []