active_record_query_trace 1.6 → 1.8

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: 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