rspec-openapi 0.18.2 → 0.18.4

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: e9d5e7e261220ae8c790eff0702c0d5e08dbf53667a410a1a540bdb4557d5f55
4
- data.tar.gz: ffd9b3d5cab09166652fb03d1a22cf774170c6e80690ed4215e3483b951d8f73
3
+ metadata.gz: ec34ef0e56eb4c46221d956120a836d20addbfa8d636807effad4b93cf5ac8f8
4
+ data.tar.gz: 8b2c33feefc0f7173e6f31a09c66c9824b2f3f6124a24c6f56f59f7f5ff3e938
5
5
  SHA512:
6
- metadata.gz: 007a4e0466e55fa656667eb498a0f27cd3b049dc8fb2d3a2b46b1b511fbe0f28fab3a79282577b0c5db08a55301576e8104013854fdf400884ab58d3312fba04
7
- data.tar.gz: 39f0f78cfe88df09e7b16c540dc95890ac712feb7700df6f18101e5355540f21881f2905652c808422065f9330abfdd0c8f1037342192e5ee0b643fc71b65713
6
+ metadata.gz: e2e12be8f18ac6e3c6641bb3b128bad631c120f4400148f999b758b1b2820b44dd047569036c1adc4393b001a438f2595aacf5869540411ec077c054a6b8d4c3
7
+ data.tar.gz: 347a1c54c418ad9957b3137b2d7db8c0c74496b473cdaf9f14dc9e4dab0205340e510317c324ff68494e237b27a369642d7cba2687b6eaa88318a70387557f37
@@ -38,7 +38,7 @@ jobs:
38
38
  - run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
39
39
  name: codecov-action@v4 workaround
40
40
  - name: Upload coverage reports
41
- uses: codecov/codecov-action@v4
41
+ uses: codecov/codecov-action@v5
42
42
  if: matrix.coverage == 'coverage'
43
43
  with:
44
44
  fail_ci_if_error: true
data/Gemfile CHANGED
@@ -11,8 +11,12 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0')
11
11
  gem 'hanami', ENV['HANAMI_VERSION'] || '2.1.0'
12
12
  gem 'hanami-controller', ENV['HANAMI_VERSION'] || '2.1.0'
13
13
  gem 'hanami-router', ENV['HANAMI_VERSION'] || '2.1.0'
14
+
15
+ gem 'dry-logger', '1.0.3'
14
16
  end
15
17
 
18
+ gem 'concurrent-ruby', '1.3.4'
19
+
16
20
  gem 'roda'
17
21
 
18
22
  gem 'rails-dom-testing', '~> 2.2'
data/README.md CHANGED
@@ -122,8 +122,18 @@ RSpec::OpenAPI.path = -> (example) {
122
122
  end
123
123
  }
124
124
 
125
+ # Change the default title of the generated schema
125
126
  RSpec::OpenAPI.title = 'OpenAPI Documentation'
126
127
 
128
+ # Or generate individual titles for your partial schema files, given an RSpec example
129
+ RSpec::OpenAPI.title = -> (example) {
130
+ case example.file_path
131
+ when %r[spec/requests/api/v1/] then 'API v1 Documentation'
132
+ when %r[spec/requests/api/v2/] then 'API v2 Documentation'
133
+ else 'OpenAPI Documentation'
134
+ end
135
+ }
136
+
127
137
  # Disable generating `example`
128
138
  RSpec::OpenAPI.enable_example = false
129
139
 
@@ -19,10 +19,7 @@ class Inspector
19
19
  def call(verb, path)
20
20
  route = routes.find { |r| r.http_method == verb && r.path == path }
21
21
 
