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.
Files changed (38) hide show
  1. data/.gitignore +2 -1
  2. data/CHANGELOG.md +21 -0
  3. data/Gemfile +3 -2
  4. data/Gemfile.lock +47 -48
  5. data/README.md +14 -25
  6. data/docs/user_guide.md +155 -30
  7. data/examples/rack/config.ru +1 -1
  8. data/examples/sinatra/README.md +15 -0
  9. data/examples/sinatra/example.rb +18 -0
  10. data/lib/radar.rb +11 -5
  11. data/lib/radar/application.rb +14 -3
  12. data/lib/radar/backtrace.rb +42 -0
  13. data/lib/radar/config.rb +112 -20
  14. data/lib/radar/data_extensions/rack.rb +4 -21
  15. data/lib/radar/data_extensions/rails2.rb +31 -0
  16. data/lib/radar/data_extensions/request_helper.rb +28 -0
  17. data/lib/radar/exception_event.rb +10 -4
  18. data/lib/radar/integration/rails2.rb +31 -0
  19. data/lib/radar/integration/rails2/action_controller_rescue.rb +30 -0
  20. data/lib/radar/integration/rails3.rb +0 -2
  21. data/lib/radar/integration/rails3/railtie.rb +0 -2
  22. data/lib/radar/integration/sinatra.rb +21 -0
  23. data/lib/radar/matchers/local_request_matcher.rb +43 -0
  24. data/lib/radar/reporter/hoptoad_reporter.rb +204 -0
  25. data/lib/radar/reporter/logger_reporter.rb +2 -3
  26. data/lib/radar/version.rb +1 -1
  27. data/radar.gemspec +1 -0
  28. data/test/radar/application_test.rb +39 -18
  29. data/test/radar/backtrace_test.rb +42 -0
  30. data/test/radar/config_test.rb +49 -4
  31. data/test/radar/data_extensions/rails2_test.rb +14 -0
  32. data/test/radar/exception_event_test.rb +9 -0
  33. data/test/radar/integration/rack_test.rb +1 -1
  34. data/test/radar/integration/sinatra_test.rb +13 -0
  35. data/test/radar/matchers/local_request_matcher_test.rb +26 -0
  36. data/test/radar/reporter/hoptoad_reporter_test.rb +20 -0
  37. data/test/radar/reporter/logger_reporter_test.rb +0 -4
  38. 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
@@ -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
- assert @instance.reporters.values.first.is_a?(@reporter_klass)
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.is_a?(Radar::Matchers::ClassMatcher)
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 test" do
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
- - 3
7
+ - 4
8
8
  - 0
9
- version: 0.3.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-08-21 00:00:00 -07:00
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: bundler
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: *id002
65
+ version_requirements: *id003
52
66
  - !ruby/object:Gem::Dependency
53
67
  name: shoulda
54
- requirement: &id003 !ruby/object:Gem::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: *id003
78
+ version_requirements: *id004
65
79
  - !ruby/object:Gem::Dependency
66
80
  name: mocha
67
- requirement: &id004 !ruby/object:Gem::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: *id004
91
+ version_requirements: *id005
78
92
  - !ruby/object:Gem::Dependency
79
93
  name: rake
80
- requirement: &id005 !ruby/object:Gem::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: *id005
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: -3089432238801880584
197
+ hash: 2858053667388978751
169
198
  segments:
170
199
  - 0
171
200
  version: "0"