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 +4 -4
 - data/lib/active_record_query_trace.rb +60 -27
 - data/lib/active_record_query_trace/version.rb +1 -1
 - metadata +4 -4
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3b9863216a6d3587bfe68f4aeee1213e6f1e16475045e20231fac8870f996ccb
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 43a7bd0611953022e35f1909deefb395d35c2c1b2349a49eb5270b0c74566d83
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 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 
     | 
    
         
            -
                    && !( 
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
      
 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] 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
      
 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. 
     | 
| 
      
 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|  
     | 
| 
      
 162 
     | 
    
         
            +
                    Rails.backtrace_cleaner.add_silencer { |line| line !~ rails_root_regexp }
         
     | 
| 
       139 
163 
     | 
    
         
             
                  when :rails
         
     | 
| 
       140 
     | 
    
         
            -
                    Rails.backtrace_cleaner.add_silencer { |line| line 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
       181 
     | 
    
         
            -
                   
     | 
| 
      
 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+( 
     | 
| 
      
 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 !~ / 
     | 
| 
      
 249 
     | 
    
         
            +
                  && args.first !~ /INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX}/
         
     | 
| 
       217 
250 
     | 
    
         
             
                original_debug(*args, &block)
         
     | 
| 
       218 
251 
     | 
    
         
             
              end
         
     | 
| 
       219 
252 
     | 
    
         
             
            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. 
     | 
| 
      
 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- 
     | 
| 
      
 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
         
     |