diff options
| author | Zack Hobson | 2013-12-22 18:10:22 -0800 | 
|---|---|---|
| committer | Zack Hobson | 2013-12-22 18:10:22 -0800 | 
| commit | 71edf6d36f0cbfe3580501456779082ae7166d51 (patch) | |
| tree | 71b8c15a8891b75a06809b79bd6225d9399bbb27 | |
| parent | 54af5191fb6723e17f4427974a90488bfb341936 (diff) | |
| download | hcl-71edf6d36f0cbfe3580501456779082ae7166d51.tar.bz2 | |
improved harvest middleware
| -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 | 
