Class: Thor

Inherits:
Object show all
Includes:
Base
Defined in:
lib/thor.rb,
lib/thor/base.rb,
lib/thor/task.rb,
lib/thor/util.rb,
lib/thor/error.rb,
lib/thor/shell.rb,
lib/thor/actions.rb,
lib/thor/version.rb,
lib/thor/invocation.rb,
lib/thor/shell/html.rb,
lib/thor/rake_compat.rb,
lib/thor/shell/basic.rb,
lib/thor/shell/color.rb,
lib/thor/parser/option.rb,
lib/thor/parser/options.rb,
lib/thor/parser/argument.rb,
lib/thor/parser/arguments.rb,
lib/thor/actions/directory.rb,
lib/thor/actions/create_file.rb,
lib/thor/actions/create_link.rb,
lib/thor/core_ext/ordered_hash.rb,
lib/thor/actions/empty_directory.rb,
lib/thor/actions/inject_into_file.rb,
lib/thor/actions/file_manipulation.rb,
lib/thor/core_ext/hash_with_indifferent_access.rb

Direct Known Subclasses

Runner

Defined Under Namespace

Modules: Actions, Base, CoreExt, Invocation, RakeCompat, Sandbox, Shell, Util Classes: Argument, Arguments, DynamicTask, Error, Group, HiddenTask, InvocationError, MalformattedArgumentError, Option, Options, RequiredArgumentMissingError, Runner, Task, UndefinedTaskError, UnknownArgumentError

Constant Summary collapse

HELP_MAPPINGS =

Shortcuts for help.

%w(-h -? --help -D)
THOR_RESERVED_WORDS =

Thor methods that should not be overwritten by the user.

%w(invoke shell options behavior root destination_root relative_root
action add_file create_file in_root inside run run_ruby_script)
VERSION =
"0.14.6".freeze

Instance Attribute Summary

Attributes included from Base

#options

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Base

included, #initialize, register_klass_file, shell, shell=, subclass_files, subclasses

Class Method Details

.check_unknown_options!(options = {}) ⇒ Object

Extend check unknown options to accept a hash of conditions.

Parameters

options<Hash>: A hash containing :only and/or :except keys



212
213
214
215
216
217
218
219
220
221
222
# File 'lib/thor.rb', line 212

def check_unknown_options!(options={})
  @check_unknown_options ||= Hash.new
  options.each do |key, value|
    if value
      @check_unknown_options[key] = Array(value)
    else
      @check_unknown_options.delete(key)
    end
  end
  @check_unknown_options
end

.check_unknown_options?(config) ⇒ Boolean

Overwrite check_unknown_options? to take subcommands and options into account.

Returns:

  • (Boolean)


225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/thor.rb', line 225

def check_unknown_options?(config) #:nodoc:
  options = check_unknown_options
  return false unless options

  task = config[:current_task]
  return true unless task

  name = task.name

  if subcommands.include?(name)
    false
  elsif options[:except]
    !options[:except].include?(name.to_sym)
  elsif options[:only]
    options[:only].include?(name.to_sym)
  else
    true
  end
end

.default_task(meth = nil) ⇒ Object

Sets the default task when thor is executed without an explicit task to be called.

Parameters

meth<Symbol>

name of the defaut task



10
11
12
13
14
15
16
17
18
19
# File 'lib/thor.rb', line 10

def default_task(meth=nil)
  case meth
    when :none
      @default_task = 'help'
    when nil
      @default_task ||= from_superclass(:default_task, 'help')
    else
      @default_task = meth.to_s
  end
end

.desc(usage, description, options = {}) ⇒ Object

Defines the usage and the description of the next task.

Parameters

usage<String> description<String> options<String>



45
46
47
48
49
50
51
52
53
# File 'lib/thor.rb', line 45

def desc(usage, description, options={})
  if options[:for]
    task = find_and_refresh_task(options[:for])
    task.usage = usage             if usage
    task.description = description if description
  else
    @usage, @desc, @hide = usage, description, options[:hide] || false
  end
end

.help(shell, subcommand = false) ⇒ Object

Prints help information for this class.

Parameters

shell<Thor::Shell>



174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/thor.rb', line 174

def help(shell, subcommand = false)
  list = printable_tasks(true, subcommand)
  Thor::Util.thor_classes_in(self).each do |klass|
    list += klass.printable_tasks(false)
  end
  list.sort!{ |a,b| a[0] <=> b[0] }

  shell.say "Tasks:"
  shell.print_table(list, :ident => 2, :truncate => true)
  shell.say
  class_options_help(shell)
end

.long_desc(long_description, options = {}) ⇒ Object

Defines the long description of the next task.

Parameters

long description<String>



