Class: Kerplutz::Executable

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/kerplutz/executable.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, arguments = {}) ⇒ Executable

Returns a new instance of Executable.



12
13
14
15
16
# File 'lib/kerplutz/executable.rb', line 12

def initialize(name, arguments={})
  @arguments = arguments
  @top       = Command.new(name, '', @arguments)
  @commands  = CommandMap.new
end

Instance Attribute Details

#argumentsObject (readonly)

Returns the value of attribute arguments.



8
9
10
# File 'lib/kerplutz/executable.rb', line 8

def arguments
  @arguments
end

#commandsObject (readonly)

Returns the value of attribute commands.



8
9
10
# File 'lib/kerplutz/executable.rb', line 8

def commands
  @commands
end

#topObject (readonly)

Returns the value of attribute top.



8
9
10
# File 'lib/kerplutz/executable.rb', line 8

def top
  @top
end

Instance Method Details

#add_command(command) ⇒ Object



18
19
20
# File 'lib/kerplutz/executable.rb', line 18

def add_command(command)
  commands << command
end

#add_option(option) ⇒ Object



22
23
24
# File 'lib/kerplutz/executable.rb', line 22

def add_option(option)
  top.add_option(option, false)
end


54
55
56
57
58
59
# File 'lib/kerplutz/executable.rb', line 54

def banner
  help = ""
  help << top.help << "\n"
  help << " Commands:\n" << commands.summary << "\n"
  help << "Type '#{name} help COMMAND' for help with a specific command.\n"
end

#parse(args) ⇒ Object

TODO: Extract this method into separate class that gives all the involved parties the chance to parse all of the args



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/kerplutz/executable.rb', line 28

def parse(args)
  if args[0] =~ /^(--help|help)$/
    first, *rest = args
    if rest.empty?
      puts banner
    else
      puts commands[rest.first].help
    end
  elsif cmd = args.find { |el| commands.has_command?(el) }
    cmd_idx = args.index(cmd)
    top_args, cmd_args = args.partition.with_index do |_arg, idx|
      idx < cmd_idx
    end
    top.parse(top_args)
    remainder = commands[cmd].parse(cmd_args[1..-1])
  else
    if args.empty?
      puts banner
    else
      remainder = top.parse(args)
    end
  end

  [(cmd and cmd.to_sym) || name.to_sym, arguments, remainder || []]
end