Module: Thor::Base
- Defined in:
- lib/thor/base.rb,
lib/thor/shell.rb,
lib/thor/base/common_class_options.rb
Overview
Declarations
Defined Under Namespace
Modules: ClassMethods, CommonClassOptions
Class Attribute Summary collapse
-
.shell ⇒ Object
Returns the shell used in all Thor classes.
Instance Attribute Summary collapse
-
#args ⇒ Object
Returns the value of attribute args.
-
#options ⇒ Object
Returns the value of attribute options.
-
#parent_options ⇒ Object
Returns the value of attribute parent_options.
Class Method Summary collapse
- .included(base) ⇒ void
-
.register_klass_file(klass) ⇒ Object
Whenever a class inherits from Thor or Thor::Group, we should track the class and the file on Thor::Base.
-
.subclass_files ⇒ Object
Returns the files where the subclasses are kept.
-
.subclasses ⇒ Object
Returns the classes that inherits from Thor or Thor::Group.
Instance Method Summary collapse
-
#initialize(args = [], local_options = {}, config = {}) ⇒ Object
It receives arguments in an Array and two hashes, one for options and other for configuration.
-
#on_run_error(error, command, args) ⇒ Object
protected
Atli addition: An error handling hook that is called from Command#run when running a command raises an unhandled exception.
Class Attribute Details
.shell ⇒ Object
Returns the shell used in all Thor classes. If you are in a Unix platform it will use a colored log, otherwise it will use a basic one without color.
11 12 13 14 15 16 17 18 19 |
# File 'lib/thor/shell.rb', line 11 def shell @shell ||= if ENV["THOR_SHELL"] && !ENV["THOR_SHELL"].empty? Thor::Shell.const_get(ENV["THOR_SHELL"]) elsif RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ && !ENV["ANSICON"] Thor::Shell::Basic else Thor::Shell::Color end end |
Instance Attribute Details
#args ⇒ Object
Returns the value of attribute args.
51 52 53 |
# File 'lib/thor/base.rb', line 51 def args @args end |
#options ⇒ Object
Returns the value of attribute options.
51 52 53 |
# File 'lib/thor/base.rb', line 51 def @options end |
#parent_options ⇒ Object
Returns the value of attribute parent_options.
51 52 53 |
# File 'lib/thor/base.rb', line 51 def @parent_options end |
Class Method Details
.included(base) ⇒ void
This method returns an undefined value.
Hook called when Thor::Base is mixed in (Thor and Group).
Extends ‘base` with ClassMethods, and includes Invocation and Shell in `base` as well.
187 188 189 190 191 192 193 194 195 196 |
# File 'lib/thor/base.rb', line 187 def self.included base base.extend ClassMethods base.send :include, Invocation base.send :include, Shell base.no_commands { base.send :include, SemanticLogger::Loggable } end |
.register_klass_file(klass) ⇒ Object
Whenever a class inherits from Thor or Thor::Group, we should track the class and the file on Thor::Base. This is the method responsible for it.
219 220 221 222 223 224 225 226 227 |
# File 'lib/thor/base.rb', line 219 def self.register_klass_file(klass) #:nodoc: file = caller[1].match(/(.*):\d+/)[1] unless Thor::Base.subclasses.include?(klass) Thor::Base.subclasses << klass end file_subclasses = Thor::Base.subclass_files[File.(file)] file_subclasses << klass unless file_subclasses.include?(klass) end |
.subclass_files ⇒ Object
Returns the files where the subclasses are kept.
Returns
Hash[path<String> => Class]
212 213 214 |
# File 'lib/thor/base.rb', line 212 def self.subclass_files @subclass_files ||= Hash.new { |h, k| h[k] = [] } end |
.subclasses ⇒ Object
203 204 205 |
# File 'lib/thor/base.rb', line 203 def self.subclasses @subclasses ||= [] end |
Instance Method Details
#initialize(args = [], local_options = {}, config = {}) ⇒ Object
It receives arguments in an Array and two hashes, one for options and other for configuration.
Notice that it does not check if all required arguments were supplied. It should be done by the parser.
Parameters
- args<Array>
-
An array of objects. The objects are applied to their respective accessors declared with
argument. - options<Hash>
-
An options hash that will be available as self.options. The hash given is converted to a hash with indifferent access, magic predicates (options.skip?) and then frozen.
- config<Hash>
-
Configuration for this Thor class.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 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 124 125 126 |
# File 'lib/thor/base.rb', line 70 def initialize(args = [], = {}, config = {}) logger.trace "#{ self.class.name }#initialize", args: args, local_options: , config: config = self.class. # The start method splits inbound arguments at the first argument # that looks like an option (starts with - or --). It then calls # new, passing in the two halves of the arguments Array as the # first two parameters. = config.delete(:command_options) # hook for start = .merge() if if .is_a?(Array) = = {} else # Handle the case where the class was explicitly instantiated # with pre-parsed options. = [] = end # Let Thor::Options parse the options first, so it can remove # declared options from the array. This will leave us with # a list of arguments that weren't declared. stop_on_unknown = \ self.class.stop_on_unknown_option? config[:current_command] disable_required_check = \ self.class.disable_required_check? config[:current_command] opts = Thor::Options.new( , , stop_on_unknown, disable_required_check ) self. = opts.parse() if config[:class_options] self. = config[:class_options].merge() end # If unknown options are disallowed, make sure that none of the # remaining arguments looks like an option. opts.check_unknown! if self.class.(config) # Add the remaining arguments from the options parser to the # arguments passed in to initialize. Then remove any positional # arguments declared using #argument (this is primarily used # by Thor::Group). Tis will leave us with the remaining # positional arguments. to_parse = args to_parse += opts.remaining unless self.class.strict_args_position?(config) thor_args = Thor::Arguments.new(self.class.arguments) thor_args.parse(to_parse).each { |k, v| __send__("#{k}=", v) } @args = thor_args.remaining end |
#on_run_error(error, command, args) ⇒ Object (protected)
Atli addition: An error handling hook that is called from Command#run when running a command raises an unhandled exception.
I don’t believe errors are recoverable at this point, but this hook allows the Thor subclass to respond to expected errors and gracefully inform the user.
It’s basically ‘goto fail` or whatever.
User overrides should always exit or re-raise the error.
The base implementation here simply re-raises.
Note that ArgumentError and NoMethodError are both rescued in Command#run and passed off to Thor’s relevant ‘.handle_*_error` methods, so you probably won’t be able to intercept any of those.
Generally, it’s best to use this to respond to custom, specific errors so you can easily bail out with a ‘raise` from anywhere in the application and still provide a properly formatted response and exit status to the user.
Errors that are only expected in a single command
167 168 169 |
# File 'lib/thor/base.rb', line 167 def on_run_error error, command, args raise error end |