end
begin
- require 'curb'
- require 'rubygems'
- require 'arvados/google_api_client'
require 'json'
+ require 'net/http'
require 'pp'
- require 'trollop'
+ require 'tempfile'
+ require 'yaml'
+rescue LoadError => error
+ abort "Error loading libraries: #{error}\n"
+end
+
+begin
+ require 'rubygems'
+ # Load the gems with more requirements first, so we respect any version
+ # constraints they put on gems loaded later.
+ require 'arvados/google_api_client'
+ require 'active_support/inflector'
require 'andand'
+ require 'curb'
require 'oj'
- require 'active_support/inflector'
- require 'yaml'
- require 'tempfile'
- require 'net/http'
-rescue LoadError
+ require 'trollop'
+rescue LoadError => error
abort <<-EOS
+Error loading gems: #{error}
+
Please install all required gems:
- gem install activesupport andand curb google-api-client json oj trollop yaml
+ gem install arvados activesupport andand curb json oj trollop
EOS
end
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
}
end
end
- discovered_params.each do |k,v|
+ discovered_params.merge({resource => {'type' => 'object'}}).each do |k,v|
k = k.to_sym
if ['object', 'array'].index(v["type"]) and method_opts.has_key? k
if method_opts[k].andand.match /^\//
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
+ resource_body_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
+ resource_body_is_json = false
+ end
+ resource_body_is_readable_file = false
+ # if resource_body is not valid JSON, it should be a filename (or '-' for stdin)
+ if resource_body == '-'
+ resource_body_is_readable_file = true
+ resource_body_file = $stdin
+ elsif File.readable? resource_body
+ resource_body_is_readable_file = true
+ resource_body_file = File.open(resource_body, 'r')
+ end
+ if resource_body_is_json and resource_body_is_readable_file
+ abort "Argument specified for option '--#{resource_schema.to_sym}' is both valid JSON and a readable file. Please consider renaming the file: '#{resource_body}'"
+ elsif !resource_body_is_json and !resource_body_is_readable_file
+ if File.exists? resource_body
+ # specified file exists but is not readable
+ abort "Argument specified for option '--#{resource_schema.to_sym}' is an existing file but is not readable. Please check permissions on: '#{resource_body}'"
+ else
+ # specified file does not exist
+ abort "Argument specified for option '--#{resource_schema.to_sym}' is neither valid JSON nor an existing file: '#{resource_body}'"
+ end
+ elsif resource_body_is_readable_file
+ resource_body = resource_body_file.read()
+ 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
+ abort "Contents of file '#{resource_body_file.path}' is not valid JSON: #{e}"
+ end
+ resource_body_file.close()
+ end
request_body = {
resource_schema => resource_body
}