arvados-cli 0.1.20140620110538 → 0.1.20140623091138

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/arv +330 -144
  3. data/bin/arv-run-pipeline-instance +3 -1
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74ba2f2127c0e4953bdedb5716f56854e0ba24d6
4
- data.tar.gz: ece9bc2eda7ec8b73eb1bd29d361432d1ebbadab
3
+ metadata.gz: 80d7e95b8e15773381fcc4a5aa27bc0ab95ec956
4
+ data.tar.gz: e9f5f1bc71bcab04f424748c512ab47e9bcc5e14
5
5
  SHA512:
6
- metadata.gz: 2b5cb37ecf9075aeaacbde57a89c4c5a48440842232ea91bd611094201e892d5aa4a852a962d7e26fe93533ac3575c22d8f102c1a3ee58a94a362a5343d4d23e
7
- data.tar.gz: 7a737a5ce8d579f2e2521d8d9c45ad30be0eb9e4ef13f22c224abaabccc1c15f613ef9fddea6682051baf6345069658f3f2c28e17510d562593ffd4cf043fad0
6
+ metadata.gz: e518d49c4f69805654e8db45dbc9fb12a9c9340d8b11d9ffa082c880bec7e85254dd9cf940416dbe51642d5ac996398aebd97e135bd79951ff55f81b3475f1a0
7
+ data.tar.gz: 3ad86619afcd25ee9cecdf6936f46eca39b73d6c6e48baec9841e31ad2a3329fd3410426a6ab619aa2a2111ed68be0d78128298a9984c149a500c9c401cb7448
data/bin/arv CHANGED
@@ -12,75 +12,6 @@ if RUBY_VERSION < '1.9.3' then
12
12
  EOS
13
13
  end
14
14
 
15
- # read authentication data from arvados configuration file if present
16
- lineno = 0
17
- config_file = File.expand_path('~/.config/arvados/settings.conf')
18
- if File.exist? config_file then
19
- File.open(config_file, 'r').each do |line|
20
- lineno = lineno + 1
21
- # skip comments
22
- if line.match('^\s*#') then
23
- next
24
- end
25
- var, val = line.chomp.split('=', 2)
26
- # allow environment settings to override config files.
27
- if var and val
28
- ENV[var] ||= val
29
- else
30
- warn "#{config_file}: #{lineno}: could not parse `#{line}'"
31
- end
32
- end
33
- end
34
-
35
- case ARGV[0]
36
- when 'keep'
37
- ARGV.shift
38
- @sub = ARGV.shift
39
- if ['get', 'put', 'ls', 'normalize'].index @sub then
40
- # Native Arvados
41
- exec `which arv-#{@sub}`.strip, *ARGV
42
- elsif ['less', 'check'].index @sub then
43
- # wh* shims
44
- exec `which wh#{@sub}`.strip, *ARGV
45
- elsif @sub == 'docker'
46
- exec `which arv-keepdocker`.strip, *ARGV
47
- else
48
- puts "Usage: \n" +
49
- "#{$0} keep ls\n" +
50
- "#{$0} keep get\n" +
51
- "#{$0} keep put\n" +
52
- "#{$0} keep less\n" +
53
- "#{$0} keep check\n" +
54
- "#{$0} keep docker\n"
55
- end
56
- abort
57
- when 'pipeline'
58
- ARGV.shift
59
- @sub = ARGV.shift
60
- if ['run'].index @sub then
61
- exec `which arv-run-pipeline-instance`.strip, *ARGV
62
- else
63
- puts "Usage: \n" +
64
- "#{$0} pipeline run [...]\n" +
65
- "(see arv-run-pipeline-instance --help for details)\n"
66
- end
67
- abort
68
- when 'tag'
69
- ARGV.shift
70
- exec `which arv-tag`.strip, *ARGV
71
- when 'ws'
72
- ARGV.shift
73
- exec `which arv-ws`.strip, *ARGV
74
- end
75
-
76
- ENV['ARVADOS_API_VERSION'] ||= 'v1'
77
-
78
- if not ENV.include?('ARVADOS_API_HOST') or not ENV.include?('ARVADOS_API_TOKEN') then
79
- abort <<-EOS
80
- ARVADOS_API_HOST and ARVADOS_API_TOKEN need to be defined as environment variables.
81
- EOS
82
- end
83
-
84
15
  begin
