daemon-kit 0.1.8rc2 → 0.1.8rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/Rakefile +1 -0
  2. data/daemon-kit.gemspec +36 -36
  3. data/lib/daemon_kit.rb +1 -1
  4. data/lib/daemon_kit/amqp.rb +1 -0
  5. data/lib/daemon_kit/cron.rb +16 -0
  6. data/lib/daemon_kit/deployment/capistrano.rb +34 -0
  7. data/lib/daemon_kit/error_handlers/hoptoad.rb +8 -2
  8. data/lib/daemon_kit/generators.rb +1 -1
  9. data/lib/daemon_kit/generators/base.rb +1 -1
  10. data/lib/daemon_kit/ruote_participants.rb +7 -1
  11. data/lib/daemon_kit/ruote_workitem.rb +30 -20
  12. data/lib/daemon_kit/tasks/environment.rake +1 -0
  13. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/CHANGELOG.rdoc +9 -0
  14. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/LICENSE +0 -0
  15. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/README.rdoc +65 -2
  16. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/Thorfile +14 -9
  17. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor.rb +10 -8
  18. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/actions.rb +34 -12
  19. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/actions/create_file.rb +0 -0
  20. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/actions/directory.rb +0 -0
  21. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/actions/empty_directory.rb +0 -0
  22. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/actions/file_manipulation.rb +1 -1
  23. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/actions/inject_into_file.rb +9 -6
  24. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/base.rb +45 -20
  25. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/core_ext/file_binary_read.rb +0 -0
  26. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/core_ext/hash_with_indifferent_access.rb +0 -0
  27. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/core_ext/ordered_hash.rb +0 -0
  28. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/error.rb +3 -0
  29. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/group.rb +21 -21
  30. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/invocation.rb +19 -17
  31. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/parser.rb +0 -0
  32. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/parser/argument.rb +0 -0
  33. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/parser/arguments.rb +9 -4
  34. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/parser/option.rb +0 -4
  35. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/parser/options.rb +41 -14
  36. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/rake_compat.rb +0 -0
  37. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/runner.rb +20 -9
  38. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/shell.rb +8 -3
  39. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/shell/basic.rb +0 -0
  40. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/shell/color.rb +0 -0
  41. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/task.rb +24 -33
  42. data/lib/daemon_kit/vendor/{thor-0.12.3 → thor-0.13.6}/lib/thor/util.rb +9 -18
  43. data/lib/daemon_kit/vendor/thor-0.13.6/lib/thor/version.rb +3 -0
  44. data/lib/generators/daemon_kit/amqp/amqp_generator.rb +1 -1
  45. data/lib/generators/daemon_kit/amqp/templates/config/pre-daemonize/amqp.rb +1 -1
  46. data/lib/generators/daemon_kit/app/app_generator.rb +1 -1
  47. data/lib/generators/daemon_kit/app/templates/README.tt +58 -0
  48. data/lib/generators/daemon_kit/capistrano/capistrano_generator.rb +5 -0
  49. data/lib/generators/daemon_kit/cron/cron_generator.rb +1 -1
  50. data/lib/generators/daemon_kit/cron/templates/config/pre-daemonize/cron.rb +1 -1
  51. data/lib/generators/daemon_kit/nanite_agent/nanite_agent_generator.rb +1 -1
  52. data/lib/generators/daemon_kit/nanite_agent/templates/config/pre-daemonize/nanite_agent.rb +1 -1
  53. data/lib/generators/daemon_kit/ruote/ruote_generator.rb +2 -2
  54. data/lib/generators/daemon_kit/ruote/templates/config/pre-daemonize/ruote.rb +2 -2
  55. data/lib/generators/daemon_kit/xmpp/templates/config/pre-daemonize/xmpp.rb +1 -1
  56. data/lib/generators/daemon_kit/xmpp/xmpp_generator.rb +1 -1
  57. data/tasks/rspec.rake +6 -7
  58. metadata +77 -49
  59. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/version.rb +0 -3
  60. data/lib/generators/daemon_kit/app/templates/README +0 -48
@@ -145,7 +145,7 @@ When invoking the task one:
145
145
 
146
146
  The output is "1 2 3", which means that the three task was invoked only once.
147
147
  You can even invoke tasks from another class, so be sure to check the
