active_record_query_trace 1.6 → 1.8

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: dafae1b675da678759ad1ba18101f418fb97193f178a57dcb98442e0760f2e1a
4
- data.tar.gz: 9748c99d235fef46ef85f432c0419191e05baccd9c28be61f7e090c9cac356ad
3
+ metadata.gz: 06d7497a2165d922974efd1ffc10bf6b6725d1c4705f9b5d5464affca6db069e
4
+ data.tar.gz: 1d5bf04f35d74b69cddc657d9f91795c315ce4b50422cc79aa06843a0299d3e9
5
5
  SHA512:
6
- metadata.gz: 6b40a57407d833bdd54c45a0db89592dbcd5ead14e4b17cc78d3e9f6c33614163f67a57c75969c2c59396fb544eb96e390943265fe7bd0fd9fc57494cce0d985
7
- data.tar.gz: e6a1d216f71480d97d0d254c03de448838ece938af770cf80602ee1cae92f1c5988379d0826551f5dda1eed9a80f3a8b33455e97f63022179665cd61c21e9c6b
6
+ metadata.gz: '09cd3daa1e090acc6e8bafd776c28c3df40f190baccd3799e5b93629a416f890ce4b4514993842830159840fe8d688ef71ba45f54893c62cf053b045c8dd978f'
7
+ data.tar.gz: d53226b99e6eae63ea2b79abf5db75f4f04c546773dc61fda88962d9de2b4c465f84c3af6481b3778d0410e3c4ed07433b29ba29eba5d4481c04efe9d836118c
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordQueryTrace
4
- VERSION = '1.6'
4
+ VERSION = '1.8'
5
5
  end
@@ -33,9 +33,19 @@ module ActiveRecordQueryTrace
33
33
  attr_accessor :colorize
34
34
  attr_accessor :query_type
35
35
  attr_accessor :suppress_logging_of_db_reads
36
+ attr_reader :backtrace_cleaner
37
+
38
+ def backtrace_cleaner=(cleaner)
39
+ @backtrace_cleaner =
40
+ if cleaner.is_a?(Proc)
41
+ cleaner
42
+ else
43
+ proc { |trace| cleaner.clean(trace) }
44
+ end
45
+ end
36
46
  end
37
47
 
38
- class CustomLogSubscriber < ActiveRecord::LogSubscriber
48
+ class CustomLogSubscriber < ActiveRecord::LogSubscriber # rubocop:disable Metrics/ClassLength
39
49
  def initialize
40
50
  super
41
51
  ActiveRecordQueryTrace.enabled = false
@@ -51,7 +61,7 @@ module ActiveRecordQueryTrace
51
61
  payload = event.payload
52
62
  return unless display_backtrace?(payload)
53
63
 
54
- setup_backtrace_cleaner
64
+ setup_backtrace_cleaner unless ActiveRecordQueryTrace.backtrace_cleaner
55
65
 
56
66
  trace = fully_formatted_trace # Memoize
57
67
  debug(trace) unless trace.blank?
@@ -61,34 +71,34 @@ module ActiveRecordQueryTrace
61
71
 
62
72
  private
63
73
 
64
- # rubocop:disable Metrics/CyclomaticComplexity
65
- # rubocop:disable Metrics/PerceivedComplexity
74
+ def cached_query?(payload)
75
+ return false unless ActiveRecordQueryTrace.ignore_cached_queries
76
+ payload[:cached] || payload[:name] == 'CACHE'
77
+ end
78
+
66
79
  # TODO: refactor and remove rubocop:disable comments.
67
80
  def display_backtrace?(payload)
68
81
  ActiveRecordQueryTrace.enabled \
69
82
  && !transaction_begin_or_commit_query?(payload) \
70
83
  && !schema_query?(payload) \
71
- && !(ActiveRecordQueryTrace.ignore_cached_queries && payload[:cached]) \
84
+ && !cached_query?(payload) \
72
85
  && !(ActiveRecordQueryTrace.suppress_logging_of_db_reads && db_read_query?(payload)) \
73
86
  && display_backtrace_for_query_type?(payload)
74
87
  end
75
- # rubocop:enable Metrics/CyclomaticComplexity
76
- # rubocop:enable Metrics/PerceivedComplexity
77
88
 
78
89
  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
