active_record_query_trace 1.6.2 → 1.7

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: b58e5acd23e046a98d5f4ab7bd558ecab9bb02b23aa0edf948942d9af0547c21
4
- data.tar.gz: 94684eb961ff681969356cba534b78bee8ee4bca1eb925566e6daa56d8b98d7b
3
+ metadata.gz: 3b9863216a6d3587bfe68f4aeee1213e6f1e16475045e20231fac8870f996ccb
4
+ data.tar.gz: 43a7bd0611953022e35f1909deefb395d35c2c1b2349a49eb5270b0c74566d83
5
5
  SHA512:
6
- metadata.gz: 47362f8e90ea73124e054bb313155101fb9c972bf1eec07e97678b4e43edf6307744ce4a9cb3d8c7fa959ee8b1963a7fda2725b589d8b438c0e8c292b155724d
7
- data.tar.gz: 2d95048c71b93ef3ef7ddf3003e4463a61feec2c1f82dd28113f32bc65d5d4275ddc6ebe9053b5232e0a543d74d75647de4505d8834b1f58b2621d7702ab7c4d
6
+ metadata.gz: 9936bc3e438c24fc1d652c8710b8f9e82b485ab26f1189ec45667015bc96fa88d7256bd6259247df65b8f81b70eb6b8a0f719027edff01a6626b6fe7c9972d92
7
+ data.tar.gz: 90568c7a20aa1c64a2465efea7a9769119d5999c2a7bdf01ea785375e3ddc5445132607d0dfe0d0e693b6811e1c8782060270571cc5ef882094073d16ef30a8b
@@ -33,6 +33,16 @@ 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
48
  class CustomLogSubscriber < ActiveRecord::LogSubscriber # rubocop:disable Metrics/ClassLength
@@ -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,36 @@ module ActiveRecordQueryTrace
61
71
 
62
72
  private
63
73
 
74
+ def cached_query?(payload)
75
+ return false unless ActiveRecordQueryTrace.ignore_cached_queries
76
+ payload[:cached] || payload[:name] == 'CACHE'
77
+ end
78
+
64
79
  # rubocop:disable Metrics/CyclomaticComplexity
65
- # rubocop:disable Metrics/PerceivedComplexity
66
80
  # TODO: refactor and remove rubocop:disable comments.
67
81
  def display_backtrace?(payload)
68
82
  ActiveRecordQueryTrace.enabled \
69
83
  && !transaction_begin_or_commit_query?(payload) \
70
84
  && !schema_query?(payload) \
71
- && !(ActiveRecordQueryTrace.ignore_cached_queries && payload[:cached]) \
85
+ && !cached_query?(payload) \
72
86
  && !(ActiveRecordQueryTrace.suppress_logging_of_db_reads && db_read_query?(payload)) \
73
87
  && display_backtrace_for_query_type?(payload)
74
88
  end
75
89
  # rubocop:enable Metrics/CyclomaticComplexity
76
- # rubocop:enable Metrics/PerceivedComplexity
77
90
 
78
91
  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
92
  case ActiveRecordQueryTrace.query_type
83
93
  when :all then true
84
94
  when :read then db_read_query?(payload)
85
95
  when :write then !db_read_query?(payload)
86
- else raise(invalid_type_msg)
96
+ else
97
+ raise 'Invalid ActiveRecordQueryTrace.query_type value ' \
98
+ "#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
87
99
  end
88
100
  end
89
101
 
90
102
  def db_read_query?(payload)
91
- !payload[:sql].match(/(INSERT|UPDATE|DELETE)/)
103
+ payload[:sql] !~ /INSERT|UPDATE|DELETE/
92
104
  end
93
105
 
94
106
  def fully_formatted_trace
@@ -104,24 +116,36 @@ module ActiveRecordQueryTrace
104
116
  end
105
117
 
106
118
  def transaction_begin_or_commit_query?(payload)
107
- payload[:sql].match(/\A(begin transaction|commit transaction|BEGIN|COMMIT)\Z/)
119
+ payload[:sql] =~ /\Abegin transaction|commit transaction|BEGIN|COMMIT\Z/
108
120
  end
109
121
 
110
122
  def schema_query?(payload)
111
123
  payload[:name] == 'SCHEMA'
112
124
  end
113
125
 
126
+ # rubocop:disable Metrics/MethodLength
114
127
  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)
