Class: Epi::Slop::Commands

Inherits:
Object show all
Includes:
Enumerable
Defined in:
lib/epitools/slop/commands.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Enumerable

#*, #**, #average, #blank?, #combination, #counts, #cross_product, #foldl, #group_neighbours_by, #grouped_to_h, #groups, #map_recursively, #parallel_map, #permutation, #powerset, #reverse, #reverse_each, #rle, #rzip, #select_recursively, #skip, #sort_numerically, #split_after, #split_at, #split_before, #split_between, #sum, #to_iter, #uniq, #unzip

Constructor Details

#initialize(config = {}, &block) ⇒ Commands

Create a new instance of Slop::Commands and optionally build Slop instances via a block. Any configuration options used in this method will be the default configuration options sent to each Slop object created.

config - An optional configuration Hash. block - Optional block used to define commands.

Examples:

commands = Slop::Commands.new do
  on :new do
    on '-o', '--outdir=', 'The output directory'
    on '-v', '--verbose', 'Enable verbose mode'
  end

  on :generate do
    on '--assets', 'Generate assets', :default => true
  end

  global do
    on '-D', '--debug', 'Enable debug mode', :default => false
  end
end

commands[:new].class #=> Slop
commands.parse

39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/epitools/slop/commands.rb', line 39

def initialize(config = {}, &block)
  @config = config
  @commands = {}
  @banner = nil
  @triggered_command = nil

  warn "[DEPRECATED] Slop::Commands is deprecated and will be removed in "\
    "Slop version 4. Check out http://injekt.github.com/slop/#commands for "\
    "a new implementation of commands."

  return unless block_given?

  block.arity == 1 ? yield(self) : instance_eval(&block)
end

Instance Attribute Details

#argumentsObject (readonly)

Returns the value of attribute arguments


8
9
10
# File 'lib/epitools/slop/commands.rb', line 8

def arguments
  @arguments
end

Optionally set the banner for this command help output.

banner - The String text to set the banner.

Returns the String banner if one is set.


59
60
61
62
# File 'lib/epitools/slop/commands.rb', line 59

def banner(banner = nil)
  @banner = banner if banner
  @banner
end

#commandsObject (readonly)

Returns the value of attribute commands


8
9
10
# File 'lib/epitools/slop/commands.rb', line 8

def commands
  @commands
end

#configObject (readonly)

Returns the value of attribute config


8
9
10
# File 'lib/epitools/slop/commands.rb', line 8

def config
  @config
end

Instance Method Details

#[](key) ⇒ Object Also known as: get

Fetch the instance of Slop tied to a command.

key - The String or Symbol key used to locate this command.

Returns the Slop instance if this key is found, nil otherwise.


100
101
102
# File 'lib/epitools/slop/commands.rb', line 100

def [](key)
  commands[key.to_s]
end

#default(config = {}, &block) ⇒ Object

Add a Slop instance used when no other commands exist.

config - A Hash of configuration options to pass to Slop. block - An optional block used to pass options to Slop.

Returns the newly created Slop instance mapped to default.


81
82
83
# File 'lib/epitools/slop/commands.rb', line 81

def default(config = {}, &block)
  on('default', config, &block)
end

#each(&block) ⇒ Object

Enumerable interface.


119
120
121
# File 'lib/epitools/slop/commands.rb', line 119

def each(&block)
  @commands.each(&block)
end

#global(config = {}, &block) ⇒ Object

Add a global Slop instance.

config - A Hash of configuration options to pass to Slop. block - An optional block used to pass options to Slop.

Returns the newly created Slop instance mapped to global.


91
92
93
# File 'lib/epitools/slop/commands.rb', line 91

def global(config = {}, &block)
  on('global', config, &block)
end

#inspectObject

Returns the inspection String.


170
171
172
# File 'lib/epitools/slop/commands.rb', line 170

def inspect
  "#<Slop::Commands #{config.inspect} #{commands.values.map(&:inspect)}>"
end

#on(command, config = {}, &block) ⇒ Object

Add a Slop instance for a specific command.

command - A String or Symbol key used to identify this command. config - A Hash of configuration options to pass to Slop. block - An optional block used to pass options to Slop.

Returns the newly created Slop instance mapped to command.


71
72
73
# File 'lib/epitools/slop/commands.rb', line 71

def on(command, config = {}, &block)
  commands[command.to_s] = Slop.new(@config.merge(config), &block)
end

#parse(items = ARGV) ⇒ Object

Parse a list of items.

items - The Array of items to parse.

Returns the original Array of items.


128
129
130
131
# File 'lib/epitools/slop/commands.rb', line 128

def parse(items = ARGV)
  parse! items.dup
  items
end

#parse!(items = ARGV) ⇒ Object

Parse a list of items, removing any options or option arguments found.

items - The Array of items to parse.

Returns the original Array of items with options removed.


138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/epitools/slop/commands.rb', line 138

def parse!(items = ARGV)
  if (opts = commands[items[0].to_s])
    @triggered_command = items.shift
    execute_arguments! items
    opts.parse! items
  elsif (opts = commands['default'])
    opts.parse! items
  elsif config[:strict] && items[0]
    raise InvalidCommandError, "Unknown command `#{items[0]}`"
  end
  execute_global_opts! items
  items
end

#present?(key) ⇒ Boolean

Check for a command presence.

Examples:

cmds.parse %w( foo )
cmds.present?(:foo) #=> true
cmds.present?(:bar) #=> false

Returns true if the given key is present in the parsed arguments.


114
115
116
# File 'lib/epitools/slop/commands.rb', line 114

def present?(key)
  key.to_s == @triggered_command
end

#to_hashObject

Returns a nested Hash with Slop options and values. See Slop#to_hash.


153
154
155
# File 'lib/epitools/slop/commands.rb', line 153

def to_hash
  Hash[commands.map { |k, v| [k.to_sym, v.to_hash] }]
end

#to_sObject Also known as: help

Returns the help String.


158
159
160
161
162
163
164
165
166
# File 'lib/epitools/slop/commands.rb', line 158

def to_s
  defaults = commands.delete('default')
  globals = commands.delete('global')
  helps = commands.reject { |_, v| v.options.none? }
  helps['Global options'] = globals.to_s if globals && globals.options.any?
  helps['Other options'] = defaults.to_s if defaults && defaults.options.any?
  banner = @banner ? "#{@banner}\n" : ""
  banner + helps.map { |key, opts| "  #{key}\n#{opts}" }.join("\n\n")
end