summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZack Hobson2013-12-22 18:10:22 -0800
committerZack Hobson2013-12-22 18:10:22 -0800
commit71edf6d36f0cbfe3580501456779082ae7166d51 (patch)
tree71b8c15a8891b75a06809b79bd6225d9399bbb27
parent54af5191fb6723e17f4427974a90488bfb341936 (diff)
downloadhcl-71edf6d36f0cbfe3580501456779082ae7166d51.tar.bz2
improved harvest middleware
-rw-r--r--lib/hcl/app.rb6
-rw-r--r--lib/hcl/day_entry.rb2
-rw-r--r--lib/hcl/harvest_middleware.rb49
-rw-r--r--lib/hcl/task.rb2
-rw-r--r--lib/hcl/timesheet_resource.rb9
-rw-r--r--test/app_test.rb6
-rw-r--r--test/day_entry_test.rb2
-rw-r--r--test/timesheet_resource_test.rb9
8 files changed, 60 insertions, 25 deletions
diff --git a/lib/hcl/app.rb b/lib/hcl/app.rb
index 1bceab8..671575c 100644
--- a/lib/hcl/app.rb
+++ b/lib/hcl/app.rb
@@ -62,15 +62,15 @@ module HCl
rescue SocketError => e
$stderr.puts "Connection failed. (#{e.message})"
exit 1
- rescue TimesheetResource::ThrottleFailure => e
+ rescue HarvestMiddleware::ThrottleFailure => e
$stderr.puts "Too many requests, retrying in #{e.retry_after+5} seconds..."
sleep e.retry_after+5
run
- rescue TimesheetResource::AuthFailure => e
+ rescue HarvestMiddleware::AuthFailure => e
$stderr.puts "Unable to authenticate: #{e}"
request_config
run
- rescue TimesheetResource::Failure => e
+ rescue HarvestMiddleware::Failure => e
$stderr.puts "API failure: #{e}"
exit 1
end
diff --git a/lib/hcl/day_entry.rb b/lib/hcl/day_entry.rb
index bd14be8..6441f1d 100644
--- a/lib/hcl/day_entry.rb
+++ b/lib/hcl/day_entry.rb
@@ -22,7 +22,7 @@ module HCl
def cancel
begin
DayEntry.delete("daily/delete/#{id}")
- rescue TimesheetResource::Failure
+ rescue HarvestMiddleware::Failure
return false
end
true
diff --git a/lib/hcl/harvest_middleware.rb b/lib/hcl/harvest_middleware.rb
index 2be04bc..87cdb27 100644
--- a/lib/hcl/harvest_middleware.rb
+++ b/lib/hcl/harvest_middleware.rb
@@ -3,7 +3,51 @@ require 'multi_json'
require 'cgi'
class HCl::HarvestMiddleware < FaradayMiddleware::ResponseMiddleware
- def self.unescape obj
+ class Failure < StandardError; end
+ class AuthFailure < StandardError; end
+ class ThrottleFailure < StandardError
+ attr_reader :retry_after
+ def initialize env
+ @retry_after = env[:headers]['Retry-After'].to_i
+ super "Too many requests! Try again in #{@retry_after} seconds."
+ end
+ end
+
+ define_parser do |body|
+ unescape MultiJson.load(body, symbolize_keys:true)
+ end
+
+ def call(env)
+ @app.call(env).on_complete do |env|
+ case env[:status]
+ when 200..299
+ env[:body] = unescape MultiJson.load(env[:body], symbolize_keys:true)
+ when 300..399
+ raise Failure, "Redirected! Perhaps your ssl configuration variable is set incorrectly?"
+ when 400..499
+ raise AuthFailure, "Login failed."
+ when 503
+ raise ThrottleFailure, env
+ else
+ raise Failure, "Unexpected response from the upstream API."
+ end
+ end
+ end
+
+ # case response
+ # when Net::HTTPSuccess
+ # response.body
+ # when Net::HTTPFound
+ # raise Failure, "Redirected! Perhaps your ssl configuration variable is set incorrectly?"
+ # when Net::HTTPServiceUnavailable
+ # raise ThrottleFailure, response
+ # when Net::HTTPUnauthorized
+ # raise AuthFailure, "Login failed."
+ # else
+ # raise Failure, "Unexpected response from the upstream API."
+ # end
+
+ def unescape obj
if obj.kind_of? Hash
obj.inject({}){|o,(k,v)| o[k] = unescape(v);o}
elsif obj.kind_of? Array
@@ -13,7 +57,4 @@ class HCl::HarvestMiddleware < FaradayMiddleware::ResponseMiddleware
end
end
- define_parser do |body|
- unescape MultiJson.load(body, symbolize_keys:true)
- end
end
diff --git a/lib/hcl/task.rb b/lib/hcl/task.rb
index 78efa62..7678655 100644
--- a/lib/hcl/task.rb
+++ b/lib/hcl/task.rb
@@ -64,7 +64,7 @@ module HCl
if day.running?
day
else
- DayEntry.new Task.get("daily/timer/#{day.id}")[:day_entries].first
+ DayEntry.new Task.get("daily/timer/#{day.id}")
end
end
end
diff --git a/lib/hcl/timesheet_resource.rb b/lib/hcl/timesheet_resource.rb
index ff25c01..c82e7ed 100644
--- a/lib/hcl/timesheet_resource.rb
+++ b/lib/hcl/timesheet_resource.rb
@@ -5,15 +5,6 @@ require 'faraday_middleware'
module HCl
class TimesheetResource
- class Failure < StandardError; end
- class AuthFailure < StandardError; end
- class ThrottleFailure < StandardError
- attr_reader :retry_after
- def initialize response
- @retry_after = response.headers['Retry-After'].to_i
- super "Too many requests! Try again in #{@retry_after} seconds."
- end
- end
def self.configure opts = nil
if opts
diff --git a/test/app_test.rb b/test/app_test.rb
index 68e3782..19678fd 100644
--- a/test/app_test.rb
+++ b/test/app_test.rb
@@ -23,7 +23,7 @@ class AppTest < HCl::TestCase
app = HCl::App.new
throttled = states('throttled').starts_as(false)
app.expects(:show).
- raises(HCl::TimesheetResource::ThrottleFailure, stub(headers:{'Retry-After' => 42})).
+ raises(HCl::HarvestMiddleware::ThrottleFailure, {headers:{'Retry-After' => 42}}).
then(throttled.is(true))
app.expects(:sleep).with(47).when(throttled.is(true))
app.expects(:show).when(throttled.is(true))
@@ -48,7 +48,7 @@ class AppTest < HCl::TestCase
def test_configure_on_auth_failure
app = HCl::App.new
configured = states('configured').starts_as(false)
- app.expects(:show).raises(HCl::TimesheetResource::AuthFailure).when(configured.is(false))
+ app.expects(:show).raises(HCl::HarvestMiddleware::AuthFailure).when(configured.is(false))
app.expects(:ask).returns('xxx').times(4).when(configured.is(false))
app.expects(:write_config).then(configured.is(true))
app.expects(:show).when(configured.is(true))
@@ -58,7 +58,7 @@ class AppTest < HCl::TestCase
def test_api_failure
app = HCl::App.new
- app.expects(:show).raises(HCl::TimesheetResource::Failure)
+ app.expects(:show).raises(HCl::HarvestMiddleware::Failure)
app.expects(:exit).with(1)
app.process_args('show').run
assert_match /API failure/i, error_output
diff --git a/test/day_entry_test.rb b/test/day_entry_test.rb
index 1df4cba..ec2abe2 100644
--- a/test/day_entry_test.rb
+++ b/test/day_entry_test.rb
@@ -9,7 +9,7 @@ class DayEntryTest < HCl::TestCase
def test_cancel_failure
entry = HCl::DayEntry.new(id:123)
- HCl::DayEntry.expects(:delete).raises(HCl::TimesheetResource::Failure)
+ HCl::DayEntry.expects(:delete).raises(HCl::HarvestMiddleware::Failure)
assert !entry.cancel
end
diff --git a/test/timesheet_resource_test.rb b/test/timesheet_resource_test.rb
index 4153429..1f1b1de 100644
--- a/test/timesheet_resource_test.rb
+++ b/test/timesheet_resource_test.rb
@@ -19,19 +19,22 @@ class TimesheetResourceTest < HCl::TestCase
end
def test_http_get
- FakeWeb.register_uri(:get, "https://bob:secret@bobclock.harvestapp.com/foo", :body => 'gotten!')
+ FakeWeb.register_uri(:get, "https://bob:secret@bobclock.harvestapp.com/foo",
+ :body => 'gotten!'.inspect)
body = HCl::TimesheetResource.get 'foo'
assert_equal 'gotten!', body
end
def test_http_post
- FakeWeb.register_uri(:post, "https://bob:secret@bobclock.harvestapp.com/foo", :body => 'posted!')
+ FakeWeb.register_uri(:post, "https://bob:secret@bobclock.harvestapp.com/foo",
+ :body => 'posted!'.inspect)
body = HCl::TimesheetResource.post 'foo', {pizza:'taco'}
assert_equal 'posted!', body
end
def test_http_delete
- FakeWeb.register_uri(:delete, "https://bob:secret@bobclock.harvestapp.com/foo", :body => 'wiped!')
+ FakeWeb.register_uri(:delete, "https://bob:secret@bobclock.harvestapp.com/foo",
+ :body => 'wiped!'.inspect)
body = HCl::TimesheetResource.delete 'foo'
assert_equal 'wiped!', body
end