squared 0.4.6 → 0.4.7

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.
@@ -278,45 +278,44 @@ module Squared
278
278
 
279
279
  def buildx(flag, opts = [], tag: nil, context: nil)
280
280
  cmd, opts = docker_session('buildx', opts: opts)
281
- opts = option_sanitize(opts, OPT_DOCKER[:buildx][:common]).first
282
- cmd << flag
283
- list = OPT_DOCKER[:buildx][flag == :bake ? :bake : :build] + OPT_DOCKER[:buildx][:shared]
284
- out = option_sanitize(opts, list).first
281
+ op = OptionPartition.new(opts, OPT_DOCKER[:buildx][:common], cmd, project: self)
282
+ op << flag
283
+ op.parse(OPT_DOCKER[:buildx][flag == :bake ? :bake : :build] + OPT_DOCKER[:buildx][:shared])
285
284
  case flag
286
285
  when :build, :context
287
286
  append_tag(tag || option('tag', ignore: false) || @tag)
288
287
  append_context context
289
288
  when :bake
290
- unless out.empty?
291
- args = out.dup
292
- out.clear
289
+ unless op.empty?
290
+ args = op.dup
291
+ op.extras.clear
293
292
  if Dir.exist?(args.last)
294
293
  if projectpath?(val = args.pop)
295
294
  context = val
296
295
  else
297
- out << val
296
+ op.extras << val
298
297
  end
299
298
  end
300
- append_value(args, escape: true)
299
+ op.append(args, escape: true)
301
300
  contextdir(context) if context
302
301
  end
303
302
  end
304
- option_clear(out, pass: false)
303
+ op.clear(pass: false)
305
304
  run(from: :"buildx:#{flag}")
306
305
  end
307
306
 
308
307
  def composex(flag, opts = [], service: nil)
309
308
  cmd, opts = docker_session('compose', opts: opts)
310
- opts = option_sanitize(opts, OPT_DOCKER[:compose][:common]).first
311
- append_file filetype unless session_arg?('f', 'file')
312
- cmd << flag
313
- out = option_sanitize(opts, OPT_DOCKER[:compose][flag]).first
309
+ op = OptionPartition.new(opts, OPT_DOCKER[:compose][:common], cmd, project: self)
310
+ append_file filetype unless op.arg?('f', 'file')
311
+ op << flag
312
+ op.parse(OPT_DOCKER[:compose][flag])
314
313
  from = :"compose:#{flag}"
315
314
  case flag
316
315
  when :build, :up
317
- append_value(out, escape: true)
316
+ op.append(escape: true)
318
317
  when :exec, :run
319
- append_command(flag, service, out, from: from)
318
+ append_command(flag, service, op.extras, from: from)
320
319
  end
321
320
  run(from: from)
322
321
  end
@@ -324,12 +323,12 @@ module Squared
324
323
  def container(flag, opts = [], id: nil)
325
324
  cmd, opts = docker_session('container', flag, opts: opts)
326
325
  list = OPT_DOCKER[:container].fetch(flag, [])
327
- list += OPT_DOCKER[:container][:update] if flag == :run
328
- out = option_sanitize(opts, list, args: flag == :run || flag == :exec).first
326
+ list.concat(OPT_DOCKER[:container][:update]) if flag == :run
327
+ op = OptionPartition.new(opts, list, cmd, project: self, args: flag == :run || flag == :exec)
329
328
  from = :"container:#{flag}"
330
329
  case flag
331
330
  when :run, :exec
332
- if flag == :run && !session_arg?('mount')
331
+ if flag == :run && !op.arg?('mount')
333
332
  run = VAL_DOCKER[:run]
334
333
  both = run[:bind] + run[:tmpfs]
335
334
  diff = run[:bind].reject { |val| run[:tmpfs].include?(val) }
@@ -361,14 +360,14 @@ module Squared
361
360
  cmd << "--mount type=#{tmpfs ? 'tmpfs' : 'bind'},#{args.join(',')}"
362
361
  end
363
362
  end
364
- append_command(flag, id.to_s.empty? ? tagmain : id, out, from: from)
363
+ append_command(flag, id.to_s.empty? ? tagmain : id, op.extras, from: from)
365
364
  when :update