85
16
  require 'curb'
86
17
  require 'rubygems'
@@ -97,11 +28,13 @@ rescue LoadError
97
28
 
98
29
  Please install all required gems:
99
30
 
100
- gem install activesupport andand curb google-api-client json oj trollop
31
+ gem install activesupport andand curb google-api-client json oj trollop yaml
101
32
 
102
33
  EOS
103
34
  end
104
35
 
36
+ # Search for 'ENTRY POINT' to see where things get going
37
+
105
38
  ActiveSupport::Inflector.inflections do |inflect|
106
39
  inflect.irregular 'specimen', 'specimens'
107
40
  inflect.irregular 'human', 'humans'
@@ -117,11 +50,6 @@ module Kernel
117
50
  end
118
51
  end
119
52
 
120
- # do this if you're testing with a dev server and you don't care about SSL certificate checks:
121
- if ENV['ARVADOS_API_HOST_INSECURE']
122
- suppress_warnings { OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE }
123
- end
124
-
125
53
  class Google::APIClient
126
54
  def discovery_document(api, version)
127
55
  api = api.to_s
@@ -154,21 +82,229 @@ class ArvadosClient < Google::APIClient
154
82
  end
155
83
  end
156
84
 
157
- begin
158
- client = ArvadosClient.new(:host => ENV['ARVADOS_API_HOST'], :application_name => 'arvados-cli', :application_version => '1.0')
159
- arvados = client.discovered_api('arvados', ENV['ARVADOS_API_VERSION'])
160
- rescue Exception => e
161
- puts "Failed to connect to Arvados API server: #{e}"
162
- exit 1
85
+ def init_config
86
+ # read authentication data from arvados configuration file if present
87
+ lineno = 0
88
+ config_file = File.expand_path('~/.config/arvados/settings.conf')
89
+ if File.exist? config_file then
90
+ File.open(config_file, 'r').each do |line|
91
+ lineno = lineno + 1
92
+ # skip comments
93
+ if line.match('^\s*#') then
94
+ next
95
+ end
96
+ var, val = line.chomp.split('=', 2)
97
+ # allow environment settings to override config files.
98
+ if var and val
99
+ ENV[var] ||= val
100
+ else
101
+ warn "#{config_file}: #{lineno}: could not parse `#{line}'"
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ subcommands = %w(keep pipeline tag ws edit)
108
+
109
+ def check_subcommands client, arvados, subcommand, global_opts, remaining_opts
110
+ case subcommand
111
+ when 'keep'
112
+ @sub = remaining_opts.shift
113
+ if ['get', 'put', 'ls', 'normalize'].index @sub then
114
+ # Native Arvados
115
+ exec `which arv-#{@sub}`.strip, *remaining_opts
116
+ elsif ['less', 'check'].index @sub then
117
+ # wh* shims
118
+ exec `which wh#{@sub}`.strip, *remaining_opts
119
+ elsif @sub == 'docker'
120
+ exec `which arv-keepdocker`.strip, *remaining_opts
121
+ else
122
+ puts "Usage: arv keep [method] [--parameters]\n"
123
+ puts "Use 'arv keep [method] --help' to get more information about specific methods.\n\n"
124
+ puts "Available methods: ls, get, put, less, check, docker"
125
+ end
126
+ abort
127
+ when 'pipeline'
128
+ sub = remaining_opts.shift
129
+ if sub == 'run'
130
+ exec `which arv-run-pipeline-instance`.strip, *remaining_opts
131
+ else
132
+ puts "Usage: arv pipeline [method] [--parameters]\n"
133
+ puts "Use 'arv pipeline [method] --help' to get more information about specific methods.\n\n"
134
+ puts "Available methods: run"
135
+ end
136
+ abort
137
+ when 'tag'
138
+ exec `which arv-tag`.strip, *remaining_opts
139
+ when 'ws'
140
+ exec `which arv-ws`.strip, *remaining_opts
141
+ when 'edit'
142
+ arv_edit client, arvados, global_opts, remaining_opts
143
+ end
144
+ end
145
+
146
+ def arv_edit client, arvados, global_opts, remaining_opts
147
+ n = remaining_opts.shift
148
+ if n.nil? or n == "-h" or n == "--help"
149
+ puts head_banner
150
+ puts "Usage: arv edit [uuid] [fields...]\n\n"
151
+ puts "Fetch the specified Arvados object, select the specified fields, \n"
152
+ puts "open an interactive text editor on a text representation (json or\n"
153
+ puts "yaml, use --format) and then update the object. Will use 'nano'\n"
154
+ puts "by default, customize with the EDITOR or VISUAL environment variable.\n"
155
+ exit 255
156
+ end
157
+
158
+ if not $stdout.tty?
159
+ puts "Not connected to a TTY, cannot run interactive editor."
160
+ exit 1
161
+ end
162
+
163
+ # determine controller
164
+
165
+ m = /([a-z0-9]{5})-([a-z0-9]{5})-([a-z0-9]{15})/.match n
166
+ if !m
167
+ if /^[a-f0-9]{32}/.match n
168
+ abort "Arvados collections are not editable."
169
+ else
170
+ abort "#{n} does not appear to be an Arvados uuid"
171
+ end
172
+ end
173
+
174
+ rsc = nil
175
+ arvados.discovery_document["resources"].each do |k,v|
176
+ klass = k.singularize.camelize
177
+ dig = Digest::MD5.hexdigest(klass).to_i(16).to_s(36)[-5..-1]
178
+ if dig == m[2]
179
+ rsc = k
180
+ end
181
+ end
182
+
183
+ if rsc.nil?
184
+ abort "Could not determine resource type #{m[2]}"
185
+ end
186
+
187
+ api_method = 'arvados.' + rsc + '.get'
188
+
189
+ result = client.execute(:api_method => eval(api_method),
190
+ :parameters => {"uuid" => n},
191
+ :authenticated => false,
192
+ :headers => {
193
+ authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']
194
+ })
195
+ begin
196
+ results = JSON.parse result.body
197
+ rescue JSON::ParserError => e
198
+ abort "Failed to parse server response:\n" + e.to_s
199
+ end
200
+
201
+ if remaining_opts.length > 0
202
+ results.select! { |k, v| remaining_opts.include? k }
203
+ end
204
+
205
+ content = ""
206
+
207
+ case global_opts[:format]
208
+ when 'json'
209
+ content = Oj.dump(results, :indent => 1)
210
+ when 'yaml'
211
+ content = results.to_yaml
212
+ end
213
+
214
+ require 'tempfile'
215
+
216
+ tmp = Tempfile.new([n, "." + global_opts[:format]])
217
+ tmp.write(content)
218
+ tmp.close
219
+
220
+ need_edit = true
221
+
222
+ while need_edit
223
+ pid = Process::fork
224
+ if pid.nil?
225
+ editor ||= ENV["VISUAL"]
226
+ editor ||= ENV["EDITOR"]
227
+ editor ||= "nano"
228
+ exec editor, tmp.path
229
+ else
230
+ Process.wait pid
231
+ end
232
+
233
+ if $?.exitstatus == 0
234
+ tmp.open
235
+ newcontent = tmp.read()
236
+
237
+ newobj = {}
238
+ begin
239
+ case global_opts[:format]
240
+ when 'json'
241
+ newobj = Oj.load(newcontent)
242
+ when 'yaml'
243
+ newobj = YAML.load(newcontent)
244
+ end
245
+ need_edit = false
246
+ rescue Exception => e
247
+ puts "Parse error! " + e.to_s
248
+ n = 1
249
+ newcontent.each_line do |line|
250
+ puts "#{n.to_s.rjust 4} #{line}"
251
+ n += 1
252
+ end
253
+ puts "\nTry again (y/n)? "
254
+ yn = $stdin.read 1
255
+ if yn == 'n' or yn == 'N'
256
+ exit 1
257
+ end
258
+ end
259
+ else
260
+ puts "Editor exited with status #{$?.exitstatus}"
261
+ exit $?.exitstatus
262
+ end
263
+ end
264
+
265
+ tmp.close(true)
266
+
267
+ if newobj != results
268
+ api_method = 'arvados.' + rsc + '.update'
269
+ dumped = Oj.dump(newobj)
270
+ result = client.execute(:api_method => eval(api_method),
271
+ :parameters => {"uuid" => n, rsc.singularize => dumped},
272
+ :authenticated => false,
273
+ :headers => {
274
+ authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']
275
+ })
276
+
277
+ begin
278
+ results = JSON.parse result.body
279
+ rescue JSON::ParserError => e
280
+ abort "Failed to parse server response:\n" + e.to_s
281
+ end
282
+
283
+ if result.response.status != 200
284
+ puts "Update failed. Server responded #{result.response.status}: #{results['errors']} "
285
+ puts "Update body was:"
286
+ puts dumped
287
+ end
288
+ else
289
+ puts "Object is unchanged, did not update."
290
+ end
291
+
292
+ exit 0
163
293
  end
