lib/toadhopper.rb in toadhopper-1.0.1 vs lib/toadhopper.rb in toadhopper-1.0.2
- old
+ new
@@ -2,11 +2,11 @@
require 'erb'
require 'ostruct'
# Posts errors to the Hoptoad API
class Toadhopper
- VERSION = "1.0.1"
+ VERSION = "1.0.2"
# Hoptoad API response
class Response < Struct.new(:status, :body, :errors); end
attr_reader :api_key
@@ -18,15 +18,10 @@
# Sets patterns to +[FILTER]+ out sensitive data such as +/password/+, +/email/+ and +/credit_card_number/+
def filters=(*filters)
@filters = filters.flatten
end
- # @private
- def filters
- [@filters].flatten.compact
- end
-
# Posts an exception to hoptoad.
#
# @param [Exception] error the error to post
#
# @param [Hash] options
@@ -54,36 +49,10 @@
def post!(error, options={}, http_headers={})
options[:notifier_name] ||= 'Toadhopper'
post_document(document_for(error, options), {'X-Hoptoad-Client-Name' => options[:notifier_name]})
end
- # @private
- def post_document(document, headers={})
- uri = URI.parse("http://hoptoadapp.com:80/notifier_api/v2/notices")
- Net::HTTP.start(uri.host, uri.port) do |http|
- http.read_timeout = 5 # seconds
- http.open_timeout = 2 # seconds
- begin
- response = http.post uri.path,
- document,
- {'Content-type' => 'text/xml', 'Accept' => 'text/xml, application/xml'}.merge(headers)
- Response.new response.code.to_i,
- response.body,
- response.body.scan(%r{<error>(.+)<\/error>}).flatten
- rescue TimeoutError => e
- Response.new(500, '', ['Timeout error'])
- end
- end
- end
-
- # @private
- def document_for(exception, options={})
- data = document_data(exception, options)
- scope = OpenStruct.new(data).extend(ERB::Util)
- scope.instance_eval ERB.new(notice_template, nil, '-').src
- end
-
def document_defaults(error)
{
:error => error,
:api_key => api_key,
:environment => ENV.to_hash,
@@ -105,37 +74,62 @@
data = document_defaults(error).merge(options)
[:params, :session, :environment].each{|n| data[n] = clean(data[n]) if data[n] }
data
end
- # @private
+ private
+
+ def filters
+ [@filters].flatten.compact
+ end
+
+ def post_document(document, headers={})
+ uri = URI.parse("http://hoptoadapp.com:80/notifier_api/v2/notices")
+ Net::HTTP.start(uri.host, uri.port) do |http|
+ http.read_timeout = 5 # seconds
+ http.open_timeout = 2 # seconds
+ begin
+ response = http.post uri.path,
+ document,
+ {'Content-type' => 'text/xml', 'Accept' => 'text/xml, application/xml'}.merge(headers)
+ Response.new response.code.to_i,
+ response.body,
+ response.body.scan(%r{<error>(.+)<\/error>}).flatten
+ rescue TimeoutError => e
+ Response.new(500, '', ['Timeout error'])
+ end
+ end
+ end
+
+ def document_for(exception, options={})
+ data = document_data(exception, options)
+ scope = OpenStruct.new(data).extend(ERB::Util)
+ scope.instance_eval ERB.new(notice_template, nil, '-').src
+ end
+
def backtrace_line(line)
- Struct.new(:file, :number, :method).new(*line.match(%r{^([^:]+):(\d+)(?::in `([^']+)')?$}).captures)
+ Struct.new(:file, :number, :method).new(*line.match(%r{^(.+):(\d+)(?::in `([^']+)')?$}).captures)
end
- # @private
def notice_template
File.read(::File.join(::File.dirname(__FILE__), 'notice.erb'))
end
- # @private
def clean(hash)
hash.inject({}) do |acc, (k, v)|
acc[k] = (v.is_a?(Hash) ? clean(v) : filtered_value(k,v)) if serializable?(v)
acc
end
end
- # @private
def filtered_value(key, value)
if filters.any? {|f| key.to_s =~ Regexp.new(f)}
"[FILTERED]"
else
value
end
end
- # @private
def serializable?(value)
[Fixnum, Array, String, Hash, Bignum].any? {|c| value.is_a?(c)}
end
end