Class: Caterer::Cli

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

Instance Method Summary collapse

Constructor Details

#initialize(argv, env) ⇒ Cli

Returns a new instance of Cli.



9
10
11
12
13
14
15
16
# File 'lib/caterer/cli.rb', line 9

def initialize(argv, env)
  @argv   = argv
  @env    = env
  @logger = Log4r::Logger.new("caterer::cli")
  @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)

  @logger.info("CLI: #{@main_args.inspect} #{@sub_command.inspect} #{@sub_args.inspect}")
end

Instance Method Details

#executeObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/caterer/cli.rb', line 18

def execute
  if @main_args.include?("-v") || @main_args.include?("--version")
    # Version short-circuits the whole thing. Just print
    # the version and exit.
    @env.ui.info "Caterer version #{Caterer::VERSION}", :prefix => false

    return 0
  elsif @main_args.include?("-h") || @main_args.include?("--help")
    # Help is next in short-circuiting everything. Print
    # the help and exit.
    help
    return 0
  end

  if !@sub_command
    help
    return 0
  end      

  begin
    command_class = Caterer.commands.get(@sub_command.to_sym) || raise
  rescue
    # didn't understand the sub-command, let's run our default
    @sub_args.unshift @sub_command
    @sub_command = @env.config.default_command
    retry
  end

  @logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")

  # Initialize and execute the command class, returning the exit status.
  result = command_class.new(@sub_args, @env).execute
  result = 0 if !result.is_a?(Fixnum)
  result
end

#helpObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/caterer/cli.rb', line 54

def help
  opts = OptionParser.new do |opts|
    opts.banner = "Usage: cater [-v] [-h] command [<args>]"
    opts.separator ""
    opts.on("-v", "--version", "Print the version and exit.")
    opts.on("-h", "--help", "Print this help.")
    opts.separator ""
    opts.separator "Available subcommands:"

    # Add the available subcommands as separators in order to print them
    # out as well.
    keys = []
    Caterer.commands.each { |key, value| keys << key.to_s }

    keys.sort.each do |key|
      opts.separator "     #{key}"
    end

    opts.separator ""
    opts.separator "For help on any individual command run `cater COMMAND -h`"
  end

  @env.ui.info opts.help, :prefix => false
end

#split_main_and_subcommand(argv) ⇒ Array

This method will split the argv given into three parts: the flags to this command, the subcommand, and the flags to the subcommand. For example:

-v status -h -v

The above would yield 3 parts:

["-v"]
"status"
["-h", "-v"]

These parts are useful because the first is a list of arguments given to the current command, the second is a subcommand, and the third are the commands given to the subcommand.

Returns:

  • (Array)

    The three parts.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/caterer/cli.rb', line 96

def split_main_and_subcommand(argv)
  # Initialize return variables
  main_args   = nil
  sub_command = nil
  sub_args    = []

  # We split the arguments into two: One set containing any
  # flags before a word, and then the rest. The rest are what
  # get actually sent on to the subcommand.
  argv.each_index do |i|
    if !argv[i].start_with?("-")
      # We found the beginning of the sub command. Split the
      # args up.
      main_args   = argv[0, i]
      sub_command = argv[i]
      sub_args    = argv[i + 1, argv.length - i + 1]

      # Break so we don't find the next non flag and shift our
      # main args.
      break
    end
  end

  # Handle the case that argv was empty or didn't contain any subcommand
  main_args = argv.dup if main_args.nil?

  return [main_args, sub_command, sub_args]
end