366
- raise_error('missing container', hint: from) if out.empty?
367
- append_value(out, escape: true)
365
+ raise_error('missing container', hint: from) if op.empty?
366
+ op.append(escape: true)
368
367
  when :commit
369
- latest = out.shift || tagmain
368
+ latest = op.shift || tagmain
370
369
  cmd << id << latest
371
- raise_error("unknown args: #{out.join(', ')}", hint: from) unless out.empty?
370
+ raise_error("unknown args: #{op.join(', ')}", hint: from) unless op.empty?
372
371
  return unless confirm_command(cmd.to_s, title: from, target: id, as: latest)
373
372
 
374
373
  registry = option('registry') || @registry
@@ -386,7 +385,7 @@ module Squared
386
385
  opts << '--quiet' unless verbose
387
386
  return image(:push, opts, id: latest, registry: registry)
388
387
  else
389
- if out.empty?
388
+ if op.empty?
390
389
  status = []
391
390
  no = true
392
391
  case flag
@@ -411,13 +410,13 @@ module Squared
411
410
  when :rm
412
411
  status = %w[created exited dead]
413
412
  end
414
- ps = docker_output('ps -a', *status.map! { |s| "--filter='status=#{s}'" })
413
+ ps = docker_output('ps -a', *status.map { |s| "--filter='status=#{s}'" })
415
414
  list_image(flag, ps, no: no, hint: "status: #{status.join(', ')}", from: from) do |img|
416
415
  run(cmd.temp(img), from: from)
417
416
  end
418
417
  return
419
418
  else
420
- append_value(out, escape: true)
419
+ op.append(escape: true)
421
420
  end
422
421
  end
423
422
  run(from: from)
@@ -425,11 +424,11 @@ module Squared
425
424
 
426
425
  def image(flag, opts = [], sync: true, id: nil, registry: nil)
427
426
  cmd, opts = docker_session('image', flag, opts: opts)
428
- out = option_sanitize(opts, OPT_DOCKER[:image][flag]).first
427
+ op = OptionPartition.new(opts, OPT_DOCKER[:image][flag], cmd, project: self)
429
428
  from = :"image:#{flag}"
430
429
  case flag
431
430
  when :list
432
- if opts.size == out.size
431
+ if opts.size == op.size
433
432
  index = 0
434
433
  name = nil
