jedi 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +31 -0
  6. data/Rakefile +2 -0
  7. data/bin/jedi +6 -0
  8. data/jedi.gemspec +23 -0
  9. data/lib/jedi.rb +5 -0
  10. data/lib/jedi/cli.rb +27 -0
  11. data/lib/jedi/vendor/thor-0.19.1/lib/thor.rb +484 -0
  12. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions.rb +319 -0
  13. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/create_file.rb +103 -0
  14. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/create_link.rb +59 -0
  15. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/directory.rb +118 -0
  16. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/empty_directory.rb +135 -0
  17. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/file_manipulation.rb +316 -0
  18. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/inject_into_file.rb +107 -0
  19. data/lib/jedi/vendor/thor-0.19.1/lib/thor/base.rb +656 -0
  20. data/lib/jedi/vendor/thor-0.19.1/lib/thor/command.rb +133 -0
  21. data/lib/jedi/vendor/thor-0.19.1/lib/thor/core_ext/hash_with_indifferent_access.rb +77 -0
  22. data/lib/jedi/vendor/thor-0.19.1/lib/thor/core_ext/io_binary_read.rb +10 -0
  23. data/lib/jedi/vendor/thor-0.19.1/lib/thor/core_ext/ordered_hash.rb +98 -0
  24. data/lib/jedi/vendor/thor-0.19.1/lib/thor/error.rb +32 -0
  25. data/lib/jedi/vendor/thor-0.19.1/lib/thor/group.rb +281 -0
  26. data/lib/jedi/vendor/thor-0.19.1/lib/thor/invocation.rb +178 -0
  27. data/lib/jedi/vendor/thor-0.19.1/lib/thor/line_editor.rb +17 -0
  28. data/lib/jedi/vendor/thor-0.19.1/lib/thor/line_editor/basic.rb +35 -0
  29. data/lib/jedi/vendor/thor-0.19.1/lib/thor/line_editor/readline.rb +88 -0
  30. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser.rb +4 -0
  31. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/argument.rb +73 -0
  32. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/arguments.rb +175 -0
  33. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/option.rb +125 -0
  34. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/options.rb +218 -0
  35. data/lib/jedi/vendor/thor-0.19.1/lib/thor/rake_compat.rb +71 -0
  36. data/lib/jedi/vendor/thor-0.19.1/lib/thor/runner.rb +322 -0
  37. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell.rb +81 -0
  38. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell/basic.rb +421 -0
  39. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell/color.rb +149 -0
  40. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell/html.rb +126 -0
  41. data/lib/jedi/vendor/thor-0.19.1/lib/thor/util.rb +267 -0
  42. data/lib/jedi/vendor/thor-0.19.1/lib/thor/version.rb +3 -0
  43. data/lib/jedi/vendored_thor.rb +5 -0
  44. data/lib/jedi/version.rb +3 -0
  45. metadata +116 -0
