Commit b82e2b6
Changed files (8)
bin
lib
spec
bin/urkel
lib/urkel/configuration.rb
@@ -0,0 +1,23 @@
+module Urkel
+ class Configuration
+ attr_reader :uri, :api_key
+
+ def initialize(api_host, api_key)
+ @uri = URI.parse(api_host)
+ @api_key = api_key
+ end
+
+ def request(request)
+ request['authorization'] = "Token token=#{api_key}"
+ http_connection.request(request)
+ end
+
+ private
+
+ def http_connection
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = (uri.scheme == "https")
+ http
+ end
+ end
+end
lib/urkel/connection.rb
@@ -0,0 +1,31 @@
+module Urkel
+ class Connection
+ API_ENDPOINT="/api/v1/failures"
+
+ def initialize(configuration)
+ @configuration = configuration
+ end
+
+ def publish(error)
+ response = @configuration.request(request_for(error))
+ response.is_a?(Net::HTTPOK)
+ end
+
+ private
+
+ def request_for(error)
+ Net::HTTP::Post.new(API_ENDPOINT).tap do |request|
+ request.set_form_data(form_payload_for(error))
+ end
+ end
+
+ def form_payload_for(error)
+ {
+ "error[message]" => error.message,
+ "error[hostname]" => Socket.gethostname,
+ "error[error_type]" => error.class.name,
+ "error[backtrace]" => error.backtrace,
+ }
+ end
+ end
+end
lib/urkel.rb
@@ -1,5 +1,7 @@
require "urkel/version"
+require 'net/http'
+require 'urkel/configuration'
+require 'urkel/connection'
module Urkel
- # Your code goes here...
end
spec/lib/urkel/connection_spec.rb
@@ -0,0 +1,37 @@
+require 'spec_helper'
+
+module Urkel
+ describe Connection do
+ subject { Connection.new(configuration) }
+
+ describe "#publish" do
+ let(:error) do
+ begin
+ 1/0
+ rescue => error
+ error
+ end
+ end
+
+ context "given proper credentials" do
+ let(:configuration) { Configuration.new('http://localhost:3000', '02513a35-b875-40a1-a1fc-f2d2582bdcc5') }
+ let(:hostname) { Socket.gethostname }
+
+ it 'publishes a new error' do
+ stub_request(:post, "http://localhost:3000/api/v1/failures").
+ with(body: {
+ "error"=>
+ {
+ "message" => error.message,
+ "hostname" => hostname,
+ "error_type" => error.class.name,
+ "backtrace" => error.backtrace
+ }
+ }, :headers => { 'Authorization'=>'Token token=02513a35-b875-40a1-a1fc-f2d2582bdcc5' })
+ .to_return(status: 200, body: "", headers: {})
+ expect(subject.publish(error)).to be_truthy
+ end
+ end
+ end
+ end
+end
spec/spec_helper.rb
@@ -1,2 +1,3 @@
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'urkel'
+require 'webmock/rspec'
spec/urkel_spec.rb
@@ -5,7 +5,13 @@ describe Urkel do
expect(Urkel::VERSION).not_to be nil
end
- it 'does something useful' do
- expect(false).to eq(true)
+ describe ".oops" do
+ it 'publishes a new error' do
+ Urkel.configure do |configuration|
+ configuration.api_host = 'http://localhost:3000'
+ configuration.api_key = '02513a35-b875-40a1-a1fc-f2d2582bdcc5'
+ end
+ Urkel.oops(error)
+ end
end
end
urkel.gemspec
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
spec.add_development_dependency "bundler", "~> 1.7"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency "rspec"
+ spec.add_development_dependency "webmock"
end