lib/dato/api_client.rb in dato-0.6.14 vs lib/dato/api_client.rb in dato-0.6.15
- old
+ new
@@ -70,17 +70,45 @@
request(*args)
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
puts e.message
raise e
rescue Faraday::ClientError => e
- error = ApiError.new(e)
- puts '===='
- puts error.message
- puts '===='
- raise error
+ if e.response[:status] == 429
+ to_wait = e.response[:headers]['x-ratelimit-reset'].to_i
+ puts "Rate limit exceeded, waiting #{to_wait} seconds..."
+ sleep(to_wait + 1)
+ request(*args)
+ elsif e.response[:status] == 422 && batch_data_validation?(e.response)
+ puts "Validating items, waiting 1 second and retrying..."
+ sleep(1)
+ request(*args)
+ else
+ error = ApiError.new(e)
+ puts "===="
+ puts error.message
+ puts "===="
+ raise error
+ end
end
private
+
+ def batch_data_validation?(response)
+ body = begin
+ JSON.parse(response[:body])
+ rescue JSON::ParserError => e
+ nil
+ end
+
+ return false unless body
+ return false unless body["data"]
+
+ body["data"].any? do |e|
+ e["attributes"]["code"] == "BATCH_DATA_VALIDATION_IN_PROGRESS"
+ end
+ rescue
+ false
+ end
def connection
default_headers = {
'Accept' => 'application/json',
'Content-Type' => 'application/json',