toadhopper 0.7 → 0.8
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/.gitignore +7 -0
- data/.yardopts +5 -0
- data/Gemfile +16 -0
- data/README.md +25 -2
- data/Rakefile +15 -12
- data/lib/backtrace.rb +31 -0
- data/lib/notice.haml +34 -0
- data/lib/toadhopper.rb +134 -61
- data/test/helper.rb +3 -0
- data/test/test_filter.rb +15 -13
- data/test/test_posting.rb +23 -0
- data/test/test_setters.rb +10 -14
- metadata +38 -16
- data/Readme.md +0 -15
- data/test/test_notice_params.rb +0 -29
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -4,12 +4,35 @@ Toadhopper can be used to report plain old Ruby exceptions, or to build a framew
|
|
4
4
|
|
5
5
|
require 'toadhopper'
|
6
6
|
|
7
|
-
|
7
|
+
dispatcher = Toadhopper::Dispatcher.new("YOURAPIKEY")
|
8
8
|
|
9
9
|
error = begin; raise "Kaboom!"; rescue => e; e; end
|
10
10
|
|
11
|
-
puts
|
11
|
+
puts dispatcher.post!(error)
|
12
12
|
|
13
13
|
You can install it via rubygems:
|
14
14
|
|
15
15
|
gem install toadhopper
|
16
|
+
|
17
|
+
## Development
|
18
|
+
|
19
|
+
Firstly, `gem install bundler`, then:
|
20
|
+
|
21
|
+
% git clone git://github.com/toolmantim/toadhopper.git
|
22
|
+
% cd toadhopper
|
23
|
+
% gem bundle
|
24
|
+
% bin/rake test
|
25
|
+
|
26
|
+
If you set a `HOPTOAD_API_KEY` environment variable it'll test actually posting to the Hoptoad API. For example:
|
27
|
+
|
28
|
+
% bin/rake test HOPTOAD_API_KEY=abc123
|
29
|
+
|
30
|
+
To generate the docs:
|
31
|
+
|
32
|
+
% bin/yardoc
|
33
|
+
|
34
|
+
## Contributors
|
35
|
+
|
36
|
+
* [Tim Lucas](http://github.com/toolmantim)
|
37
|
+
* [Samuel Tesla](http://github.com/stesla)
|
38
|
+
* [atmos](http://github.com/atmos)
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
Bundler.require_env(:development)
|
2
|
+
|
1
3
|
require 'rake/testtask'
|
2
4
|
|
3
5
|
Rake::TestTask.new do |t|
|
@@ -6,18 +8,19 @@ Rake::TestTask.new do |t|
|
|
6
8
|
t.verbose = true
|
7
9
|
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
Jeweler::Tasks.new do |s|
|
12
|
+
s.name = "toadhopper"
|
13
|
+
s.summary = "Post error notifications to Hoptoad"
|
14
|
+
s.email = "t.lucas@toolmantim.com"
|
15
|
+
s.homepage = "http://github.com/toolmantim/toadhopper"
|
16
|
+
s.authors = ["Tim Lucas", "Samuel Tesla", "Corey Donohoe"]
|
17
|
+
s.version = "0.8"
|
18
|
+
s.extra_rdoc_files = ["README.md", "LICENSE"]
|
19
|
+
s.executables = nil # stops jeweler automatically adding bin/*
|
15
20
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
t.options = ['-r', 'Readme.md', '--files', 'LICENSE'] # optional
|
21
|
+
require 'bundler'
|
22
|
+
bundler_env = Bundler::Environment.load(File.dirname(__FILE__) + '/Gemfile')
|
23
|
+
bundler_env.dependencies.each do |d|
|
24
|
+
s.add_dependency(d.name, d.version) if d.in?(:release)
|
21
25
|
end
|
22
|
-
rescue Gem::LoadError
|
23
26
|
end
|
data/lib/backtrace.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module ToadHopper
|
2
|
+
# A line in a ruby Backtrace
|
3
|
+
#
|
4
|
+
# @private
|
5
|
+
class BacktraceLine < Struct.new(:file, :number, :method); end
|
6
|
+
|
7
|
+
# A collection of BacktraceLines representing an entire ruby backtrace
|
8
|
+
#
|
9
|
+
# @private
|
10
|
+
class Backtrace
|
11
|
+
INPUT_FORMAT = %r{^([^:]+):(\d+)(?::in `([^']+)')?$}.freeze
|
12
|
+
|
13
|
+
# the collection of lines in the backtrace
|
14
|
+
attr_reader :lines
|
15
|
+
|
16
|
+
# create a collection of BacktraceLines from an exception
|
17
|
+
def self.from_exception(exception)
|
18
|
+
@lines = exception.backtrace.map do |line|
|
19
|
+
_, file, number, method = line.match(INPUT_FORMAT).to_a
|
20
|
+
BacktraceLine.new(file, number, method)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# iterate over the lines in a Backtrace
|
25
|
+
def each_line(&block)
|
26
|
+
lines.each do |line|
|
27
|
+
yield line
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/notice.haml
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
!!!XML
|
2
|
+
%notice{:version => '2.0.0'}
|
3
|
+
%api-key= api_key
|
4
|
+
%notifier
|
5
|
+
%name= notifier_name
|
6
|
+
%version= notifier_version
|
7
|
+
%url http://github.com/toolmantim/toadhopper
|
8
|
+
%error
|
9
|
+
%class= error.class.name
|
10
|
+
%message= "#{error.class.name}: #{error.message}"
|
11
|
+
%backtrace
|
12
|
+
- backtrace.each do |line|
|
13
|
+
%line{:method => line.method, :file => line.file, :number => line.number}
|
14
|
+
%request
|
15
|
+
%url= url
|
16
|
+
%component= component
|
17
|
+
- if action && !action.blank?
|
18
|
+
%action= action
|
19
|
+
- if request && request.params.any?
|
20
|
+
%params
|
21
|
+
- request.params.each do |key,value|
|
22
|
+
%var{:key => key}= value
|
23
|
+
- if session && session.any?
|
24
|
+
%session
|
25
|
+
- session.each do |key,value|
|
26
|
+
%var{:key => key}= value
|
27
|
+
- if environment && environment.any?
|
28
|
+
%cgi-data
|
29
|
+
- environment.each do |key,value|
|
30
|
+
%var{:key => key}= value
|
31
|
+
|
32
|
+
%server-environment
|
33
|
+
%project-root= Dir.pwd
|
34
|
+
%environment-name= framework_env
|
data/lib/toadhopper.rb
CHANGED
@@ -1,80 +1,153 @@
|
|
1
|
+
root = File.expand_path(File.dirname(__FILE__))
|
1
2
|
require 'net/http'
|
2
|
-
require '
|
3
|
+
require 'haml'
|
4
|
+
require 'haml/engine'
|
5
|
+
require 'nokogiri'
|
6
|
+
require File.join(root, 'backtrace')
|
3
7
|
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
8
|
+
module ToadHopper
|
9
|
+
# Hoptoad API response
|
10
|
+
class Response < Struct.new(:status, :body, :errors); end
|
11
|
+
|
12
|
+
# Posts errors to the Hoptoad API
|
13
|
+
class Dispatcher
|
14
|
+
attr_reader :api_key
|
15
|
+
|
16
|
+
def initialize(api_key)
|
17
|
+
@api_key = api_key
|
18
|
+
end
|
19
|
+
|
20
|
+
# Sets patterns to [FILTER] out sensitive data such as passwords, emails and credit card numbers.
|
21
|
+
#
|
22
|
+
# Toadhopper::Dispatcher.new('apikey').filters = /password/, /email/, /credit_card_number/
|
23
|
+
def filters=(*filters)
|
24
|
+
@filters = filters.flatten
|
25
|
+
end
|
26
|
+
|
27
|
+
# Filters for the Dispatcher
|
28
|
+
#
|
29
|
+
# @return [Regexp]
|
30
|
+
def filters
|
31
|
+
[@filters].flatten.compact
|
32
|
+
end
|
33
|
+
|
34
|
+
# Posts an exception to hoptoad.
|
35
|
+
# Toadhopper::Dispatcher.new('apikey').post!(exception, {:action => 'show', :controller => 'Users'})
|
36
|
+
# The Following Keys are available as parameters to the document_options
|
37
|
+
# error The actual exception to be reported
|
38
|
+
# api_key The api key for your project
|
39
|
+
# url The url for the request, required to post but not useful in a console environment
|
40
|
+
# component Normally this is your Controller name in an MVC framework
|
41
|
+
# action Normally the action for your request in an MVC framework
|
42
|
+
# request An object that response to #params and returns a hash
|
43
|
+
# notifier_name Say you're a different notifier than ToadHopper
|
44
|
+
# notifier_version Specify the version of your custom notifier
|
45
|
+
# session A hash of the user session in a web request
|
46
|
+
# framework_env The framework environment your app is running under
|
47
|
+
# backtrace Normally not needed, parsed automatically from the provided exception parameter
|
48
|
+
# environment You MUST scrub your environment if you plan to use this, please do not use it though. :)
|
49
|
+
#
|
50
|
+
# @return Toadhopper::Response
|
51
|
+
def post!(error, document_options={}, header_options={})
|
52
|
+
post_document(document_for(error, document_options), header_options)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Posts a v2 document error to Hoptoad
|
56
|
+
# header_options can be passed in to indicate you're posting from a separate client
|
57
|
+
# Toadhopper::Dispatcher.new('API KEY').post_document(doc, 'X-Hoptoad-Client-Name' => 'MyCustomDispatcher')
|
58
|
+
#
|
59
|
+
# @private
|
60
|
+
def post_document(document, header_options={})
|
61
|
+
uri = URI.parse("http://hoptoadapp.com:80/notifier_api/v2/notices")
|
62
|
+
|
63
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
64
|
+
headers = {
|
65
|
+
'Content-type' => 'text/xml',
|
66
|
+
'Accept' => 'text/xml, application/xml',
|
67
|
+
'X-Hoptoad-Client-Name' => 'Toadhopper',
|
68
|
+
}.merge(header_options)
|
69
|
+
http.read_timeout = 5 # seconds
|
70
|
+
http.open_timeout = 2 # seconds
|
71
|
+
begin
|
72
|
+
response = http.post uri.path, document, headers
|
73
|
+
response_for(response)
|
74
|
+
rescue TimeoutError => e
|
75
|
+
Response.new(500, '', ['Timeout error'])
|
76
|
+
end
|
39
77
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
78
|
+
end
|
79
|
+
|
80
|
+
# @private
|
81
|
+
def document_for(exception, options={})
|
82
|
+
locals = {
|
83
|
+
:error => exception,
|
84
|
+
:api_key => api_key,
|
85
|
+
:environment => scrub_environment(ENV.to_hash),
|
86
|
+
:backtrace => Backtrace.from_exception(exception),
|
87
|
+
:url => 'http://localhost/',
|
88
|
+
:component => 'http://localhost/',
|
89
|
+
:action => nil,
|
90
|
+
:request => nil,
|
91
|
+
:notifier_name => 'ToadHopper',
|
92
|
+
:notifier_version => '0.8',
|
93
|
+
:session => { },
|
94
|
+
:framework_env => ENV['RACK_ENV'] || 'development' }.merge(options)
|
95
|
+
|
96
|
+
Haml::Engine.new(notice_template).render(Object.new, locals)
|
97
|
+
end
|
98
|
+
|
99
|
+
# @private
|
100
|
+
def response_for(http_response)
|
101
|
+
status = Integer(http_response.code)
|
102
|
+
case status
|
103
|
+
when 422
|
104
|
+
errors = Nokogiri::XML.parse(http_response.body).xpath('//errors/error')
|
105
|
+
Response.new(status, http_response.body, errors.map { |error| error.content })
|
106
|
+
else
|
107
|
+
Response.new(status, http_response.body, [])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# @private
|
44
112
|
def filter(hash)
|
45
113
|
hash.inject({}) do |acc, (key, val)|
|
46
|
-
acc[key] =
|
47
|
-
|
114
|
+
acc[key] = filter?(key) ? "[FILTERED]" : val
|
115
|
+
acc
|
48
116
|
end
|
49
117
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
118
|
+
|
119
|
+
# @private
|
120
|
+
def filter?(key)
|
121
|
+
filters.any? do |filter|
|
122
|
+
key.to_s =~ Regexp.new(filter)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# @private
|
127
|
+
def scrub_environment(hash)
|
128
|
+
filter(clean_non_serializable_data(hash))
|
59
129
|
end
|
60
|
-
|
61
|
-
|
62
|
-
|
130
|
+
|
131
|
+
# @private
|
132
|
+
def clean_non_serializable_data(data)
|
133
|
+
data.select{|k,v| serializable?(v) }.inject({}) do |h, pair|
|
134
|
+
h[pair.first] = pair.last.is_a?(Hash) ? clean_non_serializable_data(pair.last) : pair.last
|
63
135
|
h
|
64
136
|
end
|
65
137
|
end
|
66
|
-
|
138
|
+
|
139
|
+
# @private
|
140
|
+
def serializable?(value)
|
67
141
|
value.is_a?(Fixnum) ||
|
68
142
|
value.is_a?(Array) ||
|
69
143
|
value.is_a?(String) ||
|
70
144
|
value.is_a?(Hash) ||
|
71
145
|
value.is_a?(Bignum)
|
72
146
|
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
147
|
+
|
148
|
+
# @private
|
149
|
+
def notice_template
|
150
|
+
File.read(::File.join(::File.dirname(__FILE__), 'notice.haml'))
|
78
151
|
end
|
152
|
+
end
|
79
153
|
end
|
80
|
-
end
|
data/test/helper.rb
ADDED
data/test/test_filter.rb
CHANGED
@@ -1,28 +1,30 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def setup
|
7
|
-
Toadhopper.filters = nil
|
3
|
+
class ToadHopper::Dispatcher::TestFilter < Test::Unit::TestCase
|
4
|
+
def dispatcher
|
5
|
+
@dispatcher ||= ToadHopper::Dispatcher.new("test api key")
|
8
6
|
end
|
7
|
+
|
9
8
|
def test_no_filters
|
10
9
|
assert_equal( {:id => "myid", :password => "mypassword"},
|
11
|
-
|
10
|
+
dispatcher.filter(:id => "myid", :password => "mypassword"))
|
12
11
|
end
|
12
|
+
|
13
13
|
def test_string_filter
|
14
|
-
|
14
|
+
dispatcher.filters = "pass"
|
15
15
|
assert_equal( {:id => "myid", :password => "[FILTERED]"},
|
16
|
-
|
16
|
+
dispatcher.filter(:id => "myid", :password => "mypassword"))
|
17
17
|
end
|
18
|
+
|
18
19
|
def test_regex_filter
|
19
|
-
|
20
|
+
dispatcher.filters = /pas{2}/
|
20
21
|
assert_equal( {:id => "myid", :password => "[FILTERED]"},
|
21
|
-
|
22
|
+
dispatcher.filter(:id => "myid", :password => "mypassword"))
|
22
23
|
end
|
24
|
+
|
23
25
|
def test_multiple_filters
|
24
|
-
|
26
|
+
dispatcher.filters = "email", /pas{2}/
|
25
27
|
assert_equal( {:id => "myid", :email => "[FILTERED]", :password => "[FILTERED]"},
|
26
|
-
|
28
|
+
dispatcher.filter(:id => "myid", :email => "myemail", :password => "mypassword"))
|
27
29
|
end
|
28
30
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
|
+
|
3
|
+
class ToadHopper::Dispatcher::TestPosting < Test::Unit::TestCase
|
4
|
+
def test_posting
|
5
|
+
dispatcher = ToadHopper::Dispatcher.new("abc123")
|
6
|
+
error = begin; raise "Kaboom!"; rescue => e; e end
|
7
|
+
|
8
|
+
response = dispatcher.post!(error)
|
9
|
+
assert_equal 422, response.status
|
10
|
+
assert_equal ['No project exists with the given API key.'], response.errors
|
11
|
+
end
|
12
|
+
|
13
|
+
if ENV['HOPTOAD_API_KEY']
|
14
|
+
def test_posting_integration
|
15
|
+
dispatcher = ToadHopper::Dispatcher.new(ENV['HOPTOAD_API_KEY'])
|
16
|
+
error = begin; raise "Kaboom!"; rescue => e; e end
|
17
|
+
|
18
|
+
response = dispatcher.post!(error)
|
19
|
+
assert_equal 200, response.status
|
20
|
+
assert_equal [], response.errors
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/test/test_setters.rb
CHANGED
@@ -1,22 +1,18 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
class Toadhopper::TestSetters < Test::Unit::TestCase
|
6
|
-
def setup
|
7
|
-
Toadhopper.api_key = nil
|
8
|
-
Toadhopper.filters = nil
|
9
|
-
end
|
3
|
+
class ToadHopper::Dispatcher::TestSetters < Test::Unit::TestCase
|
10
4
|
def test_setting_api_key
|
11
|
-
|
12
|
-
assert_equal "abc123",
|
5
|
+
dispatcher = ToadHopper::Dispatcher.new('abc123')
|
6
|
+
assert_equal "abc123", dispatcher.api_key
|
13
7
|
end
|
14
8
|
def test_setting_single_filter
|
15
|
-
|
16
|
-
|
9
|
+
dispatcher = ToadHopper::Dispatcher.new('')
|
10
|
+
dispatcher.filters = /password/
|
11
|
+
assert_equal [/password/], dispatcher.filters
|
17
12
|
end
|
18
13
|
def test_setting_multple_filters
|
19
|
-
|
20
|
-
|
14
|
+
dispatcher = ToadHopper::Dispatcher.new('')
|
15
|
+
dispatcher.filters = /password/, /email/
|
16
|
+
assert_equal [/password/, /email/], dispatcher.filters
|
21
17
|
end
|
22
18
|
end
|
metadata
CHANGED
@@ -1,40 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toadhopper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.8"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Lucas
|
8
|
+
- Samuel Tesla
|
9
|
+
- Corey Donohoe
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
13
|
|
12
|
-
date: 2009-
|
14
|
+
date: 2009-12-15 00:00:00 +11:00
|
13
15
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: haml
|
19
|
+
type: :runtime
|
20
|
+
version_requirement:
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ~>
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: "2.0"
|
26
|
+
version:
|
27
|
+
description:
|
17
28
|
email: t.lucas@toolmantim.com
|
18
29
|
executables: []
|
19
30
|
|
20
31
|
extensions: []
|
21
32
|
|
22
33
|
extra_rdoc_files:
|
23
|
-
-
|
34
|
+
- LICENSE
|
35
|
+
- README.md
|
24
36
|
files:
|
37
|
+
- .gitignore
|
38
|
+
- .yardopts
|
39
|
+
- Gemfile
|
40
|
+
- LICENSE
|
25
41
|
- README.md
|
26
42
|
- Rakefile
|
27
|
-
-
|
43
|
+
- lib/backtrace.rb
|
44
|
+
- lib/notice.haml
|
28
45
|
- lib/toadhopper.rb
|
46
|
+
- test/helper.rb
|
29
47
|
- test/test_filter.rb
|
30
|
-
- test/
|
48
|
+
- test/test_posting.rb
|
31
49
|
- test/test_setters.rb
|
32
|
-
- Readme.md
|
33
50
|
has_rdoc: true
|
34
51
|
homepage: http://github.com/toolmantim/toadhopper
|
35
|
-
|
36
|
-
rdoc_options: []
|
52
|
+
licenses: []
|
37
53
|
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options:
|
56
|
+
- --charset=UTF-8
|
38
57
|
require_paths:
|
39
58
|
- lib
|
40
59
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -51,10 +70,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
70
|
version:
|
52
71
|
requirements: []
|
53
72
|
|
54
|
-
rubyforge_project:
|
55
|
-
rubygems_version: 1.3.
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 1.3.5
|
56
75
|
signing_key:
|
57
|
-
specification_version:
|
76
|
+
specification_version: 3
|
58
77
|
summary: Post error notifications to Hoptoad
|
59
|
-
test_files:
|
60
|
-
|
78
|
+
test_files:
|
79
|
+
- test/helper.rb
|
80
|
+
- test/test_filter.rb
|
81
|
+
- test/test_posting.rb
|
82
|
+
- test/test_setters.rb
|
data/Readme.md
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
A base library for [Hoptoad](http://www.hoptoadapp.com/) error reporting.
|
2
|
-
|
3
|
-
Toadhopper can be used to report plain old Ruby exceptions, or to build a framework-specific gem such as [toadhopper-sinatra](http://github.com/toolmantim/toadhopper-sinatra).
|
4
|
-
|
5
|
-
require 'toadhopper'
|
6
|
-
|
7
|
-
Toadhopper.api_key = "YOURAPIKEY"
|
8
|
-
|
9
|
-
error = begin; raise "Kaboom!"; rescue => e; e; end
|
10
|
-
|
11
|
-
puts Toadhopper.post!(error)
|
12
|
-
|
13
|
-
You can install it via rubygems:
|
14
|
-
|
15
|
-
gem install toadhopper
|
data/test/test_notice_params.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + "/../lib/toadhopper"
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
|
5
|
-
class Toadhopper::TestNoticeParams < Test::Unit::TestCase
|
6
|
-
def test_notice_params
|
7
|
-
Toadhopper.api_key = "abc123"
|
8
|
-
error = begin; raise "Kaboom!"; rescue => e; e end
|
9
|
-
def error.backtrace; ["backtrace line 1", "backtrace line 2"] end
|
10
|
-
assert_equal({
|
11
|
-
"api_key" => "abc123",
|
12
|
-
"error_class" => "RuntimeError",
|
13
|
-
"error_message" => "Kaboom!",
|
14
|
-
"backtrace" => ["backtrace line 1", "backtrace line 2"],
|
15
|
-
"request" => {"request_var" => "request_val"},
|
16
|
-
"environment" => {"env_var" => "env_val"},
|
17
|
-
"session" => {"session_var" => "session_val"},
|
18
|
-
},
|
19
|
-
Toadhopper.notice_params(
|
20
|
-
error,
|
21
|
-
{
|
22
|
-
"request" => {"request_var" => "request_val"},
|
23
|
-
"environment" => {"env_var" => "env_val"},
|
24
|
-
"session" => {"session_var" => "session_val"}
|
25
|
-
}
|
26
|
-
)
|
27
|
-
)
|
28
|
-
end
|
29
|
-
end
|