radar 0.3.0 → 0.4.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/.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"
|