arvados-cli 0.1.20141010134550 → 0.1.20141014153331

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/arv +182 -63
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a97c51480ca61d8c9937eec9c154d6bca7479736
4
- data.tar.gz: f449dd972b1f22d1b3af13218c3fa7c1f68f8813
3
+ metadata.gz: b4d8052affebd48f1d77d61bd70dba5f93963eb6
4
+ data.tar.gz: 192d67d32736a74c3e6db81f8dde6cbdf1780b88
5
5
  SHA512:
6
- metadata.gz: 34d991922c34da39921a1a1e01c8b38080844b2f6faf73ea9ffbde94f510001620223d2a0fe2ed25a3b51f49c6a90562cb9e38cb93efb97a67a7dff8238863e3
7
- data.tar.gz: 5797994d01809703171b1078cc5c43d6b93e8456ab02325b0ccd25cb3529ea465794bcd429ba59668db9a1878aa0b7f5b380440478a89f20cad6d89da20ff9c6
6
+ metadata.gz: fe4b9d47027b58979ff8ec74bad832ae3e7c2824ce3a08b315b0db912d72cf1f7b064b2f38975ae6d25bb6b743e45c5bd94ef021c183e9baf770e74e1feace92
7
+ data.tar.gz: 9811ea9a89dccfa5d544a3bc45c58e86d49d6f64ff2d2ca2589028cbbc359267e1f3153d6631190ad30c6b817590cf8069287b8b0961988757da996f0e274dc4
data/bin/arv CHANGED
@@ -23,6 +23,7 @@ begin
23
23
  require 'oj'
24
24
  require 'active_support/inflector'
25
25
  require 'yaml'
26
+ require 'tempfile'
26
27
  rescue LoadError
27
28
  abort <<-EOS
28
29
 
@@ -112,10 +113,14 @@ def init_config
112
113
  end
113
114
  end
114
115
 
115
- subcommands = %w(keep pipeline tag ws edit)
116
+ subcommands = %w(create edit keep pipeline tag ws)
116
117
 
117
118
  def check_subcommands client, arvados, subcommand, global_opts, remaining_opts
118
119
  case subcommand
120
+ when 'create'
121
+ arv_create client, arvados, global_opts, remaining_opts
122
+ when 'edit'
123
+ arv_edit client, arvados, global_opts, remaining_opts
119
124
  when 'keep'
120
125
  @sub = remaining_opts.shift
121
126
  if ['get', 'put', 'ls', 'normalize'].index @sub then
@@ -146,8 +151,6 @@ def check_subcommands client, arvados, subcommand, global_opts, remaining_opts
146
151
  exec `which arv-tag`.strip, *remaining_opts
147
152
  when 'ws'
148
153
  exec `which arv-ws`.strip, *remaining_opts
149
- when 'edit'
150
- arv_edit client, arvados, global_opts, remaining_opts
151
154
  end
152
155
  end
153
156
 
@@ -156,6 +159,67 @@ def arv_edit_save_tmp tmp
156
159
  puts "Saved contents to " + tmp.path + ".saved"
157
160
  end
158
161
 
162
+ def command_exists?(command)
163
+ ENV['PATH'].split(':').each {|folder| File.executable?(File.join(folder, command))}
164
+ end
165
+
166
+ def run_editor tmp_file, global_opts
167
+ need_edit = true
168
+ while need_edit
169
+ pid = Process::fork
170
+ if pid.nil?
171
+ editor = nil
172
+ [ENV["VISUAL"], ENV["EDITOR"], "nano", "vi"].each do |e|
173
+ editor ||= e if e and command_exists? e
174
+ end
175
+ if editor.nil?
176
+ puts "Could not find any editor to use, please set $VISUAL or $EDITOR to your desired editor."
177
+ exit 1
178
+ end
179
+ exec editor, tmp_file.path
180
+ else
181
+ Process.wait pid
182
+ end
183
+
184
+ if $?.exitstatus == 0
185
+ tmp_file.open
186
+ newcontent = tmp_file.read()
187
+
188
+ newobj = {}
189
+ begin
190
+ case global_opts[:format]
191
+ when 'json'
192
+ newobj = Oj.load(newcontent)
193
+ when 'yaml'
194
+ newobj = YAML.load(newcontent)
195
+ end
196
+ need_edit = false
197
+ rescue Exception => e
198
+ n = 1
199
+ newcontent.each_line do |line|
200
+ puts "#{n.to_s.rjust 4} #{line}"
201
+ n += 1
202
+ end
203
+ puts "Parse error! " + e.to_s
204
+ puts "\nTry again (y/n)? "
205
+ yn = "X"
206
+ while not ["y", "Y", "n", "N"].include?(yn)
207
+ yn = $stdin.read 1
208
+ end
209
+ if yn == 'n' or yn == 'N'
210
+ arv_edit_save_tmp tmp_file
211
+ abort
212
+ end
213
+ end
214
+ else
215
+ puts "Editor exited with status #{$?.exitstatus}"
216
+ exit $?.exitstatus
217
+ end
218
+ end
219
+
220
+ newobj
221
+ end
222
+
159
223
  def arv_edit client, arvados, global_opts, remaining_opts