90
  case ActiveRecordQueryTrace.query_type
83
91
  when :all then true
84
92
  when :read then db_read_query?(payload)
85
93
  when :write then !db_read_query?(payload)
86
- else raise(invalid_type_msg)
94
+ else
95
+ raise 'Invalid ActiveRecordQueryTrace.query_type value ' \
96
+ "#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
87
97
  end
88
98
  end
89
99
 
90
100
  def db_read_query?(payload)
91
- !payload[:sql].match(/(INSERT|UPDATE|DELETE)/)
101
+ payload[:sql] !~ /INSERT|UPDATE|DELETE/
92
102
  end
93
103
 
94
104
  def fully_formatted_trace
@@ -104,24 +114,36 @@ module ActiveRecordQueryTrace
104
114
  end
105
115
 
106
116
  def transaction_begin_or_commit_query?(payload)
107
- payload[:sql].match(/\A(begin transaction|commit transaction|BEGIN|COMMIT)\Z/)
117
+ payload[:sql] =~ /\Abegin transaction|commit transaction|BEGIN|COMMIT\Z/
108
118
  end
109
119
 
110
120
  def schema_query?(payload)
111
121
  payload[:name] == 'SCHEMA'
112
122
  end
113
123
 
124
+ # rubocop:disable Metrics/MethodLength
114
125
  def clean_trace(full_trace)
115
- invalid_level_msg = 'Invalid ActiveRecordQueryTrace.level value ' \
116
- "#{ActiveRecordQueryTrace.level}. Should be :full, :rails, or :app."
117
- raise(invalid_level_msg) unless %i[full app rails].include?(ActiveRecordQueryTrace.level)
126
+ case ActiveRecordQueryTrace.level
127
+ when :full
128
+ trace = full_trace
129
+ when :app, :rails
130
+ trace = Rails.backtrace_cleaner.clean(full_trace)
131
+ when :custom
132
+ unless ActiveRecordQueryTrace.backtrace_cleaner
133
+ raise 'Configure your backtrace cleaner first via ActiveRecordQueryTrace.backtrace_cleaner = MyCleaner'
134
+ end
135
+ trace = ActiveRecordQueryTrace.backtrace_cleaner.call(full_trace)
136
+ else
137
+ raise 'Invalid ActiveRecordQueryTrace.level value ' \
138
+ "#{ActiveRecordQueryTrace.level}. Should be :full, :rails, or :app."
139
+ end
118
140
 
119
- trace = ActiveRecordQueryTrace.level == :full ? full_trace : Rails.backtrace_cleaner.clean(full_trace)
120
141
  # We cant use a Rails::BacktraceCleaner filter to display only the relative
121
142
  # path of application trace lines because it breaks the silencer that selects
122
143
  # the lines to display or hide based on whether they include `Rails.root`.
123
- trace.map { |line| line.gsub("#{Rails.root}/", '') }
144
+ trace.map { |line| line.sub(rails_root_prefix, '') }
124
145
  end
146
+ # rubocop:enable Metrics/MethodLength
125
147
 
126
148
  # Rails by default silences all backtraces that *do not* match
127
149
  # Rails::BacktraceCleaner::APP_DIRS_PATTERN. In other words, the default
@@ -129,11 +151,15 @@ module ActiveRecordQueryTrace
129
151
  # application lines.
130
152
  def setup_backtrace_cleaner
131
153
  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)})
154
+ return if ActiveRecordQueryTrace.level == :full
155
+
156
+ remove_filters_and_silencers
157
+
158
+ case ActiveRecordQueryTrace.level
159
+ when :app
160
+ Rails.backtrace_cleaner.add_silencer { |line| line !~ rails_root_regexp }
161
+ when :rails
162
+ Rails.backtrace_cleaner.add_silencer { |line| line =~ rails_root_regexp }
137
163
  end
138
164
  end
139
165
 
@@ -146,6 +172,11 @@ module ActiveRecordQueryTrace
146
172
  Rails.backtrace_cleaner.instance_variable_set :@root, Rails.root.to_s
147
173
  end
148
174
 
175
+ def remove_filters_and_silencers
176
+ Rails.backtrace_cleaner.remove_filters!
177
+ Rails.backtrace_cleaner.remove_silencers!
178
+ end
179
+
149
180
  # Allow query to be colorized in the terminal
