radar 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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"