160
224
  uuid = remaining_opts.shift
161
225
  if uuid.nil? or uuid == "-h" or uuid == "--help"
@@ -224,60 +288,11 @@ def arv_edit client, arvados, global_opts, remaining_opts
224
288
  content = results.to_yaml
225
289
  end
226
290
 
227
- require 'tempfile'
228
-
229
- tmp = Tempfile.new([uuid, "." + global_opts[:format]])
230
- tmp.write(content)
231
- tmp.close
232
-
233
- need_edit = true
234
-
235
- while need_edit
236
- pid = Process::fork
237
- if pid.nil?
238
- editor ||= ENV["VISUAL"]
239
- editor ||= ENV["EDITOR"]
240
- editor ||= "nano"
241
- exec editor, tmp.path
242
- else
243
- Process.wait pid
244
- end
245
-
246
- if $?.exitstatus == 0
247
- tmp.open
248
- newcontent = tmp.read()
291
+ tmp_file = Tempfile.new([uuid, "." + global_opts[:format]])
292
+ tmp_file.write(content)
293
+ tmp_file.close
249
294
 
250
- newobj = {}
251
- begin
252
- case global_opts[:format]
253
- when 'json'
254
- newobj = Oj.load(newcontent)
255
- when 'yaml'
256
- newobj = YAML.load(newcontent)
257
- end
258
- need_edit = false
259
- rescue Exception => e
260
- puts "Parse error! " + e.to_s
261
- n = 1
262
- newcontent.each_line do |line|
263
- puts "#{n.to_s.rjust 4} #{line}"
264
- n += 1
265
- end
266
- puts "\nTry again (y/n)? "
267
- yn = "X"
268
- while not ["y", "Y", "n", "N"].include?(yn)
269
- yn = $stdin.read 1
270
- end
271
- if yn == 'n' or yn == 'N'
272
- arv_edit_save_tmp tmp
273
- abort
274
- end
275
- end
276
- else
277
- puts "Editor exited with status #{$?.exitstatus}"
278
- exit $?.exitstatus
279
- end
280
- end
295
+ newobj = run_editor tmp_file, global_opts
281
296
 
282
297
  begin
283
298
  if newobj != results
@@ -296,13 +311,14 @@ def arv_edit client, arvados, global_opts, remaining_opts
296
311
  puts "Error communicating with server, error was #{e}"
297
312
  puts "Update body was:"
298
313
  puts dumped
299
- arv_edit_save_tmp tmp
314
+ arv_edit_save_tmp tmp_file
300
315
  abort
301
316
  end
302
317
 
303
318
  begin
304
319
  results = JSON.parse result.body
305
320
  rescue JSON::ParserError => e
321
+ arv_edit_save_tmp tmp_file
306
322
  abort "Failed to parse server response:\n" + e.to_s
307
323
  end
308
324
 
@@ -310,14 +326,114 @@ def arv_edit client, arvados, global_opts, remaining_opts
310
326
  puts "Update failed. Server responded #{result.response.status}: #{results['errors']} "
311
327
  puts "Update body was:"
312
328
  puts dumped
313
- arv_edit_save_tmp tmp
329
+ arv_edit_save_tmp tmp_file
314
330
  abort
315
331
  end
316
332
  else
317
333
  puts "Object is unchanged, did not update."
318
334
  end
319
335
  ensure