148
- documentation.
148
+ documentation[http://rdoc.info/rdoc/wycats/thor/blob/f939a3e8a854616784cac1dcff04ef4f3ee5f7ff/Thor.html].
149
149
 
150
150
  == Thor::Group
151
151
 
@@ -227,7 +227,70 @@ To use them, you just need to include Thor::Actions in your Thor classes:
227
227
 
228
228
  Some actions like copy file requires that a class method called source_root is
229
229
  defined in your class. This is the directory where your templates should be
230
- placed. Be sure to check the documentation.
230
+ placed. Be sure to check the documentation on actions[http://rdoc.info/rdoc/wycats/thor/blob/f939a3e8a854616784cac1dcff04ef4f3ee5f7ff/Thor/Actions.html].
231
+
232
+ == Generators
233
+
234
+ A great use for Thor is creating custom generators. Combining Thor::Group,
235
+ Thor::Actions and ERB templates makes this very easy. Here is an example:
236
+
237
+ class Newgem < Thor::Group
238
+ include Thor::Actions
239
+
240
+ # Define arguments and options
241
+ argument :name
242
+ class_option :test_framework, :default => :test_unit
243
+
244
+ def self.source_root
245
+ File.dirname(__FILE__)
246
+ end
247
+
248
+ def create_lib_file
249
+ template('templates/newgem.tt', "#{name}/lib/#{name}.rb")
250
+ end
251
+
252
+ def create_test_file
253
+ test = options[:test_framework] == "rspec" ? :spec : :test
254
+ create_file "#{name}/#{test}/#{name}_#{test}.rb"
255
+ end
256
+
257
+ def copy_licence
258
+ if yes?("Use MIT license?")
259
+ # Make a copy of the MITLICENSE file at the source root
260
+ copy_file "MITLICENSE", "#{name}/MITLICENSE"
261
+ else
262
+ say "Shame on you…", :red
263
+ end
264
+ end
265
+ end
266
+
267
+ Doing a <tt>thor -T</tt> will show how to run our generator. It should read:
268
+ <tt>thor newgem NAME</tt>. This shows that we have to supply a NAME
269
+ argument for our generator to run.
270
+
271
+ The <tt>create_lib_file</tt> uses an ERB template. This is what it looks like:
272
+
273
+ class <%= name.capitalize %>
274
+ end
275
+
276
+ The arguments that you set in your generator will automatically be passed in
277
+ when <tt>template</tt> gets called. Be sure to read the documentation[http://rdoc.info/rdoc/wycats/thor/blob/f939a3e8a854616784cac1dcff04ef4f3ee5f7ff/Thor/Actions.html] for
278
+ more options.
279
+
280
+ Running the generator with <tt>thor newgem devise</tt> will
281
+ create two files: "devise/lib/devise.rb",
282
+ "devise/test/devise_test.rb". The user will then be prompt (with the
283
+ use of the method <tt>yes?</tt>) if he wants to copy the MITLICENSE. If you
284
+ want to change the test framework, you can add the option:
285
+ <tt>thor newgem devise --test-framework=rspec</tt>
286
+ This will generate: "devise/lib/devise.rb" and
287
+ "devise/spec/devise_spec.rb".
288
+
289
+ == Further Reading
290
+
291
+ Thor has many scripting possibilities beyond these examples. Be sure to read
292
+ through the documentation[http://rdoc.info/rdoc/wycats/thor/blob/f939a3e8a854616784cac1dcff04ef4f3ee5f7ff/Thor.html] and specs[http://github.com/wycats/thor/tree/master/spec/] to get a better understanding of all the
293
+ options Thor offers.
231
294
 
232
295
  == License
233
296
 
@@ -4,7 +4,10 @@ require File.join(File.dirname(__FILE__), "lib", "thor", "version")
4
4
  require 'rubygems'
5
5
  require 'thor/rake_compat'
6
6
  require 'spec/rake/spectask'
7
- require 'rdoc/task'
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ end
8
11
 
9
12
  GEM_NAME = 'thor'
10
13
  EXTRA_RDOC_FILES = ["README.rdoc", "LICENSE", "CHANGELOG.rdoc", "VERSION", "Thorfile"]
@@ -26,13 +29,15 @@ class Default < Thor
26
29
  t.rcov_dir = "rcov"
27
30
  end
28
31
 
29
- RDoc::Task.new do |rdoc|
30
- rdoc.main = "README.rdoc"
31
- rdoc.rdoc_dir = "rdoc"
32
- rdoc.title = GEM_NAME
33
- rdoc.rdoc_files.include(*EXTRA_RDOC_FILES)
34
- rdoc.rdoc_files.include('lib/**/*.rb')
35
- rdoc.options << '--line-numbers' << '--inline-source'
32
+ if defined?(RDoc)
33
+ RDoc::Task.new do |rdoc|
34
+ rdoc.main = "README.rdoc"
35
+ rdoc.rdoc_dir = "rdoc"
36
+ rdoc.title = GEM_NAME
37
+ rdoc.rdoc_files.include(*EXTRA_RDOC_FILES)
38
+ rdoc.rdoc_files.include('lib/**/*.rb')
39
+ rdoc.options << '--line-numbers' << '--inline-source'
40
+ end
36
41
  end
37
42
 
38
43
  begin
@@ -59,6 +64,6 @@ class Default < Thor
59
64
 
60
65
  Jeweler::GemcutterTasks.new
61
66
  rescue LoadError
62
- puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
67
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: gem install jeweler"
63
68
  end
64
69
  end
@@ -1,6 +1,4 @@
1
1
  require 'thor/base'
2
- require 'thor/group'
3
- require 'thor/actions'
4
2
 
5
3
  # TODO: Update thor to allow for git-style CLI (git bisect run)
6
4
  class Thor
@@ -122,8 +120,8 @@ class Thor
122
120
  # script = MyScript.new(args, options, config)
123
121
  # script.invoke(:task, first_arg, second_arg, third_arg)
124
122
  #
125
- def start(given_args=ARGV, config={})
126
- super do
123
+ def start(original_args=ARGV, config={})
124
+ super do |given_args|
127
125
  meth = normalize_task_name(given_args.shift)
128
126
  task = all_tasks[meth]
129
127
 
@@ -147,8 +145,9 @@ class Thor
147
145
  # task_name<String>
148
146
  #
149
147
  def task_help(shell, task_name)
150
- task = all_tasks[task_name]
151
- raise UndefinedTaskError, "task '#{task_name}' could not be found in namespace '#{self.namespace}'" unless task
148
+ meth = normalize_task_name(task_name)
149
+ task = all_tasks[meth]
150
+ handle_no_task_error(meth) unless task
152
151
 
153
152
  shell.say "Usage:"
154
153
  shell.say " #{banner(task)}"
@@ -185,6 +184,10 @@ class Thor
185
184
  end
186
185
  end
187
186
 
187
+ def handle_argument_error(task, error) #:nodoc:
188
+ raise InvocationError, "#{task.name.inspect} was called incorrectly. Call as #{task.formatted_usage(self, banner_base == "thor").inspect}."
189
+ end
190
+
188
191
  protected
189
192
 
190
193
  # The banner for this class. You can customize it if you are invoking the
@@ -193,8 +196,7 @@ class Thor
193
196
  # the namespace should be displayed as arguments.
194
197
  #
195
198
  def banner(task)
196
- base = $thor_runner ? "thor" : File.basename($0.split(" ").first)
197
- "#{base} #{task.formatted_usage(self, base == "thor")}"
199
+ "#{banner_base} #{task.formatted_usage(self, banner_base == "thor")}"
198
200
  end
199
201
 
200
202
  def baseclass #:nodoc:
@@ -1,4 +1,5 @@
1
1
  require 'fileutils'
2
+ require 'uri'
2
3
  require 'thor/core_ext/file_binary_read'
3
4
 
4
5
  Dir[File.join(File.dirname(__FILE__), "actions", "*.rb")].each do |action|
@@ -19,7 +20,13 @@ class Thor
19
20
  # inherited paths and the source root.
20
21
  #
21
22
  def source_paths
22
- @source_paths ||= []
23
+ @_source_paths ||= []
24
+ end
25
+
26
+ # Stores and return the source root for this class
27
+ def source_root(path=nil)
28
+ @_source_root = path if path
29
+ @_source_root
23
30
  end
24
31
 
25
32
  # Returns the source paths in the following order:
@@ -31,7 +38,7 @@ class Thor
31
38
  def source_paths_for_search
32
39
  paths = []
33
40
  paths += self.source_paths
34
- paths << self.source_root if self.respond_to?(:source_root)
41
+ paths << self.source_root if self.source_root
35
42
  paths += from_superclass(:source_paths, [])
36
43
  paths
37
44
  end
@@ -115,7 +122,7 @@ class Thor
115
122
  @source_paths ||= self.class.source_paths_for_search
116
123
  end
117
124
 
118
- # Receives a file or directory and search for it in the source paths.
125
+ # Receives a file or directory and search for it in the source paths.
119
126
  #
120
127
  def find_in_source_paths(file)
121
128
  relative_root = relative_to_original_destination_root(destination_root, false)
@@ -125,12 +132,19 @@ class Thor
125
132
  return source_file if File.exists?(source_file)
126
133
  end
127
134
 
135
+ message = "Could not find #{file.inspect} in any of your source paths. "
136
+
137
+ unless self.class.source_root
138
+ message << "Please invoke #{self.class.name}.source_root(PATH) with the PATH containing your templates. "
139
+ end
140
+
128
141
  if source_paths.empty?
129
- raise Error, "You don't have any source path defined for class #{self.class.name}. To fix this, " <<
130
- "you can define a source_root in your class."
142
+ message << "Currently you have no source paths."
131
143
  else
132
- raise Error, "Could not find #{file.inspect} in source paths."
144
+ message << "Your current source paths are: \n#{source_paths.join("\n")}"
133
145
  end
146
+
147
+ raise Error, message
134
148
  end
135
149
 
136
150
  # Do something in the root or on a provided subfolder. If a relative path
@@ -180,11 +194,18 @@ class Thor
180
194
 
181
195
  say_status :apply, path, verbose
182
196
  shell.padding += 1 if verbose
183
- instance_eval(open(path).read)
197
+
198
+ if URI(path).is_a?(URI::HTTP)
199
+ contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
200
+ else
201
+ contents = open(path) {|io| io.read }
202
+ end
203
+
204
+ instance_eval(contents, path)
184
205
  shell.padding -= 1 if verbose
185
206
  end
186
207
 
187
- # Executes a command.
208
+ # Executes a command returning the contents of the command.
188
209
  #
189
210
  # ==== Parameters
190
211
  # command<String>:: the command to be executed.
@@ -209,7 +230,7 @@ class Thor
209
230
  end
210
231
 
211
232
  say_status :run, desc, config.fetch(:verbose, true)
212
- system(command) unless options[:pretend]
233
+ `#{command}` unless options[:pretend]
213
234
  end
214
235
 
215
236
  # Executes a ruby script (taking into account WIN32 platform quirks).
@@ -220,10 +241,10 @@ class Thor
220
241
  #
221
242
  def run_ruby_script(command, config={})
222
243
  return unless behavior == :invoke
223
- run "#{command}", config.merge(:with => Thor::Util.ruby_command)
244
+ run command, config.merge(:with => Thor::Util.ruby_command)
224
245
  end
225
246
 
226
- # Run a thor command. A hash of options can be given and it's converted to
247
+ # Run a thor command. A hash of options can be given and it's converted to
227
248
  # switches.
228
249
  #
229
250
  # ==== Parameters
@@ -243,12 +264,13 @@ class Thor
243
264
  def thor(task, *args)
244
265
  config = args.last.is_a?(Hash) ? args.pop : {}
245
266
  verbose = config.key?(:verbose) ? config.delete(:verbose) : true
267
+ pretend = config.key?(:pretend) ? config.delete(:pretend) : false
246
268
 
247
269
  args.unshift task
248
270
  args.push Thor::Options.to_switches(config)
249
271
  command = args.join(' ').strip
250
272
 
251
- run command, :with => :thor, :verbose => verbose
273
+ run command, :with => :thor, :verbose => verbose, :pretend => pretend
252
274
  end
253
275
 
254
276
  protected
@@ -48,7 +48,7 @@ class Thor
48
48
  #
49
49
  def get(source, destination=nil, config={}, &block)
50
50
  source = File.expand_path(find_in_source_paths(source.to_s)) unless source =~ /^http\:\/\//
51
- render = File.binread(source)
51
+ render = open(source) {|input| input.binmode.read }
52
52
 
53
53
  destination ||= if block_given?
54
54
  block.arity == 1 ? block.call(render) : block.call
@@ -10,7 +10,8 @@ class Thor
10
10
  # destination<String>:: Relative path to the destination root
11
11
  # data<String>:: Data to add to the file. Can be given as a block.
12
12
  # config<Hash>:: give :verbose => false to not log the status and the flag
13
- # for injection (:after or :before).
13
+ # for injection (:after or :before) or :force => true for
14
+ # insert two or more times the same content.
14
15
  #
15
16
  # ==== Examples
16
17
  #
@@ -55,7 +56,7 @@ class Thor
55
56
  replacement + '\0'
56
57
  end
57
58
 
58
- replace!(/#{flag}/, content)
59
+ replace!(/#{flag}/, content, config[:force])
59
60
  end
60
61
 
61
62
  def revoke!
@@ -69,7 +70,7 @@ class Thor
69
70
  /(#{Regexp.escape(replacement)})(.*)(#{flag})/m
70
71
  end
71
72
 
72
- replace!(regexp, content)
73
+ replace!(regexp, content, true)
73
74
  end
74
75
 
75
76
  protected
@@ -88,11 +89,13 @@ class Thor
88
89
 
89
90
  # Adds the content to the file.
90
91
  #
91
- def replace!(regexp, string)
92
+ def replace!(regexp, string, force)
92
93
  unless base.options[:pretend]
93
94
  content = File.binread(destination)
94
- content.gsub!(regexp, string)
95
- File.open(destination, 'wb') { |file| file.write(content) }
95
+ if force || !content.include?(replacement)
96
+ content.gsub!(regexp, string)
97
+ File.open(destination, 'wb') { |file| file.write(content) }
98
+ end
96
99
  end
97
100
  end
98
101
 
@@ -8,6 +8,9 @@ require 'thor/task'
8
8
  require 'thor/util'
9
9
 
10
10
  class Thor
11
+ autoload :Actions, 'thor/actions'
12
+ autoload :RakeCompat, 'thor/rake_compat'
13
+
11
14
  # Shortcuts for help.
12
15
  HELP_MAPPINGS = %w(-h -? --help -D)
13
16
 
@@ -35,9 +38,8 @@ class Thor
35
38
  # config<Hash>:: Configuration for this Thor class.
36
39
  #
37
40
  def initialize(args=[], options={}, config={})
38
- Thor::Arguments.parse(self.class.arguments, args).each do |key, value|
39
- send("#{key}=", value)
40
- end
41
+ args = Thor::Arguments.parse(self.class.arguments, args)
42
+ args.each { |key, value| send("#{key}=", value) }
41
43
 
42
44
  parse_options = self.class.class_options
43
45
 
@@ -49,9 +51,9 @@ class Thor
49
51
  array_options, hash_options = [], options
50
52
  end
51
53
 
52
- options = Thor::Options.parse(parse_options, array_options)
53
- self.options = Thor::CoreExt::HashWithIndifferentAccess.new(options).merge!(hash_options)
54
- self.options.freeze
54
+ opts = Thor::Options.new(parse_options, hash_options)
55
+ self.options = opts.parse(array_options)
56
+ opts.check_unknown! if self.class.check_unknown_options?
55
57
  end
56
58
 
57
59
  class << self
@@ -94,6 +96,28 @@ class Thor
94
96
  module ClassMethods
95
97
  attr_accessor :debugging
96
98
 
99
+ def attr_reader(*) #:nodoc:
100
+ no_tasks { super }
101
+ end
102
+
103
+ def attr_writer(*) #:nodoc:
104
+ no_tasks { super }
105
+ end
106
+
107
+ def attr_accessor(*) #:nodoc:
108
+ no_tasks { super }
109
+ end
110
+
111
+ # If you want to raise an error for unknown options, call check_unknown_options!
112
+ # This is disabled by default to allow dynamic invocations.
113
+ def check_unknown_options!
114
+ @check_unknown_options = true
115
+ end
116
+
117
+ def check_unknown_options? #:nodoc:
118
+ @check_unknown_options || false
119
+ end
120
+
97
121
  # Adds an argument to the class and creates an attr_accessor for it.
98
122
  #
99
123
  # Arguments are different from options in several aspects. The first one
@@ -340,7 +364,7 @@ class Thor
340
364
  def namespace(name=nil)
341
365
  case name
342
366
  when nil
343
- @namespace ||= Thor::Util.namespace_from_thor_class(self, false)
367
+ @namespace ||= Thor::Util.namespace_from_thor_class(self)
344
368
  else
345
369
  @namespace = name.to_s
346
370
  end
@@ -351,14 +375,18 @@ class Thor
351
375
  def start(given_args=ARGV, config={})
352
376
  self.debugging = given_args.include?("--debug")
353
377
  config[:shell] ||= Thor::Base.shell.new
354
- yield
378
+ yield(given_args.dup)
355
379
  rescue Thor::Error => e
356
- if debugging
357
- raise e
380
+ debugging ? (raise e) : config[:shell].error(e.message)
381
+ exit(1) if exit_on_failure?
382
+ end
383
+
384
+ def handle_no_task_error(task) #:nodoc:
385
+ if self.banner_base == "thor"
386
+ raise UndefinedTaskError, "Could not find task #{task.inspect} in #{namespace.inspect} namespace."
358
387
  else
359
- config[:shell].error e.message
388
+ raise UndefinedTaskError, "Could not find task #{task.inspect}."
360
389
  end
361
- exit(1) if exit_on_failure?
362
390
  end
363
391
 
364
392
  protected
@@ -404,7 +432,6 @@ class Thor
404
432
  end
405
433
 
406
434
  # Raises an error if the word given is a Thor reserved word.
407
- #
408
435
  def is_thor_reserved_word?(word, type) #:nodoc:
409
436
  return false unless THOR_RESERVED_WORDS.include?(word.to_s)
410
437
  raise "#{word.inspect} is a Thor reserved word and cannot be defined as #{type}"
@@ -415,7 +442,6 @@ class Thor
415
442
  # ==== Parameters
416
443
  # name<Symbol>:: The name of the argument.
417
444
  # options<Hash>:: Described in both class_option and method_option.
418
- #
419
445
  def build_option(name, options, scope) #:nodoc:
420
446
  scope[name] = Thor::Option.new(name, options[:desc], options[:required],
421
447
  options[:type], options[:default], options[:banner],
@@ -429,7 +455,6 @@ class Thor
429
455
  #
430
456
  # ==== Parameters
431
457
  # Hash[Symbol => Object]
432
- #
433
458
  def build_options(options, scope) #:nodoc:
434
459
  options.each do |key, value|
435
460
  scope[key] = Thor::Option.parse(key, value)
@@ -439,7 +464,6 @@ class Thor
439
464
  # Finds a task with the given name. If the task belongs to the current
440
465
  # class, just return it, otherwise dup it and add the fresh copy to the
441
466
  # current task hash.
442
- #
443
467
  def find_and_refresh_task(name) #:nodoc:
444
468
  task = if task = tasks[name.to_s]
445
469
  task
@@ -452,14 +476,12 @@ class Thor
452
476
 
453
477
  # Everytime someone inherits from a Thor class, register the klass
454
478
  # and file into baseclass.
455
- #
456
479
  def inherited(klass)
457
480
  Thor::Base.register_klass_file(klass)
458
481
  end
459
482
 
460
483
  # Fire this callback whenever a method is added. Added methods are
461
484
  # tracked as tasks by invoking the create_task method.
462
- #
463
485
  def method_added(meth)
464
486
  meth = meth.to_s
465
487
 
@@ -480,7 +502,6 @@ class Thor
480
502
 
481
503
  # Retrieves a value from superclass. If it reaches the baseclass,
482
504
  # returns default.
483
- #
484
505
  def from_superclass(method, default=nil)
485
506
  if self == baseclass || !superclass.respond_to?(method, true)
486
507
  default
@@ -491,11 +512,15 @@ class Thor
491
512
  end
492
513
 
493
514
  # A flag that makes the process exit with status 1 if any error happens.
494
- #
495
515
  def exit_on_failure?
496
516
  false
497
517
  end
498
518
 
519
+ # Returns the base for banner.
520
+ def banner_base
521
+ @banner_base ||= $thor_runner ? "thor" : File.basename($0.split(" ").first)
522
+ end
523
+
499
524
  # SIGNATURE: Sets the baseclass. This is where the superclass lookup
500
525
  # finishes.
501
526
  def baseclass #:nodoc: