active_record_query_trace 1.6.1 → 1.9
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 +4 -4
- data/lib/active_record_query_trace/version.rb +1 -1
- data/lib/active_record_query_trace.rb +99 -60
- metadata +52 -38
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7b5e993ea82ca839b520e3e11a3ca7fb9c2109abbae2f0a91d52e04e2f8cf656
|
|
4
|
+
data.tar.gz: 4be20dad7c8d8002fff46a801e4df6244e4130854a873bb7d70d8490a14861e4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 48c2560aaf4754231a27a9a62f32a4424eadc9cc0a4a64d78eafc1ac4d5dcb1fe2cde57d97c0fa2d9daeda71943558c7d6db45fd6cf17cfb68a65a5da44aade7
|
|
7
|
+
data.tar.gz: 71b2c37831a9d8313372048946b370ded9221de476d3fedf4b0bf75a4d1c775417ed7aee373a45554103041529e88372c58999df9d00fdcbd4f7a1d03e838adb
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'active_record/log_subscriber'
|
|
4
|
+
require_relative 'active_record_query_trace/version'
|
|
4
5
|
|
|
5
6
|
module ActiveRecordQueryTrace
|
|
6
7
|
INDENTATION = ' ' * 6
|
|
@@ -26,16 +27,57 @@ module ActiveRecordQueryTrace
|
|
|
26
27
|
}.freeze
|
|
27
28
|
|
|
28
29
|
class << self
|
|
29
|
-
attr_accessor :enabled
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
attr_accessor :enabled, :lines, :ignore_cached_queries, :colorize, :query_type, :suppress_logging_of_db_reads
|
|
31
|
+
attr_writer :default_cleaner
|
|
32
|
+
attr_reader :backtrace_cleaner, :level
|
|
33
|
+
|
|
34
|
+
def backtrace_cleaner=(cleaner)
|
|
35
|
+
@backtrace_cleaner =
|
|
36
|
+
if cleaner.is_a?(Proc)
|
|
37
|
+
cleaner
|
|
38
|
+
else
|
|
39
|
+
proc { |trace| cleaner.clean(trace) }
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# When changing the level we need to reset the backtrace cleaner used
|
|
44
|
+
def level=(level)
|
|
45
|
+
@level = level
|
|
46
|
+
@default_cleaner = nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def default_cleaner
|
|
50
|
+
@default_cleaner ||= setup_backtrace_cleaner
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# The following code creates a brand new BacktraceCleaner just for the use of this Gem
|
|
54
|
+
# avoiding the dealing with Rails.backtrace_cleaner
|
|
55
|
+
def setup_backtrace_cleaner
|
|
56
|
+
cleaner = Rails::BacktraceCleaner.new
|
|
57
|
+
remove_filters_and_silencers cleaner
|
|
58
|
+
cleaner.instance_variable_set :@root, Rails.root.to_s if cleaner.instance_variable_get(:@root) == '/'
|
|
59
|
+
case ActiveRecordQueryTrace.level
|
|
60
|
+
when :app
|
|
61
|
+
cleaner.add_silencer { |line| line !~ rails_root_regexp }
|
|
62
|
+
when :rails
|
|
63
|
+
cleaner.add_silencer { |line| line =~ rails_root_regexp }
|
|
64
|
+
end
|
|
65
|
+
cleaner
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def remove_filters_and_silencers(cleaner)
|
|
69
|
+
cleaner.remove_filters!
|
|
70
|
+
cleaner.remove_silencers!
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# This cannot be set in a constant as Rails.root is not yet available when
|
|
74
|
+
# this file is loaded.
|
|
75
|
+
def rails_root_regexp
|
|
76
|
+
@rails_root_regexp ||= %r{#{Regexp.escape(Rails.root.to_s)}(?!/vendor)}
|
|
77
|
+
end
|
|
36
78
|
end
|
|
37
79
|
|
|
38
|
-
class CustomLogSubscriber < ActiveRecord::LogSubscriber
|
|
80
|
+
class CustomLogSubscriber < ActiveRecord::LogSubscriber # rubocop:disable Metrics/ClassLength
|
|
39
81
|
def initialize
|
|
40
82
|
super
|
|
41
83
|
ActiveRecordQueryTrace.enabled = false
|
|
@@ -50,51 +92,50 @@ module ActiveRecordQueryTrace
|
|
|
50
92
|
def sql(event)
|
|
51
93
|
payload = event.payload
|
|
52
94
|
return unless display_backtrace?(payload)
|
|
53
|
-
|
|
54
|
-
setup_backtrace_cleaner
|
|
55
|
-
|
|
56
95
|
trace = fully_formatted_trace # Memoize
|
|
57
|
-
debug(trace)
|
|
96
|
+
debug(trace) if trace.present?
|
|
58
97
|
end
|
|
59
98
|
|
|
99
|
+
delegate :default_cleaner, to: ActiveRecordQueryTrace
|
|
100
|
+
|
|
60
101
|
attach_to :active_record
|
|
61
102
|
|
|
62
103
|
private
|
|
63
104
|
|
|
64
|
-
|
|
65
|
-
|
|
105
|
+
def cached_query?(payload)
|
|
106
|
+
return false unless ActiveRecordQueryTrace.ignore_cached_queries
|
|
107
|
+
payload[:cached] || payload[:name] == 'CACHE'
|
|
108
|
+
end
|
|
109
|
+
|
|
66
110
|
# TODO: refactor and remove rubocop:disable comments.
|
|
67
111
|
def display_backtrace?(payload)
|
|
68
112
|
ActiveRecordQueryTrace.enabled \
|
|
69
113
|
&& !transaction_begin_or_commit_query?(payload) \
|
|
70
114
|
&& !schema_query?(payload) \
|
|
71
|
-
&& !(
|
|
115
|
+
&& !cached_query?(payload) \
|
|
72
116
|
&& !(ActiveRecordQueryTrace.suppress_logging_of_db_reads && db_read_query?(payload)) \
|
|
73
117
|
&& display_backtrace_for_query_type?(payload)
|
|
74
118
|
end
|
|
75
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
76
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
|
77
119
|
|
|
78
120
|
def display_backtrace_for_query_type?(payload)
|
|
79
|
-
invalid_type_msg = 'Invalid ActiveRecordQueryTrace.query_type value ' \
|
|
80
|
-
"#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
|
|
81
|
-
|
|
82
121
|
case ActiveRecordQueryTrace.query_type
|
|
83
122
|
when :all then true
|
|
84
123
|
when :read then db_read_query?(payload)
|
|
85
124
|
when :write then !db_read_query?(payload)
|
|
86
|
-
else
|
|
125
|
+
else
|
|
126
|
+
raise 'Invalid ActiveRecordQueryTrace.query_type value ' \
|
|
127
|
+
"#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
|
|
87
128
|
end
|
|
88
129
|
end
|
|
89
130
|
|
|
90
131
|
def db_read_query?(payload)
|
|
91
|
-
|
|
132
|
+
payload[:sql] !~ /INSERT|UPDATE|DELETE/
|
|
92
133
|
end
|
|
93
134
|
|
|
94
135
|
def fully_formatted_trace
|
|
95
136
|
cleaned_trace = clean_trace(original_trace)
|
|
96
137
|
return if cleaned_trace.blank?
|
|
97
|
-
stringified_trace = BACKTRACE_PREFIX + lines_to_display(cleaned_trace).join("\n"
|
|
138
|
+
stringified_trace = BACKTRACE_PREFIX + lines_to_display(cleaned_trace).join("\n#{INDENTATION}")
|
|
98
139
|
colorize_text(stringified_trace)
|
|
99
140
|
end
|
|
100
141
|
|
|
@@ -104,47 +145,36 @@ module ActiveRecordQueryTrace
|
|
|
104
145
|
end
|
|
105
146
|
|
|
106
147
|
def transaction_begin_or_commit_query?(payload)
|
|
107
|
-
payload[:sql]
|
|
148
|
+
payload[:sql] =~ /\Abegin transaction|commit transaction|BEGIN|COMMIT\Z/
|
|
108
149
|
end
|
|
109
150
|
|
|
110
151
|
def schema_query?(payload)
|
|
111
152
|
payload[:name] == 'SCHEMA'
|
|
112
153
|
end
|
|
113
154
|
|
|
155
|
+
# rubocop:disable Metrics/MethodLength
|
|
114
156
|
def clean_trace(full_trace)
|
|
115
|
-
|
|
157
|
+
case ActiveRecordQueryTrace.level
|
|
158
|
+
when :full
|
|
159
|
+
trace = full_trace
|
|
160
|
+
when :app, :rails
|
|
161
|
+
trace = default_cleaner.clean(full_trace)
|
|
162
|
+
when :custom
|
|
163
|
+
unless ActiveRecordQueryTrace.backtrace_cleaner
|
|
164
|
+
raise 'Configure your backtrace cleaner first via ActiveRecordQueryTrace.backtrace_cleaner = MyCleaner'
|
|
165
|
+
end
|
|
166
|
+
trace = ActiveRecordQueryTrace.backtrace_cleaner.call(full_trace)
|
|
167
|
+
else
|
|
168
|
+
raise 'Invalid ActiveRecordQueryTrace.level value ' \
|
|
116
169
|
"#{ActiveRecordQueryTrace.level}. Should be :full, :rails, or :app."
|
|
117
|
-
|
|
170
|
+
end
|
|
118
171
|
|
|
119
|
-
trace = ActiveRecordQueryTrace.level == :full ? full_trace : Rails.backtrace_cleaner.clean(full_trace)
|
|
120
172
|
# We cant use a Rails::BacktraceCleaner filter to display only the relative
|
|
121
173
|
# path of application trace lines because it breaks the silencer that selects
|
|
122
174
|
# the lines to display or hide based on whether they include `Rails.root`.
|
|
123
|
-
trace.map { |line| line.
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Rails by default silences all backtraces that *do not* match
|
|
127
|
-
# Rails::BacktraceCleaner::APP_DIRS_PATTERN. In other words, the default
|
|
128
|
-
# silencer filters out all framework backtrace lines, leaving only the
|
|
129
|
-
# application lines.
|
|
130
|
-
def setup_backtrace_cleaner
|
|
131
|
-
setup_backtrace_cleaner_path
|
|
132
|
-
return unless ActiveRecordQueryTrace.level == :rails
|
|
133
|
-
Rails.backtrace_cleaner.remove_filters!
|
|
134
|
-
Rails.backtrace_cleaner.remove_silencers!
|
|
135
|
-
Rails.backtrace_cleaner.add_silencer do |line|
|
|
136
|
-
line.match(%r{#{Regexp.escape(Rails.root.to_s)}(?!/vendor)})
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# Rails relies on backtrace cleaner to set the application root directory
|
|
141
|
-
# filter. The problem is that the backtrace cleaner is initialized before
|
|
142
|
-
# this gem. This ensures that the value of `root` used by the filter
|
|
143
|
-
# is correct.
|
|
144
|
-
def setup_backtrace_cleaner_path
|
|
145
|
-
return unless Rails.backtrace_cleaner.instance_variable_get(:@root) == '/'
|
|
146
|
-
Rails.backtrace_cleaner.instance_variable_set :@root, Rails.root.to_s
|
|
175
|
+
trace.map { |line| line.sub(rails_root_prefix, '') }
|
|
147
176
|
end
|
|
177
|
+
# rubocop:enable Metrics/MethodLength
|
|
148
178
|
|
|
149
179
|
# Allow query to be colorized in the terminal
|
|
150
180
|
def colorize_text(text)
|
|
@@ -158,22 +188,31 @@ module ActiveRecordQueryTrace
|
|
|
158
188
|
end
|
|
159
189
|
|
|
160
190
|
def color_code
|
|
191
|
+
return @color_code if @color_code && @configured_color == ActiveRecordQueryTrace.colorize
|
|
192
|
+
|
|
193
|
+
@configured_color = ActiveRecordQueryTrace.colorize
|
|
194
|
+
|
|
161
195
|
# Backward compatibility for string color names with space as word separator.
|
|
162
|
-
color_code =
|
|
196
|
+
@color_code =
|
|
163
197
|
case ActiveRecordQueryTrace.colorize
|
|
164
|
-
when Symbol then COLORS[ActiveRecordQueryTrace.colorize]
|
|
198
|
+
when Symbol, true then COLORS[ActiveRecordQueryTrace.colorize]
|
|
165
199
|
when String then COLORS[ActiveRecordQueryTrace.colorize.tr("\s", '_').to_sym]
|
|
166
200
|
end
|
|
201
|
+
end
|
|
167
202
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
203
|
+
def validate_color_code(color_code)
|
|
204
|
+
valid_color_code?(color_code) || raise(
|
|
205
|
+
'ActiveRecordQueryTrace.colorize was set to an invalid ' \
|
|
206
|
+
"color. Use one of #{COLORS.keys} or a valid color code."
|
|
207
|
+
)
|
|
173
208
|
end
|
|
174
209
|
|
|
175
210
|
def valid_color_code?(color_code)
|
|
176
|
-
/\A\d+(
|
|
211
|
+
/\A\d+(?:;\d+)?\Z/ =~ color_code
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def rails_root_prefix
|
|
215
|
+
@rails_root_prefix ||= "#{Rails.root}/"
|
|
177
216
|
end
|
|
178
217
|
end
|
|
179
218
|
end
|
|
@@ -198,7 +237,7 @@ ActiveSupport::LogSubscriber.class_eval do
|
|
|
198
237
|
|
|
199
238
|
def debug(*args, &block)
|
|
200
239
|
return if ActiveRecordQueryTrace.suppress_logging_of_db_reads \
|
|
201
|
-
&& args.first !~ /
|
|
240
|
+
&& args.first !~ /INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX}/o
|
|
202
241
|
original_debug(*args, &block)
|
|
203
242
|
end
|
|
204
243
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: active_record_query_trace
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: '1.9'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Cody Caughlan
|
|
8
8
|
- Bruno Facca
|
|
9
|
-
autorequire:
|
|
9
|
+
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2026-01-20 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activerecord
|
|
@@ -17,112 +17,126 @@ dependencies:
|
|
|
17
17
|
requirements:
|
|
18
18
|
- - ">="
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version:
|
|
21
|
-
type: :
|
|
20
|
+
version: 6.0.0
|
|
21
|
+
type: :runtime
|
|
22
22
|
prerelease: false
|
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
24
|
requirements:
|
|
25
25
|
- - ">="
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
|
-
version:
|
|
27
|
+
version: 6.0.0
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
|
-
name:
|
|
29
|
+
name: rake
|
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
|
31
31
|
requirements:
|
|
32
|
-
- - "
|
|
32
|
+
- - "~>"
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: 0
|
|
34
|
+
version: '13.0'
|
|
35
35
|
type: :development
|
|
36
36
|
prerelease: false
|
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
38
|
requirements:
|
|
39
|
-
- - "
|
|
39
|
+
- - "~>"
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: 0
|
|
41
|
+
version: '13.0'
|
|
42
42
|
- !ruby/object:Gem::Dependency
|
|
43
|
-
name:
|
|
43
|
+
name: debug
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
|
45
45
|
requirements:
|
|
46
|
-
- - "
|
|
46
|
+
- - "~>"
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
|
-
version:
|
|
48
|
+
version: '1.8'
|
|
49
49
|
type: :development
|
|
50
50
|
prerelease: false
|
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
52
52
|
requirements:
|
|
53
|
-
- - "
|
|
53
|
+
- - "~>"
|
|
54
54
|
- !ruby/object:Gem::Version
|
|
55
|
-
version:
|
|
55
|
+
version: '1.8'
|
|
56
56
|
- !ruby/object:Gem::Dependency
|
|
57
57
|
name: rspec
|
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - "~>"
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '3.12'
|
|
63
|
+
type: :development
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - "~>"
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '3.12'
|
|
70
|
+
- !ruby/object:Gem::Dependency
|
|
71
|
+
name: rubocop
|
|
58
72
|
requirement: !ruby/object:Gem::Requirement
|
|
59
73
|
requirements:
|
|
60
74
|
- - ">="
|
|
61
75
|
- !ruby/object:Gem::Version
|
|
62
|
-
version:
|
|
76
|
+
version: '0'
|
|
63
77
|
type: :development
|
|
64
78
|
prerelease: false
|
|
65
79
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
80
|
requirements:
|
|
67
81
|
- - ">="
|
|
68
82
|
- !ruby/object:Gem::Version
|
|
69
|
-
version:
|
|
83
|
+
version: '0'
|
|
70
84
|
- !ruby/object:Gem::Dependency
|
|
71
|
-
name: rubocop
|
|
85
|
+
name: rubocop-performance
|
|
72
86
|
requirement: !ruby/object:Gem::Requirement
|
|
73
87
|
requirements:
|
|
74
88
|
- - ">="
|
|
75
89
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: 0
|
|
90
|
+
version: '0'
|
|
77
91
|
type: :development
|
|
78
92
|
prerelease: false
|
|
79
93
|
version_requirements: !ruby/object:Gem::Requirement
|
|
80
94
|
requirements:
|
|
81
95
|
- - ">="
|
|
82
96
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: 0
|
|
97
|
+
version: '0'
|
|
84
98
|
- !ruby/object:Gem::Dependency
|
|
85
|
-
name: rubocop-
|
|
99
|
+
name: rubocop-rails
|
|
86
100
|
requirement: !ruby/object:Gem::Requirement
|
|
87
101
|
requirements:
|
|
88
102
|
- - ">="
|
|
89
103
|
- !ruby/object:Gem::Version
|
|
90
|
-
version:
|
|
104
|
+
version: '0'
|
|
91
105
|
type: :development
|
|
92
106
|
prerelease: false
|
|
93
107
|
version_requirements: !ruby/object:Gem::Requirement
|
|
94
108
|
requirements:
|
|
95
109
|
- - ">="
|
|
96
110
|
- !ruby/object:Gem::Version
|
|
97
|
-
version:
|
|
111
|
+
version: '0'
|
|
98
112
|
- !ruby/object:Gem::Dependency
|
|
99
|
-
name:
|
|
113
|
+
name: rubocop-rspec
|
|
100
114
|
requirement: !ruby/object:Gem::Requirement
|
|
101
115
|
requirements:
|
|
102
116
|
- - ">="
|
|
103
117
|
- !ruby/object:Gem::Version
|
|
104
|
-
version: 0
|
|
118
|
+
version: '0'
|
|
105
119
|
type: :development
|
|
106
120
|
prerelease: false
|
|
107
121
|
version_requirements: !ruby/object:Gem::Requirement
|
|
108
122
|
requirements:
|
|
109
123
|
- - ">="
|
|
110
124
|
- !ruby/object:Gem::Version
|
|
111
|
-
version: 0
|
|
125
|
+
version: '0'
|
|
112
126
|
- !ruby/object:Gem::Dependency
|
|
113
|
-
name:
|
|
127
|
+
name: simplecov
|
|
114
128
|
requirement: !ruby/object:Gem::Requirement
|
|
115
129
|
requirements:
|
|
116
|
-
- - "
|
|
130
|
+
- - ">="
|
|
117
131
|
- !ruby/object:Gem::Version
|
|
118
|
-
version:
|
|
132
|
+
version: 0.22.0
|
|
119
133
|
type: :development
|
|
120
134
|
prerelease: false
|
|
121
135
|
version_requirements: !ruby/object:Gem::Requirement
|
|
122
136
|
requirements:
|
|
123
|
-
- - "
|
|
137
|
+
- - ">="
|
|
124
138
|
- !ruby/object:Gem::Version
|
|
125
|
-
version:
|
|
139
|
+
version: 0.22.0
|
|
126
140
|
description: Print stack trace of all DB queries to the Rails log. Helpful to find
|
|
127
141
|
where queries are being executed in your application.
|
|
128
142
|
email: bruno@facca.info
|
|
@@ -135,8 +149,9 @@ files:
|
|
|
135
149
|
homepage: https://github.com/brunofacca/active-record-query-trace
|
|
136
150
|
licenses:
|
|
137
151
|
- MIT
|
|
138
|
-
metadata:
|
|
139
|
-
|
|
152
|
+
metadata:
|
|
153
|
+
homepage_uri: https://github.com/brunofacca/active-record-query-trace
|
|
154
|
+
post_install_message:
|
|
140
155
|
rdoc_options: []
|
|
141
156
|
require_paths:
|
|
142
157
|
- lib
|
|
@@ -144,16 +159,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
144
159
|
requirements:
|
|
145
160
|
- - ">="
|
|
146
161
|
- !ruby/object:Gem::Version
|
|
147
|
-
version: '
|
|
162
|
+
version: '3.2'
|
|
148
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
164
|
requirements:
|
|
150
165
|
- - ">="
|
|
151
166
|
- !ruby/object:Gem::Version
|
|
152
167
|
version: '0'
|
|
153
168
|
requirements: []
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
signing_key:
|
|
169
|
+
rubygems_version: 3.4.10
|
|
170
|
+
signing_key:
|
|
157
171
|
specification_version: 4
|
|
158
172
|
summary: Print stack trace of all DB queries to the Rails log. Helpful to find where
|
|
159
173
|
queries are being executed in your application.
|