22
- if route.nil?
23
- # FIXME: This is a hack to pass `/sites/***` in testing
24
- {}
25
- elsif route.to.is_a?(Proc)
22
+ if route.to.is_a?(Proc)
26
23
  {
27
24
  tags: [],
28
25
  summary: "#{verb} #{path}",
@@ -55,7 +52,7 @@ class << RSpec::OpenAPI::Extractors::Hanami = Object.new
55
52
  # @param [RSpec::Core::Example] example
56
53
  # @return Array
57
54
  def request_attributes(request, example)
58
- route = Hanami.app.router.recognize(request.path, method: request.method)
55
+ route = Hanami.app.router.recognize(Rack::MockRequest.env_for(request.path, method: request.method))
59
56
 
60
57
  return RSpec::OpenAPI::Extractors::Rack.request_attributes(request, example) unless route.routable?
61
58
 
@@ -69,7 +66,7 @@ class << RSpec::OpenAPI::Extractors::Hanami = Object.new
69
66
  deprecated = metadata[:deprecated]
70
67
  path = request.path
71
68
 
72
- raw_path_params = route.params.filter { |_key, value| RSpec::OpenAPI::Extractors.number_or_nil(value) }
69
+ raw_path_params = route.params
73
70
 
74
71
  result = InspectorAnalyzer.call(request.method, add_id(path, route))
75
72
 
@@ -95,8 +92,6 @@ class << RSpec::OpenAPI::Extractors::Hanami = Object.new
95
92
  return path if route.params.empty?
96
93
 
97
94
  route.params.each_pair do |key, value|
98
- next unless RSpec::OpenAPI::Extractors.number_or_nil(value)
99
-
100
95
  path = path.sub("/#{value}", "/:#{key}")
101
96
  end
102
97
 
@@ -107,8 +102,6 @@ class << RSpec::OpenAPI::Extractors::Hanami = Object.new
107
102
  return path if route.params.empty?
108
103
 
109
104
  route.params.each_pair do |key, value|
110
- next unless RSpec::OpenAPI::Extractors.number_or_nil(value)
111
-
112
105
  path = path.sub("/#{value}", "/{#{key}}")
113
106
  end
114
107
 
@@ -12,10 +12,10 @@ class << RSpec::OpenAPI::Extractors::Rails = Object.new
12
12
 
13
13
  route, path = find_rails_route(fixed_request)
14
14
 
15
- raise "No route matched for #{fixed_request.request_method} #{fixed_request.path_info}" if route.nil?
16
-
17
15
  return RSpec::OpenAPI::Extractors::Rack.request_attributes(request, example) unless path
18
16
 
17
+ raise "No route matched for #{fixed_request.request_method} #{fixed_request.path_info}" if route.nil?
18
+
19
19
  metadata = example.metadata[:openapi] || {}
20
20
  summary = metadata[:summary] || RSpec::OpenAPI.summary_builder.call(example)
21
21
  tags = metadata[:tags] || RSpec::OpenAPI.tags_builder.call(example)
@@ -2,11 +2,4 @@
2
2
 
3
3
  # Create namespace
4
4
  module RSpec::OpenAPI::Extractors
5
- # @param [String, Symbol] path_parameter
6
- # @return [Integer, nil]
7
- def self.number_or_nil(path_parameter)
8
- Integer(path_parameter.to_s || '')
9
- rescue ArgumentError
10
- nil
11
- end
12
5
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec::OpenAPI::Record = Struct.new(
4
+ :title, # @param [String] - "API Documentation - Statuses"
4
5
  :http_method, # @param [String] - "GET"
5
6
  :path, # @param [String] - "/v1/status/:id"
6
7
  :path_params, # @param [Hash] - {:controller=>"v1/statuses", :action=>"create", :id=>"1"}
@@ -11,6 +11,7 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
11
11
  request, response = extractor.request_response(context)
12
12
  return if request.nil?
13
13
 
14
+ title = RSpec::OpenAPI.title.then { |t| t.is_a?(Proc) ? t.call(example) : t }
14
15
  path, summary, tags, operation_id, required_request_params, raw_path_params, description, security, deprecated =
15
16
  extractor.request_attributes(request, example)
16
17
 
@@ -19,6 +20,7 @@ class << RSpec::OpenAPI::RecordBuilder = Object.new
19
20
  request_headers, response_headers = extract_headers(request, response)
20
21
 
21
22
  RSpec::OpenAPI::Record.new(
23
+ title: title,
22
24
  http_method: request.method,
23
25
  path: path,
24
26
  path_params: raw_path_params,
@@ -16,7 +16,7 @@ class RSpec::OpenAPI::ResultRecorder
16
16
  puts "WARNING: Unable to load #{config_file}: #{e}"
17
17
  end
18
18
 
19
- title = RSpec::OpenAPI.title
19
+ title = records.first.title
20
20
  RSpec::OpenAPI::SchemaFile.new(path).edit do |spec|
21
21
  schema = RSpec::OpenAPI::DefaultSchema.build(title)
22
22
  schema[:info].merge!(RSpec::OpenAPI.info)
@@ -36,7 +36,7 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
36
36
  security: record.security,
37
37
  deprecated: record.deprecated ? true : nil,
38
38
  parameters: build_parameters(record),
39
- requestBody: http_method == 'get' ? nil : build_request_body(record),
39
+ requestBody: include_nil_request_body?(http_method) ? nil : build_request_body(record),
40
40
  responses: {
41
41
  record.status.to_s => response,
42
42
  },
@@ -48,6 +48,10 @@ class << RSpec::OpenAPI::SchemaBuilder = Object.new
48
48
 
49
49
  private
50
50
 
51
+ def include_nil_request_body?(http_method)
52
+ %w[delete get].include?(http_method)
53
+ end
54
+
51
55
  def enrich_with_required_keys(obj)
52
56
  obj[:required] = obj[:properties]&.keys || []
53
57
  obj
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module OpenAPI
5
- VERSION = '0.18.2'
5
+ VERSION = '0.18.4'
6
6
  end
7
7
  end
data/lib/rspec/openapi.rb CHANGED
@@ -15,30 +15,17 @@ require 'rspec/openapi/shared_hooks'
15
15
  require 'rspec/openapi/extractors'
16
16
  require 'rspec/openapi/extractors/rack'
17
17
 
18
- if ENV['OPENAPI']
19
- DEBUG_ENABLED = ['', '1', 'true'].include?(ENV['DEBUG']&.downcase)
20
-
21
- begin
22
- require 'hanami'
23
- rescue LoadError
24
- warn 'Hanami not detected' if DEBUG_ENABLED
25
- else
26
- require 'rspec/openapi/extractors/hanami'
27
- end
18
+ module RSpec::OpenAPI
19
+ class Config
20
+ class << self
21
+ attr_accessor :debug_enabled
28
22
 
29
- begin
30
- require 'rails'
31
- rescue LoadError
32
- warn 'Rails not detected' if DEBUG_ENABLED
33
- else
34
- require 'rspec/openapi/extractors/rails'
23
+ def load_environment_settings
24
+ @debug_enabled = ['', '1', 'true'].include?(ENV['DEBUG']&.downcase)
25
+ end
26
+ end
35
27
  end
36
- end
37
28
 
38
- require 'rspec/openapi/minitest_hooks' if Object.const_defined?('Minitest')
39
- require 'rspec/openapi/rspec_hooks' if ENV['OPENAPI'] && Object.const_defined?('RSpec')
40
-
41
- module RSpec::OpenAPI
42
29
  @path = 'doc/openapi.yaml'
43
30
  @title = File.basename(Dir.pwd)
44
31
  @comment = nil
@@ -84,3 +71,26 @@ module RSpec::OpenAPI
84
71
  attr_reader :config_filename
85
72
  end
86
73
  end
74
+
75
+ if ENV['OPENAPI']
76
+ RSpec::OpenAPI::Config.load_environment_settings
77
+
78
+ begin
79
+ require 'hanami'
80
+ rescue LoadError
81
+ warn 'Hanami not detected' if RSpec::OpenAPI::Config.debug_enabled
82
+ else
83
+ require 'rspec/openapi/extractors/hanami'
84
+ end
85
+
86
+ begin
87
+ require 'rails'
88
+ rescue LoadError
89
+ warn 'Rails not detected' if RSpec::OpenAPI::Config.debug_enabled
90
+ else
91
+ require 'rspec/openapi/extractors/rails'
92
+ end
93
+ end
94
+
95
+ require 'rspec/openapi/minitest_hooks' if Object.const_defined?('Minitest')
96
+ require 'rspec/openapi/rspec_hooks' if ENV['OPENAPI'] && Object.const_defined?('RSpec')
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.18.2
4
+ version: 0.18.4
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: 2024-04-22 00:00:00.000000000 Z
12
+ date: 2025-02-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -109,7 +109,7 @@ licenses:
109
109
  metadata:
110
110
  homepage_uri: https://github.com/exoego/rspec-openapi
111
111
  source_code_uri: https://github.com/exoego/rspec-openapi
112
- changelog_uri: https://github.com/exoego/rspec-openapi/releases/tag/v0.18.2
112
+ changelog_uri: https://github.com/exoego/rspec-openapi/releases/tag/v0.18.4
113
113
  rubygems_mfa_required: 'true'
114
114
  post_install_message:
115
115
  rdoc_options: []