@@ -0,0 +1,133 @@
1
+ class Thor
2
+ class Command < Struct.new(:name, :description, :long_description, :usage, :options)
3
+ FILE_REGEXP = /^#{Regexp.escape(File.dirname(__FILE__))}/
4
+
5
+ def initialize(name, description, long_description, usage, options = nil)
6
+ super(name.to_s, description, long_description, usage, options || {})
7
+ end
8
+
9
+ def initialize_copy(other) #:nodoc:
10
+ super(other)
11
+ self.options = other.options.dup if other.options
12
+ end
13
+
14
+ def hidden?
15
+ false
16
+ end
17
+
18
+ # By default, a command invokes a method in the thor class. You can change this
19
+ # implementation to create custom commands.
20
+ def run(instance, args = [])
21
+ arity = nil
22
+
23
+ if private_method?(instance)
24
+ instance.class.handle_no_command_error(name)
25
+ elsif public_method?(instance)
26
+ arity = instance.method(name).arity
27
+ instance.__send__(name, *args)
28
+ elsif local_method?(instance, :method_missing)
29
+ instance.__send__(:method_missing, name.to_sym, *args)
30
+ else
31
+ instance.class.handle_no_command_error(name)
32
+ end
33
+ rescue ArgumentError => e
34
+ handle_argument_error?(instance, e, caller) ? instance.class.handle_argument_error(self, e, args, arity) : (raise e)
35
+ rescue NoMethodError => e
36
+ handle_no_method_error?(instance, e, caller) ? instance.class.handle_no_command_error(name) : (fail e)
37
+ end
38
+
39
+ # Returns the formatted usage by injecting given required arguments
40
+ # and required options into the given usage.
41
+ def formatted_usage(klass, namespace = true, subcommand = false)
42
+ if namespace
43
+ namespace = klass.namespace
44
+ formatted = "#{namespace.gsub(/^(default)/, '')}:"
45
+ end
46
+ formatted = "#{klass.namespace.split(':').last} " if subcommand
47
+
48
+ formatted ||= ""
49
+
50
+ # Add usage with required arguments
51
+ formatted << if klass && !klass.arguments.empty?
52
+ usage.to_s.gsub(/^#{name}/) do |match|
53
+ match << " " << klass.arguments.map { |a| a.usage }.compact.join(" ")
54
+ end
55
+ else
56
+ usage.to_s
57
+ end
58
+
59
+ # Add required options
60
+ formatted << " #{required_options}"
61
+
62
+ # Strip and go!
63
+ formatted.strip
64
+ end
65
+
66
+ protected
67
+
68
+ def not_debugging?(instance)
69
+ !(instance.class.respond_to?(:debugging) && instance.class.debugging)
70
+ end
71
+
72
+ def required_options
73
+ @required_options ||= options.map { |_, o| o.usage if o.required? }.compact.sort.join(" ")
74
+ end
75
+
76
+ # Given a target, checks if this class name is a public method.
77
+ def public_method?(instance) #:nodoc:
78
+ !(instance.public_methods & [name.to_s, name.to_sym]).empty?
79
+ end
80
+
81
+ def private_method?(instance)
82
+ !(instance.private_methods & [name.to_s, name.to_sym]).empty?
83
+ end
84
+
85
+ def local_method?(instance, name)
86
+ methods = instance.public_methods(false) + instance.private_methods(false) + instance.protected_methods(false)
87
+ !(methods & [name.to_s, name.to_sym]).empty?
88
+ end
89
+
90
+ def sans_backtrace(backtrace, caller) #:nodoc:
91
+ saned = backtrace.reject { |frame| frame =~ FILE_REGEXP || (frame =~ /\.java:/ && RUBY_PLATFORM =~ /java/) || (frame =~ /^kernel\// && RUBY_ENGINE =~ /rbx/) }
92
+ saned - caller
93
+ end
94
+
95
+ def handle_argument_error?(instance, error, caller)
96
+ not_debugging?(instance) && (error.message =~ /wrong number of arguments/ || error.message =~ /given \d*, expected \d*/) && begin
97
+ saned = sans_backtrace(error.backtrace, caller)
98
+ # Ruby 1.9 always include the called method in the backtrace
99
+ saned.empty? || (saned.size == 1 && RUBY_VERSION >= "1.9")
100
+ end
101
+ end
102
+
103
+ def handle_no_method_error?(instance, error, caller)
104
+ not_debugging?(instance) &&
105
+ error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/
106
+ end
107
+ end
108
+ Task = Command # rubocop:disable ConstantName
109
+
110
+ # A command that is hidden in help messages but still invocable.
111
+ class HiddenCommand < Command
112
+ def hidden?
113
+ true
114
+ end
115
+ end
116
+ HiddenTask = HiddenCommand # rubocop:disable ConstantName
117
+
118
+ # A dynamic command that handles method missing scenarios.
119
+ class DynamicCommand < Command
120
+ def initialize(name, options = nil)
121
+ super(name.to_s, "A dynamically-generated command", name.to_s, name.to_s, options)
122
+ end
123
+
124
+ def run(instance, args = [])
125
+ if (instance.methods & [name.to_s, name.to_sym]).empty?
126
+ super
127
+ else
128
+ instance.class.handle_no_command_error(name)
129
+ end
130
+ end
131
+ end
132
+ DynamicTask = DynamicCommand # rubocop:disable ConstantName
133
+ end
@@ -0,0 +1,77 @@
1
+ class Thor
2
+ module CoreExt #:nodoc:
3
+ # A hash with indifferent access and magic predicates.
4
+ #
5
+ # hash = Thor::CoreExt::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true
6
+ #
7
+ # hash[:foo] #=> 'bar'
8
+ # hash['foo'] #=> 'bar'
9
+ # hash.foo? #=> true
10
+ #
11
+ class HashWithIndifferentAccess < ::Hash #:nodoc:
12
+ def initialize(hash = {})
13
+ super()
14
+ hash.each do |key, value|
15
+ self[convert_key(key)] = value
16
+ end
17
+ end
18
+
19
+ def [](key)
20
+ super(convert_key(key))
21
+ end
22
+
23
+ def []=(key, value)
24
+ super(convert_key(key), value)
25
+ end
26
+
27
+ def delete(key)
28
+ super(convert_key(key))
29
+ end
30
+
31
+ def values_at(*indices)
32
+ indices.map { |key| self[convert_key(key)] }
33
+ end
34
+
35
+ def merge(other)
36
+ dup.merge!(other)
37
+ end
38
+
39
+ def merge!(other)
40
+ other.each do |key, value|
41
+ self[convert_key(key)] = value
42
+ end
43
+ self
44
+ end
45
+
46
+ # Convert to a Hash with String keys.
47
+ def to_hash
48
+ Hash.new(default).merge!(self)
49
+ end
50
+
51
+ protected
52
+
53
+ def convert_key(key)
54
+ key.is_a?(Symbol) ? key.to_s : key
55
+ end
56
+
57
+ # Magic predicates. For instance:
58
+ #
59
+ # options.force? # => !!options['force']
60
+ # options.shebang # => "/usr/lib/local/ruby"
61
+ # options.test_framework?(:rspec) # => options[:test_framework] == :rspec
62
+ #
63
+ def method_missing(method, *args, &block)
64
+ method = method.to_s
65
+ if method =~ /^(\w+)\?$/
66
+ if args.empty?
67
+ !!self[$1]
68
+ else
69
+ self[$1] == args.first
70
+ end
71
+ else
72
+ self[method]
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,10 @@
1
+ class IO #:nodoc:
2
+ class << self
3
+ def binread(file, *args)
4
+ fail ArgumentError, "wrong number of arguments (#{1 + args.size} for 1..3)" unless args.size < 3
5
+ File.open(file, "rb") do |f|
6
+ f.read(*args)
7
+ end
8
+ end unless method_defined? :binread
9
+ end
10
+ end
@@ -0,0 +1,98 @@
1
+ class Thor
2
+ module CoreExt #:nodoc:
3
+ if RUBY_VERSION >= "1.9"
4
+ class OrderedHash < ::Hash
5
+ end
6
+ else
7
+ # This class is based on the Ruby 1.9 ordered hashes.
8
+ #
9
+ # It keeps the semantics and most of the efficiency of normal hashes
10
+ # while also keeping track of the order in which elements were set.
11
+ #
12
+ class OrderedHash #:nodoc:
13
+ include Enumerable
14
+
15
+ Node = Struct.new(:key, :value, :next, :prev)
16
+
17
+ def initialize
18
+ @hash = {}
19
+ end
20
+
21
+ def [](key)
22
+ @hash[key] && @hash[key].value
23
+ end
24
+
25
+ def []=(key, value)
26
+ if node = @hash[key] # rubocop:disable AssignmentInCondition
27
+ node.value = value
28
+ else
29
+ node = Node.new(key, value)
30
+
31
+ if !defined?(@first) || @first.nil?
32
+ @first = @last = node
33
+ else
34
+ node.prev = @last
35
+ @last.next = node
36
+ @last = node
37
+ end
38
+ end
39
+
40
+ @hash[key] = node
41
+ value
42
+ end
43
+
44
+ def delete(key)
45
+ if node = @hash[key] # rubocop:disable AssignmentInCondition
46
+ prev_node = node.prev
47
+ next_node = node.next
48
+
49
+ next_node.prev = prev_node if next_node
50
+ prev_node.next = next_node if prev_node
51
+
52
+ @first = next_node if @first == node
53
+ @last = prev_node if @last == node
54
+
55
+ value = node.value
56
+ end
57
+
58
+ @hash.delete(key)
59
+ value
60
+ end
61
+
62
+ def keys
63
+ map { |k, v| k }
64
+ end
65
+
66
+ def values
67
+ map { |k, v| v }
68
+ end
69
+
70
+ def each
71
+ return unless defined?(@first) && @first
72
+ yield [@first.key, @first.value]
73
+ node = @first
74
+ yield [node.key, node.value] while node = node.next # rubocop:disable AssignmentInCondition
75
+ self
76
+ end
77
+
78
+ def merge(other)
79
+ hash = self.class.new
80
+
81
+ each do |key, value|
82
+ hash[key] = value
83
+ end
84
+
85
+ other.each do |key, value|
86
+ hash[key] = value
87
+ end
88
+
89
+ hash
90
+ end
91
+
92
+ def empty?
93
+ @hash.empty?
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,32 @@
1
+ class Thor
2
+ # Thor::Error is raised when it's caused by wrong usage of thor classes. Those
3
+ # errors have their backtrace suppressed and are nicely shown to the user.
4
+ #
5
+ # Errors that are caused by the developer, like declaring a method which
6
+ # overwrites a thor keyword, it SHOULD NOT raise a Thor::Error. This way, we
7
+ # ensure that developer errors are shown with full backtrace.
8
+ class Error < StandardError
9
+ end
10
+
11
+ # Raised when a command was not found.
12
+ class UndefinedCommandError < Error
13
+ end
14
+ UndefinedTaskError = UndefinedCommandError # rubocop:disable ConstantName
15
+
16
+ class AmbiguousCommandError < Error
17
+ end
18
+ AmbiguousTaskError = AmbiguousCommandError # rubocop:disable ConstantName
19
+
20
+ # Raised when a command was found, but not invoked properly.
21
+ class InvocationError < Error
22
+ end
23
+
24
+ class UnknownArgumentError < Error
25
+ end
26
+
27
+ class RequiredArgumentMissingError < InvocationError
28
+ end
29
+
30
+ class MalformattedArgumentError < InvocationError
31
+ end
32
+ end
@@ -0,0 +1,281 @@
1
+ require "thor/base"
2
+
3
+ # Thor has a special class called Thor::Group. The main difference to Thor class
4
+ # is that it invokes all commands at once. It also include some methods that allows
5
+ # invocations to be done at the class method, which are not available to Thor
6
+ # commands.
7
+ class Thor::Group # rubocop:disable ClassLength
8
+ class << self
9
+ # The description for this Thor::Group. If none is provided, but a source root
10
+ # exists, tries to find the USAGE one folder above it, otherwise searches
11
+ # in the superclass.
12
+ #
13
+ # ==== Parameters
14
+ # description<String>:: The description for this Thor::Group.
15
+ #
16
+ def desc(description = nil)
17
+ if description
18
+ @desc = description
19
+ else
20
+ @desc ||= from_superclass(:desc, nil)
21
+ end
22
+ end
23
+
24
+ # Prints help information.
25
+ #
26
+ # ==== Options
27
+ # short:: When true, shows only usage.
28
+ #
29
+ def help(shell)
30
+ shell.say "Usage:"
31
+ shell.say " #{banner}\n"
32
+ shell.say
33
+ class_options_help(shell)
34
+ shell.say desc if desc
35
+ end
36
+
37
+ # Stores invocations for this class merging with superclass values.
38
+ #
39
+ def invocations #:nodoc:
40
+ @invocations ||= from_superclass(:invocations, {})
41
+ end
42
+
43
+ # Stores invocation blocks used on invoke_from_option.
44
+ #
45
+ def invocation_blocks #:nodoc:
46
+ @invocation_blocks ||= from_superclass(:invocation_blocks, {})
47
+ end
48
+
49
+ # Invoke the given namespace or class given. It adds an instance
50
+ # method that will invoke the klass and command. You can give a block to
51
+ # configure how it will be invoked.
52
+ #
53
+ # The namespace/class given will have its options showed on the help
54
+ # usage. Check invoke_from_option for more information.
55
+ #
56
+ def invoke(*names, &block) # rubocop:disable MethodLength
57
+ options = names.last.is_a?(Hash) ? names.pop : {}
58
+ verbose = options.fetch(:verbose, true)
59
+
60
+ names.each do |name|
61
+ invocations[name] = false
62
+ invocation_blocks[name] = block if block_given?
63
+
64
+ class_eval <<-METHOD, __FILE__, __LINE__
65
+ def _invoke_#{name.to_s.gsub(/\W/, "_")}
66
+ klass, command = self.class.prepare_for_invocation(nil, #{name.inspect})
67
+
68
+ if klass
69
+ say_status :invoke, #{name.inspect}, #{verbose.inspect}
70
+ block = self.class.invocation_blocks[#{name.inspect}]
71
+ _invoke_for_class_method klass, command, &block
72
+ else
73
+ say_status :error, %(#{name.inspect} [not found]), :red
74
+ end
75
+ end
76
+ METHOD
77
+ end
78
+ end
79
+
80
+ # Invoke a thor class based on the value supplied by the user to the
81
+ # given option named "name". A class option must be created before this
82
+ # method is invoked for each name given.
83
+ #
84
+ # ==== Examples
85
+ #
86
+ # class GemGenerator < Thor::Group
87
+ # class_option :test_framework, :type => :string
88
+ # invoke_from_option :test_framework
89
+ # end
90
+ #
91
+ # ==== Boolean options
92
+ #
93
+ # In some cases, you want to invoke a thor class if some option is true or
94
+ # false. This is automatically handled by invoke_from_option. Then the
95
+ # option name is used to invoke the generator.
96
+ #
97
+ # ==== Preparing for invocation
98
+ #
99
+ # In some cases you want to customize how a specified hook is going to be
100
+ # invoked. You can do that by overwriting the class method
101
+ # prepare_for_invocation. The class method must necessarily return a klass
102
+ # and an optional command.
103
+ #
104
+ # ==== Custom invocations
105
+ #
106
+ # You can also supply a block to customize how the option is going to be
107
+ # invoked. The block receives two parameters, an instance of the current
108
+ # class and the klass to be invoked.
109
+ #
110
+ def invoke_from_option(*names, &block) # rubocop:disable MethodLength
111
+ options = names.last.is_a?(Hash) ? names.pop : {}
112
+ verbose = options.fetch(:verbose, :white)
113
+
114
+ names.each do |name|
115
+ unless class_options.key?(name)
116
+ fail ArgumentError, "You have to define the option #{name.inspect} " <<
117
+ "before setting invoke_from_option."
118
+ end
119
+
120
+ invocations[name] = true
121
+ invocation_blocks[name] = block if block_given?
122
+
123
+ class_eval <<-METHOD, __FILE__, __LINE__
124
+ def _invoke_from_option_#{name.to_s.gsub(/\W/, "_")}
125
+ return unless options[#{name.inspect}]
126
+
127
+ value = options[#{name.inspect}]
128
+ value = #{name.inspect} if TrueClass === value
129
+ klass, command = self.class.prepare_for_invocation(#{name.inspect}, value)
130
+
131
+ if klass
132
+ say_status :invoke, value, #{verbose.inspect}
133
+ block = self.class.invocation_blocks[#{name.inspect}]
134
+ _invoke_for_class_method klass, command, &block
135
+ else
136
+ say_status :error, %(\#{value} [not found]), :red
137
+ end
138
+ end
139
+ METHOD
140
+ end
141
+ end
142
+
143
+ # Remove a previously added invocation.
144
+ #
145
+ # ==== Examples
146
+ #
147
+ # remove_invocation :test_framework
148
+ #
149
+ def remove_invocation(*names)
150
+ names.each do |name|
151
+ remove_command(name)
152
+ remove_class_option(name)
153
+ invocations.delete(name)
154
+ invocation_blocks.delete(name)
155
+ end
156
+ end
157
+
158
+ # Overwrite class options help to allow invoked generators options to be
159
+ # shown recursively when invoking a generator.
160
+ #
161
+ def class_options_help(shell, groups = {}) #:nodoc:
162
+ get_options_from_invocations(groups, class_options) do |klass|
163
+ klass.send(:get_options_from_invocations, groups, class_options)
164
+ end
165
+ super(shell, groups)
166
+ end
167
+
168
+ # Get invocations array and merge options from invocations. Those
169
+ # options are added to group_options hash. Options that already exists
170
+ # in base_options are not added twice.
171
+ #
172
+ def get_options_from_invocations(group_options, base_options) #:nodoc: # rubocop:disable MethodLength
173
+ invocations.each do |name, from_option|
174
+ value = if from_option
175
+ option = class_options[name]
176
+ option.type == :boolean ? name : option.default
177
+ else
178
+ name
179
+ end
180
+ next unless value
181
+
182
+ klass, _ = prepare_for_invocation(name, value)
183
+ next unless klass && klass.respond_to?(:class_options)
184
+
185
+ value = value.to_s
186
+ human_name = value.respond_to?(:classify) ? value.classify : value
187
+
188
+ group_options[human_name] ||= []
189
+ group_options[human_name] += klass.class_options.values.select do |class_option|
190
+ base_options[class_option.name.to_sym].nil? && class_option.group.nil? &&
191
+ !group_options.values.flatten.any? { |i| i.name == class_option.name }
192
+ end
193
+
194
+ yield klass if block_given?
195
+ end
196
+ end
197
+
198
+ # Returns commands ready to be printed.
199
+ def printable_commands(*)
200
+ item = []
201
+ item << banner
202
+ item << (desc ? "# #{desc.gsub(/\s+/m, ' ')}" : "")
203
+ [item]
204
+ end
205
+ alias_method :printable_tasks, :printable_commands
206
+
207
+ def handle_argument_error(command, error, args, arity) #:nodoc:
208
+ msg = "#{basename} #{command.name} takes #{arity} argument"
209
+ msg << "s" if arity > 1
210
+ msg << ", but it should not."
211
+ fail error, msg
212
+ end
213
+
214
+ protected
215
+
216
+ # The method responsible for dispatching given the args.
217
+ def dispatch(command, given_args, given_opts, config) #:nodoc:
218
+ if Thor::HELP_MAPPINGS.include?(given_args.first)
219
+ help(config[:shell])
220
+ return
221
+ end
222
+
223
+ args, opts = Thor::Options.split(given_args)
224
+ opts = given_opts || opts
225
+
226
+ instance = new(args, opts, config)
227
+ yield instance if block_given?
228
+
229
+ if command
230
+ instance.invoke_command(all_commands[command])
231
+ else
232
+ instance.invoke_all
233
+ end
234
+ end
235
+
236
+ # The banner for this class. You can customize it if you are invoking the
237
+ # thor class by another ways which is not the Thor::Runner.
238
+ def banner
239
+ "#{basename} #{self_command.formatted_usage(self, false)}"
240
+ end
241
+
242
+ # Represents the whole class as a command.
243
+ def self_command #:nodoc:
244
+ Thor::DynamicCommand.new(namespace, class_options)
245
+ end
246
+ alias_method :self_task, :self_command
247
+
248
+ def baseclass #:nodoc:
249
+ Thor::Group
250
+ end
251
+
252
+ def create_command(meth) #:nodoc:
253
+ commands[meth.to_s] = Thor::Command.new(meth, nil, nil, nil, nil)
254
+ true
255
+ end
256
+ alias_method :create_task, :create_command
257
+ end
258
+
259
+ include Thor::Base
260
+
261
+ protected
262
+
263
+ # Shortcut to invoke with padding and block handling. Use internally by
264
+ # invoke and invoke_from_option class methods.
265
+ def _invoke_for_class_method(klass, command = nil, *args, &block) #:nodoc:
266
+ with_padding do
267
+ if block
268
+ case block.arity
269
+ when 3
270
+ block.call(self, klass, command)
271
+ when 2
272
+ block.call(self, klass)
273
+ when 1
274
+ instance_exec(klass, &block)
275
+ end
276
+ else
277
+ invoke klass, command, *args
278
+ end
279
+ end
280
+ end
281
+ end