scrolls-rails 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # scrolls-rails
2
+
3
+ ## Usage
4
+
5
+ In `config/production.rb`:
6
+
7
+ Scrolls::Rails.setup(Rails.application)
8
+ config.middleware.delete Rails::Rack::Logger
9
+ config.middleware.use Scrolls::Rails::Rack::QuietLogger
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1 @@
1
+ require 'scrolls/rails'
@@ -0,0 +1,52 @@
1
+ require 'scrolls'
2
+ require 'scrolls/rails/rack/quiet_logger'
3
+ require 'scrolls/rails/log_subscriber'
4
+ require 'scrolls/rails/version'
5
+
6
+ require 'active_support/log_subscriber'
7
+ require 'active_support/notifications'
8
+
9
+ require 'action_view/log_subscriber'
10
+ require 'action_controller/log_subscriber'
11
+
12
+ module Scrolls
13
+ module Rails
14
+ extend self
15
+
16
+ def setup(app)
17
+ detach_existing_subscribers
18
+ Scrolls::Rails::LogSubscriber.attach_to(:action_controller)
19
+ end
20
+
21
+ def detach_existing_subscribers
22
+ ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
23
+ case subscriber
24
+ when ActionView::LogSubscriber
25
+ unsubscribe(:action_view, subscriber)
26
+ when ActionController::LogSubscriber
27
+ unsubscribe(:action_controller, subscriber)
28
+ end
29
+ end
30
+ end
31
+
32
+ # private
33
+
34
+ def unsubscribe(component, subscriber)
35
+ events = events_for_subscriber(subscriber)
36
+
37
+ events.each do |event|
38
+ notifier = ActiveSupport::Notifications.notifier
39
+ notifier.listeners_for("#{event}.#{component}").each do |listener|
40
+ if listener.instance_variable_get('@delegate') == subscriber
41
+ ActiveSupport::Notifications.unsubscribe(listener)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def events_for_subscriber(subscriber)
48
+ subscriber.public_methods(false).reject {|method| method.to_s == 'call' }
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,74 @@
1
+ require 'scrolls'
2
+ require 'active_support/core_ext/class/attribute'
3
+ require 'active_support/log_subscriber'
4
+
5
+ module Scrolls
6
+ module Rails
7
+ class LogSubscriber < ActiveSupport::LogSubscriber
8
+
9
+ FIELDS = [
10
+ :method, :path, :format, :controller, :action, :status, :error,
11
+ :duration, :view, :db, :location
12
+ ]
13
+
14
+ def process_action(event)
15
+ exception = event.payload[:exception]
16
+ if exception
17
+ Scrolls.log_exception({status: 500}, exception)
18
+ else
19
+ Scrolls.log(extract_request_data_from_event(event))
20
+ end
21
+ end
22
+
23
+ def redirect_to(event)
24
+ Thread.current[:scrolls_rails_location] = event.payload[:location]
25
+ end
26
+
27
+ # private
28
+
29
+ def extract_request_data_from_event(event)
30
+ data = extract_request(event.payload)
31
+ data[:status] = extract_status(event.payload)
32
+ data.merge! runtimes(event)
33
+ data.merge! location(event)
34
+ end
35
+
36
+ def extract_request(payload)
37
+ {
38
+ :method => payload[:method],
39
+ :path => payload[:path],
40
+ :format => payload[:format],
41
+ :controller => payload[:params]['controller'],
42
+ :action => payload[:params]['action']
43
+ }
44
+ end
45
+
46
+ def extract_status(payload)
47
+ if payload[:status]
48
+ payload[:status].to_i
49
+ else
50
+ 0
51
+ end
52
+ end
53
+
54
+ def runtimes(event)
55
+ { :duration => event.duration,
56
+ :view => event.payload[:view_runtime],
57
+ :db => event.payload[:db_runtime]
58
+ }.inject({}) do |runtimes, (name, runtime)|
59
+ runtimes[name] = runtime.to_f.round(2) if runtime
60
+ runtimes
61
+ end
62
+ end
63
+
64
+ def location(event)
65
+ if location = Thread.current[:scrolls_rails_location]
66
+ Thread.current[:scrolls_rails_location] = nil
67
+ { :location => location }
68
+ else
69
+ {}
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails/rack/logger'
2
+ require 'active_support/log_subscriber'
3
+
4
+ module Scrolls
5
+ module Rails
6
+ module Rack
7
+ class QuietLogger < ::Rails::Rack::Logger
8
+
9
+ def call_app(request, env)
10
+ @app.call(env)
11
+ ensure
12
+ ActiveSupport::LogSubscriber.flush_all!
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ module Scrolls
2
+ module Rails
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scrolls-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Lloyd
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: scrolls
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description:
47
+ email:
48
+ - christopher.lloyd@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - README.md
54
+ - Rakefile
55
+ - Gemfile
56
+ - lib/scrolls/rails/log_subscriber.rb
57
+ - lib/scrolls/rails/rack/quiet_logger.rb
58
+ - lib/scrolls/rails/version.rb
59
+ - lib/scrolls/rails.rb
60
+ - lib/scrolls-rails.rb
61
+ homepage: https://github.com/minefold/scrolls-rails
62
+ licenses: []
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 1.8.23
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: Tools for using Scrolls logger in Rails
85
+ test_files: []