rspec-openapi 0.9.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d55c7178770a58a980d06669adfab735ba84b51a283302dd8e14e91af4b7b4e9
4
- data.tar.gz: 7b0030924262f8a1cd7027df612315b8d6e3fb89e91f9b4e57c3ec83f7e9bfd6
3
+ metadata.gz: 0a48ebba5d2201f35bb94f47d5bd649444bb9c58ae1f0ef91f57e315553f9ef2
4
+ data.tar.gz: 71d4dec68449c2e14b4d3ce7058622b7c56629bee2814e04b1f16e5e817a7bf2
5
5
  SHA512:
6
- metadata.gz: 4cf846ca12d2062ae17c0b5d1829a7887c206425330c015f5fdde310c59678cb802b4cadb60f63c1ca6d55063c3d4f1cc2ac7813db10c6d8611a0fa3af975192
7
- data.tar.gz: 7501fac5fbfd8b0c4cec6cb196feb9ff09a640c4aff7165a93a6880eebea194d5c30674eefadb53987538ebed913d8d43ab625f1a7c8a3a12ad76ba15b459687
6
+ metadata.gz: 4c984f5dbd1a4587a9d34686c50e06a832051215f5e22abc8a96781ecebe57e0bdddabeef093db06f5bea23f58e70322a7574168f621e8765721ab2c2cf19c48
7
+ data.tar.gz: 2877daab4753106d04275e3189b8a8e648b7268a6c6d7e422e94d5bfb230064a2e875e73531abe6930bfa6c8b7cdefe7d06ee512cdcb4e22adb618915349514b
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "monthly"
7
+ labels:
8
+ - "chore"
@@ -25,15 +25,15 @@ jobs:
25
25
 
26
26
  steps:
27
27
  - name: Checkout repository
28
- uses: actions/checkout@v3
28
+ uses: actions/checkout@v4
29
29
 
30
30
  - name: Initialize CodeQL
31
- uses: github/codeql-action/init@v2
31
+ uses: github/codeql-action/init@v3
32
32
  with:
33
33
  languages: ${{ matrix.language }}
34
34
 
35
35
  - name: Autobuild
36
- uses: github/codeql-action/autobuild@v2
36
+ uses: github/codeql-action/autobuild@v3
37
37
 
38
38
  - name: Perform CodeQL Analysis
39
- uses: github/codeql-action/analyze@v2
39
+ uses: github/codeql-action/analyze@v3
@@ -14,7 +14,7 @@ jobs:
14
14
 
15
15
  steps:
16
16
  - name: Checkout repository
17
- uses: actions/checkout@v3
17
+ uses: actions/checkout@v4
18
18
 
19
19
  - name: Set up Ruby
20
20
  uses: ruby/setup-ruby@v1
@@ -30,6 +30,6 @@ jobs:
30
30
  "
31
31
 
32
32
  - name: Upload Sarif output
33
- uses: github/codeql-action/upload-sarif@v2
33
+ uses: github/codeql-action/upload-sarif@v3
34
34
  with:
35
35
  sarif_file: rubocop.sarif
@@ -26,14 +26,21 @@ jobs:
26
26
  rails: 6.1.6
27
27
  - ruby: ruby:3.1
28
28
  rails: 7.0.3
29
+ - ruby: ruby:3.3
30
+ rails: 7.1.2
29
31
  coverage: coverage
30
32
  env:
31
33
  RAILS_VERSION: ${{ matrix.rails == '' && '6.1.6' || matrix.rails }}
32
34
  COVERAGE: ${{ matrix.coverage || '' }}
33
35
  steps:
34
- - uses: actions/checkout@v2
36
+ - uses: actions/checkout@v4
35
37
  - name: bundle install
36
38
  run: bundle install -j$(nproc) --retry 3
39
+ - name: install simplecov-fork only for minitest with coverage
40
+ run: |
41
+ gem install specific_install
42
+ gem specific_install https://github.com/exoego/simplecov.git branch-fix
43
+ if: matrix.coverage == 'coverage'
37
44
  - run: bundle exec rspec
