module GroupOptionParser

Add grouping to Ruby's `OptionParser`

Constants

TOP_INDEX

Attributes

current_top[W]

Public Instance Methods

group(name) { |self| ... } click to toggle source

run block in context of a group, if group does not exist it's created

# File lib/group_option_parser.rb, line 42
def group(name, &_block)
  self.current_top = group_index(name)
  yield self
  self.current_top = TOP_INDEX
end
remove(name=nil) click to toggle source

@overload remove(name)

allows removing last or group by `name`
# File lib/group_option_parser.rb, line 32
def remove(name=nil)
  if name
    remove_group(name)
  else
    remove_last
  end
end
top() click to toggle source

changes the target of all functions to be set by `group`

# File lib/group_option_parser.rb, line 26
def top
  @stack[current_top]
end

Private Instance Methods

current_top() click to toggle source
# File lib/group_option_parser.rb, line 54
def current_top
  @current_top ||= TOP_INDEX
end
group_index(name) click to toggle source
# File lib/group_option_parser.rb, line 65
def group_index(name)
  name = name.to_s
  groups[name] || new_group(name)
end
groups() click to toggle source
# File lib/group_option_parser.rb, line 58
def groups
  @groups ||= {
    "tail" => 1,
    "top"  => TOP_INDEX,
  }
end
last_index() click to toggle source
# File lib/group_option_parser.rb, line 88
def last_index
  @stack.size - 1
end
new_group(name) click to toggle source
# File lib/group_option_parser.rb, line 70
def new_group(name)
  index = last_index
  groups[name] = index
  @stack.insert(index, OptionParser::List.new)
  index
end
remove_group(name) click to toggle source
# File lib/group_option_parser.rb, line 77
def remove_group(name)
  index = groups.delete(name.to_str)
  @stack.delete_at(index) if index
end
remove_last() click to toggle source
# File lib/group_option_parser.rb, line 82
def remove_last
  name, _ = groups.rassoc(last_index)
  groups.delete(name) if name
  @stack.pop
end