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 /lib | |
| parent | 54af5191fb6723e17f4427974a90488bfb341936 (diff) | |
| download | hcl-71edf6d36f0cbfe3580501456779082ae7166d51.tar.bz2 | |
improved harvest middleware
Diffstat (limited to 'lib')
| -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 |
5 files changed, 50 insertions, 18 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 |
