summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorZack Hobson2013-12-22 18:10:22 -0800
committerZack Hobson2013-12-22 18:10:22 -0800
commit71edf6d36f0cbfe3580501456779082ae7166d51 (patch)
tree71b8c15a8891b75a06809b79bd6225d9399bbb27 /lib
parent54af5191fb6723e17f4427974a90488bfb341936 (diff)
downloadhcl-71edf6d36f0cbfe3580501456779082ae7166d51.tar.bz2
improved harvest middleware
Diffstat (limited to 'lib')
-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
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