jordan-brough-hoptoad_notifier 2.3.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/CHANGELOG +161 -0
- data/INSTALL +25 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +384 -0
- data/Rakefile +217 -0
- data/SUPPORTED_RAILS_VERSIONS +9 -0
- data/TESTING.rdoc +8 -0
- data/generators/hoptoad/hoptoad_generator.rb +63 -0
- data/generators/hoptoad/lib/insert_commands.rb +34 -0
- data/generators/hoptoad/lib/rake_commands.rb +24 -0
- data/generators/hoptoad/templates/capistrano_hook.rb +6 -0
- data/generators/hoptoad/templates/hoptoad_notifier_tasks.rake +25 -0
- data/generators/hoptoad/templates/initializer.rb +6 -0
- data/lib/hoptoad_notifier.rb +148 -0
- data/lib/hoptoad_notifier/backtrace.rb +99 -0
- data/lib/hoptoad_notifier/capistrano.rb +20 -0
- data/lib/hoptoad_notifier/configuration.rb +232 -0
- data/lib/hoptoad_notifier/notice.rb +318 -0
- data/lib/hoptoad_notifier/rack.rb +40 -0
- data/lib/hoptoad_notifier/rails.rb +37 -0
- data/lib/hoptoad_notifier/rails/action_controller_catcher.rb +29 -0
- data/lib/hoptoad_notifier/rails/controller_methods.rb +63 -0
- data/lib/hoptoad_notifier/rails/error_lookup.rb +33 -0
- data/lib/hoptoad_notifier/rails3_tasks.rb +90 -0
- data/lib/hoptoad_notifier/railtie.rb +23 -0
- data/lib/hoptoad_notifier/sender.rb +63 -0
- data/lib/hoptoad_notifier/tasks.rb +97 -0
- data/lib/hoptoad_notifier/version.rb +3 -0
- data/lib/hoptoad_tasks.rb +44 -0
- data/lib/rails/generators/hoptoad/hoptoad_generator.rb +69 -0
- data/lib/templates/rescue.erb +91 -0
- data/rails/init.rb +1 -0
- data/script/integration_test.rb +38 -0
- data/test/backtrace_test.rb +118 -0
- data/test/catcher_test.rb +324 -0
- data/test/configuration_test.rb +208 -0
- data/test/helper.rb +239 -0
- data/test/hoptoad_tasks_test.rb +152 -0
- data/test/logger_test.rb +85 -0
- data/test/notice_test.rb +443 -0
- data/test/notifier_test.rb +222 -0
- data/test/rack_test.rb +58 -0
- data/test/rails_initializer_test.rb +36 -0
- data/test/sender_test.rb +123 -0
- metadata +205 -0
@@ -0,0 +1,222 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class NotifierTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class OriginalException < Exception
|
6
|
+
end
|
7
|
+
|
8
|
+
class ContinuedException < Exception
|
9
|
+
end
|
10
|
+
|
11
|
+
include DefinesConstants
|
12
|
+
|
13
|
+
def setup
|
14
|
+
super
|
15
|
+
reset_config
|
16
|
+
end
|
17
|
+
|
18
|
+
def assert_sent(notice, notice_args)
|
19
|
+
assert_received(HoptoadNotifier::Notice, :new) {|expect| expect.with(has_entries(notice_args)) }
|
20
|
+
assert_received(notice, :to_xml)
|
21
|
+
assert_received(HoptoadNotifier.sender, :send_to_hoptoad) {|expect| expect.with(notice.to_xml) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_public_env
|
25
|
+
HoptoadNotifier.configure { |config| config.environment_name = 'production' }
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_development_env
|
29
|
+
HoptoadNotifier.configure { |config| config.environment_name = 'development' }
|
30
|
+
end
|
31
|
+
|
32
|
+
should "yield and save a configuration when configuring" do
|
33
|
+
yielded_configuration = nil
|
34
|
+
HoptoadNotifier.configure do |config|
|
35
|
+
yielded_configuration = config
|
36
|
+
end
|
37
|
+
|
38
|
+
assert_kind_of HoptoadNotifier::Configuration, yielded_configuration
|
39
|
+
assert_equal yielded_configuration, HoptoadNotifier.configuration
|
40
|
+
end
|
41
|
+
|
42
|
+
should "not remove existing config options when configuring twice" do
|
43
|
+
first_config = nil
|
44
|
+
HoptoadNotifier.configure do |config|
|
45
|
+
first_config = config
|
46
|
+
end
|
47
|
+
HoptoadNotifier.configure do |config|
|
48
|
+
assert_equal first_config, config
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
should "configure the sender" do
|
53
|
+
sender = stub_sender
|
54
|
+
HoptoadNotifier::Sender.stubs(:new => sender)
|
55
|
+
configuration = nil
|
56
|
+
|
57
|
+
HoptoadNotifier.configure { |yielded_config| configuration = yielded_config }
|
58
|
+
|
59
|
+
assert_received(HoptoadNotifier::Sender, :new) { |expect| expect.with(configuration) }
|
60
|
+
assert_equal sender, HoptoadNotifier.sender
|
61
|
+
end
|
62
|
+
|
63
|
+
should "create and send a notice for an exception" do
|
64
|
+
set_public_env
|
65
|
+
exception = build_exception
|
66
|
+
stub_sender!
|
67
|
+
notice = stub_notice!
|
68
|
+
|
69
|
+
HoptoadNotifier.notify(exception)
|
70
|
+
|
71
|
+
assert_sent notice, :exception => exception
|
72
|
+
end
|
73
|
+
|
74
|
+
should "create and send a notice for a hash" do
|
75
|
+
set_public_env
|
76
|
+
notice = stub_notice!
|
77
|
+
notice_args = { :error_message => 'uh oh' }
|
78
|
+
stub_sender!
|
79
|
+
|
80
|
+
HoptoadNotifier.notify(notice_args)
|
81
|
+
|
82
|
+
assert_sent(notice, notice_args)
|
83
|
+
end
|
84
|
+
|
85
|
+
should "create and sent a notice for an exception and hash" do
|
86
|
+
set_public_env
|
87
|
+
exception = build_exception
|
88
|
+
notice = stub_notice!
|
89
|
+
notice_args = { :error_message => 'uh oh' }
|
90
|
+
stub_sender!
|
91
|
+
|
92
|
+
HoptoadNotifier.notify(exception, notice_args)
|
93
|
+
|
94
|
+
assert_sent(notice, notice_args.merge(:exception => exception))
|
95
|
+
end
|
96
|
+
|
97
|
+
should "not create a notice in a development environment" do
|
98
|
+
set_development_env
|
99
|
+
sender = stub_sender!
|
100
|
+
|
101
|
+
HoptoadNotifier.notify(build_exception)
|
102
|
+
HoptoadNotifier.notify_or_ignore(build_exception)
|
103
|
+
|
104
|
+
assert_received(sender, :send_to_hoptoad) {|expect| expect.never }
|
105
|
+
end
|
106
|
+
|
107
|
+
should "not deliver an ignored exception when notifying implicitly" do
|
108
|
+
set_public_env
|
109
|
+
exception = build_exception
|
110
|
+
sender = stub_sender!
|
111
|
+
notice = stub_notice!
|
112
|
+
notice.stubs(:ignore? => true)
|
113
|
+
|
114
|
+
HoptoadNotifier.notify_or_ignore(exception)
|
115
|
+
|
116
|
+
assert_received(sender, :send_to_hoptoad) {|expect| expect.never }
|
117
|
+
end
|
118
|
+
|
119
|
+
should "deliver an ignored exception when notifying manually" do
|
120
|
+
set_public_env
|
121
|
+
exception = build_exception
|
122
|
+
sender = stub_sender!
|
123
|
+
notice = stub_notice!
|
124
|
+
notice.stubs(:ignore? => true)
|
125
|
+
|
126
|
+
HoptoadNotifier.notify(exception)
|
127
|
+
|
128
|
+
assert_sent(notice, :exception => exception)
|
129
|
+
end
|
130
|
+
|
131
|
+
should "pass config to created notices" do
|
132
|
+
exception = build_exception
|
133
|
+
config_opts = { 'one' => 'two', 'three' => 'four' }
|
134
|
+
notice = stub_notice!
|
135
|
+
stub_sender!
|
136
|
+
HoptoadNotifier.configuration = stub('config', :merge => config_opts, :public? => true)
|
137
|
+
|
138
|
+
HoptoadNotifier.notify(exception)
|
139
|
+
|
140
|
+
assert_received(HoptoadNotifier::Notice, :new) do |expect|
|
141
|
+
expect.with(has_entries(config_opts))
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "building notice JSON for an exception" do
|
146
|
+
setup do
|
147
|
+
@params = { :controller => "users", :action => "create" }
|
148
|
+
@exception = build_exception
|
149
|
+
@hash = HoptoadNotifier.build_lookup_hash_for(@exception, @params)
|
150
|
+
end
|
151
|
+
|
152
|
+
should "set action" do
|
153
|
+
assert_equal @params[:action], @hash[:action]
|
154
|
+
end
|
155
|
+
|
156
|
+
should "set controller" do
|
157
|
+
assert_equal @params[:controller], @hash[:component]
|
158
|
+
end
|
159
|
+
|
160
|
+
should "set line number" do
|
161
|
+
assert @hash[:line_number] =~ /\d+/
|
162
|
+
end
|
163
|
+
|
164
|
+
should "set file" do
|
165
|
+
assert_match /test\/helper\.rb$/, @hash[:file]
|
166
|
+
end
|
167
|
+
|
168
|
+
should "set rails_env to production" do
|
169
|
+
assert_equal 'production', @hash[:environment_name]
|
170
|
+
end
|
171
|
+
|
172
|
+
should "set error class" do
|
173
|
+
assert_equal 'RuntimeError', @hash[:error_class]
|
174
|
+
end
|
175
|
+
|
176
|
+
should "not set file or line number with no backtrace" do
|
177
|
+
@exception.stubs(:backtrace).returns([])
|
178
|
+
|
179
|
+
@hash = HoptoadNotifier.build_lookup_hash_for(@exception)
|
180
|
+
|
181
|
+
assert_nil @hash[:line_number]
|
182
|
+
assert_nil @hash[:file]
|
183
|
+
end
|
184
|
+
|
185
|
+
should "not set action or controller when not provided" do
|
186
|
+
@hash = HoptoadNotifier.build_lookup_hash_for(@exception)
|
187
|
+
|
188
|
+
assert_nil @hash[:action]
|
189
|
+
assert_nil @hash[:controller]
|
190
|
+
end
|
191
|
+
|
192
|
+
context "when an exception that provides #original_exception is raised" do
|
193
|
+
setup do
|
194
|
+
@exception.stubs(:original_exception).returns(begin
|
195
|
+
raise NotifierTest::OriginalException.new
|
196
|
+
rescue Exception => e
|
197
|
+
e
|
198
|
+
end)
|
199
|
+
end
|
200
|
+
|
201
|
+
should "unwrap exceptions that provide #original_exception" do
|
202
|
+
@hash = HoptoadNotifier.build_lookup_hash_for(@exception)
|
203
|
+
assert_equal "NotifierTest::OriginalException", @hash[:error_class]
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
context "when an exception that provides #continued_exception is raised" do
|
208
|
+
setup do
|
209
|
+
@exception.stubs(:continued_exception).returns(begin
|
210
|
+
raise NotifierTest::ContinuedException.new
|
211
|
+
rescue Exception => e
|
212
|
+
e
|
213
|
+
end)
|
214
|
+
end
|
215
|
+
|
216
|
+
should "unwrap exceptions that provide #continued_exception" do
|
217
|
+
@hash = HoptoadNotifier.build_lookup_hash_for(@exception)
|
218
|
+
assert_equal "NotifierTest::ContinuedException", @hash[:error_class]
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
data/test/rack_test.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class RackTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
should "call the upstream app with the environment" do
|
6
|
+
environment = { 'key' => 'value' }
|
7
|
+
app = lambda { |env| ['response', {}, env] }
|
8
|
+
stack = HoptoadNotifier::Rack.new(app)
|
9
|
+
|
10
|
+
response = stack.call(environment)
|
11
|
+
|
12
|
+
assert_equal ['response', {}, environment], response
|
13
|
+
end
|
14
|
+
|
15
|
+
should "deliver an exception raised while calling an upstream app" do
|
16
|
+
HoptoadNotifier.stubs(:notify_or_ignore)
|
17
|
+
|
18
|
+
exception = build_exception
|
19
|
+
environment = { 'key' => 'value' }
|
20
|
+
app = lambda do |env|
|
21
|
+
raise exception
|
22
|
+
end
|
23
|
+
|
24
|
+
begin
|
25
|
+
stack = HoptoadNotifier::Rack.new(app)
|
26
|
+
stack.call(environment)
|
27
|
+
rescue Exception => raised
|
28
|
+
assert_equal exception, raised
|
29
|
+
else
|
30
|
+
flunk "Didn't raise an exception"
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_received(HoptoadNotifier, :notify_or_ignore) do |expect|
|
34
|
+
expect.with(exception, :rack_env => environment)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
should "deliver an exception in rack.exception" do
|
39
|
+
HoptoadNotifier.stubs(:notify_or_ignore)
|
40
|
+
exception = build_exception
|
41
|
+
environment = { 'key' => 'value' }
|
42
|
+
|
43
|
+
response = [200, {}, ['okay']]
|
44
|
+
app = lambda do |env|
|
45
|
+
env['rack.exception'] = exception
|
46
|
+
response
|
47
|
+
end
|
48
|
+
stack = HoptoadNotifier::Rack.new(app)
|
49
|
+
|
50
|
+
actual_response = stack.call(environment)
|
51
|
+
|
52
|
+
assert_equal response, actual_response
|
53
|
+
assert_received(HoptoadNotifier, :notify_or_ignore) do |expect|
|
54
|
+
expect.with(exception, :rack_env => environment)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
require 'hoptoad_notifier/rails'
|
4
|
+
|
5
|
+
class RailsInitializerTest < Test::Unit::TestCase
|
6
|
+
include DefinesConstants
|
7
|
+
|
8
|
+
should "trigger use of Rails' logger if logger isn't set and Rails' logger exists" do
|
9
|
+
rails = Module.new do
|
10
|
+
def self.logger
|
11
|
+
"RAILS LOGGER"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
define_constant("Rails", rails)
|
15
|
+
HoptoadNotifier::Rails.initialize
|
16
|
+
assert_equal "RAILS LOGGER", HoptoadNotifier.logger
|
17
|
+
end
|
18
|
+
|
19
|
+
should "trigger use of Rails' default logger if logger isn't set and Rails.logger doesn't exist" do
|
20
|
+
define_constant("RAILS_DEFAULT_LOGGER", "RAILS DEFAULT LOGGER")
|
21
|
+
|
22
|
+
HoptoadNotifier::Rails.initialize
|
23
|
+
assert_equal "RAILS DEFAULT LOGGER", HoptoadNotifier.logger
|
24
|
+
end
|
25
|
+
|
26
|
+
should "allow overriding of the logger if already assigned" do
|
27
|
+
define_constant("RAILS_DEFAULT_LOGGER", "RAILS DEFAULT LOGGER")
|
28
|
+
HoptoadNotifier::Rails.initialize
|
29
|
+
|
30
|
+
HoptoadNotifier.configure(true) do |config|
|
31
|
+
config.logger = "OVERRIDDEN LOGGER"
|
32
|
+
end
|
33
|
+
|
34
|
+
assert_equal "OVERRIDDEN LOGGER", HoptoadNotifier.logger
|
35
|
+
end
|
36
|
+
end
|
data/test/sender_test.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class SenderTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
reset_config
|
7
|
+
end
|
8
|
+
|
9
|
+
def build_sender(opts = {})
|
10
|
+
config = HoptoadNotifier::Configuration.new
|
11
|
+
opts.each {|opt, value| config.send(:"#{opt}=", value) }
|
12
|
+
HoptoadNotifier::Sender.new(config)
|
13
|
+
end
|
14
|
+
|
15
|
+
def send_exception(args = {})
|
16
|
+
notice = args.delete(:notice) || build_notice_data
|
17
|
+
sender = args.delete(:sender) || build_sender(args)
|
18
|
+
sender.send_to_hoptoad(notice)
|
19
|
+
sender
|
20
|
+
end
|
21
|
+
|
22
|
+
def stub_http
|
23
|
+
response = stub(:body => 'body')
|
24
|
+
http = stub(:post => response,
|
25
|
+
:read_timeout= => nil,
|
26
|
+
:open_timeout= => nil,
|
27
|
+
:use_ssl= => nil)
|
28
|
+
Net::HTTP.stubs(:new => http)
|
29
|
+
http
|
30
|
+
end
|
31
|
+
|
32
|
+
should "post to Hoptoad when using an HTTP proxy" do
|
33
|
+
response = stub(:body => 'body')
|
34
|
+
http = stub(:post => response,
|
35
|
+
:read_timeout= => nil,
|
36
|
+
:open_timeout= => nil,
|
37
|
+
:use_ssl= => nil)
|
38
|
+
proxy = stub(:new => http)
|
39
|
+
Net::HTTP.stubs(:Proxy => proxy)
|
40
|
+
|
41
|
+
url = "http://hoptoadapp.com:80#{HoptoadNotifier::Sender::NOTICES_URI}"
|
42
|
+
uri = URI.parse(url)
|
43
|
+
|
44
|
+
proxy_host = 'some.host'
|
45
|
+
proxy_port = 88
|
46
|
+
proxy_user = 'login'
|
47
|
+
proxy_pass = 'passwd'
|
48
|
+
|
49
|
+
send_exception(:proxy_host => proxy_host,
|
50
|
+
:proxy_port => proxy_port,
|
51
|
+
:proxy_user => proxy_user,
|
52
|
+
:proxy_pass => proxy_pass)
|
53
|
+
assert_received(http, :post) do |expect|
|
54
|
+
expect.with(uri.path, anything, HoptoadNotifier::HEADERS)
|
55
|
+
end
|
56
|
+
assert_received(Net::HTTP, :Proxy) do |expect|
|
57
|
+
expect.with(proxy_host, proxy_port, proxy_user, proxy_pass)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
should "post to the right url for non-ssl" do
|
62
|
+
http = stub_http
|
63
|
+
url = "http://hoptoadapp.com:80#{HoptoadNotifier::Sender::NOTICES_URI}"
|
64
|
+
uri = URI.parse(url)
|
65
|
+
send_exception(:secure => false)
|
66
|
+
assert_received(http, :post) {|expect| expect.with(uri.path, anything, HoptoadNotifier::HEADERS) }
|
67
|
+
end
|
68
|
+
|
69
|
+
should "post to the right path for ssl" do
|
70
|
+
http = stub_http
|
71
|
+
send_exception(:secure => true)
|
72
|
+
assert_received(http, :post) {|expect| expect.with(HoptoadNotifier::Sender::NOTICES_URI, anything, HoptoadNotifier::HEADERS) }
|
73
|
+
end
|
74
|
+
|
75
|
+
should "default the open timeout to 2 seconds" do
|
76
|
+
http = stub_http
|
77
|
+
send_exception
|
78
|
+
assert_received(http, :open_timeout=) {|expect| expect.with(2) }
|
79
|
+
end
|
80
|
+
|
81
|
+
should "default the read timeout to 5 seconds" do
|
82
|
+
http = stub_http
|
83
|
+
send_exception
|
84
|
+
assert_received(http, :read_timeout=) {|expect| expect.with(5) }
|
85
|
+
end
|
86
|
+
|
87
|
+
should "allow override of the open timeout" do
|
88
|
+
http = stub_http
|
89
|
+
send_exception(:http_open_timeout => 4)
|
90
|
+
assert_received(http, :open_timeout=) {|expect| expect.with(4) }
|
91
|
+
end
|
92
|
+
|
93
|
+
should "allow override of the read timeout" do
|
94
|
+
http = stub_http
|
95
|
+
send_exception(:http_read_timeout => 10)
|
96
|
+
assert_received(http, :read_timeout=) {|expect| expect.with(10) }
|
97
|
+
end
|
98
|
+
|
99
|
+
should "connect to the right port for ssl" do
|
100
|
+
stub_http
|
101
|
+
send_exception(:secure => true)
|
102
|
+
assert_received(Net::HTTP, :new) {|expect| expect.with("hoptoadapp.com", 443) }
|
103
|
+
end
|
104
|
+
|
105
|
+
should "connect to the right port for non-ssl" do
|
106
|
+
stub_http
|
107
|
+
send_exception(:secure => false)
|
108
|
+
assert_received(Net::HTTP, :new) {|expect| expect.with("hoptoadapp.com", 80) }
|
109
|
+
end
|
110
|
+
|
111
|
+
should "use ssl if secure" do
|
112
|
+
stub_http
|
113
|
+
send_exception(:secure => true, :host => 'example.org')
|
114
|
+
assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 443) }
|
115
|
+
end
|
116
|
+
|
117
|
+
should "not use ssl if not secure" do
|
118
|
+
stub_http
|
119
|
+
send_exception(:secure => false, :host => 'example.org')
|
120
|
+
assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 80) }
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jordan-brough-hoptoad_notifier
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 3
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 2.3.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- thoughtbot, inc
|
14
|
+
- Jordan Brough
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2010-07-02 00:00:00 -06:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: activesupport
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activerecord
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: actionpack
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
type: :development
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: jferris-mocha
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
type: :development
|
77
|
+
version_requirements: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: nokogiri
|
80
|
+
prerelease: false
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
type: :development
|
91
|
+
version_requirements: *id005
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: shoulda
|
94
|
+
prerelease: false
|
95
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
type: :development
|
105
|
+
version_requirements: *id006
|
106
|
+
description:
|
107
|
+
email: support@hoptoadapp.com
|
108
|
+
executables: []
|
109
|
+
|
110
|
+
extensions: []
|
111
|
+
|
112
|
+
extra_rdoc_files:
|
113
|
+
- README.rdoc
|
114
|
+
files:
|
115
|
+
- CHANGELOG
|
116
|
+
- INSTALL
|
117
|
+
- MIT-LICENSE
|
118
|
+
- Rakefile
|
119
|
+
- README.rdoc
|
120
|
+
- SUPPORTED_RAILS_VERSIONS
|
121
|
+
- TESTING.rdoc
|
122
|
+
- generators/hoptoad/hoptoad_generator.rb
|
123
|
+
- generators/hoptoad/lib/insert_commands.rb
|
124
|
+
- generators/hoptoad/lib/rake_commands.rb
|
125
|
+
- generators/hoptoad/templates/capistrano_hook.rb
|
126
|
+
- generators/hoptoad/templates/hoptoad_notifier_tasks.rake
|
127
|
+
- generators/hoptoad/templates/initializer.rb
|
128
|
+
- lib/hoptoad_notifier/backtrace.rb
|
129
|
+
- lib/hoptoad_notifier/capistrano.rb
|
130
|
+
- lib/hoptoad_notifier/configuration.rb
|
131
|
+
- lib/hoptoad_notifier/notice.rb
|
132
|
+
- lib/hoptoad_notifier/rack.rb
|
133
|
+
- lib/hoptoad_notifier/rails/action_controller_catcher.rb
|
134
|
+
- lib/hoptoad_notifier/rails/controller_methods.rb
|
135
|
+
- lib/hoptoad_notifier/rails/error_lookup.rb
|
136
|
+
- lib/hoptoad_notifier/rails.rb
|
137
|
+
- lib/hoptoad_notifier/rails3_tasks.rb
|
138
|
+
- lib/hoptoad_notifier/railtie.rb
|
139
|
+
- lib/hoptoad_notifier/sender.rb
|
140
|
+
- lib/hoptoad_notifier/tasks.rb
|
141
|
+
- lib/hoptoad_notifier/version.rb
|
142
|
+
- lib/hoptoad_notifier.rb
|
143
|
+
- lib/hoptoad_tasks.rb
|
144
|
+
- lib/rails/generators/hoptoad/hoptoad_generator.rb
|
145
|
+
- test/backtrace_test.rb
|
146
|
+
- test/catcher_test.rb
|
147
|
+
- test/configuration_test.rb
|
148
|
+
- test/helper.rb
|
149
|
+
- test/hoptoad_tasks_test.rb
|
150
|
+
- test/logger_test.rb
|
151
|
+
- test/notice_test.rb
|
152
|
+
- test/notifier_test.rb
|
153
|
+
- test/rack_test.rb
|
154
|
+
- test/rails_initializer_test.rb
|
155
|
+
- test/sender_test.rb
|
156
|
+
- rails/init.rb
|
157
|
+
- script/integration_test.rb
|
158
|
+
- lib/templates/rescue.erb
|
159
|
+
has_rdoc: true
|
160
|
+
homepage: http://www.hoptoadapp.com
|
161
|
+
licenses: []
|
162
|
+
|
163
|
+
post_install_message:
|
164
|
+
rdoc_options:
|
165
|
+
- --line-numbers
|
166
|
+
- --main
|
167
|
+
- README.rdoc
|
168
|
+
require_paths:
|
169
|
+
- lib
|
170
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
172
|
+
requirements:
|
173
|
+
- - ">="
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
hash: 3
|
176
|
+
segments:
|
177
|
+
- 0
|
178
|
+
version: "0"
|
179
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
hash: 3
|
185
|
+
segments:
|
186
|
+
- 0
|
187
|
+
version: "0"
|
188
|
+
requirements: []
|
189
|
+
|
190
|
+
rubyforge_project:
|
191
|
+
rubygems_version: 1.3.7
|
192
|
+
signing_key:
|
193
|
+
specification_version: 3
|
194
|
+
summary: Send your application errors to our hosted service and reclaim your inbox.
|
195
|
+
test_files:
|
196
|
+
- test/backtrace_test.rb
|
197
|
+
- test/catcher_test.rb
|
198
|
+
- test/configuration_test.rb
|
199
|
+
- test/hoptoad_tasks_test.rb
|
200
|
+
- test/logger_test.rb
|
201
|
+
- test/notice_test.rb
|
202
|
+
- test/notifier_test.rb
|
203
|
+
- test/rack_test.rb
|
204
|
+
- test/rails_initializer_test.rb
|
205
|
+
- test/sender_test.rb
|