timber-rails 1.0.0

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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +56 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE.md +15 -0
  7. data/README.md +12 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/gemfiles/rails-3.0.gemfile +8 -0
  12. data/gemfiles/rails-3.1.gemfile +8 -0
  13. data/gemfiles/rails-3.2.gemfile +8 -0
  14. data/gemfiles/rails-4.0.gemfile +12 -0
  15. data/gemfiles/rails-4.1.gemfile +12 -0
  16. data/gemfiles/rails-4.2.gemfile +12 -0
  17. data/gemfiles/rails-5.0.gemfile +12 -0
  18. data/gemfiles/rails-5.1.gemfile +12 -0
  19. data/gemfiles/rails-5.2.gemfile +12 -0
  20. data/gemfiles/rails-edge.gemfile +11 -0
  21. data/lib/timber-rails/action_controller/log_subscriber/timber_log_subscriber.rb +46 -0
  22. data/lib/timber-rails/action_controller/log_subscriber.rb +25 -0
  23. data/lib/timber-rails/action_controller.rb +17 -0
  24. data/lib/timber-rails/action_dispatch/debug_exceptions.rb +51 -0
  25. data/lib/timber-rails/action_dispatch.rb +20 -0
  26. data/lib/timber-rails/action_view/log_subscriber/timber_log_subscriber.rb +83 -0
  27. data/lib/timber-rails/action_view/log_subscriber.rb +25 -0
  28. data/lib/timber-rails/action_view.rb +17 -0
  29. data/lib/timber-rails/active_record/log_subscriber/timber_log_subscriber.rb +52 -0
  30. data/lib/timber-rails/active_record/log_subscriber.rb +20 -0
  31. data/lib/timber-rails/active_record.rb +17 -0
  32. data/lib/timber-rails/config/action_controller.rb +29 -0
  33. data/lib/timber-rails/config/action_view.rb +29 -0
  34. data/lib/timber-rails/config/active_record.rb +29 -0
  35. data/lib/timber-rails/config.rb +12 -0
  36. data/lib/timber-rails/error_event.rb +61 -0
  37. data/lib/timber-rails/logger.rb +15 -0
  38. data/lib/timber-rails/overrides/active_support_3_tagged_logging.rb +111 -0
  39. data/lib/timber-rails/overrides/active_support_buffered_logger.rb +22 -0
  40. data/lib/timber-rails/overrides/active_support_tagged_logging.rb +66 -0
  41. data/lib/timber-rails/overrides/lograge.rb +18 -0
  42. data/lib/timber-rails/overrides/rails_stdout_logging.rb +21 -0
  43. data/lib/timber-rails/overrides.rb +12 -0
  44. data/lib/timber-rails/rack_logger.rb +58 -0
  45. data/lib/timber-rails/railtie.rb +27 -0
  46. data/lib/timber-rails/session_context.rb +40 -0
  47. data/lib/timber-rails/version.rb +7 -0
  48. data/lib/timber-rails.rb +63 -0
  49. data/timber-rails.gemspec +71 -0
  50. metadata +240 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7f4f0a765269e2b04700d9f0b5e8be9c8c5a1e2b7335ee31decc53379e0c29c6
