toadhopper 0.3
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 +14 -0
- data/Readme.md +19 -0
- data/lib/toadhopper/test.rb +13 -0
- data/lib/toadhopper.rb +78 -0
- data/test/test_filter.rb +28 -0
- data/test/test_notice_params.rb +29 -0
- data/test/test_setters.rb +22 -0
- data/test/test_test.rb +12 -0
- metadata +60 -0
data/Rakefile
ADDED
data/Readme.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Toadhopper
|
2
|
+
----------
|
3
|
+
|
4
|
+
A base library for [Hoptoad](http://www.hoptoadapp.com/) error reporting.
|
5
|
+
|
6
|
+
Toadhopper can be used to report plain old Ruby exceptions or to build a library specific gem, such as the yet-to-be-built toadhopper-sinatra and toadhopper-rack gems (they're next on my list).
|
7
|
+
|
8
|
+
## Example
|
9
|
+
|
10
|
+
require 'rubygems'
|
11
|
+
|
12
|
+
gem 'toadhopper'
|
13
|
+
require 'toadhopper'
|
14
|
+
|
15
|
+
Toadhopper.api_key = "YOURAPIKEY"
|
16
|
+
|
17
|
+
error = begin; raise "Kaboom!"; rescue => e; e; end
|
18
|
+
|
19
|
+
puts Toadhopper.post!(error)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../toadhopper"
|
2
|
+
|
3
|
+
# Helper methods for testing Toadhopper posting
|
4
|
+
module Toadhopper::Test
|
5
|
+
# Stub the posting of the error, storing the post params for accessing via
|
6
|
+
# last_toadhopper_post_params
|
7
|
+
def stub_toadhopper_post!
|
8
|
+
# TODO:
|
9
|
+
end
|
10
|
+
def last_toadhopper_post_params
|
11
|
+
# TODO:
|
12
|
+
end
|
13
|
+
end
|
data/lib/toadhopper.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Toadhopper
|
5
|
+
class << self
|
6
|
+
# Set the API key
|
7
|
+
def api_key=(key)
|
8
|
+
@@api_key = key
|
9
|
+
end
|
10
|
+
# Returns the key set by Toadhopper.api_key=
|
11
|
+
def api_key
|
12
|
+
@@api_key
|
13
|
+
end
|
14
|
+
# Sets patterns to [FILTER] out sensitive data such as passwords, emails and credit card numbers.
|
15
|
+
#
|
16
|
+
# Toadhopper.filters = /password/, /email/, /credit_card_number/
|
17
|
+
def filters=(*filters)
|
18
|
+
@@filters = filters.flatten
|
19
|
+
end
|
20
|
+
# Returns the filters set by Toadhopper.filters=
|
21
|
+
def filters
|
22
|
+
[@@filters].flatten.compact
|
23
|
+
end
|
24
|
+
# Replaces the values of the keys matching Toadhopper.filters with [FILTERED]. Typically used on the params and environment hashes.
|
25
|
+
def filter(hash)
|
26
|
+
hash.inject({}) do |acc, (key, val)|
|
27
|
+
acc[key] = filters.any? {|f| key.to_s =~ Regexp.new(f)} ? "[FILTERED]" : val
|
28
|
+
acc
|
29
|
+
end
|
30
|
+
end
|
31
|
+
# Posts an error to Hoptoad
|
32
|
+
def post!(error, options={}, header_options={})
|
33
|
+
uri = URI.parse("http://hoptoadapp.com/notices/")
|
34
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
35
|
+
headers = {
|
36
|
+
'Content-type' => 'application/x-yaml',
|
37
|
+
'Accept' => 'text/xml, application/xml',
|
38
|
+
'X-Hoptoad-Client-Name' => 'Toadhopper',
|
39
|
+
}.merge(header_options)
|
40
|
+
http.read_timeout = 5 # seconds
|
41
|
+
http.open_timeout = 2 # seconds
|
42
|
+
begin
|
43
|
+
http.post uri.path, {"notice" => notice_params(error, options)}.to_yaml, headers
|
44
|
+
rescue TimeoutError => e
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
def notice_params(error, options={}) # :nodoc:
|
49
|
+
clean_non_serializable_data(stringify_keys(
|
50
|
+
{
|
51
|
+
:api_key => api_key,
|
52
|
+
:error_class => error.class.name,
|
53
|
+
:error_message => error.message,
|
54
|
+
:backtrace => error.backtrace,
|
55
|
+
}.merge(options)
|
56
|
+
))
|
57
|
+
end
|
58
|
+
def stringify_keys(hash) #:nodoc:
|
59
|
+
hash.inject({}) do |h, pair|
|
60
|
+
h[pair.first.to_s] = pair.last.is_a?(Hash) ? stringify_keys(pair.last) : pair.last
|
61
|
+
h
|
62
|
+
end
|
63
|
+
end
|
64
|
+
def serializable?(value) #:nodoc:
|
65
|
+
value.is_a?(Fixnum) ||
|
66
|
+
value.is_a?(Array) ||
|
67
|
+
value.is_a?(String) ||
|
68
|
+
value.is_a?(Hash) ||
|
69
|
+
value.is_a?(Bignum)
|
70
|
+
end
|
71
|
+
def clean_non_serializable_data(data) #:nodoc:
|
72
|
+
data.select{|k,v| serializable?(v) }.inject({}) do |h, pair|
|
73
|
+
h[pair.first] = pair.last.is_a?(Hash) ? clean_non_serializable_data(pair.last) : pair.last
|
74
|
+
h
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/test/test_filter.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../lib/toadhopper"
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class Toadhopper::TestFilter < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Toadhopper.filters = nil
|
8
|
+
end
|
9
|
+
def test_no_filters
|
10
|
+
assert_equal( {:id => "myid", :password => "mypassword"},
|
11
|
+
Toadhopper.filter(:id => "myid", :password => "mypassword"))
|
12
|
+
end
|
13
|
+
def test_string_filter
|
14
|
+
Toadhopper.filters = "pass"
|
15
|
+
assert_equal( {:id => "myid", :password => "[FILTERED]"},
|
16
|
+
Toadhopper.filter(:id => "myid", :password => "mypassword"))
|
17
|
+
end
|
18
|
+
def test_regex_filter
|
19
|
+
Toadhopper.filters = /pas{2}/
|
20
|
+
assert_equal( {:id => "myid", :password => "[FILTERED]"},
|
21
|
+
Toadhopper.filter(:id => "myid", :password => "mypassword"))
|
22
|
+
end
|
23
|
+
def test_multiple_filters
|
24
|
+
Toadhopper.filters = "email", /pas{2}/
|
25
|
+
assert_equal( {:id => "myid", :email => "[FILTERED]", :password => "[FILTERED]"},
|
26
|
+
Toadhopper.filter(:id => "myid", :email => "myemail", :password => "mypassword"))
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
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
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../lib/toadhopper"
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class Toadhopper::TestSetters < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Toadhopper.api_key = nil
|
8
|
+
Toadhopper.filters = nil
|
9
|
+
end
|
10
|
+
def test_setting_api_key
|
11
|
+
Toadhopper.api_key = "abc123"
|
12
|
+
assert_equal "abc123", Toadhopper.api_key
|
13
|
+
end
|
14
|
+
def test_setting_single_filter
|
15
|
+
Toadhopper.filters = /password/
|
16
|
+
assert_equal [/password/], Toadhopper.filters
|
17
|
+
end
|
18
|
+
def test_setting_multple_filters
|
19
|
+
Toadhopper.filters = /password/, /email/
|
20
|
+
assert_equal [/password/, /email/], Toadhopper.filters
|
21
|
+
end
|
22
|
+
end
|
data/test/test_test.rb
ADDED
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: toadhopper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.3"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tim Lucas
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-11 00:00:00 +10:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Library for posting Hoptoad notifications
|
17
|
+
email: t.lucas@toolmantim.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- Readme.md
|
24
|
+
files:
|
25
|
+
- Readme.md
|
26
|
+
- Rakefile
|
27
|
+
- lib/toadhopper.rb
|
28
|
+
- lib/toadhopper/test.rb
|
29
|
+
- test/test_filter.rb
|
30
|
+
- test/test_notice_params.rb
|
31
|
+
- test/test_setters.rb
|
32
|
+
- test/test_test.rb
|
33
|
+
has_rdoc: true
|
34
|
+
homepage: http://github.com/toolmantim/toadhopper
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
45
|
+
version:
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
requirements: []
|
53
|
+
|
54
|
+
rubyforge_project: toadhopper
|
55
|
+
rubygems_version: 1.3.1
|
56
|
+
signing_key:
|
57
|
+
specification_version: 2
|
58
|
+
summary: Library for posting Hoptoad notifications
|
59
|
+
test_files: []
|
60
|
+
|