diff --git a/lib/opencpu/client.rb b/lib/opencpu/client.rb index 3e05f93..c93a567 100644 --- a/lib/opencpu/client.rb +++ b/lib/opencpu/client.rb @@ -107,7 +107,8 @@ def request_options(data, format) end def function_url(package, function, user = :system, github_remote = false, format = nil) - "#{package_url(package, user, github_remote)}/R/#{function}/#{format.to_s}" + "#{package_url(package, user, github_remote)}/#{function}/#{format.to_s}" + # "#{package_url(package, user, github_remote)}/R/#{function}/#{format.to_s}" end def package_url(package, user = :system, github_remote = false) diff --git a/lib/opencpu/delayed_calculation.rb b/lib/opencpu/delayed_calculation.rb index b585570..1ac8ab1 100644 --- a/lib/opencpu/delayed_calculation.rb +++ b/lib/opencpu/delayed_calculation.rb @@ -3,6 +3,7 @@ class UnsupportedFormatError < StandardError; end class ResponseNotAvailableError < StandardError; end class DelayedCalculation + include Errors include HTTMultiParty attr_accessor :location @@ -50,8 +51,50 @@ def info process_resource @available_resources[:info].to_s end + def keys + @available_resources.keys + end + + # available_resources(:"R/foo") + def available_resources(key) + raise ResponseNotAvailableError unless @available_resources.has_key?(key) + process_resource @available_resources[key].to_s + end + + def process_resources(key, options = {}) + options = { + user: :system, + format: :json, + data: {} + }.merge(options) + + raise ResponseNotAvailableError unless @available_resources.has_key?(key) + url = @available_resources[key].to_s + data = options[:data] + format = options[:format] + + process_query url, data, format do |response| + location = response.headers['location'] + resources = response.body.split(/\n/) + OpenCPU::DelayedCalculation.new(location, resources) + end + end + private + def process_query(url, data, format, &block) + return fake_response_for(url) if OpenCPU.test_mode? + + response = self.class.post(url, request_options(data, format)) + + case response.code + when 200..201 + return yield(response) + else + fail error_class_for(response.code), "#{response.code}:\n #{response.body}" + end + end + def process_resource(resource) response = self.class.get resource if response.ok? @@ -83,5 +126,40 @@ def key(uri, location) key = :graphics if key =~ /graphics\/\d/ key.to_sym end + + def request_options(data, format) + options = { + verify: OpenCPU.configuration.verify_ssl + } + + case format + when :json + options[:body] = data.to_json if data + options[:headers] = {"Content-Type" => 'application/json'} + when :urlencoded + options[:query] = data if data + end + + if OpenCPU.configuration.username && OpenCPU.configuration.password + options[:basic_auth] = { + username: OpenCPU.configuration.username, password: OpenCPU.configuration.password + } + end + options + end + + def error_class_for(response_code) + case response_code + when 403 + AccessDenied + when 400..499 + BadRequest + when 500..599 + InternalServerError + else + OpenCPUError + end + end end + end diff --git a/lib/opencpu/version.rb b/lib/opencpu/version.rb index 9b248db..5a1b744 100644 --- a/lib/opencpu/version.rb +++ b/lib/opencpu/version.rb @@ -1,6 +1,6 @@ module OpenCPU MAJOR = 0 - MINOR = 11 + MINOR = 12 TINY = 0 VERSION = [MAJOR, MINOR, TINY].join('.') end