Add command line SDK page.
[arvados.git] / sdk / ruby / lib / arvados.rb
index f4941238c0e4fbed31bf23edc9e4df6381a87a4b..5d1f4897022dd8b1a9a7cdd358731270c0c2e629 100644 (file)
@@ -3,6 +3,7 @@ require 'google/api_client'
 require 'active_support/inflector'
 require 'json'
 require 'fileutils'
+require 'andand'
 
 ActiveSupport::Inflector.inflections do |inflect|
   inflect.irregular 'specimen', 'specimens'
@@ -78,7 +79,7 @@ class Arvados
         each do |method|
         class << klass; self; end.class_eval do
           define_method method.name do |*params|
-            self.api_exec(method.name.to_sym, *params)
+            self.api_exec method, *params
           end
         end
       end
@@ -86,7 +87,7 @@ class Arvados
       # Give the new class access to the API
       klass.instance_eval do
         @arvados = _arvados
-        # These should be pulled from the discovery document instead:
+        # TODO: Pull these from the discovery document instead.
         @api_models_sym = classname.underscore.split('/').last.pluralize.to_sym
         @api_model_sym = classname.underscore.split('/').last.to_sym
       end
@@ -186,15 +187,28 @@ class Arvados
       self.class.arvados.class.debuglog *args
     end
     def self.api_exec(method, parameters={})
+      api_method = arvados_api.send(api_models_sym).send(method.name.to_sym)
       parameters = parameters.
         merge(:api_token => arvados.config['ARVADOS_API_TOKEN'])
       parameters.each do |k,v|
         parameters[k] = v.to_json if v.is_a? Array or v.is_a? Hash
       end
+      # Look for objects expected by request.properties.(key).$ref and
+      # move them from parameters (query string) to request body.
+      body = nil
+      method.discovery_document['request'].
+        andand['properties'].
+        andand.each do |k,v|
+        if v.is_a? Hash and v['$ref']
+          body ||= {}
+          body[k] = parameters.delete k.to_sym
+        end
+      end
       result = client.
-        execute(:api_method => arvados_api.send(api_models_sym).send(method),
+        execute(:api_method => api_method,
                 :authenticated => false,
-                :parameters => parameters)
+                :parameters => parameters,
+                :body => body)
       resp = JSON.parse result.body, :symbolize_names => true
       if resp[:errors]
         raise Arvados::TransactionFailedError.new(resp[:errors])