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