38
45
  timeout-minutes: 1
39
46
  - name: Upload coverage reports
data/.rubocop_todo.yml CHANGED
@@ -1,25 +1,35 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2023-04-14 06:22:29 UTC using RuboCop version 1.49.0.
3
+ # on 2024-01-13 11:12:43 UTC using RuboCop version 1.50.2.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 10
9
+ # Offense count: 9
10
10
  # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
11
11
  Metrics/AbcSize:
12
- Max: 31
12
+ Max: 48
13
+
14
+ # Offense count: 2
15
+ # Configuration parameters: CountComments, CountAsOne.
16
+ Metrics/ClassLength:
17
+ Max: 192
13
18
 
14
- # Offense count: 4
19
+ # Offense count: 5
15
20
  # Configuration parameters: AllowedMethods, AllowedPatterns.
16
21
  Metrics/CyclomaticComplexity:
17
- Max: 10
22
+ Max: 13
18
23
 
19
- # Offense count: 13
24
+ # Offense count: 16
20
25
  # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
21
26
  Metrics/MethodLength:
22
- Max: 30
27
+ Max: 31
28
+
29
+ # Offense count: 1
30
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
31
+ Metrics/PerceivedComplexity:
32
+ Max: 13
23
33
 
24
34
  # Offense count: 1
25
35
  # Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers, AllowedPatterns.
@@ -29,7 +39,7 @@ Naming/VariableNumber:
29
39
  Exclude:
30
40
  - 'spec/integration_tests/roda_test.rb'
31
41
 
32
- # Offense count: 5
42
+ # Offense count: 6
33
43
  # Configuration parameters: AllowedConstants.
34
44
  Style/Documentation:
35
45
  Exclude:
data/.simplecov_spawn.rb CHANGED
@@ -9,6 +9,7 @@ unless ENV['COVERAGE'] && ENV['COVERAGE'].empty?
9
9
  SimpleCov::Formatter::CoberturaFormatter,
10
10
  ])
11
11
  SimpleCov.start do
12
+ enable_coverage :branch
12
13
  add_filter '/spec/'
13
14
  add_filter '/scripts/'
14
15
  end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ ## v0.11.0
