radar 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/CHANGELOG.md +21 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +47 -48
- data/README.md +14 -25
- data/docs/user_guide.md +155 -30
- data/examples/rack/config.ru +1 -1
- data/examples/sinatra/README.md +15 -0
- data/examples/sinatra/example.rb +18 -0
- data/lib/radar.rb +11 -5
- data/lib/radar/application.rb +14 -3
- data/lib/radar/backtrace.rb +42 -0
- data/lib/radar/config.rb +112 -20
- data/lib/radar/data_extensions/rack.rb +4 -21
- data/lib/radar/data_extensions/rails2.rb +31 -0
- data/lib/radar/data_extensions/request_helper.rb +28 -0
- data/lib/radar/exception_event.rb +10 -4
- data/lib/radar/integration/rails2.rb +31 -0
- data/lib/radar/integration/rails2/action_controller_rescue.rb +30 -0
- data/lib/radar/integration/rails3.rb +0 -2
- data/lib/radar/integration/rails3/railtie.rb +0 -2
- data/lib/radar/integration/sinatra.rb +21 -0
- data/lib/radar/matchers/local_request_matcher.rb +43 -0
- data/lib/radar/reporter/hoptoad_reporter.rb +204 -0
- data/lib/radar/reporter/logger_reporter.rb +2 -3
- data/lib/radar/version.rb +1 -1
- data/radar.gemspec +1 -0
- data/test/radar/application_test.rb +39 -18
- data/test/radar/backtrace_test.rb +42 -0
- data/test/radar/config_test.rb +49 -4
- data/test/radar/data_extensions/rails2_test.rb +14 -0
- data/test/radar/exception_event_test.rb +9 -0
- data/test/radar/integration/rack_test.rb +1 -1
- data/test/radar/integration/sinatra_test.rb +13 -0
- data/test/radar/matchers/local_request_matcher_test.rb +26 -0
- data/test/radar/reporter/hoptoad_reporter_test.rb +20 -0
- data/test/radar/reporter/logger_reporter_test.rb +0 -4
- metadata +41 -12
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BacktraceTest < Test::Unit::TestCase
|
4
|
+
context "backtrace class" do
|
5
|
+
setup do
|
6
|
+
@klass = Radar::Backtrace
|
7
|
+
@instance = @klass.new(["test.rb:14:in `bar'", "test.rb:10:in `foo'", "test.rb:18:in `<main>'"])
|
8
|
+
end
|
9
|
+
|
10
|
+
should "be an array" do
|
11
|
+
assert @instance.is_a?(Array)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "properly parse a backtrace" do
|
15
|
+
assert_equal 3, @instance.length
|
16
|
+
assert @instance.all? { |x| x.is_a?(Radar::Backtrace::Entry) }
|
17
|
+
end
|
18
|
+
|
19
|
+
# This happens if an exception is created, not raised.
|
20
|
+
should "be empty if backtrace is nil" do
|
21
|
+
instance = @klass.new(Exception.new("test").backtrace)
|
22
|
+
assert instance.empty?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "backtrace entry class" do
|
27
|
+
setup do
|
28
|
+
@klass = Radar::Backtrace::Entry
|
29
|
+
@instance = @klass.new("test.rb:14:in `bar'")
|
30
|
+
end
|
31
|
+
|
32
|
+
should "properly parse out the file, line, and method" do
|
33
|
+
assert_equal "test.rb", @instance.file
|
34
|
+
assert_equal "14", @instance.line
|
35
|
+
assert_equal "bar", @instance.method
|
36
|
+
end
|
37
|
+
|
38
|
+
should "turn into json nicely" do
|
39
|
+
assert @instance.to_json
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/test/radar/config_test.rb
CHANGED
@@ -9,7 +9,9 @@ class ConfigTest < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
context "reporters" do
|
11
11
|
setup do
|
12
|
-
@reporter_klass = Class.new
|
12
|
+
@reporter_klass = Class.new do
|
13
|
+
def report(event); end
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
teardown do
|
@@ -23,13 +25,16 @@ class ConfigTest < Test::Unit::TestCase
|
|
23
25
|
should "be able to add reporters" do
|
24
26
|
@instance.reporters.use @reporter_klass
|
25
27
|
assert !@instance.reporters.empty?
|
26
|
-
|
28
|
+
end
|
29
|
+
|
30
|
+
should "be able to add reporters using the shortcut singular method" do
|
31
|
+
@instance.reporter @reporter_klass
|
32
|
+
assert !@instance.reporters.empty?
|
27
33
|
end
|
28
34
|
|
29
35
|
should "be able to add reporters via built-in symbols" do
|
30
36
|
@instance.reporters.use :file
|
31
37
|
assert !@instance.reporters.empty?
|
32
|
-
assert @instance.reporters.values.first.is_a?(Radar::Reporter::FileReporter)
|
33
38
|
end
|
34
39
|
|
35
40
|
should "yield the reporter instance if a block is given" do
|
@@ -61,6 +66,11 @@ class ConfigTest < Test::Unit::TestCase
|
|
61
66
|
assert !@instance.data_extensions.empty?
|
62
67
|
end
|
63
68
|
|
69
|
+
should "be able to add data extensions via the shortcut singular method" do
|
70
|
+
@instance.data_extension @extension
|
71
|
+
assert !@instance.data_extensions.empty?
|
72
|
+
end
|
73
|
+
|
64
74
|
should "be able to add built-in extensions via symbols" do
|
65
75
|
@instance.data_extensions.use :rack
|
66
76
|
assert_equal Radar::DataExtensions::Rack, @instance.data_extensions.values.last
|
@@ -89,7 +99,33 @@ class ConfigTest < Test::Unit::TestCase
|
|
89
99
|
|
90
100
|
should "be able to use built-in matchers as symbols" do
|
91
101
|
@instance.match :class, Object
|
92
|
-
assert @instance.matchers.values.first
|
102
|
+
assert @instance.matchers.values.first
|
103
|
+
end
|
104
|
+
|
105
|
+
should "key the matchers by name if given" do
|
106
|
+
@instance.match :class, Object
|
107
|
+
assert @instance.matchers.index(:class)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "rejecters" do
|
112
|
+
setup do
|
113
|
+
@rejecter = Class.new do
|
114
|
+
def matches?(event); end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
teardown do
|
119
|
+
@instance.rejecters.clear
|
120
|
+
end
|
121
|
+
|
122
|
+
should "initially have no rejecters" do
|
123
|
+
assert @instance.rejecters.empty?
|
124
|
+
end
|
125
|
+
|
126
|
+
should "be able to add rejecters" do
|
127
|
+
@instance.reject @rejecter
|
128
|
+
assert !@instance.rejecters.empty?
|
93
129
|
end
|
94
130
|
end
|
95
131
|
|
@@ -98,6 +134,10 @@ class ConfigTest < Test::Unit::TestCase
|
|
98
134
|
@instance.filters.clear
|
99
135
|
end
|
100
136
|
|
137
|
+
should "not have any filters by default" do
|
138
|
+
assert @instance.filters.empty?
|
139
|
+
end
|
140
|
+
|
101
141
|
should "raise an ArgumentError if no class or lambda is given" do
|
102
142
|
assert_raises(ArgumentError) { @instance.filters.use }
|
103
143
|
end
|
@@ -109,6 +149,11 @@ class ConfigTest < Test::Unit::TestCase
|
|
109
149
|
}
|
110
150
|
assert_equal 1, @instance.filters.length
|
111
151
|
end
|
152
|
+
|
153
|
+
should "be able to add filters using the shortcut singular method" do
|
154
|
+
@instance.filter {}
|
155
|
+
assert_equal 1, @instance.filters.length
|
156
|
+
end
|
112
157
|
end
|
113
158
|
end
|
114
159
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Rails2DataTest < Test::Unit::TestCase
|
4
|
+
context "rails 2 data extension class" do
|
5
|
+
setup do
|
6
|
+
@klass = Radar::DataExtensions::Rails2
|
7
|
+
@instance = @klass.new(create_exception_event)
|
8
|
+
end
|
9
|
+
|
10
|
+
should "be able to convert to a hash" do
|
11
|
+
assert @instance.respond_to?(:to_hash)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -16,6 +16,11 @@ class ExceptionEventTest < Test::Unit::TestCase
|
|
16
16
|
assert @instance.occurred_at.is_a?(Time)
|
17
17
|
end
|
18
18
|
|
19
|
+
should "include a backtrace from the exception" do
|
20
|
+
assert @instance.backtrace
|
21
|
+
assert_equal @instance.exception.backtrace, @instance.backtrace.original
|
22
|
+
end
|
23
|
+
|
19
24
|
should "not have extra data by default" do
|
20
25
|
assert @instance.extra.empty?
|
21
26
|
end
|
@@ -50,6 +55,10 @@ class ExceptionEventTest < Test::Unit::TestCase
|
|
50
55
|
@extension.any_instance.stubs(:to_hash).returns(nil)
|
51
56
|
assert_nothing_raised { @instance.to_hash }
|
52
57
|
end
|
58
|
+
|
59
|
+
should "cache the generated hash" do
|
60
|
+
assert @instance.to_hash.equal?(@instance.to_hash)
|
61
|
+
end
|
53
62
|
end
|
54
63
|
|
55
64
|
context "filters" do
|
@@ -6,7 +6,7 @@ class RackIntegrationTest < Test::Unit::TestCase
|
|
6
6
|
@klass = Radar::Integration::Rack
|
7
7
|
end
|
8
8
|
|
9
|
-
should "not allow integration via the actual integration
|
9
|
+
should "not allow integration via the actual integration" do
|
10
10
|
assert_raises(RuntimeError) {
|
11
11
|
@klass.integrate!(nil)
|
12
12
|
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SinatraIntegrationTest < Test::Unit::TestCase
|
4
|
+
context "sinatra integration class" do
|
5
|
+
setup do
|
6
|
+
@klass = Radar::Integration::Sinatra
|
7
|
+
end
|
8
|
+
|
9
|
+
should "not allow integration via the actual integration" do
|
10
|
+
assert_raises(RuntimeError) { @klass.integrate!(nil) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LocalRequestMatcherTest < Test::Unit::TestCase
|
4
|
+
context "class matcher class" do
|
5
|
+
setup do
|
6
|
+
@klass = Radar::Matchers::LocalRequestMatcher
|
7
|
+
@hash = {}
|
8
|
+
@event = create_exception_event
|
9
|
+
@event.stubs(:to_hash).returns(@hash)
|
10
|
+
end
|
11
|
+
|
12
|
+
should "match if the IP matches a local IP" do
|
13
|
+
@hash[:request] = { :remote_ip => "127.0.0.1" }
|
14
|
+
assert @klass.new.matches?(@event)
|
15
|
+
end
|
16
|
+
|
17
|
+
should "not match if the IP does not match a local IP" do
|
18
|
+
@hash[:request] = { :remote_ip => "33.33.33.10" }
|
19
|
+
assert !@klass.new.matches?(@event)
|
20
|
+
end
|
21
|
+
|
22
|
+
should "not match if the field doesn't exist" do
|
23
|
+
assert !@klass.new.matches?(@event)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class HoptoadReporterTest < Test::Unit::TestCase
|
4
|
+
context "hoptoad reporter class" do
|
5
|
+
setup do
|
6
|
+
@klass = Radar::Reporter::HoptoadReporter
|
7
|
+
end
|
8
|
+
|
9
|
+
should "default notifier information to Radar" do
|
10
|
+
instance = @klass.new
|
11
|
+
assert_equal "Radar", instance.notifier_name
|
12
|
+
assert_equal Radar::VERSION, instance.notifier_version
|
13
|
+
assert !instance.notifier_url.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
should "require an API key" do
|
17
|
+
assert_raises(ArgumentError) { @klass.new.report(create_exception_event) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -10,10 +10,6 @@ class LoggerReporterTest < Test::Unit::TestCase
|
|
10
10
|
assert_raises(ArgumentError) { @klass.new.report(create_exception_event) }
|
11
11
|
end
|
12
12
|
|
13
|
-
should "raise an argument error if an invalid logger is given" do
|
14
|
-
assert_raises(ArgumentError) { @klass.new(:log_object => 7).report(create_exception_event) }
|
15
|
-
end
|
16
|
-
|
17
13
|
should "raise an argument error if the logger doesn't respond to the log level" do
|
18
14
|
assert_raises(ArgumentError) { @klass.new(:log_object => Logger.new(nil), :log_level => :bananas).report(create_exception_event) }
|
19
15
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 4
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.4.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mitchell Hashimoto
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-10-05 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -33,8 +33,22 @@ dependencies:
|
|
33
33
|
prerelease: false
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: builder
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ~>
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 2
|
44
|
+
- 0
|
45
|
+
version: "2.0"
|
46
|
+
type: :runtime
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: bundler
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
38
52
|
none: false
|
39
53
|
requirements:
|
40
54
|
- - ">="
|
@@ -48,10 +62,10 @@ dependencies:
|
|
48
62
|
version: 1.0.0.rc.5
|
49
63
|
type: :development
|
50
64
|
prerelease: false
|
51
|
-
version_requirements: *
|
65
|
+
version_requirements: *id003
|
52
66
|
- !ruby/object:Gem::Dependency
|
53
67
|
name: shoulda
|
54
|
-
requirement: &
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
55
69
|
none: false
|
56
70
|
requirements:
|
57
71
|
- - ">="
|
@@ -61,10 +75,10 @@ dependencies:
|
|
61
75
|
version: "0"
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
|
-
version_requirements: *
|
78
|
+
version_requirements: *id004
|
65
79
|
- !ruby/object:Gem::Dependency
|
66
80
|
name: mocha
|
67
|
-
requirement: &
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
68
82
|
none: false
|
69
83
|
requirements:
|
70
84
|
- - ">="
|
@@ -74,10 +88,10 @@ dependencies:
|
|
74
88
|
version: "0"
|
75
89
|
type: :development
|
76
90
|
prerelease: false
|
77
|
-
version_requirements: *
|
91
|
+
version_requirements: *id005
|
78
92
|
- !ruby/object:Gem::Dependency
|
79
93
|
name: rake
|
80
|
-
requirement: &
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
81
95
|
none: false
|
82
96
|
requirements:
|
83
97
|
- - ">="
|
@@ -87,7 +101,7 @@ dependencies:
|
|
87
101
|
version: "0"
|
88
102
|
type: :development
|
89
103
|
prerelease: false
|
90
|
-
version_requirements: *
|
104
|
+
version_requirements: *id006
|
91
105
|
description: Radar provides a drop-in solution to catching and reporting errors in your libraries and applications.
|
92
106
|
email:
|
93
107
|
- mitchell.hashimoto@gmail.com
|
@@ -110,42 +124,57 @@ files:
|
|
110
124
|
- examples/README.md
|
111
125
|
- examples/rack/README.md
|
112
126
|
- examples/rack/config.ru
|
127
|
+
- examples/sinatra/README.md
|
128
|
+
- examples/sinatra/example.rb
|
113
129
|
- lib/radar.rb
|
114
130
|
- lib/radar/application.rb
|
131
|
+
- lib/radar/backtrace.rb
|
115
132
|
- lib/radar/config.rb
|
116
133
|
- lib/radar/data_extensions/host_environment.rb
|
117
134
|
- lib/radar/data_extensions/rack.rb
|
135
|
+
- lib/radar/data_extensions/rails2.rb
|
136
|
+
- lib/radar/data_extensions/request_helper.rb
|
118
137
|
- lib/radar/error.rb
|
119
138
|
- lib/radar/exception_event.rb
|
120
139
|
- lib/radar/filters/key_filter.rb
|
121
140
|
- lib/radar/integration/rack.rb
|
141
|
+
- lib/radar/integration/rails2.rb
|
142
|
+
- lib/radar/integration/rails2/action_controller_rescue.rb
|
122
143
|
- lib/radar/integration/rails3.rb
|
123
144
|
- lib/radar/integration/rails3/generator.rb
|
124
145
|
- lib/radar/integration/rails3/railtie.rb
|
125
146
|
- lib/radar/integration/rails3/templates/README
|
126
147
|
- lib/radar/integration/rails3/templates/radar.rb
|
148
|
+
- lib/radar/integration/sinatra.rb
|
127
149
|
- lib/radar/logger.rb
|
128
150
|
- lib/radar/matchers/backtrace_matcher.rb
|
129
151
|
- lib/radar/matchers/class_matcher.rb
|
152
|
+
- lib/radar/matchers/local_request_matcher.rb
|
130
153
|
- lib/radar/reporter.rb
|
131
154
|
- lib/radar/reporter/file_reporter.rb
|
155
|
+
- lib/radar/reporter/hoptoad_reporter.rb
|
132
156
|
- lib/radar/reporter/io_reporter.rb
|
133
157
|
- lib/radar/reporter/logger_reporter.rb
|
134
158
|
- lib/radar/support.rb
|
135
159
|
- lib/radar/version.rb
|
136
160
|
- radar.gemspec
|
137
161
|
- test/radar/application_test.rb
|
162
|
+
- test/radar/backtrace_test.rb
|
138
163
|
- test/radar/config_test.rb
|
139
164
|
- test/radar/data_extensions/host_environment_test.rb
|
140
165
|
- test/radar/data_extensions/rack_test.rb
|
166
|
+
- test/radar/data_extensions/rails2_test.rb
|
141
167
|
- test/radar/exception_event_test.rb
|
142
168
|
- test/radar/filters/key_filter_test.rb
|
143
169
|
- test/radar/integration/rack_test.rb
|
144
170
|
- test/radar/integration/rails3_test.rb
|
171
|
+
- test/radar/integration/sinatra_test.rb
|
145
172
|
- test/radar/logger_test.rb
|
146
173
|
- test/radar/matchers/backtrace_matcher_test.rb
|
147
174
|
- test/radar/matchers/class_matcher_test.rb
|
175
|
+
- test/radar/matchers/local_request_matcher_test.rb
|
148
176
|
- test/radar/reporter/file_reporter_test.rb
|
177
|
+
- test/radar/reporter/hoptoad_reporter_test.rb
|
149
178
|
- test/radar/reporter/io_reporter_test.rb
|
150
179
|
- test/radar/reporter/logger_reporter_test.rb
|
151
180
|
- test/radar/reporter_test.rb
|
@@ -165,7 +194,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
194
|
requirements:
|
166
195
|
- - ">="
|
167
196
|
- !ruby/object:Gem::Version
|
168
|
-
hash:
|
197
|
+
hash: 2858053667388978751
|
169
198
|
segments:
|
170
199
|
- 0
|
171
200
|
version: "0"
|