crashdesk-rack 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/Rakefile +21 -0
- data/crashdesk-rack.gemspec +18 -0
- data/lib/crashdesk-rack.rb +8 -0
- data/lib/crashdesk-rack/rack.rb +33 -0
- data/lib/crashdesk-rack/rack_context.rb +53 -0
- data/lib/crashdesk-rack/version.rb +3 -0
- data/spec/rack_spec.rb +57 -0
- data/spec/spec_helper.rb +8 -0
- metadata +84 -0
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
Bundler::GemHelper.install_tasks
|
8
|
+
|
9
|
+
desc 'Default: run specs.'
|
10
|
+
task :default => :spec
|
11
|
+
|
12
|
+
desc "Run specs"
|
13
|
+
RSpec::Core::RakeTask.new do |t|
|
14
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
15
|
+
# Put spec opts in a file named .rspec in root
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Run tests with SimpleCov"
|
19
|
+
RSpec::Core::RakeTask.new('coverage') do |t|
|
20
|
+
ENV['COVERAGE'] = "true"
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/crashdesk-rack/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'crashdesk-rack'
|
6
|
+
gem.version = CrashdeskRack::VERSION
|
7
|
+
gem.authors = ["Ladislav Martincik"]
|
8
|
+
gem.summary = "Crashde.sk Rack Integration"
|
9
|
+
gem.description = "crashdesk-rack is the Rack gem for integration with crashde.sk servers"
|
10
|
+
gem.email = "info@crashde.sk"
|
11
|
+
gem.files = Dir['lib/**/*'] + Dir['spec/**/*'] + Dir['*.rb'] + ["crashdesk-rack.gemspec", "Rakefile"]
|
12
|
+
gem.homepage = "http://crashde.sk"
|
13
|
+
gem.require_paths = ["lib"]
|
14
|
+
gem.rubyforge_project = "crashdesk-rack"
|
15
|
+
gem.add_dependency('crashdesk', '~> 0')
|
16
|
+
gem.add_dependency('rack', '~> 1.0')
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CrashdeskRack
|
2
|
+
class Rack
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
begin
|
9
|
+
status, headers, body = @app.call(env)
|
10
|
+
rescue Exception => exception
|
11
|
+
$stdout.puts "Crashdesk rack rescue: #{exception.message}"
|
12
|
+
|
13
|
+
request = ::Rack::Request.new(env)
|
14
|
+
context = RackContext.new(env, request)
|
15
|
+
|
16
|
+
begin
|
17
|
+
crashlog = Crashdesk.crashlog(exception, request, context)
|
18
|
+
crashlog.report
|
19
|
+
|
20
|
+
env['crashdesk.crashlog_crc'] = crashlog.crc
|
21
|
+
rescue Exception => e
|
22
|
+
$stderr.puts "Crashdesk can has a bug: #{e.message}"
|
23
|
+
$stderr.puts "Backtrace: ", e.backtrace
|
24
|
+
end
|
25
|
+
|
26
|
+
raise
|
27
|
+
end
|
28
|
+
|
29
|
+
[status, headers, body]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module CrashdeskRack
|
2
|
+
class RackContext < Crashdesk::ContextBase
|
3
|
+
|
4
|
+
def initialize(env, request)
|
5
|
+
@env = env
|
6
|
+
@request = request
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_hash
|
10
|
+
{
|
11
|
+
'url' => request_url,
|
12
|
+
'parameters' => parameters,
|
13
|
+
'request_method' => request_method,
|
14
|
+
'remote_ip' => remote_ip,
|
15
|
+
'headers' => headers,
|
16
|
+
'session' => session,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def framework
|
21
|
+
"rack"
|
22
|
+
end
|
23
|
+
|
24
|
+
def framework_version
|
25
|
+
Rack.version # eq Rack::VERSION.join('.')
|
26
|
+
end
|
27
|
+
|
28
|
+
def request_url
|
29
|
+
"#{@request.url}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def parameters
|
33
|
+
@request.params
|
34
|
+
end
|
35
|
+
|
36
|
+
def request_method
|
37
|
+
@request.request_method.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def remote_ip
|
41
|
+
@request.ip
|
42
|
+
end
|
43
|
+
|
44
|
+
def headers
|
45
|
+
extract_http_headers(@env)
|
46
|
+
end
|
47
|
+
|
48
|
+
def session
|
49
|
+
extract_session(@request)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/spec/rack_spec.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class FakeRackException < Exception; end
|
4
|
+
exception = Proc.new {|env| raise FakeRackException, 'For testing purpose' }
|
5
|
+
plain = Proc.new { |env| [200, {"Content-Type" => "text/html"}, "Hello Rack!"] }
|
6
|
+
|
7
|
+
Crashdesk.configure do |config|
|
8
|
+
config.reporters = [:test]
|
9
|
+
end
|
10
|
+
|
11
|
+
describe CrashdeskRack::Rack do
|
12
|
+
|
13
|
+
context "with one of the Rack middleware throwing exception" do
|
14
|
+
before do
|
15
|
+
@env = Rack::MockRequest.env_for('/hello')
|
16
|
+
@app = Rack::Builder.new do
|
17
|
+
use CrashdeskRack::Rack
|
18
|
+
run exception
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should send the exception with Crashdesk crashlog reporter and re-raise" do
|
23
|
+
-> {
|
24
|
+
@app.call(@env)
|
25
|
+
}.should raise_error FakeRackException, 'For testing purpose'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should insert into env crashdesk.crashlog_crc variable" do
|
29
|
+
begin
|
30
|
+
@app.call(@env)
|
31
|
+
rescue FakeRackException
|
32
|
+
@env.has_key?('crashdesk.crashlog_crc').should be_true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "without throwing exception" do
|
38
|
+
before do
|
39
|
+
@env = Rack::MockRequest.env_for('/hello')
|
40
|
+
@app = Rack::Builder.new do
|
41
|
+
use CrashdeskRack::Rack
|
42
|
+
run plain
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should pass the rack output" do
|
47
|
+
-> {
|
48
|
+
@status, @headers, @body = @app.call(@env)
|
49
|
+
}.should_not raise_error
|
50
|
+
|
51
|
+
@status.should eq(200)
|
52
|
+
@headers.should eq({"Content-Type" => "text/html"})
|
53
|
+
@body.should eq('Hello Rack!')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: crashdesk-rack
|
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-09-19 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: rack
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.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: '1.0'
|
46
|
+
description: crashdesk-rack is the Rack 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-rack/rack.rb
|
53
|
+
- lib/crashdesk-rack/rack_context.rb
|
54
|
+
- lib/crashdesk-rack/version.rb
|
55
|
+
- lib/crashdesk-rack.rb
|
56
|
+
- spec/rack_spec.rb
|
57
|
+
- spec/spec_helper.rb
|
58
|
+
- crashdesk-rack.gemspec
|
59
|
+
- Rakefile
|
60
|
+
homepage: http://crashde.sk
|
61
|
+
licenses: []
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project: crashdesk-rack
|
80
|
+
rubygems_version: 1.8.24
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Crashde.sk Rack Integration
|
84
|
+
test_files: []
|