crashdesk-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/crashdesk-rails/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'crashdesk-rails'
6
+ gem.version = CrashdeskRails::VERSION
7
+ gem.authors = ["Ladislav Martincik"]
8
+ gem.summary = "Crashde.sk Rails Integration"
9
+ gem.description = "crashdesk-rails is the Rails gem for integration with crashde.sk servers"
10
+ gem.email = "info@crashde.sk"
11
+ gem.files = Dir['lib/**/*'] + Dir['spec/**/*'] + Dir['*.rb'] + ["crashdesk-rails.gemspec"]
12
+ gem.homepage = "http://crashde.sk"
13
+ gem.require_paths = ["lib"]
14
+ gem.rubyforge_project = "crashdesk-rails"
15
+ gem.add_dependency('crashdesk', '~> 0')
16
+ gem.add_dependency('rails', '~> 3.0')
17
+ end
@@ -0,0 +1,92 @@
1
+ module CrashdeskRails
2
+
3
+ class ActionControllerContext < Crashdesk::ContextBase
4
+
5
+ def initialize(controller, request)
6
+ @controller = controller
7
+ @request = request
8
+ end
9
+
10
+ # Extract all meaningfull data from our controller.
11
+ def to_hash
12
+ {
13
+ 'url' => request_url,
14
+ 'controller_name' => controller_name,
15
+ 'action_name' => action_name,
16
+ 'parameters' => parameters,
17
+ 'request_method' => request_method,
18
+ 'remote_ip' => remote_ip,
19
+ 'headers' => headers,
20
+ 'session' => session
21
+ }
22
+ end
23
+
24
+ def framework
25
+ "rails"
26
+ end
27
+
28
+ def framework_version
29
+ Rails::VERSION::STRING
30
+ end
31
+
32
+ def request_url
33
+ @request.respond_to?(:url) ? @request.url : "#{@request.protocol}#{@request.host}#{@request.request_uri}"
34
+ end
35
+
36
+ def controller_name
37
+ @controller.class.to_s
38
+ end
39
+
40
+ def action_name
41
+ @request.respond_to?(:parameters) ? @request.parameters['action'] : @request.params['action']
42
+ end
43
+
44
+ def remote_ip
45
+ @request.respond_to?(:remote_ip) ? @request.remote_ip : @request.ip
46
+ end
47
+
48
+ def parameters
49
+ filter_parameters(@request.respond_to?(:parameters) ? @request.parameters : @request.params)
50
+ end
51
+
52
+ def request_method
53
+ @request.request_method.to_s
54
+ end
55
+
56
+ def headers
57
+ extract_http_headers(@request.env)
58
+ end
59
+
60
+ def session
61
+ extract_session(@request)
62
+ end
63
+
64
+ private
65
+
66
+ def filter_hash(keys_to_filter, hash)
67
+ keys_to_filter.map! {|x| x.to_s}
68
+ if keys_to_filter.is_a?(Array) && !keys_to_filter.empty?
69
+ hash.each do |key, value|
70
+ if key_match?(key, keys_to_filter)
71
+ hash[key] = "[FILTERED]"
72
+ elsif value.respond_to?(:to_hash)
73
+ filter_hash(keys_to_filter, hash[key])
74
+ end
75
+ end
76
+ end
77
+ hash
78
+ end
79
+
80
+ def filter_parameters(hash)
81
+ if @request.respond_to?(:env) && @request.env["action_dispatch.parameter_filter"]
82
+ filter_hash(@request.env["action_dispatch.parameter_filter"], hash)
83
+ elsif @controller.respond_to?(:filter_parameters)
84
+ @controller.send(:filter_parameters, hash)
85
+ else
86
+ hash
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,21 @@
1
+ module CrashdeskRails
2
+ module DebugExceptions
3
+
4
+ def self.included(base)
5
+ base.send(:alias_method_chain, :render_exception, :crashdesk)
6
+ end
7
+
8
+ # We are overriding this method as we don't want
9
+ # to write our own middleware yet.
10
+ def render_exception_with_crashdesk(env, exception)
11
+ request = Rack::Request.new(env)
12
+ context = ActionControllerContext.new(env['action_controller.instance'], request)
13
+
14
+ crashlog = Crashdesk.crashlog(exception, request, context)
15
+ crashlog.report
16
+
17
+ render_exception_without_crashdesk(env, exception)
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ module CrashdeskRails
2
+ class Middleware
3
+
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ begin
10
+ status, headers, body = @app.call(env)
11
+ rescue Exception => exception
12
+
13
+ request = Rack::Request.new(env)
14
+ context = ActionControllerContext.new(env['action_controller.instance'], request)
15
+
16
+ crashlog = Crashdesk.crashlog(exception, request, context)
17
+ crashlog.report
18
+
19
+ env['crashdesk.crashlog_crc'] = crashlog.crc
20
+
21
+ raise
22
+ end
23
+
24
+ [status, headers, body]
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ module CrashdeskRails
2
+ class Railtie < Rails::Railtie
3
+
4
+ config.after_initialize do |app|
5
+ Crashdesk.configure do |config|
6
+ config.logger ||= ::Rails.logger
7
+ config.environment_name ||= ::Rails.env
8
+ config.project_root ||= ::Rails.root
9
+ end
10
+
11
+ Crashdesk.logger.info 'Crahsdesk initializing.'
12
+
13
+ if defined? ::ActionDispatch::DebugExceptions
14
+ Crashdesk.logger.debug 'Crashdesk integrated via including DebugExceptions module.'
15
+ # DebugException is middleware inside Rails
16
+ # Would be nice to have our own with nice message rendering.
17
+ ::ActionDispatch::DebugExceptions.send(:include, CrashdeskRails::DebugExceptions)
18
+
19
+ # Also there's ShowException middleware we could override with much
20
+ # nicer default rendering.
21
+ else
22
+ Crashdesk.logger.debug 'Crashdesk integrated via middleware.'
23
+ app.config.middleware.use "CrashdeskRails::Middleware"
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module CrashdeskRails
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,10 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'crashdesk'
4
+
5
+ require 'crashdesk-rails/debug_exceptions'
6
+ require 'crashdesk-rails/middleware'
7
+ require 'crashdesk-rails/action_controller_context'
8
+ require 'crashdesk-rails/version'
9
+
10
+ require 'crashdesk-rails/railtie' if defined?(Rails::Railtie)
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crashdesk-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ladislav Martincik
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: crashdesk
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: '3.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: '3.0'
46
+ description: crashdesk-rails is the Rails gem for integration with crashde.sk servers
47
+ email: info@crashde.sk
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - lib/crashdesk-rails/action_controller_context.rb
53
+ - lib/crashdesk-rails/debug_exceptions.rb
54
+ - lib/crashdesk-rails/middleware.rb
55
+ - lib/crashdesk-rails/railtie.rb
56
+ - lib/crashdesk-rails/version.rb
57
+ - lib/crashdesk-rails.rb
58
+ - crashdesk-rails.gemspec
59
+ homepage: http://crashde.sk
60
+ licenses: []
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project: crashdesk-rails
79
+ rubygems_version: 1.8.24
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: Crashde.sk Rails Integration
83
+ test_files: []