crashdesk-rails 0.1.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.
- data/crashdesk-rails.gemspec +17 -0
- data/lib/crashdesk-rails/action_controller_context.rb +92 -0
- data/lib/crashdesk-rails/debug_exceptions.rb +21 -0
- data/lib/crashdesk-rails/middleware.rb +28 -0
- data/lib/crashdesk-rails/railtie.rb +28 -0
- data/lib/crashdesk-rails/version.rb +3 -0
- data/lib/crashdesk-rails.rb +10 -0
- metadata +83 -0
@@ -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,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: []
|