164
294
 
165
295
  def to_boolean(s)
166
296
  !!(s =~ /^(true|t|yes|y|1)$/i)
167
297
  end
168
298
 
299
+ def head_banner
300
+ "Arvados command line client\n"
301
+ end
302
+
169
303
  def help_methods(discovery_document, resource, method=nil)
170
- banner = "\n"
171
- banner += "The #{resource} resource type supports the following methods:"
304
+ banner = head_banner
305
+ banner += "Usage: arv #{resource} [method] [--parameters]\n"
306
+ banner += "Use 'arv #{resource} [method] --help' to get more information about specific methods.\n\n"
307
+ banner += "The #{resource} resource supports the following methods:"
172
308
  banner += "\n\n"
173
309
  discovery_document["resources"][resource.pluralize]["methods"].
174
310
  each do |k,v|
@@ -182,28 +318,15 @@ def help_methods(discovery_document, resource, method=nil)
182
318
  banner += "\n"
183
319
  STDERR.puts banner
184
320
 
185
- if not method.nil? and method != '--help' then
186
- Trollop::die ("Unknown method #{method.inspect} " +
187
- "for resource #{resource.inspect}")
321
+ if not method.nil? and method != '--help' and method != '-h' then
322
+ abort "Unknown method #{method.inspect} " +
323
+ "for resource #{resource.inspect}"
188
324
  end