2
+
3
+ ## What's Changed
4
+ - feat: Allow path-based config overrides
5
+ [#162](https://github.com/exoego/rspec-openapi/pull/162)
6
+ - enhancement: Sort HTTP methods, response status codes, and contents lexicographically
7
+ [#163](https://github.com/exoego/rspec-openapi/pull/163)
8
+ - enhancement: Remove parameters that conflict with security schemas
9
+ [#166](https://github.com/exoego/rspec-openapi/pull/166)
10
+
11
+ ## v0.10.0
12
+ - bugfix: Merge parameter data to preserve description in manually edited Openapi spec
13
+ [#149](https://github.com/exoego/rspec-openapi/pull/149)
14
+ - feat: Add ability to configure which path params to ignore
15
+ [#150](https://github.com/exoego/rspec-openapi/pull/150)
16
+ - feat: Add custom title
17
+ [#147](https://github.com/exoego/rspec-openapi/pull/147)
18
+ - feat: Add ability to define custom summary and tags builders
19
+ [#148](https://github.com/exoego/rspec-openapi/pull/148)
20
+ - enhancement: Sort paths lexicographically so the order of paths is more stable and predictable
21
+ [#155](https://github.com/exoego/rspec-openapi/pull/155)
22
+ - enhancement: requestBody should not merge requestBody from error examples
23
+ [#154](https://github.com/exoego/rspec-openapi/pull/154)
24
+
1
25
  ## v0.9.0
2
26
  - bugfix: Fix engine path resolution
3
27
  [#113](https://github.com/exoego/rspec-openapi/pull/113)
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ gem 'roda'
10
10
  gem 'rspec-rails'
11
11
 
12
12
  group :test do
13
- gem 'simplecov'
13
+ gem 'simplecov', git: 'https://github.com/exoego/simplecov.git', branch: 'branch-fix'
14
14
  gem 'simplecov-cobertura'
15
15
  gem 'super_diff'
16
16
  end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # rspec-openapi ![test](https://github.com/exoego/rspec-openapi/workflows/test/badge.svg) [![codecov](https://codecov.io/gh/exoego/rspec-openapi/branch/master/graph/badge.svg?token=egYm6AlxkD)](https://codecov.io/gh/exoego/rspec-openapi)
1
+ # rspec-openapi [![Gem Version](https://badge.fury.io/rb/rspec-openapi.svg)](https://badge.fury.io/rb/rspec-openapi) [![test](https://github.com/exoego/rspec-openapi/actions/workflows/test.yml/badge.svg)](https://github.com/exoego/rspec-openapi/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/exoego/rspec-openapi/branch/master/graph/badge.svg?token=egYm6AlxkD)](https://codecov.io/gh/exoego/rspec-openapi)
2
2
 
3
3
  Generate OpenAPI schema from RSpec request specs.
4
4
 
@@ -122,6 +122,8 @@ RSpec::OpenAPI.path = -> (example) {
122
122
  end
123
123
  }
124
124
 
125
+ RSpec::OpenAPI.title = 'OpenAPI Documentation'
126
+
125
127
  # Disable generating `example`
126
128
  RSpec::OpenAPI.enable_example = false
127
129
 
@@ -167,8 +169,21 @@ EOS
167
169
  # Generate a custom description, given an RSpec example
168
170
  RSpec::OpenAPI.description_builder = -> (example) { example.description }
169
171
 
172
+ # Generate a custom summary, given an RSpec example
173
+ # This example uses the summary from the example_group.
174
+ RSpec::OpenAPI.summary_builder = ->(example) { example.metadata.dig(:example_group, :openapi, :summary) }
175
+
176
+ # Generate a custom tags, given an RSpec example
177
+ # This example uses the tags from the parent_example_group
178
+ RSpec::OpenAPI.tags_builder = -> (example) { example.metadata.dig(:example_group, :parent_example_group, :openapi, :tags) }
179
+
170
180
  # Change the example type(s) that will generate schema
171
181
  RSpec::OpenAPI.example_types = %i[request]
182
+
183
+ # Configure which path params to ignore
184
+ # :controller and :action always exist. :format is added when routes is configured as such.
185
+ RSpec::OpenAPI.ignored_path_params = %i[controller action format]
186
+
172
187
  ```
173
188
 
174
189
  ### Can I use rspec-openapi with `$ref` to minimize duplication of schema?
@@ -199,7 +214,7 @@ paths:
199
214
  application/json:
200
215
  schema:
201
216
  $ref: "#/components/schemas/User"
202
- # Note) #/components/schamas is not needed to be defined.
217
+ # Note) #/components/schemas is not needed to be defined.
203
218
  ```
204
219
 
205
220
  3. Then, re-run rspec-openapi. It will generate `#/components/schemas` with the referenced schema (`User` for example) newly-generated or updated.
@@ -278,7 +293,7 @@ If you find a room for improvement, open an issue.
278
293
 
279
294
  ### How can I add information which can't be generated from RSpec?
280
295
 
281
- rspec-openapi tries to keep manual modifications as much as possible when generating specs.
296
+ rspec-openapi tries to preserve manual modifications as much as possible when generating specs.
282
297
  You can directly edit `doc/openapi.yaml` as you like without spoiling the automatic generation capability.
283
298
 
284
299
  ### Can I exclude specific specs from OpenAPI generation?
@@ -62,8 +62,8 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
62
62
 
63
63
  def extract_request_attributes(request, example)
64
64
  metadata = example.metadata[:openapi] || {}
65
- summary = metadata[:summary]
66
- tags = metadata[:tags]
65
+ summary = metadata[:summary] || RSpec::OpenAPI.summary_builder.call(example)
66
+ tags = metadata[:tags] || RSpec::OpenAPI.tags_builder.call(example)
67
67
  operation_id = metadata[:operation_id]
68
68
  required_request_params = metadata[:required_request_params] || []
69
69
  security = metadata[:security]
@@ -83,7 +83,7 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
83
83
  tags ||= [route.requirements[:controller]&.classify].compact
84
84
  # :controller and :action always exist. :format is added when routes is configured as such.
85
85
  # TODO: Use .except(:controller, :action, :format) when we drop support for Ruby 2.x
86
- raw_path_params = raw_path_params.slice(*(raw_path_params.keys - %i[controller action format]))
86
+ raw_path_params = raw_path_params.slice(*(raw_path_params.keys - RSpec::OpenAPI.ignored_path_params))
87
87
  end
88
88
  summary ||= "#{request.method} #{path}"
89
89
  [path, summary, tags, operation_id, required_request_params, raw_path_params, description, security]
@@ -7,25 +7,33 @@ class RSpec::OpenAPI::ResultRecorder
7
7
  end
8
8
 
9
9
  def record_results!
10
- title = File.basename(Dir.pwd)
11
10
  @path_records.each do |path, records|
11
+ # Look for a path-specific config file and run it.
12
+ config_file = File.join(File.dirname(path), RSpec::OpenAPI.config_filename)
13
+ begin
14
+ require config_file if File.exist?(config_file)
15
+ rescue StandardError => e
16
+ puts "WARNING: Unable to load #{config_file}: #{e}"
17
+ end
18
+
19
+ title = RSpec::OpenAPI.title
12
20
  RSpec::OpenAPI::SchemaFile.new(path).edit do |spec|
13
21
  schema = RSpec::OpenAPI::DefaultSchema.build(title)
14
22
  schema[:info].merge!(RSpec::OpenAPI.info)
15
23
  RSpec::OpenAPI::SchemaMerger.merge!(spec, schema)
16
24
  new_from_zero = {}
17
25
  records.each do |record|
18
- begin
19
- record_schema = RSpec::OpenAPI::SchemaBuilder.build(record)
20
- RSpec::OpenAPI::SchemaMerger.merge!(spec, record_schema)
21
- RSpec::OpenAPI::SchemaMerger.merge!(new_from_zero, record_schema)
22
- rescue StandardError, NotImplementedError => e # e.g. SchemaBuilder raises a NotImplementedError
23
- @error_records[e] = record # Avoid failing the build
24
- end
26
+ record_schema = RSpec::OpenAPI::SchemaBuilder.build(record)
27
+ RSpec::OpenAPI::SchemaMerger.merge!(spec, record_schema)
28
+ RSpec::OpenAPI::SchemaMerger.merge!(new_from_zero, record_schema)
29
+ rescue StandardError, NotImplementedError => e # e.g. SchemaBuilder raises a NotImplementedError
30
+ @error_records[e] = record # Avoid failing the build
25
31
  end
32
+ RSpec::OpenAPI::SchemaCleaner.cleanup_conflicting_security_parameters!(spec)
26
33
  RSpec::OpenAPI::SchemaCleaner.cleanup!(spec, new_from_zero)
27
34
  RSpec::OpenAPI::ComponentsUpdater.update!(spec, new_from_zero)
28
35
  RSpec::OpenAPI::SchemaCleaner.cleanup_empty_required_array!(spec)
36
+ RSpec::OpenAPI::SchemaSorter.deep_sort!(spec)
29
37
  end
30
38
  end
31
39
  end
@@ -120,6 +120,7 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
120
120
  def build_request_body(record)
121
121
  return nil if record.request_content_type.nil?
122
122
  return nil if record.request_params.empty?
123
+ return nil if record.status >= 400
123
124
 
124
125
  {
125
126
  content: {
@@ -39,6 +39,24 @@ class << RSpec::OpenAPI::SchemaCleaner = Object.new
39
39
  base
40
40
  end
41
41
 
42
+ def cleanup_conflicting_security_parameters!(base)
43
+ security_schemes = base.dig('components', 'securitySchemes') || {}
44
+
45
+ return if security_schemes.empty?
46
+
47
+ paths_to_security_definitions = RSpec::OpenAPI::HashHelper.matched_paths_deeply_nested(base, 'paths', 'security')
48
+
49
+ paths_to_security_definitions.each do |path|
50
+ parent_path_definition = base.dig(*path.take(path.length - 1))
51
+
52
+ security_schemes.each do |security_scheme_name, security_scheme|
53
+ remove_parameters_conflicting_with_security_sceheme!(
54
+ parent_path_definition, security_scheme, security_scheme_name,
55
+ )
56
+ end
57
+ end
58
+ end
59
+
42
60
  def cleanup_empty_required_array!(base)
43
61
  paths_to_objects = [
44
62
  *RSpec::OpenAPI::HashHelper.matched_paths_deeply_nested(base, 'components.schemas', 'properties'),
@@ -53,6 +71,18 @@ class << RSpec::OpenAPI::SchemaCleaner = Object.new
53
71
 
54
72
  private
55
73
 
74
+ def remove_parameters_conflicting_with_security_sceheme!(path_definition, security_scheme, security_scheme_name)
75
+ return unless path_definition['security']
76
+ return unless path_definition['parameters']
77
+ return unless path_definition.dig('security', 0).keys.include?(security_scheme_name)
78
+
79
+ path_definition['parameters'].reject! do |parameter|
80
+ parameter['in'] == security_scheme['in'] && # same location (ie. header)
81
+ parameter['name'] == security_scheme['name'] # same name (ie. AUTHORIZATION)
82
+ end
83
+ path_definition.delete('parameters') if path_definition['parameters'].empty?
84
+ end
85
+
56
86
  def cleanup_array!(base, spec, selector, fields_for_identity = [])
57
87
  marshal = lambda do |obj|
58
88
  Marshal.dump(slice(obj, fields_for_identity))
@@ -43,16 +43,28 @@ class << RSpec::OpenAPI::SchemaMerger = Object.new
43
43
  end
44
44
 
45
45
  def merge_arrays(base, key, value)
46
- case key
47
- when 'parameters'
48
- base[key] = value | base[key]
49
- base[key].uniq! { |param| param.slice('name', 'in') }
50
- when 'required'
51
- # Preserve properties that appears in all test cases
52
- base[key] = value & base[key]
53
- else
54
- # last one wins
55
- base[key] = value
46
+ base[key] = case key
47
+ when 'parameters'
48
+ merge_parameters(base, key, value)
49
+ when 'required'
50
+ # Preserve properties that appears in all test cases
51
+ value & base[key]
52
+ else
53
+ # last one wins
54
+ value
55
+ end
56
+ end
57
+
58
+ def merge_parameters(base, key, value)
59
+ all_parameters = value | base[key]
60
+
61
+ unique_base_parameters = base[key].index_by { |parameter| [parameter['name'], parameter['in']] }
62
+ all_parameters = all_parameters.map do |parameter|
63
+ base_parameter = unique_base_parameters[[parameter['name'], parameter['in']]] || {}
64
+ base_parameter ? base_parameter.merge(parameter) : parameter
56
65
  end
66
+
67
+ all_parameters.uniq! { |param| param.slice('name', 'in') }
68
+ base[key] = all_parameters
57
69
  end
58
70
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class << RSpec::OpenAPI::SchemaSorter = Object.new
4
+ # Sort some unpredictably ordered properties in a lexicographical manner to make the order more predictable.
5
+ #
6
+ # @param [Hash|Array]
7
+ def deep_sort!(spec)
8
+ # paths
9
+ deep_sort_by_selector!(spec, 'paths')
10
+
11
+ # methods
12
+ deep_sort_by_selector!(spec, 'paths.*')
13
+
14
+ # response status code
15
+ deep_sort_by_selector!(spec, 'paths.*.*.responses')
16
+
17
+ # content-type
18
+ deep_sort_by_selector!(spec, 'paths.*.*.responses.*.content')
19
+ end
20
+
21
+ private
22
+
23
+ # @param [Hash] base
24
+ # @param [String] selector
25
+ def deep_sort_by_selector!(base, selector)
26
+ RSpec::OpenAPI::HashHelper.matched_paths(base, selector).each do |paths|
27
+ deep_sort_hash!(base.dig(*paths))
28
+ end
29
+ end
30
+
31
+ def deep_sort_hash!(hash)
32
+ sorted = hash.entries.sort_by { |k, _| k }.to_h
33
+ hash.replace(sorted)
34
+ end
35
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module OpenAPI
5
- VERSION = '0.9.0'
5
+ VERSION = '0.11.0'
6
6
  end
7
7
  end
data/lib/rspec/openapi.rb CHANGED
@@ -9,15 +9,19 @@ require 'rspec/openapi/schema_builder'
9
9
  require 'rspec/openapi/schema_file'
10
10
  require 'rspec/openapi/schema_merger'
11
11
  require 'rspec/openapi/schema_cleaner'
12
+ require 'rspec/openapi/schema_sorter'
12
13
 
13
14
  require 'rspec/openapi/minitest_hooks' if Object.const_defined?('Minitest')
14
15
  require 'rspec/openapi/rspec_hooks' if ENV['OPENAPI'] && Object.const_defined?('RSpec')
15
16
 
16
17
  module RSpec::OpenAPI
17
18
  @path = 'doc/openapi.yaml'
19
+ @title = File.basename(Dir.pwd)
18
20
  @comment = nil
19
21
  @enable_example = true
20
22
  @description_builder = ->(example) { example.description }
23
+ @summary_builder = ->(example) { example.metadata[:summary] }
24
+ @tags_builder = ->(example) { example.metadata[:tags] }
21
25
  @info = {}
22
26
  @application_version = '1.0.0'
23
27
  @request_headers = []
@@ -26,12 +30,19 @@ module RSpec::OpenAPI
26
30
  @example_types = %i[request]
27
31
  @response_headers = []
28
32
  @path_records = Hash.new { |h, k| h[k] = [] }
33
+ @ignored_path_params = %i[controller action format]
34
+
35
+ # This is the configuraion override file name we look for within each path.
36
+ @config_filename = 'rspec_openapi.rb'
29
37
 
30
38
  class << self
31
39
  attr_accessor :path,
40
+ :title,
32
41
  :comment,
33
42
  :enable_example,
34
43
  :description_builder,
44
+ :summary_builder,
45
+ :tags_builder,
35
46
  :info,
36
47
  :application_version,
37
48
  :request_headers,
@@ -39,6 +50,9 @@ module RSpec::OpenAPI
39
50
  :security_schemes,
40
51
  :example_types,
41
52
  :response_headers,
42
- :path_records
53
+ :path_records,
54
+ :ignored_path_params
55
+
56
+ attr_reader :config_filename
43
57
  end
44
58
  end
@@ -36,8 +36,7 @@ begin
36
36
  require 'simplecov'
37
37
 
38
38
  SimpleCov.start do
39
- # Flaky :(
40
- # enable_coverage :branch
39
+ enable_coverage :branch
41
40
  end
42
41
  end
43
42
  rescue LoadError
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-openapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-10-10 00:00:00.000000000 Z
12
+ date: 2024-01-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -47,6 +47,7 @@ executables: []
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
+ - ".github/dependabot.yml"
50
51
  - ".github/workflows/codeql-analysis.yml"
51
52
  - ".github/workflows/rubocop.yml"
52
53
  - ".github/workflows/test.yml"
@@ -75,6 +76,7 @@ files:
75
76
  - lib/rspec/openapi/schema_cleaner.rb
76
77
  - lib/rspec/openapi/schema_file.rb
77
78
  - lib/rspec/openapi/schema_merger.rb
79
+ - lib/rspec/openapi/schema_sorter.rb
78
80
  - lib/rspec/openapi/version.rb
79
81
  - rspec-openapi.gemspec
80
82
  - scripts/rspec