active_record_query_trace 1.6.2 → 1.7

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