150
181
  def colorize_text(text)
151
182
  return text unless ActiveRecordQueryTrace.colorize
@@ -158,22 +189,37 @@ module ActiveRecordQueryTrace
158
189
  end
159
190
 
160
191
  def color_code
192
+ return @color_code if @color_code && @configured_color == ActiveRecordQueryTrace.colorize
193
+
194
+ @configured_color = ActiveRecordQueryTrace.colorize
195
+
161
196
  # Backward compatibility for string color names with space as word separator.
162
- color_code =
197
+ @color_code =
163
198
  case ActiveRecordQueryTrace.colorize
164
- when Symbol then COLORS[ActiveRecordQueryTrace.colorize]
199
+ when Symbol, true then COLORS[ActiveRecordQueryTrace.colorize]
165
200
  when String then COLORS[ActiveRecordQueryTrace.colorize.tr("\s", '_').to_sym]
166
201
  end
202
+ end
167
203
 
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
204
+ def validate_color_code(color_code)
205
+ valid_color_code?(color_code) || raise(
206
+ 'ActiveRecordQueryTrace.colorize was set to an invalid ' \
207
+ "color. Use one of #{COLORS.keys} or a valid color code."
208
+ )
173
209
  end
174
210
 
175
211
  def valid_color_code?(color_code)
176
- /\A\d+(;\d+)?\Z/.match(color_code)
212
+ /\A\d+(?:;\d+)?\Z/ =~ color_code
213
+ end
214
+
215
+ def rails_root_prefix
216
+ @rails_root_prefix ||= "#{Rails.root}/"
217
+ end
218
+
219
+ # This cannot be set in a constant as Rails.root is not yet available when
220
+ # this file is loaded.
221
+ def rails_root_regexp
222
+ @rails_root_regexp ||= %r{#{Regexp.escape(Rails.root.to_s)}(?!\/vendor)}
177
223
  end
178
224
  end
179
225
  end
@@ -198,7 +244,7 @@ ActiveSupport::LogSubscriber.class_eval do
198
244
 
199
245
  def debug(*args, &block)
200
246
  return if ActiveRecordQueryTrace.suppress_logging_of_db_reads \
201
- && args.first !~ /(INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX})/
247
+ && args.first !~ /INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX}/
202
248
  original_debug(*args, &block)
203
249
  end
204
250
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_query_trace
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.6'
4
+ version: '1.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Caughlan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-03-05 00:00:00.000000000 Z
12
+ date: 2020-10-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -17,110 +17,110 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: 4.0.0
21
21
  type: :development
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: '0'
27
+ version: 4.0.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: pry
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ">="
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0'
34
+ version: 0.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: 0.13.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: pry-byebug
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: 3.9.0
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: '0'
55
+ version: 3.9.0
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: '0'
62
+ version: 3.8.0
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: '0'
69
+ version: 3.8.0
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rubocop
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: '0'
76
+ version: 0.65.0
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
- version: '0'
83
+ version: 0.65.0
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rubocop-rspec
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - ">="
89
89
  - !ruby/object:Gem::Version
90
- version: '0'
90
+ version: 1.32.0
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: '0'
97
+ version: 1.32.0
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: simplecov
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - ">="
103
103
  - !ruby/object:Gem::Version
104
- version: '0'
104
+ version: 0.16.1
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
- version: '0'
111
+ version: 0.16.1
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: sqlite3
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - "~>"
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: 1.3.6
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - "~>"
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: 1.3.6
126
126
  description: Print stack trace of all DB queries to the Rails log. Helpful to find
@@ -144,15 +144,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
144
  requirements:
145
145
  - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: '0'
147
+ version: '2.4'
148
+ - - "<"
149
+ - !ruby/object:Gem::Version
150
+ version: '4.0'
148
151
  required_rubygems_version: !ruby/object:Gem::Requirement
149
152
  requirements:
150
153
  - - ">="
151
154
  - !ruby/object:Gem::Version
152
155
  version: '0'
153
156
  requirements: []
154
- rubyforge_project:
155
- rubygems_version: 2.7.8
157
+ rubygems_version: 3.0.6
156
158
  signing_key:
157
159
  specification_version: 4
158
160
  summary: Print stack trace of all DB queries to the Rails log. Helpful to find where