4
+ data.tar.gz: 113255c96a2bcd218ce6d444c665a811f8e4ab47cf09cba3c2cebdc82e998084
5
+ SHA512:
6
+ metadata.gz: b053eb354944ecac2cdae780546d70b00f10ff9ce00c73d1ef9a210fbe6977fe270e6136270e80124d58ad146423ee57e5c23ddd11be177cca9a4143cbc2f725
7
+ data.tar.gz: de16848d218e687879c3af22f1ceffe1b84647da03044a7356ae26d009b118b8a308d1d5151f3efdcfb29395fc6c4a25aa82f00a51a9fee1fc102beaec80af89
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ # Ignore gemset
14
+ /.gem
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,56 @@
1
+ sudo: false
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.2.10
7
+ - 2.3.8
8
+ - 2.4.5
9
+ - 2.5.3
10
+ - jruby-9.2.5.0
11
+ before_install: gem install bundler -v 1.17.3
12
+ gemfile:
13
+ - gemfiles/rails-3.2.gemfile
14
+ - gemfiles/rails-4.0.gemfile
15
+ - gemfiles/rails-4.1.gemfile
16
+ - gemfiles/rails-4.2.gemfile
17
+ - gemfiles/rails-5.0.gemfile
18
+ - gemfiles/rails-5.1.gemfile
19
+ - gemfiles/rails-5.2.gemfile
20
+ - gemfiles/rails-edge.gemfile
21
+ env:
22
+ global: RAILS_ENV=test
23
+ before_script:
24
+ - echo $BUNDLE_GEMFILE
25
+ - bundle install
26
+ script:
27
+ - bundle exec rspec --format documentation
28
+ matrix:
29
+ fast_finish: true
30
+ exclude:
31
+ - rvm: 1.9.3
32
+ - gemfile: gemfiles/rails-edge.gemfile
33
+ - rvm: 2.4.5
34
+ gemfile: gemfiles/rails-4.0.gemfile
35
+ - rvm: 2.4.5
36
+ gemfile: gemfiles/rails-4.1.gemfile
37
+ - rvm: 2.5.3
38
+ gemfile: gemfiles/rails-3.2.gemfile
39
+ - rvm: 2.5.3
40
+ gemfile: gemfiles/rails-4.0.gemfile
41
+ - rvm: 2.5.3
42
+ gemfile: gemfiles/rails-4.1.gemfile
43
+ include:
44
+ - rvm: 2.5.3
45
+ gemfile: gemfiles/rails-edge.gemfile
46
+ - rvm: 1.9.3
47
+ gemfile: gemfiles/rails-3.2.gemfile
48
+ allow_failures:
49
+ - rvm: 1.9.3 # bundler wont install the gems
50
+ - gemfile: gemfiles/rails-edge.gemfile
51
+ - rvm: jruby-9.2.5.0
52
+ notifications:
53
+ email: false
54
+ slack:
55
+ rooms:
56
+ secure: F4BGVLUnaDqJ3YXfuIwx+m6047E8YstCUXs33Tfcs7SUlSuOSChuXqvCfVtnfNy2muF7xgB6VRL3xpFIRm7qNStqGUWCQJXmKq2OEgq1DYGkhAVle4d/LBtVcfBgeLelsoi+1TI9MrUtpZDHPl0li3PLoC+dq7rzSuhrxQ9EOhZlZGVn6LTeVcgNw6cLNzHSWJJ8zpYWLjBWUXgJ75MQvo5qaNbQxyfzm7GzEgRNfSzabFBwpKwB1Tog9X9TKTtPrn30O9Ur9+wmTu6EnwaDWZjaTK6I+AbxE8huIfUGvSrq1aV2JaDIra6zHEQ+d4j0oRYutgFM4YfyN9124MbPE2yH/5lXNQHMpUOsP0bl2U+KGDzq/V5APyrZ6irsvwGYpo3fSXrW8nDIAK4Mh8KB+Ta0zN5H8PmIRK76wJ+wG2zAtrfl+ailxMrdpK6J04fl3pCBuO6eW+AKEJ7Wfi5GiE7a9lk/YewAeDHyyLSnUNFIP0/iFAbTtRh5denCk0ZUS1XyfZNQuFoku7jk5lpe41SNItqOO0jv/jXPF+wensNa2UgMBIP0XkRw55LKn9eY0MKm9P+zp9ePaXs0T0Ttv4e0T4Jxrgf5QBynefgHwAsOI1nHr7GhlPaFQ6u8iNmjNYLB9v1JZMlO08LkytzZFpUuJoHbYYoBaRtUtEosBHg=
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ # TODO: REMOVE ME
4
+ gem 'timber', git: 'https://github.com/mitchellhenke/timber-ruby.git', branch: '3.0'
5
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
6
+
7
+ # Specify your gem's dependencies in timber-ruby-rails.gemspec
8
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,15 @@
1
+ # License
2
+
3
+ Copyright (c) 2019, Timber Technologies, Inc.
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any purpose
6
+ with or without fee is hereby granted, provided that the above copyright notice
7
+ and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
11
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
13
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
14
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
15
+ THIS SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # 🌲 Timber Integration For Rails
2
+
3
+ [![ISC License](https://img.shields.io/badge/license-ISC-ff69b4.svg)](LICENSE.md)
4
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/timberio/timber-ruby-rails)
5
+ [![Build Status](https://travis-ci.org/timberio/timber-ruby-rails.svg?branch=master)](https://travis-ci.org/timberio/timber-ruby-rails)
6
+ [![Code Climate](https://codeclimate.com/github/timberio/timber-ruby-rails/badges/gpa.svg)](https://codeclimate.com/github/timberio/timber-ruby-rails)
7
+
8
+ This library integrates the [`timber` Ruby library][timber_ruby] with the [Rails][rails] framework,
9
+ turning your Rails logs into rich structured events.
10
+
11
+ * **Sign-up: [https://app.timber.io](https://app.timber.io)**
12
+ * **Documentation: [https://docs.timber.io/setup/languages/ruby/integrations/rails](https://docs.timber.io/setup/languages/ruby/integrations/rails)**
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "timber-rails"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 3.0.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ gemspec :path => '../'
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 3.1.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ gemspec :path => '../'
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 3.2.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ gemspec :path => '../'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.0.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ gem 'mime-types', '2.6.2'
10
+ end
11
+
12
+ gemspec :path => '../'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.1.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ gem 'mime-types', '2.6.2'
10
+ end
11
+
12
+ gemspec :path => '../'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.2.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ gem 'mime-types', '2.6.2'
10
+ end
11
+
12
+ gemspec :path => '../'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 5.0.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ gem 'mime-types', '2.6.2'
10
+ end
11
+
12
+ gemspec :path => '../'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 5.1.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ gem 'mime-types', '2.6.2'
10
+ end
11
+
12
+ gemspec :path => '../'
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '~> 5.2.0'
4
+ # TODO: REMOVE ME
5
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
6
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
7
+
8
+ if RUBY_PLATFORM == "java"
9
+ gem 'mime-types', '2.6.2'
10
+ end
11
+
12
+ gemspec :path => '../'
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rack', git: 'https://github.com/rack/rack', branch: 'master'
4
+ gem 'arel', git: 'https://github.com/rails/arel', branch: 'master'
5
+ gem 'rails', git: 'https://github.com/rails/rails', branch: 'master'
6
+
7
+ # TODO: REMOVE ME
8
+ gem 'timber', git: 'https://github.com/timberio/timber-ruby.git', branch: '3.0'
9
+ gem 'timber-rack', git: 'https://github.com/timberio/timber-ruby-rack.git', branch: 'master'
10
+
11
+ gemspec :path => '../'
@@ -0,0 +1,46 @@
1
+ module Timber
2
+ module Integrations
3
+ module ActionController
4
+ class LogSubscriber < Integrator
5
+ # The log subscriber that replaces the default `ActionController::LogSubscriber`.
6
+ # The intent of this subscriber is to, as transparently as possible, properly
7
+ # track events that are being logged here. This LogSubscriber will never change
8
+ # default behavior / log messages.
9
+ #
10
+ # @private
11
+ class TimberLogSubscriber < ::ActionController::LogSubscriber
12
+ def start_processing(event)
13
+ return true if silence?
14
+
15
+ info do
16
+ payload = event.payload
17
+ params = payload[:params].except(*INTERNAL_PARAMS)
18
+ format = extract_format(payload)
19
+ format = format.to_s.upcase if format.is_a?(Symbol)
20
+
21
+ Events::ControllerCall.new(
22
+ controller: payload[:controller],
23
+ action: payload[:action],
24
+ format: format,
25
+ params: params
26
+ )
27
+ end
28
+ end
29
+
30
+ private
31
+ def extract_format(payload)
32
+ if payload.key?(:format)
33
+ payload[:format] # rails > 4.X
34
+ elsif payload.key?(:formats)
35
+ payload[:formats].first # rails 3.X
36
+ end
37
+ end
38
+
39
+ def silence?
40
+ ActionController.silence?
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ module Timber
2
+ module Integrations
3
+ module ActionController
4
+ # Responsible for removing the default ActionController::LogSubscriber and installing
5
+ # the TimberLogSubscriber
6
+ #
7
+ # @private
8
+ class LogSubscriber < Integrator
9
+ def initialize
10
+ require "action_controller/log_subscriber"
11
+ require "timber-rails/action_controller/log_subscriber/timber_log_subscriber"
12
+ rescue LoadError => e
13
+ raise RequirementNotMetError.new(e.message)
14
+ end
15
+
16
+ def integrate!
17
+ return true if Util::ActiveSupportLogSubscriber.subscribed?(:action_controller, TimberLogSubscriber)
18
+
19
+ Util::ActiveSupportLogSubscriber.unsubscribe!(:action_controller, ::ActionController::LogSubscriber)
20
+ TimberLogSubscriber.attach_to(:action_controller)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require "timber-rails/action_controller/log_subscriber"
2
+
3
+ module Timber
4
+ module Integrations
5
+ # Module for holding *all* ActionController integrations. See {Integration} for
6
+ # configuration details for all integrations.
7
+ module ActionController
8
+ extend Integration
9
+
10
+ def self.integrate!
11
+ return false if !enabled?
12
+
13
+ LogSubscriber.integrate!
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,51 @@
1
+ module Timber
2
+ module Integrations
3
+ module ActionDispatch
4
+ # Reponsible for disabled logging in the ActionDispatch::DebugExceptions
5
+ # Rack middleware. We cannot simply remove the middleware because it is
6
+ # coupled with displaying an exception debug screen if debug exceptions is enabled.
7
+ #
8
+ # @private
9
+ class DebugExceptions < Integrator
10
+
11
+ # Patch for disabling logging
12
+ #
13
+ # @private
14
+ module InstanceMethods
15
+ def self.included(klass)
16
+ klass.class_eval do
17
+ private
18
+ def logger(*args)
19
+ nil
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def initialize
26
+ begin
27
+ # Rails >= 3.1
28
+ require "action_dispatch/middleware/debug_exceptions"
29
+ rescue LoadError
30
+ # Rails < 3.1
31
+ require "action_dispatch/middleware/show_exceptions"
32
+ end
33
+ rescue LoadError => e
34
+ raise RequirementNotMetError.new(e.message)
35
+ end
36
+
37
+ def integrate!
38
+ if defined?(::ActionDispatch::DebugExceptions) && !::ActionDispatch::DebugExceptions.include?(InstanceMethods)
39
+ ::ActionDispatch::DebugExceptions.send(:include, InstanceMethods)
40
+ end
41
+
42
+ if defined?(::ActionDispatch::ShowExceptions) && !::ActionDispatch::ShowExceptions.include?(InstanceMethods)
43
+ ::ActionDispatch::ShowExceptions.send(:include, InstanceMethods)
44
+ end
45
+
46
+ true
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,20 @@
1
+ require "timber-rails/action_dispatch/debug_exceptions"
2
+
3
+ module Timber
4
+ module Integrations
5
+ # Module for holding *all* ActionDispatch integrations. This
6
+ # module simply disables the exception tracking middleware so that our middleware
7
+ # works as expected.
8
+ module ActionDispatch
9
+ def self.enabled?
10
+ Rails::ErrorEvent.enabled?
11
+ end
12
+
13
+ def self.integrate!
14
+ return false if !enabled?
15
+
16
+ DebugExceptions.integrate!
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,83 @@
1
+ module Timber
2
+ module Integrations
3
+ module ActionView
4
+ class LogSubscriber < Integrator
5
+
6
+ # The log subscriber that replaces the default `ActionView::LogSubscriber`.
7
+ # The intent of this subscriber is to, as transparently as possible, properly
8
+ # track events that are being logged here.
9
+ #
10
+ # @private
11
+ class TimberLogSubscriber < ::ActionView::LogSubscriber
12
+ def render_template(event)
13
+ return true if silence?
14
+
15
+ info do
16
+ full_name = from_rails_root(event.payload[:identifier])
17
+ message = " Rendered #{full_name}"
18
+ message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
19
+ message << " (#{event.duration.round(1)}ms)"
20
+
21
+ Events::TemplateRender.new(
22
+ name: full_name,
23
+ duration_ms: event.duration,
24
+ message: message
25
+ )
26
+ end
27
+ end
28
+
29
+ def render_partial(event)
30
+ return true if silence?
31
+
32
+ info do
33
+ full_name = from_rails_root(event.payload[:identifier])
34
+ message = " Rendered #{full_name}"
35
+ message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
36
+ message << " (#{event.duration.round(1)}ms)"
37
+ message << " #{cache_message(event.payload)}" if event.payload.key?(:cache_hit)
38
+
39
+ Events::TemplateRender.new(
40
+ name: full_name,
41
+ duration_ms: event.duration,
42
+ message: message
43
+ )
44
+ end
45
+ end
46
+
47
+ def render_collection(event)
48
+ return true if silence?
49
+
50
+ if respond_to?(:render_count, true)
51
+ info do
52
+ identifier = event.payload[:identifier] || "templates"
53
+ full_name = from_rails_root(identifier)
54
+ message = " Rendered collection of #{full_name}" \
55
+ " #{render_count(event.payload)} (#{event.duration.round(1)}ms)"
56
+
57
+ Events::TemplateRender.new(
58
+ name: full_name,
59
+ duration_ms: event.duration,
60
+ message: message
61
+ )
62
+ end
63
+ else
64
+ # Older versions of rails delegate this method to #render_template
65
+ render_template(event)
66
+ end
67
+ end
68
+
69
+ private
70
+ def log_rendering_start(payload)
71
+ # Consolidates 2 template rendering events into 1. We don't need 2 events for
72
+ # rendering a template. If you disagree, please feel free to open a PR and we
73
+ # can make this an option.
74
+ end
75
+
76
+ def silence?
77
+ ActionView.silence?
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,25 @@
1
+ module Timber
2
+ module Integrations
3
+ module ActionView
4
+ # Reponsible for uninstalling the default `ActionView::LogSubscriber` and installing
5
+ # the TimberLogSubscriber.
6
+ #
7
+ # @private
8
+ class LogSubscriber < Integrator
9
+ def initialize
10
+ require "action_view/log_subscriber"
11
+ require "timber-rails/action_view/log_subscriber/timber_log_subscriber"
12
+ rescue LoadError => e
13
+ raise RequirementNotMetError.new(e.message)
14
+ end
15
+
16
+ def integrate!
17
+ return true if Util::ActiveSupportLogSubscriber.subscribed?(:action_view, TimberLogSubscriber)
18
+
19
+ Util::ActiveSupportLogSubscriber.unsubscribe!(:action_view, ::ActionView::LogSubscriber)
20
+ TimberLogSubscriber.attach_to(:action_view)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require "timber-rails/action_view/log_subscriber"
2
+
3
+ module Timber
4
+ module Integrations
5
+ # Module for holding *all* ActionView integrations. See {Integration} for
6
+ # configuration details for all integrations.
7
+ module ActionView
8
+ extend Integration
9
+
10
+ def self.integrate!
11
+ return false if !enabled?
12
+
13
+ LogSubscriber.integrate!
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,52 @@
1
+ # We require all of ActiveRecord because the #logger method in ::ActiveRecord::LogSubscriber
2
+ # uses ActiveRecord::Base. We can't require active_record/base directly because ActiveRecord
3
+ # does not require files properly and we receive unintialized constant errors.
4
+ require "active_record"
5
+ require "active_record/log_subscriber"
6
+
7
+ module Timber
8
+ module Integrations
9
+ module ActiveRecord
10
+ class LogSubscriber < Integrator
11
+ # The log subscriber that replaces the default `ActiveRecord::LogSubscriber`.
12
+ # The intent of this subscriber is to, as transparently as possible, properly
13
+ # track events that are being logged here. This LogSubscriber will never change
14
+ # default behavior / log messages.
15
+ #
16
+ # @private
17
+ class TimberLogSubscriber < ::ActiveRecord::LogSubscriber
18
+ def sql(event)
19
+ return true if silence?
20
+
21
+ r = super(event)
22
+
23
+ if @message
24
+ payload = event.payload
25
+
26
+ sql_event = Events::SQLQuery.new(
27
+ sql: payload[:sql],
28
+ duration_ms: event.duration,
29
+ message: @message,
30
+ )
31
+
32
+ logger.debug sql_event
33
+
34
+ @message = nil
35
+ end
36
+
37
+ r
38
+ end
39
+
40
+ private
41
+ def debug(message)
42
+ @message = message
43
+ end
44
+
45
+ def silence?
46
+ ActiveRecord.silence?
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,20 @@
1
+ require "timber-rails/active_record/log_subscriber/timber_log_subscriber"
2
+
3
+ module Timber
4
+ module Integrations
5
+ module ActiveRecord
6
+ # Reponsible for uninstalling the default `ActiveRecord::LogSubscriber` and replacing it
7
+ # with the `TimberLogSubscriber`.
8
+ #
9
+ # @private
10
+ class LogSubscriber < Integrator
11
+ def integrate!
12
+ return true if Util::ActiveSupportLogSubscriber.subscribed?(:active_record, TimberLogSubscriber)
13
+
14
+ Util::ActiveSupportLogSubscriber.unsubscribe!(:active_record, ::ActiveRecord::LogSubscriber)
15
+ TimberLogSubscriber.attach_to(:active_record)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ require "timber-rails/active_record/log_subscriber"
2
+
3
+ module Timber
4
+ module Integrations
5
+ # Module for holding *all* ActiveRecord integrations. See {Integration} for
6
+ # configuration details for all integrations.
7
+ module ActiveRecord
8
+ extend Integration
9
+
10
+ def self.integrate!
11
+ return false if !enabled?
12
+
13
+ LogSubscriber.integrate!
14
+ end
15
+ end
16
+ end
17
+ end