Class: Wip::CLI

Inherits:
Thor
  • Object
show all
Defined in:
lib/wip/cli.rb

Overview

Thor-based command-line interface for wip.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.dispatch(meth, given_args, given_opts, config) ⇒ Object

Thor only falls back to the default task when no command name is given at all; an unrecognized first argument (e.g. a custom wip.yml command name) would otherwise raise "Could not find command". Route those to dispatch.



22
23
24
25
26
27
28
29
# File 'lib/wip/cli.rb', line 22

def self.dispatch(meth, given_args, given_opts, config)
  name = given_args.first
  if meth.nil? && name && !name.to_s.start_with?('-') && find_command_possibilities(name).empty?
    return super('dispatch', given_args, given_opts, config)
  end

  super
end

.exit_on_failure?Boolean

Returns:

  • (Boolean)


17
# File 'lib/wip/cli.rb', line 17

def self.exit_on_failure? = true

Instance Method Details

#build(*extra) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/wip/cli.rb', line 54

def build(*extra)
  extra.shift if extra.first == '--'
  settings = load_config.command('build') || {}
  context = settings['context'] || load_config.defaults['context'] || '.'
  BuildContext.new(context).stage do |staged_context|
    execute(builder.build(settings: settings.merge('context' => staged_context), extra: extra))
  end
end

#configObject



49
50
51
# File 'lib/wip/cli.rb', line 49

def config
  puts YAML.dump(load_config.to_h)
end

#dispatch(name = nil, *arguments) ⇒ Object

Raises:



114
115
116
117
118
119
# File 'lib/wip/cli.rb', line 114

def dispatch(name = nil, *arguments)
  raise ConfigError, 'A command is required' unless name

  values = load_config.command(name) || raise(ConfigError, "Unknown command: #{name}")
  execute(builder.custom(name, arguments), interactive: builder.tty?(values.fetch('interactive', false)))
end

#doctorObject



42
43
44
45
46
# File 'lib/wip/cli.rb', line 42

def doctor
  results = Doctor.new(loader: loader).call
  results.each { |item| puts "[#{item.level.to_s.upcase}] #{item.message}" }
  exit(1) if results.any? { |item| item.level == :fail }
end

#downObject



72
73
74
75
76
77
78
79
# File 'lib/wip/cli.rb', line 72

def down
  execute(builder.down, exit_on_failure: false)
  execute(builder.remove, exit_on_failure: false)
  load_config.dependencies.each_key do |name|
    execute(builder.dependency_down(name), exit_on_failure: false)
    execute(builder.dependency_remove(name), exit_on_failure: false)
  end
end

#exec(*command) ⇒ Object



83
84
85
86
# File 'lib/wip/cli.rb', line 83

def exec(*command)
  tty = builder.tty?(options[:interactive])
  execute(builder.exec(command, interactive: options[:interactive]), interactive: tty)
end

#run_command(*command) ⇒ Object



90
91
92
93
# File 'lib/wip/cli.rb', line 90

def run_command(*command)
  tty = builder.tty?(options[:interactive])
  execute(builder.run(command, interactive: options[:interactive]), interactive: tty)
end

#shell_commandObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/wip/cli.rb', line 97

def shell_command
  configured = load_config.command('shell')
  if configured
    tty = builder.tty?(configured.fetch('interactive', false))
    return execute(builder.custom('shell', []), interactive: tty)
  end

  tty = builder.tty?(true)
  code = execute(builder.exec(['bash'], settings: { 'interactive' => true }, interactive: true),
                 interactive: tty, exit_on_failure: false)
  return if code.zero?

  execute(builder.exec(['sh'], settings: { 'interactive' => true }, interactive: true), interactive: tty)
end

#upObject



65
66
67
68
69
# File 'lib/wip/cli.rb', line 65

def up
  ensure_network
  load_config.dependencies.each_key { |name| ensure_dependency(name) }
  ensure_container
end

#versionObject



32
33
34
35
36
37
38
39
# File 'lib/wip/cli.rb', line 32

def version
  puts "wip #{VERSION}"
  config = load_config
  command = resolver.resolve(config.wslc_command)
  system(command, 'version')
rescue Error
  nil
end