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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 065d0d118eb1db21b6095e817d3d2644a833aa191014650f0aa761cdcdde1f67
4
- data.tar.gz: c68672567f6b98fc6d58a6aa4cdfce6b8f53c9171a14c6ed72b12793ebb0241c
3
+ metadata.gz: 7b5e993ea82ca839b520e3e11a3ca7fb9c2109abbae2f0a91d52e04e2f8cf656
4
+ data.tar.gz: 4be20dad7c8d8002fff46a801e4df6244e4130854a873bb7d70d8490a14861e4
5
5
  SHA512:
6
- metadata.gz: 2dae585f11b61adf9333ae499bcd8739d3675fc7ab1e3e9a669f8a5d3ab133b80ce8e0afdf534eabca4241576146ddb43ded36c4e4f3b8b3e4d1f65949d82dfa
7
- data.tar.gz: 57822d872644b5ddea72c2b1e1bbd9a01084af37bc0e71a97e87c209403de7cd9c88eb7364574bb58cf24819e0f4f30319dc3e5d156fa2b493d121eb54e2ed31
6
+ metadata.gz: 48c2560aaf4754231a27a9a62f32a4424eadc9cc0a4a64d78eafc1ac4d5dcb1fe2cde57d97c0fa2d9daeda71943558c7d6db45fd6cf17cfb68a65a5da44aade7
7
+ data.tar.gz: 71b2c37831a9d8313372048946b370ded9221de476d3fedf4b0bf75a4d1c775417ed7aee373a45554103041529e88372c58999df9d00fdcbd4f7a1d03e838adb
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordQueryTrace
4
- VERSION = '1.6.1'
4
+ VERSION = '1.9'
5
5
  end
@@ -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
- attr_accessor :level
31
- attr_accessor :lines
32
- attr_accessor :ignore_cached_queries
33
- attr_accessor :colorize
34
- attr_accessor :query_type
35
- attr_accessor :suppress_logging_of_db_reads
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) unless trace.blank?
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
- # rubocop:disable Metrics/CyclomaticComplexity
65
- # rubocop:disable Metrics/PerceivedComplexity
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
- && !(ActiveRecordQueryTrace.ignore_cached_queries && payload[:cached]) \
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 raise(invalid_type_msg)
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
- !payload[:sql].match(/(INSERT|UPDATE|DELETE)/)
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" + INDENTATION)
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].match(/\A(begin transaction|commit transaction|BEGIN|COMMIT)\Z/)
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
- invalid_level_msg = 'Invalid ActiveRecordQueryTrace.level value ' \
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
- raise(invalid_level_msg) unless %i[full app rails].include?(ActiveRecordQueryTrace.level)
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.gsub("#{Rails.root}/", '') }
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
- error_msg = 'ActiveRecordQueryTrace.colorize was set to an invalid ' \
169
- "color. Use one of #{COLORS.keys} or a valid color code."
170
-
171
- raise error_msg unless valid_color_code?(color_code)
172
- color_code
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+(;\d+)?\Z/.match(color_code)
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 !~ /(INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX})/
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.6.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: 2019-03-10 00:00:00.000000000 Z
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: 4.0.0
21
- type: :development
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: 4.0.0
27
+ version: 6.0.0
28
28
  - !ruby/object:Gem::Dependency
29
- name: pry
29
+ name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ">="
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 0.12.2
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.12.2
41
+ version: '13.0'
42
42
  - !ruby/object:Gem::Dependency
43
- name: pry-byebug
43
+ name: debug
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: 3.7.0
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: 3.7.0
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: 3.8.0
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: 3.8.0
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.65.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.65.0
97
+ version: '0'
84
98
  - !ruby/object:Gem::Dependency
85
- name: rubocop-rspec
99
+ name: rubocop-rails
86
100
  requirement: !ruby/object:Gem::Requirement
87
101
  requirements:
88
102
  - - ">="
89
103
  - !ruby/object:Gem::Version
90
- version: 1.32.0
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: 1.32.0
111
+ version: '0'
98
112
  - !ruby/object:Gem::Dependency
99
- name: simplecov
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.16.1
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.16.1
125
+ version: '0'
112
126
  - !ruby/object:Gem::Dependency
113
- name: sqlite3
127
+ name: simplecov
114
128
  requirement: !ruby/object:Gem::Requirement
115
129
  requirements:
116
- - - "~>"
130
+ - - ">="
117
131
  - !ruby/object:Gem::Version
118
- version: 1.3.6
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: 1.3.6
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
- post_install_message:
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: '0'
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
- rubyforge_project:
155
- rubygems_version: 2.7.8
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.