60
61
62
63
64
65
66
67
# File 'lib/thor.rb', line 60

def long_desc(long_description, options={})
  if options[:for]
    task = find_and_refresh_task(options[:for])
    task.long_description = long_description if long_description
  else
    @long_desc = long_description
  end
end

.map(mappings = nil) ⇒ Object

Maps an input to a task. If you define:

map "-T" => "list"

Running:

thor -T

Will invoke the list task.

Parameters

Hash[String|Array => Symbol]

Maps the string or the strings in the array to the given task.



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/thor.rb', line 82

def map(mappings=nil)
  @map ||= from_superclass(:map, {})

  if mappings
    mappings.each do |key, value|
      if key.respond_to?(:each)
        key.each {|subkey| @map[subkey] = value}
      else
        @map[key] = value
      end
    end
  end

  @map
end

.method_option(name, options = {}) ⇒ Object

Adds an option to the set of method options. If :for is given as option, it allows you to change the options from a previous defined task.

def previous_task
  # magic
end

method_option :foo => :bar, :for => :previous_task

def next_task
  # magic
end

Parameters

name<Symbol>

The name of the argument.

options<Hash>

Described below.

Options

:desc - Description for the argument. :required - If the argument is required or not. :default - Default value for this argument. It cannot be required and have default values. :aliases - Aliases for this option. :type - The type of the argument, can be :string, :hash, :array, :numeric or :boolean. :banner - String to show on usage notes.



136
137
138
139
140
141
142
143
144
# File 'lib/thor.rb', line 136

def method_option(name, options={})
  scope = if options[:for]
    find_and_refresh_task(options[:for]).options
  else
    method_options
  end

  build_option(name, options, scope)
end

.method_options(options = nil) ⇒ Object

Declares the options for the next task to be declared.

Parameters

Hash[Symbol => Object]

The hash key is the name of the option and the value

is the type of the option. Can be :string, :array, :hash, :boolean, :numeric or :required (string). If you give a value, the type of the value is used.



105
106
107
108
109
# File 'lib/thor.rb', line 105

def method_options(options=nil)
  @method_options ||= {}
  build_options(options, @method_options) if options
  @method_options
end

.printable_tasks(all = true, subcommand = false) ⇒ Object

Returns tasks ready to be printed.



188
189
190
191
192
193
194
195
196
# File 'lib/thor.rb', line 188

def printable_tasks(all = true, subcommand = false)
  (all ? all_tasks : tasks).map do |_, task|
    next if task.hidden?
    item = []
    item << banner(task, false, subcommand)
    item << (task.description ? "# #{task.description.gsub(/\s+/m,' ')}" : "")
    item
  end.compact
end

.register(klass, subcommand_name, usage, description, options = {}) ⇒ Object

Registers another Thor subclass as a command.

Parameters

klass<Class>

Thor subclass to register

command<String>

Subcommand name to use

usage<String>

Short usage for the subcommand

description<String>

Description for the subcommand



28
29
30
31
32
33
34
35
36
# File 'lib/thor.rb', line 28

def register(klass, subcommand_name, usage, description, options={})
  if klass <= Thor::Group
    desc usage, description, options
    define_method(subcommand_name) { invoke klass }
  else
    desc usage, description, options
    subcommand subcommand_name, klass
  end
end

.subcommand(subcommand, subcommand_class) ⇒ Object



202
203
204
205
206
# File 'lib/thor.rb', line 202

def subcommand(subcommand, subcommand_class)
  self.subcommands << subcommand.to_s
  subcommand_class.subcommand_help subcommand
  define_method(subcommand) { |*args| invoke subcommand_class, args }
end

.subcommandsObject



198
199
200
# File 'lib/thor.rb', line 198

def subcommands
  @subcommands ||= from_superclass(:subcommands, [])
end

.task_help(shell, task_name) ⇒ Object

Prints help information for the given task.

Parameters

shell<Thor::Shell> task_name<String>



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/thor.rb', line 152

def task_help(shell, task_name)
  meth = normalize_task_name(task_name)
  task = all_tasks[meth]
  handle_no_task_error(meth) unless task

  shell.say "Usage:"
  shell.say "  #{banner(task)}"
  shell.say
  class_options_help(shell, nil => task.options.map { |_, o| o })
  if task.long_description
    shell.say "Description:"
    shell.print_wrapped(task.long_description, :ident => 2)
  else
    shell.say task.description
  end
end

Instance Method Details

#help(task = nil, subcommand = false) ⇒ Object



331
332
333
# File 'lib/thor.rb', line 331

def help(task = nil, subcommand = false)
  task ? self.class.task_help(shell, task) : self.class.help(shell, subcommand)
end