crashdesk-rack 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,8 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'rack'
4
+ require 'crashdesk'
5
+ require 'crashdesk-rack/rack_context'
6
+ require 'crashdesk-rack/rack'
7
+
8
+ require 'crashdesk-rack/version'
@@ -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
@@ -0,0 +1,3 @@
1
+ module CrashdeskRack
2
+ VERSION = "0.1.0"
3
+ end
@@ -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
@@ -0,0 +1,8 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
+ end
6
+ end
7
+
8
+ require 'crashdesk-rack'
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: []