thor 0.18.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +13 -7
  3. data/Thorfile +4 -5
  4. data/bin/thor +1 -1
  5. data/lib/thor.rb +78 -67
  6. data/lib/thor/actions.rb +57 -56
  7. data/lib/thor/actions/create_file.rb +33 -35
  8. data/lib/thor/actions/create_link.rb +2 -3
  9. data/lib/thor/actions/directory.rb +37 -38
  10. data/lib/thor/actions/empty_directory.rb +67 -69
  11. data/lib/thor/actions/file_manipulation.rb +17 -15
  12. data/lib/thor/actions/inject_into_file.rb +27 -29
  13. data/lib/thor/base.rb +193 -189
  14. data/lib/thor/command.rb +20 -23
  15. data/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -24
  16. data/lib/thor/core_ext/io_binary_read.rb +2 -4
  17. data/lib/thor/core_ext/ordered_hash.rb +9 -11
  18. data/lib/thor/error.rb +5 -1
  19. data/lib/thor/group.rb +53 -54
  20. data/lib/thor/invocation.rb +44 -38
  21. data/lib/thor/line_editor.rb +17 -0
  22. data/lib/thor/line_editor/basic.rb +35 -0
  23. data/lib/thor/line_editor/readline.rb +88 -0
  24. data/lib/thor/parser.rb +4 -4
  25. data/lib/thor/parser/argument.rb +28 -29
  26. data/lib/thor/parser/arguments.rb +102 -98
  27. data/lib/thor/parser/option.rb +26 -22
  28. data/lib/thor/parser/options.rb +86 -86
  29. data/lib/thor/rake_compat.rb +9 -10
  30. data/lib/thor/runner.rb +141 -141
  31. data/lib/thor/shell.rb +27 -34
  32. data/lib/thor/shell/basic.rb +91 -63
  33. data/lib/thor/shell/color.rb +44 -43
  34. data/lib/thor/shell/html.rb +59 -60
  35. data/lib/thor/util.rb +24 -27
  36. data/lib/thor/version.rb +1 -1
  37. data/spec/actions/create_file_spec.rb +25 -27
  38. data/spec/actions/create_link_spec.rb +19 -18
  39. data/spec/actions/directory_spec.rb +31 -31
  40. data/spec/actions/empty_directory_spec.rb +18 -18
  41. data/spec/actions/file_manipulation_spec.rb +38 -28
  42. data/spec/actions/inject_into_file_spec.rb +13 -13
  43. data/spec/actions_spec.rb +43 -43
  44. data/spec/base_spec.rb +45 -38
  45. data/spec/command_spec.rb +13 -14
  46. data/spec/core_ext/hash_with_indifferent_access_spec.rb +19 -19
  47. data/spec/core_ext/ordered_hash_spec.rb +6 -6
  48. data/spec/exit_condition_spec.rb +4 -4
  49. data/spec/fixtures/invoke.thor +19 -0
  50. data/spec/fixtures/script.thor +1 -1
  51. data/spec/group_spec.rb +30 -24
  52. data/spec/helper.rb +28 -15
  53. data/spec/invocation_spec.rb +39 -19
  54. data/spec/line_editor/basic_spec.rb +28 -0
  55. data/spec/line_editor/readline_spec.rb +69 -0
  56. data/spec/line_editor_spec.rb +43 -0
  57. data/spec/parser/argument_spec.rb +12 -12
  58. data/spec/parser/arguments_spec.rb +11 -11
  59. data/spec/parser/option_spec.rb +33 -25
  60. data/spec/parser/options_spec.rb +66 -52
  61. data/spec/quality_spec.rb +75 -0
  62. data/spec/rake_compat_spec.rb +10 -10
  63. data/spec/register_spec.rb +60 -30
  64. data/spec/runner_spec.rb +67 -62
  65. data/spec/sandbox/application.rb +2 -0
  66. data/spec/sandbox/app{1}/README +3 -0
  67. data/spec/sandbox/bundle/execute.rb +6 -0
  68. data/spec/sandbox/bundle/main.thor +1 -0
  69. data/spec/sandbox/command.thor +10 -0
  70. data/spec/sandbox/doc/%file_name%.rb.tt +1 -0
  71. data/spec/sandbox/doc/COMMENTER +11 -0
  72. data/spec/sandbox/doc/README +3 -0
  73. data/spec/sandbox/doc/block_helper.rb +3 -0
  74. data/spec/sandbox/doc/config.rb +1 -0
  75. data/spec/sandbox/doc/config.yaml.tt +1 -0
  76. data/spec/sandbox/doc/excluding/%file_name%.rb.tt +1 -0
  77. data/spec/sandbox/enum.thor +10 -0
  78. data/spec/sandbox/group.thor +128 -0
  79. data/spec/sandbox/invoke.thor +131 -0
  80. data/spec/sandbox/path with spaces b/data/spec/sandbox/path with → spaces +0 -0
  81. data/spec/sandbox/preserve/script.sh +3 -0
  82. data/spec/sandbox/script.thor +220 -0
  83. data/spec/sandbox/subcommand.thor +17 -0
  84. data/spec/shell/basic_spec.rb +107 -86
  85. data/spec/shell/color_spec.rb +32 -8
  86. data/spec/shell/html_spec.rb +3 -4
  87. data/spec/shell_spec.rb +7 -7
  88. data/spec/subcommand_spec.rb +20 -2
  89. data/spec/thor_spec.rb +111 -97
  90. data/spec/util_spec.rb +30 -30
  91. data/thor.gemspec +14 -14
  92. metadata +69 -25
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4e171d5182116b3c46ec1cf9207ca4e95c9412a6
4
+ data.tar.gz: dec1d983eca1b3b1eefe3102dee412ef4305c609
5
+ SHA512:
6
+ metadata.gz: 496ebeb3755de7ad56efab9b8686a3b84f22d8c9592b891a8a9434939d49015b2b36d315c22258b51496b482f65a7b591acf4275484209a37787b67642ff7ac4
7
+ data.tar.gz: 195addb56fb393d916eecd4b8cdeb64536c6fa50b5d413a89c39f6b6838e0b137946acae37f48804208c041f8432fa759eaa1c455c21fa13662eb365980fae53
data/README.md CHANGED
@@ -1,12 +1,18 @@
1
- [![Gem Version](https://badge.fury.io/rb/thor.png)](https://rubygems.org/gems/thor)
2
- [![Build Status](https://secure.travis-ci.org/wycats/thor.png?branch=master)](http://travis-ci.org/wycats/thor)
3
- [![Dependency Status](https://gemnasium.com/wycats/thor.png?travis)](https://gemnasium.com/wycats/thor)
4
- [![Code Climate](https://codeclimate.com/github/wycats/thor.png)](https://codeclimate.com/github/wycats/thor)
5
- [![Coverage Status](https://coveralls.io/repos/wycats/thor/badge.png?branch=master)](https://coveralls.io/r/wycats/thor)
6
-
7
1
  Thor
8
2
  ====
9
3
 
4
+ [![Gem Version](http://img.shields.io/gem/v/thor.svg)][gem]
5
+ [![Build Status](http://img.shields.io/travis/erikhuda/thor.svg)][travis]
6
+ [![Dependency Status](http://img.shields.io/gemnasium/erikhuda/thor.svg)][gemnasium]
7
+ [![Code Climate](http://img.shields.io/codeclimate/github/erikhuda/thor.svg)][codeclimate]
8
+ [![Coverage Status](http://img.shields.io/coveralls/erikhuda/thor.svg)][coveralls]
9
+
10
+ [gem]: https://rubygems.org/gems/thor
11
+ [travis]: http://travis-ci.org/erikhuda/thor
12
+ [gemnasium]: https://gemnasium.com/erikhuda/thor
13
+ [codeclimate]: https://codeclimate.com/github/erikhuda/thor
14
+ [coveralls]: https://coveralls.io/r/erikhuda/thor
15
+
10
16
  Description
11
17
  -----------
12
18
  Thor is a simple and efficient tool for building self-documenting command line
@@ -25,7 +31,7 @@ Usage and documentation
25
31
  -----------------------
26
32
  Please see the [wiki][] for basic usage and other documentation on using Thor. You can also checkout the [official homepage][homepage].
27
33
 
28
- [wiki]: https://github.com/wycats/thor/wiki
34
+ [wiki]: https://github.com/erikhuda/thor/wiki
29
35
  [homepage]: http://whatisthor.com/
30
36
 
31
37
  License
data/Thorfile CHANGED
@@ -1,8 +1,7 @@
1
- # encoding: utf-8
2
- $:.unshift File.expand_path("../lib", __FILE__)
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
3
2
 
4
- require 'bundler'
5
- require 'thor/rake_compat'
3
+ require "bundler"
4
+ require "thor/rake_compat"
6
5
 
7
6
  class Default < Thor
8
7
  include Thor::RakeCompat
@@ -25,6 +24,6 @@ class Default < Thor
25
24
 
26
25
  desc "spec", "Run RSpec code examples"
27
26
  def spec
28
- exec "rspec --color --format=documentation spec"
27
+ exec "rspec spec"
29
28
  end
30
29
  end
data/bin/thor CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- mode: ruby -*-
3
3
 
4
- require 'thor/runner'
4
+ require "thor/runner"
5
5
  $thor_runner = true
6
6
  Thor::Runner.start
@@ -1,7 +1,7 @@
1
- require 'set'
2
- require 'thor/base'
1
+ require "set"
2
+ require "thor/base"
3
3
 
4
- class Thor
4
+ class Thor # rubocop:disable ClassLength
5
5
  class << self
6
6
  # Allows for custom "Command" package naming.
7
7
  #
@@ -9,8 +9,8 @@ class Thor
9
9
  # name<String>
10
10
  # options<Hash>
11
11
  #
12
- def package_name(name, options={})
13
- @package_name = name.nil? || name == '' ? nil : name
12
+ def package_name(name, options = {})
13
+ @package_name = name.nil? || name == "" ? nil : name
14
14
  end
15
15
 
16
16
  # Sets the default command when thor is executed without an explicit command to be called.
@@ -18,17 +18,14 @@ class Thor
18
18
  # ==== Parameters
19
19
  # meth<Symbol>:: name of the default command
20
20
  #
21
- def default_command(meth=nil)
22
- @default_command = case meth
23
- when :none
24
- 'help'
25
- when nil
26
- @default_command || from_superclass(:default_command, 'help')
21
+ def default_command(meth = nil)
22
+ if meth
23
+ @default_command = meth == :none ? "help" : meth.to_s
27
24
  else
28
- meth.to_s
25
+ @default_command ||= from_superclass(:default_command, "help")
29
26
  end
30
27
  end
31
- alias default_task default_command
28
+ alias_method :default_task, :default_command
32
29
 
33
30
  # Registers another Thor subclass as a command.
34
31
  #
@@ -37,7 +34,7 @@ class Thor
37
34
  # command<String>:: Subcommand name to use
38
35
  # usage<String>:: Short usage for the subcommand
39
36
  # description<String>:: Description for the subcommand
40
- def register(klass, subcommand_name, usage, description, options={})
37
+ def register(klass, subcommand_name, usage, description, options = {})
41
38
  if klass <= Thor::Group
42
39
  desc usage, description, options
43
40
  define_method(subcommand_name) { |*args| invoke(klass, args) }
@@ -54,7 +51,7 @@ class Thor
54
51
  # description<String>
55
52
  # options<String>
56
53
  #
57
- def desc(usage, description, options={})
54
+ def desc(usage, description, options = {})
58
55
  if options[:for]
59
56
  command = find_and_refresh_command(options[:for])
60
57
  command.usage = usage if usage
@@ -69,7 +66,7 @@ class Thor
69
66
  # ==== Parameters
70
67
  # long description<String>
71
68
  #
72
- def long_desc(long_description, options={})
69
+ def long_desc(long_description, options = {})
73
70
  if options[:for]
74
71
  command = find_and_refresh_command(options[:for])
75
72
  command.long_description = long_description if long_description
@@ -91,13 +88,13 @@ class Thor
91
88
  # ==== Parameters
92
89
  # Hash[String|Array => Symbol]:: Maps the string or the strings in the array to the given command.
93
90
  #
94
- def map(mappings=nil)
91
+ def map(mappings = nil)
95
92
  @map ||= from_superclass(:map, {})
96
93
 
97
94
  if mappings
98
95
  mappings.each do |key, value|
99
96
  if key.respond_to?(:each)
100
- key.each {|subkey| @map[subkey] = value}
97
+ key.each { |subkey| @map[subkey] = value }
101
98
  else
102
99
  @map[key] = value
103
100
  end
@@ -114,13 +111,13 @@ class Thor
114
111
  # is the type of the option. Can be :string, :array, :hash, :boolean, :numeric
115
112
  # or :required (string). If you give a value, the type of the value is used.
116
113
  #
117
- def method_options(options=nil)
114
+ def method_options(options = nil)
118
115
  @method_options ||= {}
119
116
  build_options(options, @method_options) if options
120
117
  @method_options
121
118
  end
122
119
 
123
- alias options method_options
120
+ alias_method :options, :method_options
124
121
 
125
122
  # Adds an option to the set of method options. If :for is given as option,
126
123
  # it allows you to change the options from a previous defined command.
@@ -148,7 +145,7 @@ class Thor
148
145
  # :banner - String to show on usage notes.
149
146
  # :hide - If you want to hide this option from the help.
150
147
  #
151
- def method_option(name, options={})
148
+ def method_option(name, options = {})
152
149
  scope = if options[:for]
153
150
  find_and_refresh_command(options[:for]).options
154
151
  else
@@ -157,7 +154,7 @@ class Thor
157
154
 
158
155
  build_option(name, options, scope)
159
156
  end
160
- alias option method_option
157
+ alias_method :option, :method_option
161
158
 
162
159
  # Prints help information for the given command.
163
160
  #
@@ -181,7 +178,7 @@ class Thor
181
178
  shell.say command.description
182
179
  end
183
180
  end
184
- alias task_help command_help
181
+ alias_method :task_help, :command_help
185
182
 
186
183
  # Prints help information for this class.
187
184
  #
@@ -193,9 +190,9 @@ class Thor
193
190
  Thor::Util.thor_classes_in(self).each do |klass|
194
191
  list += klass.printable_commands(false)
195
192
  end
196
- list.sort!{ |a,b| a[0] <=> b[0] }
193
+ list.sort! { |a, b| a[0] <=> b[0] }
197
194
 
198
- if @package_name
195
+ if defined?(@package_name) && @package_name
199
196
  shell.say "#{@package_name} commands:"
200
197
  else
201
198
  shell.say "Commands:"
@@ -212,34 +209,40 @@ class Thor
212
209
  next if command.hidden?
213
210
  item = []
214
211
  item << banner(command, false, subcommand)
215
- item << (command.description ? "# #{command.description.gsub(/\s+/m,' ')}" : "")
212
+ item << (command.description ? "# #{command.description.gsub(/\s+/m, ' ')}" : "")
216
213
  item
217
214
  end.compact
218
215
  end
219
- alias printable_tasks printable_commands
216
+ alias_method :printable_tasks, :printable_commands
220
217
 
221
218
  def subcommands
222
219
  @subcommands ||= from_superclass(:subcommands, [])
223
220
  end
224
- alias subtasks subcommands
221
+ alias_method :subtasks, :subcommands
222
+
223
+ def subcommand_classes
224
+ @subcommand_classes ||= {}
225
+ end
225
226
 
226
227
  def subcommand(subcommand, subcommand_class)
227
- self.subcommands << subcommand.to_s
228
+ subcommands << subcommand.to_s
228
229
  subcommand_class.subcommand_help subcommand
230
+ subcommand_classes[subcommand.to_s] = subcommand_class
229
231
 
230
232
  define_method(subcommand) do |*args|
231
233
  args, opts = Thor::Arguments.split(args)
234
+ args.unshift("help") if opts.include? "--help" or opts.include? "-h"
232
235
  invoke subcommand_class, args, opts, :invoked_via_subcommand => true, :class_options => options
233
236
  end
234
237
  end
235
- alias subtask subcommand
238
+ alias_method :subtask, :subcommand
236
239
 
237
240
  # Extend check unknown options to accept a hash of conditions.
238
241
  #
239
242
  # === Parameters
240
243
  # options<Hash>: A hash containing :only and/or :except keys
241
- def check_unknown_options!(options={})
242
- @check_unknown_options ||= Hash.new
244
+ def check_unknown_options!(options = {})
245
+ @check_unknown_options ||= {}
243
246
  options.each do |key, value|
244
247
  if value
245
248
  @check_unknown_options[key] = Array(value)
@@ -309,35 +312,28 @@ class Thor
309
312
  # ==== Parameters
310
313
  # Symbol ...:: A list of commands that should be affected.
311
314
  def stop_on_unknown_option!(*command_names)
312
- @stop_on_unknown_option ||= Set.new
313
- @stop_on_unknown_option.merge(command_names)
315
+ stop_on_unknown_option.merge(command_names)
314
316
  end
315
317
 
316
318
  def stop_on_unknown_option?(command) #:nodoc:
317
- !!@stop_on_unknown_option && @stop_on_unknown_option.include?(command.name.to_sym)
319
+ command && stop_on_unknown_option.include?(command.name.to_sym)
318
320
  end
319
321
 
320
322
  protected
323
+ def stop_on_unknown_option #:nodoc:
324
+ @stop_on_unknown_option ||= Set.new
325
+ end
321
326
 
322
327
  # The method responsible for dispatching given the args.
323
- def dispatch(meth, given_args, given_opts, config) #:nodoc:
324
- # There is an edge case when dispatching from a subcommand.
325
- # A problem occurs invoking the default command. This case occurs
326
- # when arguments are passed and a default command is defined, and
327
- # the first given_args does not match the default command.
328
- # Thor use "help" by default so we skip that case.
329
- # Note the call to retrieve_command_name. It's called with
330
- # given_args.dup since that method calls args.shift. Then lookup
331
- # the command normally. If the first item in given_args is not
332
- # a command then use the default command. The given_args will be
333
- # intact later since dup was used.
334
- if config[:invoked_via_subcommand] && given_args.size >= 1 && default_command != "help" && given_args.first != default_command
335
- meth ||= retrieve_command_name(given_args.dup)
336
- command = all_commands[normalize_command_name(meth)]
337
- command ||= all_commands[normalize_command_name(default_command)]
338
- else
339
- meth ||= retrieve_command_name(given_args)
340
- command = all_commands[normalize_command_name(meth)]
328
+ def dispatch(meth, given_args, given_opts, config) #:nodoc: # rubocop:disable MethodLength
329
+ meth ||= retrieve_command_name(given_args)
330
+ command = all_commands[normalize_command_name(meth)]
331
+
332
+ if !command && config[:invoked_via_subcommand]
333
+ # We're a subcommand and our first argument didn't match any of our
334
+ # commands. So we put it back and call our default command.
335
+ given_args.unshift(meth)
336
+ command = all_commands[normalize_command_name(default_command)]
341
337
  end
342
338
 
343
339
  if command
@@ -350,7 +346,7 @@ class Thor
350
346
  end
351
347
  else
352
348
  args, opts = given_args, nil
353
- command = Thor::DynamicCommand.new(meth)
349
+ command = dynamic_command_class.new(meth)
354
350
  end
355
351
 
356
352
  opts = given_opts || opts || []
@@ -376,13 +372,21 @@ class Thor
376
372
  Thor
377
373
  end
378
374
 
375
+ def dynamic_command_class #:nodoc:
376
+ Thor::DynamicCommand
377
+ end
378
+
379
379
  def create_command(meth) #:nodoc:
380
+ @usage ||= nil
381
+ @desc ||= nil
382
+ @long_desc ||= nil
383
+
380
384
  if @usage && @desc
381
385
  base_class = @hide ? Thor::HiddenCommand : Thor::Command
382
386
  commands[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
383
387
  @usage, @desc, @long_desc, @method_options, @hide = nil
384
388
  true
385
- elsif self.all_commands[meth] || meth == "method_missing"
389
+ elsif all_commands[meth] || meth == "method_missing"
386
390
  true
387
391
  else
388
392
  puts "[WARNING] Attempted to create command #{meth.inspect} without usage or description. " <<
@@ -391,7 +395,7 @@ class Thor
391
395
  false
392
396
  end
393
397
  end
394
- alias create_task create_command
398
+ alias_method :create_task, :create_command
395
399
 
396
400
  def initialize_added #:nodoc:
397
401
  class_options.merge!(method_options)
@@ -407,7 +411,7 @@ class Thor
407
411
  nil
408
412
  end
409
413
  end
410
- alias retrieve_task_name retrieve_command_name
414
+ alias_method :retrieve_task_name, :retrieve_command_name
411
415
 
412
416
  # receives a (possibly nil) command name and returns a name that is in
413
417
  # the commands hash. In addition to normalizing aliases, this logic
@@ -417,11 +421,11 @@ class Thor
417
421
  # +normalize_command_name+ also converts names like +animal-prison+
418
422
  # into +animal_prison+.
419
423
  def normalize_command_name(meth) #:nodoc:
420
- return default_command.to_s.gsub('-', '_') unless meth
424
+ return default_command.to_s.gsub("-", "_") unless meth
421
425
 
422
426
  possibilities = find_command_possibilities(meth)
423
427
  if possibilities.size > 1
424
- raise ArgumentError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]"
428
+ fail AmbiguousTaskError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]"
425
429
  elsif possibilities.size < 1
426
430
  meth = meth || default_command
427
431
  elsif map[meth]
@@ -430,9 +434,9 @@ class Thor
430
434
  meth = possibilities.first
431
435
  end
432
436
 
433
- meth.to_s.gsub('-','_') # treat foo-bar as foo_bar
437
+ meth.to_s.gsub("-", "_") # treat foo-bar as foo_bar
434
438
  end
435
- alias normalize_task_name normalize_command_name
439
+ alias_method :normalize_task_name, :normalize_command_name
436
440
 
437
441
  # this is the logic that takes the command name passed in by the user
438
442
  # and determines whether it is an unambiguous substrings of a command or
@@ -450,16 +454,15 @@ class Thor
450
454
  possibilities
451
455
  end
452
456
  end
453
- alias find_task_possibilities find_command_possibilities
457
+ alias_method :find_task_possibilities, :find_command_possibilities
454
458
 
455
459
  def subcommand_help(cmd)
456
460
  desc "help [COMMAND]", "Describe subcommands or one specific subcommand"
457
- class_eval <<-RUBY
461
+ class_eval "
458
462
  def help(command = nil, subcommand = true); super; end
459
- RUBY
463
+ "
460
464
  end
461
- alias subtask_help subcommand_help
462
-
465
+ alias_method :subtask_help, :subcommand_help
463
466
  end
464
467
 
465
468
  include Thor::Base
@@ -468,6 +471,14 @@ class Thor
468
471
 
469
472
  desc "help [COMMAND]", "Describe available commands or one specific command"
470
473
  def help(command = nil, subcommand = false)
471
- command ? self.class.command_help(shell, command) : self.class.help(shell, subcommand)
474
+ if command
475
+ if self.class.subcommands.include? command
476
+ self.class.subcommand_classes[command].help(shell, true)
477
+ else
478
+ self.class.command_help(shell, command)
479
+ end
480
+ else
481
+ self.class.help(shell, subcommand)
482
+ end
472
483
  end
473
484
  end
@@ -1,12 +1,12 @@
1
- require 'fileutils'
2
- require 'uri'
3
- require 'thor/core_ext/io_binary_read'
4
- require 'thor/actions/create_file'
5
- require 'thor/actions/create_link'
6
- require 'thor/actions/directory'
7
- require 'thor/actions/empty_directory'
8
- require 'thor/actions/file_manipulation'
9
- require 'thor/actions/inject_into_file'
1
+ require "fileutils"
2
+ require "uri"
3
+ require "thor/core_ext/io_binary_read"
4
+ require "thor/actions/create_file"
5
+ require "thor/actions/create_link"
6
+ require "thor/actions/directory"
7
+ require "thor/actions/empty_directory"
8
+ require "thor/actions/file_manipulation"
9
+ require "thor/actions/inject_into_file"
10
10
 
11
11
  class Thor
12
12
  module Actions
@@ -26,9 +26,9 @@ class Thor
26
26
  end
27
27
 
28
28
  # Stores and return the source root for this class
29
- def source_root(path=nil)
29
+ def source_root(path = nil)
30
30
  @_source_root = path if path
31
- @_source_root
31
+ @_source_root ||= nil
32
32
  end
33
33
 
34
34
  # Returns the source paths in the following order:
@@ -39,8 +39,8 @@ class Thor
39
39
  #
40
40
  def source_paths_for_search
41
41
  paths = []
42
- paths += self.source_paths
43
- paths << self.source_root if self.source_root
42
+ paths += source_paths
43
+ paths << source_root if source_root
44
44
  paths += from_superclass(:source_paths, [])
45
45
  paths
46
46
  end
@@ -71,17 +71,16 @@ class Thor
71
71
  #
72
72
  # destination_root<String>:: The root directory needed for some actions.
73
73
  #
74
- def initialize(args=[], options={}, config={})
74
+ def initialize(args = [], options = {}, config = {})
75
75
  self.behavior = case config[:behavior].to_s
76
- when "force", "skip"
77
- _cleanup_options_and_set(options, config[:behavior])
78
- :invoke
79
- when "revoke"
80
- :revoke
81
- else
82
- :invoke
83
- end
84
-
76
+ when "force", "skip"
77
+ _cleanup_options_and_set(options, config[:behavior])
78
+ :invoke
79
+ when "revoke"
80
+ :revoke
81
+ else
82
+ :invoke
83
+ end
85
84
  super
86
85
  self.destination_root = config[:destination_root]
87
86
  end
@@ -107,16 +106,16 @@ class Thor
107
106
  #
108
107
  def destination_root=(root)
109
108
  @destination_stack ||= []
110
- @destination_stack[0] = File.expand_path(root || '')
109
+ @destination_stack[0] = File.expand_path(root || "")
111
110
  end
112
111
 
113
112
  # Returns the given path relative to the absolute root (ie, root where
114
113
  # the script started).
115
114
  #
116
- def relative_to_original_destination_root(path, remove_dot=true)
115
+ def relative_to_original_destination_root(path, remove_dot = true)
117
116
  path = path.dup
118
- if path.gsub!(@destination_stack[0], '.')
119
- remove_dot ? (path[2..-1] || '') : path
117
+ if path.gsub!(@destination_stack[0], ".")
118
+ remove_dot ? (path[2..-1] || "") : path
120
119
  else
121
120
  path
122
121
  end
@@ -130,12 +129,15 @@ class Thor
130
129
 
131
130
  # Receives a file or directory and search for it in the source paths.
132
131
  #
133
- def find_in_source_paths(file)
132
+ def find_in_source_paths(file) # rubocop:disable MethodLength
133
+ possible_files = [file, file + TEMPLATE_EXTNAME]
134
134
  relative_root = relative_to_original_destination_root(destination_root, false)
135
135
 
136
136
  source_paths.each do |source|
137
- source_file = File.expand_path(file, File.join(source, relative_root))
138
- return source_file if File.exists?(source_file)
137
+ possible_files.each do |f|
138
+ source_file = File.expand_path(f, File.join(source, relative_root))
139
+ return source_file if File.exist?(source_file)
140
+ end
139
141
  end
140
142
 
141
143
  message = "Could not find #{file.inspect} in any of your source paths. "
@@ -150,7 +152,7 @@ class Thor
150
152
  message << "Your current source paths are: \n#{source_paths.join("\n")}"
151
153
  end
152
154
 
153
- raise Error, message
155
+ fail Error, message
154
156
  end
155
157
 
156
158
  # Do something in the root or on a provided subfolder. If a relative path
@@ -162,7 +164,7 @@ class Thor
162
164
  # dir<String>:: the directory to move to.
163
165
  # config<Hash>:: give :verbose => true to log and use padding.
164
166
  #
165
- def inside(dir='', config={}, &block)
167
+ def inside(dir = "", config = {}, &block)
166
168
  verbose = config.fetch(:verbose, false)
167
169
  pretend = options[:pretend]
168
170
 
@@ -204,18 +206,18 @@ class Thor
204
206
  #
205
207
  # apply "recipes/jquery.rb"
206
208
  #
207
- def apply(path, config={})
209
+ def apply(path, config = {})
208
210
  verbose = config.fetch(:verbose, true)
209
- is_uri = path =~ /^https?\:\/\//
211
+ is_uri = path =~ %r{^https?\://}
210
212
  path = find_in_source_paths(path) unless is_uri
211
213
 
212
214
  say_status :apply, path, verbose
213
215
  shell.padding += 1 if verbose
214
216
 
215
217
  if is_uri
216
- contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
218
+ contents = open(path, "Accept" => "application/x-thor-template") { |io| io.read }
217
219
  else
218
- contents = open(path) {|io| io.read }
220
+ contents = open(path) { |io| io.read }
219
221
  end
220
222
 
221
223
  instance_eval(contents, path)
@@ -227,7 +229,7 @@ class Thor
227
229
  # ==== Parameters
228
230
  # command<String>:: the command to be executed.
229
231
  # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
230
- # to append an executable to command executation.
232
+ # to append an executable to command execution.
231
233
  #
232
234
  # ==== Example
233
235
  #
@@ -235,7 +237,7 @@ class Thor
235
237
  # run('ln -s ~/edge rails')
236
238
  # end
237
239
  #
238
- def run(command, config={})
240
+ def run(command, config = {})
239
241
  return unless behavior == :invoke
240
242
 
241
243
  destination = relative_to_original_destination_root(destination_root, false)
@@ -259,7 +261,7 @@ class Thor
259
261
  # command<String>:: the command to be executed.
260
262
  # config<Hash>:: give :verbose => false to not log the status.
261
263
  #
262
- def run_ruby_script(command, config={})
264
+ def run_ruby_script(command, config = {})
263
265
  return unless behavior == :invoke
264
266
  run command, config.merge(:with => Thor::Util.ruby_command)
265
267
  end
@@ -290,29 +292,28 @@ class Thor
290
292
 
291
293
  args.unshift(command)
292
294
  args.push Thor::Options.to_switches(config)
293
- command = args.join(' ').strip
295
+ command = args.join(" ").strip
294
296
 
295
297
  run command, :with => :thor, :verbose => verbose, :pretend => pretend, :capture => capture
296
298
  end
297
299
 
298
- protected
300
+ protected
299
301
 
300
- # Allow current root to be shared between invocations.
301
- #
302
- def _shared_configuration #:nodoc:
303
- super.merge!(:destination_root => self.destination_root)
304
- end
302
+ # Allow current root to be shared between invocations.
303
+ #
304
+ def _shared_configuration #:nodoc:
305
+ super.merge!(:destination_root => destination_root)
306
+ end
305
307
 
306
- def _cleanup_options_and_set(options, key) #:nodoc:
307
- case options
308
- when Array
309
- %w(--force -f --skip -s).each { |i| options.delete(i) }
310
- options << "--#{key}"
311
- when Hash
312
- [:force, :skip, "force", "skip"].each { |i| options.delete(i) }
313
- options.merge!(key => true)
314
- end
308
+ def _cleanup_options_and_set(options, key) #:nodoc:
309
+ case options
310
+ when Array
311
+ %w[--force -f --skip -s].each { |i| options.delete(i) }
312
+ options << "--#{key}"
313
+ when Hash
314
+ [:force, :skip, "force", "skip"].each { |i| options.delete(i) }
315
+ options.merge!(key => true)
315
316
  end
316
-
317
+ end
317
318
  end
318
319
  end