rspec-openapi 0.9.0 → 0.11.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: 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