rails_api_logger 0.9.0 → 0.10.1

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -0
  3. data/.semaphore/semaphore.yml +132 -2
  4. data/.standard.yml +2 -0
  5. data/Appraisals +31 -0
  6. data/CHANGELOG.md +62 -3
  7. data/README.md +90 -53
  8. data/Rakefile +7 -2
  9. data/app/middlewares/rails_api_logger/middleware.rb +80 -0
  10. data/app/models/rails_api_logger/inbound_request_log.rb +5 -0
  11. data/app/models/rails_api_logger/loggable.rb +27 -0
  12. data/app/models/rails_api_logger/logger.rb +22 -0
  13. data/app/models/rails_api_logger/outbound_request_log.rb +5 -0
  14. data/app/models/rails_api_logger/request_log.rb +85 -0
  15. data/bin/rails +16 -0
  16. data/gemfiles/rails_6.1.gemfile +10 -0
  17. data/gemfiles/rails_6.1.gemfile.lock +240 -0
  18. data/gemfiles/rails_7.0.gemfile +10 -0
  19. data/gemfiles/rails_7.0.gemfile.lock +239 -0
  20. data/gemfiles/rails_7.1.gemfile +9 -0
  21. data/gemfiles/rails_7.1.gemfile.lock +272 -0
  22. data/gemfiles/rails_7.2.gemfile +9 -0
  23. data/gemfiles/rails_7.2.gemfile.lock +272 -0
  24. data/gemfiles/rails_8.0.gemfile +9 -0
  25. data/lib/generators/rails_api_logger/install_generator.rb +1 -1
  26. data/lib/rails_api_logger/engine.rb +25 -0
  27. data/lib/rails_api_logger/version.rb +5 -0
  28. data/lib/rails_api_logger.rb +9 -27
  29. data/rails_api_logger.gemspec +10 -6
  30. metadata +58 -29
  31. data/CODE_OF_CONDUCT.md +0 -74
  32. data/lib/rails_api_logger/inbound_request_log.rb +0 -2
  33. data/lib/rails_api_logger/inbound_requests_logger_middleware.rb +0 -71
  34. data/lib/rails_api_logger/outbound_request_log.rb +0 -2
  35. data/lib/rails_api_logger/request_log.rb +0 -76
  36. /data/{lib/rails_api_logger → app/controllers}/inbound_requests_logger.rb +0 -0