189
325
  exit 255
190
326
  end
191
327
 
192
- def help_resources(discovery_document, resource)
193
- banner = "\n"
194
- banner += "This Arvados instance supports the following resource types:"
195
- banner += "\n\n"
196
- discovery_document["resources"].each do |k,v|
197
- description = ''
198
- resource_info = discovery_document["schemas"][k.singularize.capitalize]
199
- if resource_info and resource_info.include?('description')
200
- # add only the first line of the discovery doc description
201
- description = ' ' + resource_info["description"].split("\n").first.chomp
202
- end
203
- banner += " #{sprintf("%30s",k.singularize)}#{description}\n"
204
- end
205
- banner += "\n"
206
- STDERR.puts banner
328
+ def help_resources(option_parser, discovery_document, resource)
329
+ option_parser.educate
207
330
 
208
331
  if not resource.nil? and resource != '--help' then
209
332
  Trollop::die "Unknown resource type #{resource.inspect}"
@@ -211,15 +334,21 @@ def help_resources(discovery_document, resource)
211
334
  exit 255
212
335
  end
213
336
 
214
- def parse_arguments(discovery_document)
337
+ def parse_arguments(discovery_document, subcommands)
215
338
  resource_types = Array.new()
216
339
  discovery_document["resources"].each do |k,v|
217
340
  resource_types << k.singularize
218
341
  end
219
342
 
220
- global_opts = Trollop::options do
343
+ resource_types += subcommands
344
+
345
+ option_parser = Trollop::Parser.new do
221
346
  version __FILE__
222
- banner "arv: the Arvados CLI tool"
347
+ banner head_banner
348
+ banner "Usage: arv [--flags] subcommand|resource [method] [--parameters]"
349
+ banner ""
350
+ banner "Available flags:"
351
+
223
352
  opt :dry_run, "Don't actually do anything", :short => "-n"
224
353
  opt :verbose, "Print some things on stderr"
225
354
  opt :format,
@@ -227,11 +356,26 @@ def parse_arguments(discovery_document)
227
356
  :type => :string,
