8087: implements reading of request body from file
authorJoshua Randall <joshua.randall@sanger.ac.uk>
Mon, 22 Feb 2016 21:30:09 +0000 (21:30 +0000)
committerJoshua C. Randall <jcrandall@alum.mit.edu>
Mon, 22 Feb 2016 21:53:01 +0000 (21:53 +0000)
Attempts to parse the provided request body value as JSON. If
JSON parsing fails, assume it is a filename (or '-' for stdin)
and read the request body from that file instead.

sdk/cli/bin/arv

index 185a5b0673f1dc1c5afc5ed6530386d8255daaf4..6811a4473fe0cc82571f60bb5b0cd52ce61c562a 100755 (executable)
@@ -559,7 +559,11 @@ def parse_arguments(discovery_document, subcommands)
         if body_object["required"] == false
           is_required = false
         end
-        opt resource.to_sym, "#{resource} (request body)", {
+        _resource_opt_desc = "Either a string representing #{resource} as JSON or a filename from which to read #{resource} JSON (use '-' to read from stdin)."
+        if is_required
+          _resource_opt_desc += " This option must be specified."
+        end
+        opt resource.to_sym, _resource_opt_desc, {
           required: is_required,
           type: :string
         }
@@ -625,6 +629,25 @@ end
 request_parameters = {_profile:true}.merge(method_opts)
 resource_body = request_parameters.delete(resource_schema.to_sym)
 if resource_body
+  # check if resource_body is valid JSON by attempting to parse it
+  _is_json = true
+  begin
+    # we don't actually need the results of the parsing, 
+    # just checking for the JSON::ParserError exception
+    JSON.parse resource_body
+  rescue JSON::ParserError => e
+    _is_json = false
+  end
+  if !_is_json
+    # if resource_body is not valid JSON, it should be a filename (or '-' for stdin)
+    if resource_body == '-'
+      _resource_body_file = $stdin
+    else
+      _resource_body_file = File.open(resource_body, 'r')
+    end
+    resource_body = _resource_body_file.read()
+    _resource_body_file.close()
+  end
   request_body = {
     resource_schema => resource_body
   }