diff options
| -rw-r--r-- | lib/hcl/app.rb | 6 | ||||
| -rw-r--r-- | lib/hcl/day_entry.rb | 2 | ||||
| -rw-r--r-- | lib/hcl/harvest_middleware.rb | 49 | ||||
| -rw-r--r-- | lib/hcl/task.rb | 2 | ||||
| -rw-r--r-- | lib/hcl/timesheet_resource.rb | 9 | ||||
| -rw-r--r-- | test/app_test.rb | 6 | ||||
| -rw-r--r-- | test/day_entry_test.rb | 2 | ||||
| -rw-r--r-- | test/timesheet_resource_test.rb | 9 |
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 |