320
- tmp.close(true)
336
+ tmp_file.close(true)
337
+ end
338
+
339
+ exit 0
340
+ end
341
+
342
+ def arv_create client, arvados, global_opts, remaining_opts
343
+ types = resource_types(arvados.discovery_document)
344
+ create_opts = Trollop::options do
345
+ opt :project_uuid, "Project uuid in which to create the object", :type => :string
346
+ stop_on resource_types(arvados.discovery_document)
347
+ end
348
+
349
+ object_type = remaining_opts.shift
350
+ if object_type.nil?
351
+ abort "Missing resource type, must be one of #{types.join ', '}"
352
+ end
353
+
354
+ rsc = arvados.discovery_document["resources"].keys.select { |k| object_type == k.singularize }
355
+ if rsc.empty?
356
+ abort "Could not determine resource type #{object_type}"
357
+ end
358
+ rsc = rsc.first
359
+
360
+ discovered_params = arvados.discovery_document["resources"][rsc]["methods"]["create"]["parameters"]
361
+ method_opts = Trollop::options do
362
+ banner head_banner
363
+ banner "Usage: arv create [--project-uuid] #{object_type} [create parameters]"
364
+ banner ""
365
+ banner "This method supports the following parameters:"
366
+ banner ""
367
+ discovered_params.each do |k,v|
368
+ opts = Hash.new()
369
+ opts[:type] = v["type"].to_sym if v.include?("type")
370
+ if [:datetime, :text, :object, :array].index opts[:type]
371
+ opts[:type] = :string # else trollop bork
372
+ end
373
+ opts[:default] = v["default"] if v.include?("default")
374
+ opts[:default] = v["default"].to_i if opts[:type] == :integer
375
+ opts[:default] = to_boolean(v["default"]) if opts[:type] == :boolean
376
+ opts[:required] = true if v.include?("required") and v["required"]
377
+ description = ''
378
+ description = ' ' + v["description"] if v.include?("description")
379
+ opt k.to_sym, description, opts
380
+ end
381
+ end
382
+
383
+
384
+ newobj = {}
385
+ if create_opts[:project_uuid]
386
+ newobj["owner_uuid"] = create_opts[:project_uuid]
387
+ end
388
+
389
+ case global_opts[:format]
390
+ when 'json'
391
+ content = Oj.dump(newobj, :indent => 1)
392
+ when 'yaml'
393
+ content = newobj.to_yaml
394
+ end
395
+
396
+ tmp_file = Tempfile.new(["", ".#{global_opts[:format]}"])
397
+ tmp_file.write(content)
398
+ tmp_file.close
399
+
400
+ newobj = run_editor tmp_file, global_opts
401
+
402
+ begin
403
+ api_method = 'arvados.' + rsc + '.create'
404
+ dumped = Oj.dump(newobj)
405
+
406
+ result = client.execute(:api_method => eval(api_method),
407
+ :parameters => method_opts,
408
+ :body_object => {object_type => newobj},
409
+ :authenticated => false,
410
+ :headers => {
411
+ authorization: 'OAuth2 '+ENV['ARVADOS_API_TOKEN']
412
+ })
413
+
414
+ begin
415
+ results = JSON.parse result.body
416
+ rescue JSON::ParserError => e
417
+ arv_edit_save_tmp tmp_file
418
+ abort "Failed to parse server response:\n" + e.to_s
419
+ end
420
+
421
+ if result.response.status != 200
422
+ puts "Create failed. Server responded #{result.response.status}: #{results['errors']} "
423
+ puts "Create body was:"
424
+ puts dumped
425
+ arv_edit_save_tmp tmp_file
426
+ abort
427
+ end
428
+
429
+ begin
430
+ puts "Created object #{results['uuid']}"
431
+ rescue
432
+ arv_edit_save_tmp tmp_file
433
+ abort "Unexpected response:\n#{results}"
434
+ end
435
+ ensure
436
+ tmp_file.close(true)
321
437
  end
322
438
 
323
439
  exit 0
@@ -361,13 +477,16 @@ def help_resources(option_parser, discovery_document, resource)
361
477
  exit 255
362
478
  end
363
479
 
364
- def parse_arguments(discovery_document, subcommands)
480
+ def resource_types discovery_document
365
481
  resource_types = Array.new()
366
482
  discovery_document["resources"].each do |k,v|
367
483
  resource_types << k.singularize
368
484
  end
485
+ resource_types
486
+ end
369
487
 
370
- resource_types += subcommands
488
+ def parse_arguments(discovery_document, subcommands)
489
+ resources_and_subcommands = resource_types(discovery_document) + subcommands
371
490
 
372
491
  option_parser = Trollop::Parser.new do
373
492
  version __FILE__
@@ -396,7 +515,7 @@ def parse_arguments(discovery_document, subcommands)
396
515
  banner "Additional options:"
397
516
 
398
517
  conflicts :short, :format
399
- stop_on resource_types
518
+ stop_on resources_and_subcommands
400
519
  end
401
520
 
402
521
  global_opts = Trollop::with_standard_exception_handling option_parser do
@@ -416,7 +535,7 @@ def parse_arguments(discovery_document, subcommands)
416
535
  resource = ARGV.shift
417
536
 
418
537
  if not subcommands.include? resource
419
- if not resource_types.include?(resource)
538
+ if not resources_and_subcommands.include?(resource)
420
539
  puts "Resource or subcommand '#{resource}' is not recognized.\n\n" if !resource.nil?
421
540
  help_resources(option_parser, discovery_document, resource)
422
541
  end
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.20141010134550
4
+ version: 0.1.20141014153331
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-10-10 00:00:00.000000000 Z
11
+ date: 2014-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arvados
@@ -178,7 +178,7 @@ dependencies:
178
178
  - - "<"
179
179
  - !ruby/object:Gem::Version
180
180
  version: 1.0.0
181
- description: Arvados command line tools, git commit ff9d78bbeb09ca917f0814c6055c47db5a4e7e4a
181
+ description: Arvados command line tools, git commit debedb222cfea4bfc4519032cad8475858e04034
182
182
  email: gem-dev@curoverse.com
183
183
  executables:
184
184
  - arv