128
+ case ActiveRecordQueryTrace.level
129
+ when :full
130
+ trace = full_trace
131
+ when :app, :rails
132
+ trace = Rails.backtrace_cleaner.clean(full_trace)
133
+ when :custom
134
+ unless ActiveRecordQueryTrace.backtrace_cleaner
135
+ raise 'Configure your backtrace cleaner first via ActiveRecordQueryTrace.backtrace_cleaner = MyCleaner'
136
+ end
137
+ trace = ActiveRecordQueryTrace.backtrace_cleaner.call(full_trace)
138
+ else
139
+ raise 'Invalid ActiveRecordQueryTrace.level value ' \
140
+ "#{ActiveRecordQueryTrace.level}. Should be :full, :rails, or :app."
141
+ end
118
142
 
119
- trace = ActiveRecordQueryTrace.level == :full ? full_trace : Rails.backtrace_cleaner.clean(full_trace)
120
143
  # We cant use a Rails::BacktraceCleaner filter to display only the relative
121
144
  # path of application trace lines because it breaks the silencer that selects
122
145
  # the lines to display or hide based on whether they include `Rails.root`.
123
- trace.map { |line| line.gsub("#{Rails.root}/", '') }
146
+ trace.map { |line| line.sub(rails_root_prefix, '') }
124
147
  end
148
+ # rubocop:enable Metrics/MethodLength
125
149
 
126
150
  # Rails by default silences all backtraces that *do not* match
127
151
  # Rails::BacktraceCleaner::APP_DIRS_PATTERN. In other words, the default
@@ -135,9 +159,9 @@ module ActiveRecordQueryTrace
135
159
 
136
160
  case ActiveRecordQueryTrace.level
137
161
  when :app
138
- Rails.backtrace_cleaner.add_silencer { |line| !line.match(rails_root_regexp) }
162
+ Rails.backtrace_cleaner.add_silencer { |line| line !~ rails_root_regexp }
139
163
  when :rails
140
- Rails.backtrace_cleaner.add_silencer { |line| line.match(rails_root_regexp) }
164
+ Rails.backtrace_cleaner.add_silencer { |line| line =~ rails_root_regexp }
141
165
  end
142
166
  end
143
167
 
@@ -167,28 +191,37 @@ module ActiveRecordQueryTrace
167
191
  end
168
192
 
169
193
  def color_code
194
+ return @color_code if @color_code && @configured_color == ActiveRecordQueryTrace.colorize
195
+
196
+ @configured_color = ActiveRecordQueryTrace.colorize
197
+
170
198
  # Backward compatibility for string color names with space as word separator.
171
- color_code =
199
+ @color_code =
172
200
  case ActiveRecordQueryTrace.colorize
173
- when Symbol then COLORS[ActiveRecordQueryTrace.colorize]
201
+ when Symbol, true then COLORS[ActiveRecordQueryTrace.colorize]
174
202
  when String then COLORS[ActiveRecordQueryTrace.colorize.tr("\s", '_').to_sym]
175
203
  end
204
+ end
176
205
 
177
- error_msg = 'ActiveRecordQueryTrace.colorize was set to an invalid ' \
178
- "color. Use one of #{COLORS.keys} or a valid color code."
179
-
180
- raise error_msg unless valid_color_code?(color_code)
181
- color_code
206
+ def validate_color_code(color_code)
207
+ valid_color_code?(color_code) || raise(
208
+ 'ActiveRecordQueryTrace.colorize was set to an invalid ' \
209
+ "color. Use one of #{COLORS.keys} or a valid color code."
210
+ )
182
211
  end
183
212
 
184
213
  def valid_color_code?(color_code)
185
- /\A\d+(;\d+)?\Z/.match(color_code)
214
+ /\A\d+(?:;\d+)?\Z/ =~ color_code
215
+ end
216
+
217
+ def rails_root_prefix
218
+ @rails_root_prefix ||= "#{Rails.root}/"
186
219
  end
187
220
 
188
221
  # This cannot be set in a constant as Rails.root is not yet available when
189
222
  # this file is loaded.
190
223
  def rails_root_regexp
191
- %r{#{Regexp.escape(Rails.root.to_s)}(?!\/vendor)}
224
+ @rails_root_regexp ||= %r{#{Regexp.escape(Rails.root.to_s)}(?!\/vendor)}
192
225
  end
193
226
  end
194
227
  end
@@ -213,7 +246,7 @@ ActiveSupport::LogSubscriber.class_eval do
213
246
 
214
247
  def debug(*args, &block)
215
248
  return if ActiveRecordQueryTrace.suppress_logging_of_db_reads \
216
- && args.first !~ /(INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX})/
249
+ && args.first !~ /INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX}/
217
250
  original_debug(*args, &block)
218
251
  end
219
252
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordQueryTrace
4
- VERSION = '1.6.2'
4
+ VERSION = '1.7'
5
5
  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.2
4
+ version: '1.7'
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-12 00:00:00.000000000 Z
12
+ date: 2019-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -113,14 +113,14 @@ dependencies:
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