@@ -0,0 +1,27 @@
1
+ module RailsApiLogger
2
+ module Loggable
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ # :nodoc:
8
+ module ClassMethods
9
+ def has_many_outbound_request_logs
10
+ has_many :outbound_request_logs, -> { order(:created_at) },
11
+ class_name: "RailsApiLogger::OutboundRequestLog",
12
+ inverse_of: :loggable, dependent: :destroy, as: :loggable
13
+ end
14
+
15
+ def has_many_inbound_request_logs
16
+ has_many :inbound_request_logs, -> { order(:created_at) },
17
+ class_name: "RailsApiLogger::InboundRequestLog",
18
+ inverse_of: :loggable, dependent: :destroy, as: :loggable
19
+ end
20
+
21
+ def has_many_request_logs
22
+ has_many_inbound_request_logs
23
+ has_many_outbound_request_logs
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ module RailsApiLogger
2
+ class Logger
3
+ def initialize(loggable = nil, skip_request_body: false, skip_response_body: false)
4
+ @loggable = loggable
5
+ @skip_request_body = skip_request_body
6
+ @skip_response_body = skip_response_body
7
+ end
8
+
9
+ def call(url, request)
10
+ log = OutboundRequestLog.from_request(request, loggable: @loggable, skip_request_body: @skip_request_body)
11
+ yield.tap do |response|
12
+ log.from_response(response, skip_response_body: @skip_response_body)
13
+ end
14
+ rescue => e
15
+ log.response_body = {error: e.message} if log
16
+ raise
17
+ ensure
18
+ log.ended_at = Time.current
19
+ log.save!
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module RailsApiLogger
2
+ class OutboundRequestLog < RequestLog
3
+ self.table_name = "outbound_request_logs"
4
+ end
5
+ end
@@ -0,0 +1,85 @@
1
+ module RailsApiLogger
2
+ class RequestLog < ActiveRecord::Base
3
+ self.abstract_class = true
4
+
5
+ connects_to(**RailsApiLogger.connects_to) if RailsApiLogger.connects_to
6
+
7
+ if Gem::Version.new(Rails.version) >= Gem::Version.new("7.1")
8
+ serialize :request_body, coder: JSON
9
+ serialize :response_body, coder: JSON
10
+ else
11
+ serialize :request_body, JSON
12
+ serialize :response_body, JSON
13
+ end
14
+
15
+ belongs_to :loggable, optional: true, polymorphic: true
16
+
17
+ scope :failed, -> { where(response_code: 400..599).or(where.not(ended_at: nil).where(response_code: nil)) }
18
+
19
+ validates :method, presence: true
20
+ validates :path, presence: true
21
+
22
+ def self.from_request(request, loggable: nil, skip_request_body: false)
23
+ if skip_request_body
24
+ body = "[Skipped]"
25
+ else
26
+ request_body = (request.body.respond_to?(:read) ? request.body.read : request.body)
27
+ body = request_body&.dup&.force_encoding("UTF-8")
28
+ begin
29
+ body = JSON.parse(body) if body.present?
30
+ rescue JSON::ParserError
31
+ body
32
+ end
33
+ end
34
+ create(path: request.path, request_body: body, method: request.method, started_at: Time.current, loggable: loggable)
35
+ end
36
+
37
+ def from_response(response, skip_response_body: false)
38
+ self.response_code = response.code
39
+ self.response_body = skip_response_body ? "[Skipped]" : manipulate_body(response.body)
40
+ self
41
+ end
42
+
43
+ def formatted_request_body
44
+ formatted_body(request_body)
45
+ end
46
+
47
+ def formatted_response_body
48
+ formatted_body(response_body)
49
+ end
50
+
51
+ def formatted_body(body)
52
+ if body.is_a?(String) && body.blank?
53
+ ""
54
+ elsif body.is_a?(Hash)
55
+ JSON.pretty_generate(body)
56
+ else
57
+ xml = Nokogiri::XML(body)
58
+ if xml.errors.any?
59
+ body
60
+ else
61
+ xml.to_xml(indent: 2)
62
+ end
63
+ end
64
+ rescue
65
+ body
66
+ end
67
+
68
+ def duration
69
+ return if started_at.nil? || ended_at.nil?
70
+ ended_at - started_at
71
+ end
72
+
73
+ private
74
+
75
+ def manipulate_body(body)
76
+ body_duplicate = body&.dup&.force_encoding("UTF-8")
77
+ begin
78
+ body_duplicate = JSON.parse(body_duplicate) if body_duplicate.present?
79
+ rescue JSON::ParserError
80
+ body_duplicate
81
+ end
82
+ body_duplicate
83
+ end
84
+ end
85
+ end
data/bin/rails ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # This command will automatically be run when you run "rails" with Rails gems
5
+ # installed from the root of your application.
6
+
7
+ ENGINE_ROOT = File.expand_path('..', __dir__)
8
+ ENGINE_PATH = File.expand_path('../lib/rails_api_logger/engine', __dir__)
9
+ APP_PATH = File.expand_path('../spec/dummy/config/application', __dir__)
10
+
11
+ # Set up gems listed in the Gemfile.
12
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
13
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
14
+
15
+ require 'rails/all'
16
+ require 'rails/engine/commands'
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "concurrent-ruby", "1.3.4"
6
+ gem "rails", "~> 6.1.0"
7
+ gem "rspec-rails", "~> 6.1.0"
8
+ gem "sqlite3", "~> 1.7.3"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,240 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ rails_api_logger (0.10.1)
5
+ activejob (>= 6.0)
6
+ activerecord (>= 6.0)
7
+ nokogiri
8
+ railties (>= 6.0)
9
+ zeitwerk (>= 2.0.0)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ actioncable (6.1.7.10)
15
+ actionpack (= 6.1.7.10)
16
+ activesupport (= 6.1.7.10)
17
+ nio4r (~> 2.0)
18
+ websocket-driver (>= 0.6.1)
19
+ actionmailbox (6.1.7.10)
20
+ actionpack (= 6.1.7.10)
21
+ activejob (= 6.1.7.10)
22
+ activerecord (= 6.1.7.10)
23
+ activestorage (= 6.1.7.10)
24
+ activesupport (= 6.1.7.10)
25
+ mail (>= 2.7.1)
26
+ actionmailer (6.1.7.10)
27
+ actionpack (= 6.1.7.10)
28
+ actionview (= 6.1.7.10)
29
+ activejob (= 6.1.7.10)
30
+ activesupport (= 6.1.7.10)
31
+ mail (~> 2.5, >= 2.5.4)
32
+ rails-dom-testing (~> 2.0)
33
+ actionpack (6.1.7.10)
34
+ actionview (= 6.1.7.10)
35
+ activesupport (= 6.1.7.10)
36
+ rack (~> 2.0, >= 2.0.9)
37
+ rack-test (>= 0.6.3)
38
+ rails-dom-testing (~> 2.0)
39
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
40
+ actiontext (6.1.7.10)
41
+ actionpack (= 6.1.7.10)
42
+ activerecord (= 6.1.7.10)
43
+ activestorage (= 6.1.7.10)
44
+ activesupport (= 6.1.7.10)
45
+ nokogiri (>= 1.8.5)
46
+ actionview (6.1.7.10)
47
+ activesupport (= 6.1.7.10)
48
+ builder (~> 3.1)
49
+ erubi (~> 1.4)
50
+ rails-dom-testing (~> 2.0)
51
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
52
+ activejob (6.1.7.10)
53
+ activesupport (= 6.1.7.10)
54
+ globalid (>= 0.3.6)
55
+ activemodel (6.1.7.10)
56
+ activesupport (= 6.1.7.10)
57
+ activerecord (6.1.7.10)
58
+ activemodel (= 6.1.7.10)
59
+ activesupport (= 6.1.7.10)
60
+ activestorage (6.1.7.10)
61
+ actionpack (= 6.1.7.10)
62
+ activejob (= 6.1.7.10)
63
+ activerecord (= 6.1.7.10)
64
+ activesupport (= 6.1.7.10)
65
+ marcel (~> 1.0)
66
+ mini_mime (>= 1.1.0)
67
+ activesupport (6.1.7.10)
68
+ concurrent-ruby (~> 1.0, >= 1.0.2)
69
+ i18n (>= 1.6, < 2)
70
+ minitest (>= 5.1)
71
+ tzinfo (~> 2.0)
72
+ zeitwerk (~> 2.3)
73
+ appraisal (2.5.0)
74
+ bundler
75
+ rake
76
+ thor (>= 0.14.0)
77
+ ast (2.4.2)
78
+ base64 (0.2.0)
79
+ builder (3.3.0)
80
+ concurrent-ruby (1.3.4)
81
+ crass (1.0.6)
82
+ date (3.4.1)
83
+ diff-lcs (1.6.0)
84
+ erubi (1.13.1)
85
+ globalid (1.2.1)
86
+ activesupport (>= 6.1)
87
+ i18n (1.14.7)
88
+ concurrent-ruby (~> 1.0)
89
+ json (2.10.1)
90
+ language_server-protocol (3.17.0.4)
91
+ lint_roller (1.1.0)
92
+ loofah (2.24.0)
93
+ crass (~> 1.0.2)
94
+ nokogiri (>= 1.12.0)
95
+ mail (2.8.1)
96
+ mini_mime (>= 0.1.1)
97
+ net-imap
98
+ net-pop
99
+ net-smtp
100
+ marcel (1.0.4)
101
+ method_source (1.1.0)
102
+ mini_mime (1.1.5)
103
+ minitest (5.25.4)
104
+ mysql2 (0.5.6)
105
+ net-imap (0.5.6)
106
+ date
107
+ net-protocol
108
+ net-pop (0.1.2)
109
+ net-protocol
110
+ net-protocol (0.2.2)
111
+ timeout
112
+ net-smtp (0.5.1)
113
+ net-protocol
114
+ nio4r (2.7.4)
115
+ nokogiri (1.18.2-arm64-darwin)
116
+ racc (~> 1.4)
117
+ parallel (1.26.3)
118
+ parser (3.3.7.1)
119
+ ast (~> 2.4.1)
120
+ racc
121
+ pg (1.5.9)
122
+ racc (1.8.1)
123
+ rack (2.2.11)
124
+ rack-test (2.2.0)
125
+ rack (>= 1.3)
126
+ rails (6.1.7.10)
127
+ actioncable (= 6.1.7.10)
128
+ actionmailbox (= 6.1.7.10)
129
+ actionmailer (= 6.1.7.10)
130
+ actionpack (= 6.1.7.10)
131
+ actiontext (= 6.1.7.10)
132
+ actionview (= 6.1.7.10)
133
+ activejob (= 6.1.7.10)
134
+ activemodel (= 6.1.7.10)
135
+ activerecord (= 6.1.7.10)
136
+ activestorage (= 6.1.7.10)
137
+ activesupport (= 6.1.7.10)
138
+ bundler (>= 1.15.0)
139
+ railties (= 6.1.7.10)
140
+ sprockets-rails (>= 2.0.0)
141
+ rails-dom-testing (2.2.0)
142
+ activesupport (>= 5.0.0)
143
+ minitest
144
+ nokogiri (>= 1.6)
145
+ rails-html-sanitizer (1.6.2)
146
+ loofah (~> 2.21)
147
+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
148
+ railties (6.1.7.10)
149
+ actionpack (= 6.1.7.10)
150
+ activesupport (= 6.1.7.10)
151
+ method_source
152
+ rake (>= 12.2)
153
+ thor (~> 1.0)
154
+ rainbow (3.1.1)
155
+ rake (12.3.3)
156
+ regexp_parser (2.10.0)
157
+ rspec-core (3.13.3)
158
+ rspec-support (~> 3.13.0)
159
+ rspec-expectations (3.13.3)
160
+ diff-lcs (>= 1.2.0, < 2.0)
161
+ rspec-support (~> 3.13.0)
162
+ rspec-mocks (3.13.2)
163
+ diff-lcs (>= 1.2.0, < 2.0)
164
+ rspec-support (~> 3.13.0)
165
+ rspec-rails (6.1.5)
166
+ actionpack (>= 6.1)
167
+ activesupport (>= 6.1)
168
+ railties (>= 6.1)
169
+ rspec-core (~> 3.13)
170
+ rspec-expectations (~> 3.13)
171
+ rspec-mocks (~> 3.13)
172
+ rspec-support (~> 3.13)
173
+ rspec-support (3.13.2)
174
+ rubocop (1.71.2)
175
+ json (~> 2.3)
176
+ language_server-protocol (>= 3.17.0)
177
+ parallel (~> 1.10)
178
+ parser (>= 3.3.0.2)
179
+ rainbow (>= 2.2.2, < 4.0)
180
+ regexp_parser (>= 2.9.3, < 3.0)
181
+ rubocop-ast (>= 1.38.0, < 2.0)
182
+ ruby-progressbar (~> 1.7)
183
+ unicode-display_width (>= 2.4.0, < 4.0)
184
+ rubocop-ast (1.38.0)
185
+ parser (>= 3.3.1.0)
186
+ rubocop-performance (1.23.1)
187
+ rubocop (>= 1.48.1, < 2.0)
188
+ rubocop-ast (>= 1.31.1, < 2.0)
189
+ ruby-progressbar (1.13.0)
190
+ sprockets (4.2.1)
191
+ concurrent-ruby (~> 1.0)
192
+ rack (>= 2.2.4, < 4)
193
+ sprockets-rails (3.5.2)
194
+ actionpack (>= 6.1)
195
+ activesupport (>= 6.1)
196
+ sprockets (>= 3.0.0)
197
+ sqlite3 (1.7.3-arm64-darwin)
198
+ standard (1.45.0)
199
+ language_server-protocol (~> 3.17.0.2)
200
+ lint_roller (~> 1.0)
201
+ rubocop (~> 1.71.0)
202
+ standard-custom (~> 1.0.0)
203
+ standard-performance (~> 1.6)
204
+ standard-custom (1.0.2)
205
+ lint_roller (~> 1.0)
206
+ rubocop (~> 1.50)
207
+ standard-performance (1.6.0)
208
+ lint_roller (~> 1.1)
209
+ rubocop-performance (~> 1.23.0)
210
+ thor (1.3.2)
211
+ timeout (0.4.3)
212
+ tzinfo (2.0.6)
213
+ concurrent-ruby (~> 1.0)
214
+ unicode-display_width (3.1.4)
215
+ unicode-emoji (~> 4.0, >= 4.0.4)
216
+ unicode-emoji (4.0.4)
217
+ websocket-driver (0.7.7)
218
+ base64
219
+ websocket-extensions (>= 0.1.0)
220
+ websocket-extensions (0.1.5)
221
+ zeitwerk (2.6.18)
222
+
223
+ PLATFORMS
224
+ arm64-darwin
225
+
226
+ DEPENDENCIES
227
+ appraisal (~> 2.5)
228
+ concurrent-ruby (= 1.3.4)
229
+ mysql2 (~> 0.5.6)
230
+ pg (~> 1.5.4)
231
+ rack
232
+ rails (~> 6.1.0)
233
+ rails_api_logger!
234
+ rake (~> 12.0)
235
+ rspec-rails (~> 6.1.0)
236
+ sqlite3 (~> 1.7.3)
237
+ standard (~> 1.31)
238
+
239
+ BUNDLED WITH
240
+ 2.5.4
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "concurrent-ruby", "1.3.4"
6
+ gem "rails", "~> 7.0.0"
7
+ gem "rspec-rails", "~> 7.1.0"
8
+ gem "sqlite3", "~> 1.7.3"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,239 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ rails_api_logger (0.10.0)
5
+ activejob (>= 6.0)
6
+ activerecord (>= 6.0)
7
+ nokogiri
8
+ railties (>= 6.0)
9
+ zeitwerk (>= 2.0.0)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ actioncable (7.0.8.7)
15
+ actionpack (= 7.0.8.7)
16
+ activesupport (= 7.0.8.7)
17
+ nio4r (~> 2.0)
18
+ websocket-driver (>= 0.6.1)
19
+ actionmailbox (7.0.8.7)
20
+ actionpack (= 7.0.8.7)
21
+ activejob (= 7.0.8.7)
22
+ activerecord (= 7.0.8.7)
23
+ activestorage (= 7.0.8.7)
24
+ activesupport (= 7.0.8.7)
25
+ mail (>= 2.7.1)
26
+ net-imap
27
+ net-pop
28
+ net-smtp
29
+ actionmailer (7.0.8.7)
30
+ actionpack (= 7.0.8.7)
31
+ actionview (= 7.0.8.7)
32
+ activejob (= 7.0.8.7)
33
+ activesupport (= 7.0.8.7)
34
+ mail (~> 2.5, >= 2.5.4)
35
+ net-imap
36
+ net-pop
37
+ net-smtp
38
+ rails-dom-testing (~> 2.0)
39
+ actionpack (7.0.8.7)
40
+ actionview (= 7.0.8.7)
41
+ activesupport (= 7.0.8.7)
42
+ rack (~> 2.0, >= 2.2.4)
43
+ rack-test (>= 0.6.3)
44
+ rails-dom-testing (~> 2.0)
45
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
46
+ actiontext (7.0.8.7)
47
+ actionpack (= 7.0.8.7)
48
+ activerecord (= 7.0.8.7)
49
+ activestorage (= 7.0.8.7)
50
+ activesupport (= 7.0.8.7)
51
+ globalid (>= 0.6.0)
52
+ nokogiri (>= 1.8.5)
53
+ actionview (7.0.8.7)
54
+ activesupport (= 7.0.8.7)
55
+ builder (~> 3.1)
56
+ erubi (~> 1.4)
57
+ rails-dom-testing (~> 2.0)
58
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
59
+ activejob (7.0.8.7)
60
+ activesupport (= 7.0.8.7)
61
+ globalid (>= 0.3.6)
62
+ activemodel (7.0.8.7)
63
+ activesupport (= 7.0.8.7)
64
+ activerecord (7.0.8.7)
65
+ activemodel (= 7.0.8.7)
66
+ activesupport (= 7.0.8.7)
67
+ activestorage (7.0.8.7)
68
+ actionpack (= 7.0.8.7)
69
+ activejob (= 7.0.8.7)
70
+ activerecord (= 7.0.8.7)
71
+ activesupport (= 7.0.8.7)
72
+ marcel (~> 1.0)
73
+ mini_mime (>= 1.1.0)
74
+ activesupport (7.0.8.7)
75
+ concurrent-ruby (~> 1.0, >= 1.0.2)
76
+ i18n (>= 1.6, < 2)
77
+ minitest (>= 5.1)
78
+ tzinfo (~> 2.0)
79
+ appraisal (2.5.0)
80
+ bundler
81
+ rake
82
+ thor (>= 0.14.0)
83
+ ast (2.4.2)
84
+ base64 (0.2.0)
85
+ builder (3.3.0)
86
+ concurrent-ruby (1.3.4)
87
+ crass (1.0.6)
88
+ date (3.4.1)
89
+ diff-lcs (1.6.0)
90
+ erubi (1.13.1)
91
+ globalid (1.2.1)
92
+ activesupport (>= 6.1)
93
+ i18n (1.14.7)
94
+ concurrent-ruby (~> 1.0)
95
+ json (2.10.1)
96
+ language_server-protocol (3.17.0.4)
97
+ lint_roller (1.1.0)
98
+ loofah (2.24.0)
99
+ crass (~> 1.0.2)
100
+ nokogiri (>= 1.12.0)
101
+ mail (2.8.1)
102
+ mini_mime (>= 0.1.1)
103
+ net-imap
104
+ net-pop
105
+ net-smtp
106
+ marcel (1.0.4)
107
+ method_source (1.1.0)
108
+ mini_mime (1.1.5)
109
+ minitest (5.25.4)
110
+ mysql2 (0.5.6)
111
+ net-imap (0.5.6)
112
+ date
113
+ net-protocol
114
+ net-pop (0.1.2)
115
+ net-protocol
116
+ net-protocol (0.2.2)
117
+ timeout
118
+ net-smtp (0.5.1)
119
+ net-protocol
120
+ nio4r (2.7.4)
121
+ nokogiri (1.18.2-arm64-darwin)
122
+ racc (~> 1.4)
123
+ parallel (1.26.3)
124
+ parser (3.3.7.1)
125
+ ast (~> 2.4.1)
126
+ racc
127
+ pg (1.5.9)
128
+ racc (1.8.1)
129
+ rack (2.2.11)
130
+ rack-test (2.2.0)
131
+ rack (>= 1.3)
132
+ rails (7.0.8.7)
133
+ actioncable (= 7.0.8.7)
134
+ actionmailbox (= 7.0.8.7)
135
+ actionmailer (= 7.0.8.7)
136
+ actionpack (= 7.0.8.7)
137
+ actiontext (= 7.0.8.7)
138
+ actionview (= 7.0.8.7)
139
+ activejob (= 7.0.8.7)
140
+ activemodel (= 7.0.8.7)
141
+ activerecord (= 7.0.8.7)
142
+ activestorage (= 7.0.8.7)
143
+ activesupport (= 7.0.8.7)
144
+ bundler (>= 1.15.0)
145
+ railties (= 7.0.8.7)
146
+ rails-dom-testing (2.2.0)
147
+ activesupport (>= 5.0.0)
148
+ minitest
149
+ nokogiri (>= 1.6)
150
+ rails-html-sanitizer (1.6.2)
151
+ loofah (~> 2.21)
152
+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
153
+ railties (7.0.8.7)
154
+ actionpack (= 7.0.8.7)
155
+ activesupport (= 7.0.8.7)
156
+ method_source
157
+ rake (>= 12.2)
158
+ thor (~> 1.0)
159
+ zeitwerk (~> 2.5)
160
+ rainbow (3.1.1)
161
+ rake (12.3.3)
162
+ regexp_parser (2.10.0)
163
+ rspec-core (3.13.3)
164
+ rspec-support (~> 3.13.0)
165
+ rspec-expectations (3.13.3)
166
+ diff-lcs (>= 1.2.0, < 2.0)
167
+ rspec-support (~> 3.13.0)
168
+ rspec-mocks (3.13.2)
169
+ diff-lcs (>= 1.2.0, < 2.0)
170
+ rspec-support (~> 3.13.0)
171
+ rspec-rails (7.1.1)
172
+ actionpack (>= 7.0)
173
+ activesupport (>= 7.0)
174
+ railties (>= 7.0)
175
+ rspec-core (~> 3.13)
176
+ rspec-expectations (~> 3.13)
177
+ rspec-mocks (~> 3.13)
178
+ rspec-support (~> 3.13)
179
+ rspec-support (3.13.2)
180
+ rubocop (1.71.2)
181
+ json (~> 2.3)
182
+ language_server-protocol (>= 3.17.0)
183
+ parallel (~> 1.10)
184
+ parser (>= 3.3.0.2)
185
+ rainbow (>= 2.2.2, < 4.0)
186
+ regexp_parser (>= 2.9.3, < 3.0)
187
+ rubocop-ast (>= 1.38.0, < 2.0)
188
+ ruby-progressbar (~> 1.7)
189
+ unicode-display_width (>= 2.4.0, < 4.0)
190
+ rubocop-ast (1.38.0)
191
+ parser (>= 3.3.1.0)
192
+ rubocop-performance (1.23.1)
193
+ rubocop (>= 1.48.1, < 2.0)
194
+ rubocop-ast (>= 1.31.1, < 2.0)
195
+ ruby-progressbar (1.13.0)
196
+ sqlite3 (1.7.3-arm64-darwin)
197
+ standard (1.45.0)
198
+ language_server-protocol (~> 3.17.0.2)
199
+ lint_roller (~> 1.0)
200
+ rubocop (~> 1.71.0)
201
+ standard-custom (~> 1.0.0)
202
+ standard-performance (~> 1.6)
203
+ standard-custom (1.0.2)
204
+ lint_roller (~> 1.0)
205
+ rubocop (~> 1.50)
206
+ standard-performance (1.6.0)
207
+ lint_roller (~> 1.1)
208
+ rubocop-performance (~> 1.23.0)
209
+ thor (1.3.2)
210
+ timeout (0.4.3)
211
+ tzinfo (2.0.6)
212
+ concurrent-ruby (~> 1.0)
213
+ unicode-display_width (3.1.4)
214
+ unicode-emoji (~> 4.0, >= 4.0.4)
215
+ unicode-emoji (4.0.4)
216
+ websocket-driver (0.7.7)
217
+ base64
218
+ websocket-extensions (>= 0.1.0)
219
+ websocket-extensions (0.1.5)
220
+ zeitwerk (2.6.18)
221
+
222
+ PLATFORMS
223
+ arm64-darwin
224
+
225
+ DEPENDENCIES
226
+ appraisal (~> 2.5)
227
+ concurrent-ruby (= 1.3.4)
228
+ mysql2 (~> 0.5.6)
229
+ pg (~> 1.5.4)
230
+ rack
231
+ rails (~> 7.0.0)
232
+ rails_api_logger!
233
+ rake (~> 12.0)
234
+ rspec-rails (~> 7.1.0)
235
+ sqlite3 (~> 1.7.3)
236
+ standard (~> 1.31)
237
+
238
+ BUNDLED WITH
239
+ 2.5.4
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 7.1.0"
6
+ gem "rspec-rails", "~> 7.1.0"
7
+ gem "sqlite3", "~> 1.7.3"
8
+
9
+ gemspec path: "../"