435
434
  opts.reverse_each { |opt| break opts.delete(opt) if (name = opt[/^name=["']?(.+?)["']?$/, 1]) }
@@ -443,28 +442,30 @@ module Squared
443
442
  end
444
443
  return
445
444
  else
446
- option_clear out
445
+ op.clear
447
446
  end
448
447
  when :rm
449
448
  if id
450
- cmd << id
451
- elsif !out.empty?
452
- out.each { |val| run(cmd.temp(val), sync: sync, from: from) }
453
- return
449
+ op << id
454
450
  else
455
- list_image(flag, docker_output('image ls -a'), from: from) do |val|
456
- image(:rm, opts, sync: sync, id: val)
451
+ if op.empty?
452
+ list_image(flag, docker_output('image', 'ls', '-a'), from: from) do |val|
453
+ puts val
454
+ image(:rm, opts, sync: sync, id: val)
455
+ end
456
+ else
457
+ op.each { |val| run(cmd.temp(val), sync: sync, from: from) }
457
458
  end
458
459
  return
459
460
  end
460
461
  when :push
461
462
  id ||= option('tag', ignore: false) || tagmain
462
- registry ||= out.shift || option('registry') || @registry
463
- raise_error(id ? "unknown args: #{out.join(', ')}" : 'no id/tag given', hint: from) unless id && out.empty?
463
+ registry ||= op.shift || option('registry') || @registry
464
+ raise_error(id ? "unknown args: #{op.join(', ')}" : 'no id/tag given', hint: from) unless id && op.empty?
464
465
  raise_error('username/registry not provided', hint: from) unless registry
465
466
  registry.chomp!('/')
466
467
  uri = shell_quote("#{registry}/#{id}")
467
- cmd << uri
468
+ op << uri
468
469
  img = docker_output 'image', 'tag', id, uri
469
470
  return unless confirm_command(img.to_s, cmd.to_s, target: id, as: registry, title: from)
470
471
 
@@ -475,7 +476,8 @@ module Squared
475
476
 
476
477
  def network(flag, opts = [], target: nil)
477
478
  cmd, opts = docker_session('network', flag, opts: opts)
478
- option_sanitize(opts, OPT_DOCKER[:network][flag]).first
479
+ op = OptionPartition.new(opts, OPT_DOCKER[:network][flag], cmd, project: self)
480
+ op.clear
479
481
  from = :"network:#{flag}"
480
482
  list_image(flag, docker_output('ps -a'), from: from) do |img|
481
483
  puts 'Success' if run(cmd.temp(target, img), from: from) == true && stdout? && banner?
@@ -510,10 +512,9 @@ module Squared
510
512
  def docker_session(*cmd, opts: nil)
511
513
  return session('docker', *cmd) unless opts
512
514
 
513
- out = []
514
- opts = option_sanitize(opts, OPT_DOCKER[:common], target: out).first
515
- ret = session('docker', *out, *cmd)
516
- [ret, opts]
515
+ op = OptionPartition.new(opts, OPT_DOCKER[:common], project: self)
516
+ ret = session('docker', *op.to_a, *cmd)
517
+ [ret, op.extras]
517
518
  end
518
519
 
519
520
  def docker_output(*cmd, **kwargs)
@@ -523,7 +524,7 @@ module Squared
523
524
  def append_command(flag, val, list, target: @session, from: nil)
524
525
  case flag
525
526
  when :run
526
- unless session_arg?('name')
527
+ unless session_arg?('name', target: target)
527
528
  require 'random/formatter'
528
529
  target << basic_option('name', dnsname("#{name}_#{Random.new.alphanumeric(6)}"))
529
530
  end
@@ -537,18 +538,23 @@ module Squared
537
538
  def append_file(type, target: @session)
538
539
  return unless type == 2 || type == 4 || @file.is_a?(Array)
539
540
 
540
- target.merge(as_a(@file).map { |val| quote_option('file', basepath(val)) })
541
+ files = as_a(@file).map { |val| quote_option('file', basepath(val)) }
542
+ if target.is_a?(Set)
543
+ target.merge(files)
544
+ else
545
+ target.concat(files)
546
+ end
541
547
  end
542
548
 
543
549
  def append_context(ctx = nil, target: @session)
544
- if @file.is_a?(String) && !session_arg?('f', 'file') && !bake?(dockerfile) && !compose?(dockerfile)
550
+ if @file.is_a?(String) && !session_arg?('f', 'file', target: target) && !bake? && !compose?
545
551
  target << quote_option('file', dockerfile)
546
552
  end
547
553
  target << contextdir(ctx || context)
548
554
  end
549
555
 
550
556
  def append_tag(val, target: @session)
551
- ver = option('version', ignore: false)
557
+ ver = option('version', target: target, ignore: false)
552
558
  list = case val
553
559
  when String
554
560
  val.split(',')
@@ -587,7 +593,7 @@ module Squared
587
593
  a = sub_style(ee, styles: theme[:inline])
588
594
  b = "Execute #{sub_style(flag, styles: theme[:active])} on #{a}#{ee == id ? '' : " (#{id})"}"
589
595
  c, d = no ? ['y/N', 'N'] : ['Y/n', 'Y']
590
- e = time_format(time_offset(data['CreatedAt']), pass: ['ms'])
596
+ e = time_format(time_since(data['CreatedAt']), pass: ['ms'])
591
597
  f = sub_style(ARG[:BORDER][0], styles: theme[:inline])
592
598
  g = ' ' * (cc + 1)
593
599
  h = "#{sub_style(bb.rjust(cc), styles: theme[:current])} #{f} "
@@ -678,11 +684,11 @@ module Squared
678
684
  tag.is_a?(Array) ? tag.first : tag
679
685
  end
680
686
 
681
- def compose?(file)
687
+ def compose?(file = dockerfile)
682
688
  COMPOSEFILE.include?(File.basename(file))
683
689
  end
684
690
 
685
- def bake?(file)
691
+ def bake?(file = dockerfile)
686
692
  BAKEFILE.include?(File.basename(file))
687
693
  end
688
694
  end