228
357
  :default => 'json'
229
358
  opt :short, "Return only UUIDs (equivalent to --format=uuid)"
230
- opt :resources, "Display list of resources known to this Arvados instance."
359
+
360
+ banner ""
361
+ banner "Use 'arv subcommand|resource --help' to get more information about a particular command or resource."
362
+ banner ""
363
+ banner "Available subcommands: #{subcommands.join(', ')}"
364
+ banner ""
365
+
366
+ banner "Available resources: #{discovery_document['resources'].keys.map { |k| k.singularize }.join(', ')}"
367
+
368
+ banner ""
369
+ banner "Additional options:"
370
+
231
371
  conflicts :short, :format
232
372
  stop_on resource_types
233
373
  end
234
374
 
375
+ global_opts = Trollop::with_standard_exception_handling option_parser do
376
+ o = option_parser.parse ARGV
377
+ end
378
+
235
379
  unless %w(json yaml uuid).include?(global_opts[:format])
236
380
  $stderr.puts "#{$0}: --format must be one of json, yaml or uuid."
237
381
  $stderr.puts "Use #{$0} --help for more information."
@@ -243,59 +387,101 @@ def parse_arguments(discovery_document)
243
387
  end
244
388
 
245
389
  resource = ARGV.shift
246
- if global_opts[:resources] or not resource_types.include?(resource)
247
- help_resources(discovery_document, resource)
248
- end
249
390
 
250
- method = ARGV.shift
251
- if not (discovery_document["resources"][resource.pluralize]["methods"].
252
- include?(method))
253
- help_methods(discovery_document, resource, method)
254
- end
391
+ if not subcommands.include? resource
392
+ if not resource_types.include?(resource)
393
+ puts "Resource or subcommand '#{resource}' is not recognized.\n\n"
394
+ help_resources(option_parser, discovery_document, resource)
395
+ end
255
396
 
256
- discovered_params = discovery_document\
397
+ method = ARGV.shift
398
+ if not (discovery_document["resources"][resource.pluralize]["methods"].
399
+ include?(method))
400
+ help_methods(discovery_document, resource, method)
401
+ end
402
+
403
+ discovered_params = discovery_document\
257
404
  ["resources"][resource.pluralize]\
258
405
  ["methods"][method]["parameters"]
259
- method_opts = Trollop::options do
260
- discovered_params.each do |k,v|
261
- opts = Hash.new()
262
- opts[:type] = v["type"].to_sym if v.include?("type")
263
- if [:datetime, :text, :object, :array].index opts[:type]
264
- opts[:type] = :string # else trollop bork
406
+ method_opts = Trollop::options do
407
+ banner head_banner
408
+ banner "Usage: arv #{resource} #{method} [--parameters]"
409
+ banner ""
410
+ banner "This method supports the following parameters:"
411
+ banner ""
412
+ discovered_params.each do |k,v|
413
+ opts = Hash.new()
414
+ opts[:type] = v["type"].to_sym if v.include?("type")
415
+ if [:datetime, :text, :object, :array].index opts[:type]
416
+ opts[:type] = :string # else trollop bork
417
+ end
418
+ opts[:default] = v["default"] if v.include?("default")
419
+ opts[:default] = v["default"].to_i if opts[:type] == :integer
420
+ opts[:default] = to_boolean(v["default"]) if opts[:type] == :boolean
421
+ opts[:required] = true if v.include?("required") and v["required"]
422
+ description = ''
423
+ description = ' ' + v["description"] if v.include?("description")
424
+ opt k.to_sym, description, opts
265
425
  end
266
- opts[:default] = v["default"] if v.include?("default")
267
- opts[:default] = v["default"].to_i if opts[:type] == :integer
268
- opts[:default] = to_boolean(v["default"]) if opts[:type] == :boolean
269
- opts[:required] = true if v.include?("required") and v["required"]
270
- description = ''
271
- description = ' ' + v["description"] if v.include?("description")
272
- opt k.to_sym, description, opts
273
- end
274
- body_object = discovery_document["resources"][resource.pluralize]["methods"][method]["request"]
275
- if body_object and discovered_params[resource].nil?
276
- is_required = true
277
- if body_object["required"] == false
278
- is_required = false
426
+
427
+ body_object = discovery_document["resources"][resource.pluralize]["methods"][method]["request"]
428
+ if body_object and discovered_params[resource].nil?
429
+ is_required = true
430
+ if body_object["required"] == false
431
+ is_required = false
432
+ end
433
+ opt resource.to_sym, "#{resource} (request body)", {
434
+ required: is_required,
435
+ type: :string
436
+ }
279
437
  end
280
- opt resource.to_sym, "#{resource} (request body)", {
281
- required: is_required,
282
- type: :string
283
- }
284
438
  end
285
- end
286
439
 
287
- discovered_params.each do |k,v|
288
- k = k.to_sym
289
- if ['object', 'array'].index(v["type"]) and method_opts.has_key? k
290
- if method_opts[k].andand.match /^\//
291
- method_opts[k] = File.open method_opts[k], 'rb' do |f| f.read end
440
+ discovered_params.each do |k,v|
441
+ k = k.to_sym
442
+ if ['object', 'array'].index(v["type"]) and method_opts.has_key? k
443
+ if method_opts[k].andand.match /^\//
444
+ method_opts[k] = File.open method_opts[k], 'rb' do |f| f.read end
445
+ end
292
446
  end
293
447
  end
294
448
  end
449
+
295
450
  return resource, method, method_opts, global_opts, ARGV
296
451
  end
297
452
 
298
- resource_schema, method, method_opts, global_opts, remaining_opts = parse_arguments(arvados.discovery_document)
453
+ #
454
+ # ENTRY POINT
455
+ #
456
+
457
+ init_config
458
+
459
+ ENV['ARVADOS_API_VERSION'] ||= 'v1'
460
+
461
+ if not ENV.include?('ARVADOS_API_HOST') or not ENV.include?('ARVADOS_API_TOKEN') then
462
+ abort <<-EOS
463
+ ARVADOS_API_HOST and ARVADOS_API_TOKEN need to be defined as environment variables.
464
+ EOS
465
+ end
466
+
467
+ # do this if you're testing with a dev server and you don't care about SSL certificate checks:
468
+ if ENV['ARVADOS_API_HOST_INSECURE']
469
+ suppress_warnings { OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE }
470
+ end
471
+
472
+ begin
473
+ client = ArvadosClient.new(:host => ENV['ARVADOS_API_HOST'], :application_name => 'arvados-cli', :application_version => '1.0')
474
+ arvados = client.discovered_api('arvados', ENV['ARVADOS_API_VERSION'])
475
+ rescue Exception => e
476
+ puts "Failed to connect to Arvados API server: #{e}"
477
+ exit 1
478
+ end
479
+
480
+ # Parse arguments here
481
+ resource_schema, method, method_opts, global_opts, remaining_opts = parse_arguments(arvados.discovery_document, subcommands)
482
+
483
+ check_subcommands client, arvados, resource_schema, global_opts, remaining_opts
484
+
299
485
  controller = resource_schema.pluralize
300
486
 
301
487
  api_method = 'arvados.' + controller + '.' + method
@@ -187,7 +187,9 @@ if $options[:instance]
187
187
  abort "#{$0}: syntax error: --instance cannot be combined with --template or --submit."
188
188
  end
189
189
  elsif not $options[:template]
190
- abort "#{$0}: syntax error: you must supply a --template or --instance."
190
+ puts "error: you must supply a --template or --instance."
191
+ p.educate
192
+ abort
191
193
  end
192
194
 
193
195
  if $options[:run_here] == $options[:submit]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arvados-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20140620110538
4
+ version: 0.1.20140623091138
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arvados Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-20 00:00:00.000000000 Z
11
+ date: 2014-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arvados
@@ -146,7 +146,7 @@ dependencies:
146
146
  - - "~>"
147
147
  - !ruby/object:Gem::Version
148
148
  version: '0.8'
149
- description: This is the Arvados SDK CLI gem, git revision c9c800c1e520dc6ae2e6fe9b3c40e15db7935635
149
+ description: This is the Arvados SDK CLI gem, git revision cdd94fae8d40ad6dcee3de5d36de2d89921fd12d
150
150
  email: gem-dev@curoverse.com
151
151
  executables:
152
152
  - arv