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
@@ -1,33 +1,32 @@
1
- require 'rbconfig'
1
+ require "rbconfig"
2
2
 
3
3
  class Thor
4
4
  module Base
5
- # Returns the shell used in all Thor classes. If you are in a Unix platform
6
- # it will use a colored log, otherwise it will use a basic one without color.
7
- #
8
- def self.shell
9
- @shell ||= if ENV['THOR_SHELL'] && ENV['THOR_SHELL'].size > 0
10
- Thor::Shell.const_get(ENV['THOR_SHELL'])
11
- elsif ((RbConfig::CONFIG['host_os'] =~ /mswin|mingw/) && !(ENV['ANSICON']))
12
- Thor::Shell::Basic
13
- else
14
- Thor::Shell::Color
15
- end
16
- end
5
+ class << self
6
+ attr_writer :shell
17
7
 
18
- # Sets the shell used in all Thor classes.
19
- #
20
- def self.shell=(klass)
21
- @shell = klass
8
+ # Returns the shell used in all Thor classes. If you are in a Unix platform
9
+ # it will use a colored log, otherwise it will use a basic one without color.
10
+ #
11
+ def shell
12
+ @shell ||= if ENV["THOR_SHELL"] && ENV["THOR_SHELL"].size > 0
13
+ Thor::Shell.const_get(ENV["THOR_SHELL"])
14
+ elsif RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ && !ENV["ANSICON"]
15
+ Thor::Shell::Basic
16
+ else
17
+ Thor::Shell::Color
18
+ end
19
+ end
22
20
  end
23
21
  end
24
22
 
25
23
  module Shell
26
24
  SHELL_DELEGATED_METHODS = [:ask, :error, :set_color, :yes?, :no?, :say, :say_status, :print_in_columns, :print_table, :print_wrapped, :file_collision, :terminal_width]
25
+ attr_writer :shell
27
26
 
28
- autoload :Basic, 'thor/shell/basic'
29
- autoload :Color, 'thor/shell/color'
30
- autoload :HTML, 'thor/shell/html'
27
+ autoload :Basic, "thor/shell/basic"
28
+ autoload :Color, "thor/shell/color"
29
+ autoload :HTML, "thor/shell/html"
31
30
 
32
31
  # Add shell to initialize config values.
33
32
  #
@@ -42,10 +41,10 @@ class Thor
42
41
  #
43
42
  # MyScript.new [1.0], { :foo => :bar }, :shell => Thor::Shell::Basic.new
44
43
  #
45
- def initialize(args=[], options={}, config={})
44
+ def initialize(args = [], options = {}, config = {})
46
45
  super
47
46
  self.shell = config[:shell]
48
- self.shell.base ||= self if self.shell.respond_to?(:base)
47
+ shell.base ||= self if shell.respond_to?(:base)
49
48
  end
50
49
 
51
50
  # Holds the shell for the given Thor instance. If no shell is given,
@@ -54,11 +53,6 @@ class Thor
54
53
  @shell ||= Thor::Base.shell.new
55
54
  end
56
55
 
57
- # Sets the shell for this thor class.
58
- def shell=(shell)
59
- @shell = shell
60
- end
61
-
62
56
  # Common methods that are delegated to the shell.
63
57
  SHELL_DELEGATED_METHODS.each do |method|
64
58
  module_eval <<-METHOD, __FILE__, __LINE__
@@ -76,13 +70,12 @@ class Thor
76
70
  shell.padding -= 1
77
71
  end
78
72
 
79
- protected
80
-
81
- # Allow shell to be shared between invocations.
82
- #
83
- def _shared_configuration #:nodoc:
84
- super.merge!(:shell => self.shell)
85
- end
73
+ protected
86
74
 
75
+ # Allow shell to be shared between invocations.
76
+ #
77
+ def _shared_configuration #:nodoc:
78
+ super.merge!(:shell => shell)
79
+ end
87
80
  end
88
81
  end
@@ -1,15 +1,16 @@
1
- require 'tempfile'
1
+ require "tempfile"
2
+ require "io/console" if RUBY_VERSION > "1.9.2"
2
3
 
3
4
  class Thor
4
5
  module Shell
5
- class Basic
6
+ class Basic # rubocop:disable ClassLength
6
7
  attr_accessor :base
7
8
  attr_reader :padding
8
9
 
9
10
  # Initialize base, mute and padding to nil.
10
11
  #
11
12
  def initialize #:nodoc:
12
- @base, @mute, @padding = nil, false, 0
13
+ @base, @mute, @padding, @always_force = nil, false, 0, false
13
14
  end
14
15
 
15
16
  # Mute everything that's inside given block
@@ -23,7 +24,7 @@ class Thor
23
24
 
24
25
  # Check if base is muted
25
26
  #
26
- def mute?
27
+ def mute? # rubocop:disable TrivialAccessors
27
28
  @mute
28
29
  end
29
30
 
@@ -40,15 +41,32 @@ class Thor
40
41
  # they will be shown a message stating that one of those answers
41
42
  # must be given and re-asked the question.
42
43
  #
44
+ # If asking for sensitive information, the :echo option can be set
45
+ # to false to mask user input from $stdin.
46
+ #
47
+ # If the required input is a path, then set the path option to
48
+ # true. This will enable tab completion for file paths relative
49
+ # to the current working directory on systems that support
50
+ # Readline.
51
+ #
43
52
  # ==== Example
44
53
  # ask("What is your name?")
45
54
  #
46
55
  # ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
47
56
  #
57
+ # ask("What is your password?", :echo => false)
58
+ #
59
+ # ask("Where should the file be saved?", :path => true)
60
+ #
48
61
  def ask(statement, *args)
49
62
  options = args.last.is_a?(Hash) ? args.pop : {}
63
+ color = args.first
50
64
 
51
- options[:limited_to] ? ask_filtered(statement, options[:limited_to], *args) : ask_simply(statement, *args)
65
+ if options[:limited_to]
66
+ ask_filtered(statement, color, options)
67
+ else
68
+ ask_simply(statement, color, options)
69
+ end
52
70
  end
53
71
 
54
72
  # Say (print) something to the user. If the sentence ends with a whitespace
@@ -58,18 +76,11 @@ class Thor
58
76
  # ==== Example
59
77
  # say("I know you knew that.")
60
78
  #
61
- def say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)\Z/))
62
- message = message.to_s
79
+ def say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
80
+ buffer = prepare_message(message, *color)
81
+ buffer << "\n" if force_new_line && !message.end_with?("\n")
63
82
 
64
- message = set_color(message, *color) if color && can_display_colors?
65
-
66
- spaces = " " * padding
67
-
68
- if force_new_line
69
- stdout.puts(spaces + message)
70
- else
71
- stdout.print(spaces + message)
72
- end
83
+ stdout.print(buffer)
73
84
  stdout.flush
74
85
  end
75
86
 
@@ -78,7 +89,7 @@ class Thor
78
89
  # in log_status, avoiding the message from being shown. If a Symbol is
79
90
  # given in log_status, it's used as the color.
80
91
  #
81
- def say_status(status, message, log_status=true)
92
+ def say_status(status, message, log_status = true)
82
93
  return if quiet? || log_status == false
83
94
  spaces = " " * (padding + 1)
84
95
  color = log_status.is_a?(Symbol) ? log_status : :green
@@ -86,22 +97,25 @@ class Thor
86
97
  status = status.to_s.rjust(12)
87
98
  status = set_color status, color, true if color
88
99
 
89
- stdout.puts "#{status}#{spaces}#{message}"
100
+ buffer = "#{status}#{spaces}#{message}"
101
+ buffer << "\n" unless buffer.end_with?("\n")
102
+
103
+ stdout.print(buffer)
90
104
  stdout.flush
91
105
  end
92
106
 
93
107
  # Make a question the to user and returns true if the user replies "y" or
94
108
  # "yes".
95
109
  #
96
- def yes?(statement, color=nil)
97
- !!(ask(statement, color) =~ is?(:yes))
110
+ def yes?(statement, color = nil)
111
+ !!(ask(statement, color, :add_to_history => false) =~ is?(:yes))
98
112
  end
99
113
 
100
114
  # Make a question the to user and returns true if the user replies "n" or
101
115
  # "no".
102
116
  #
103
- def no?(statement, color=nil)
104
- !yes?(statement, color)
117
+ def no?(statement, color = nil)
118
+ !!(ask(statement, color, :add_to_history => false) =~ is?(:no))
105
119
  end
106
120
 
107
121
  # Prints values in columns
@@ -111,7 +125,7 @@ class Thor
111
125
  #
112
126
  def print_in_columns(array)
113
127
  return if array.empty?
114
- colwidth = (array.map{|el| el.to_s.size}.max || 0) + 2
128
+ colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
115
129
  array.each_with_index do |value, index|
116
130
  # Don't output trailing spaces when printing the last column
117
131
  if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
@@ -131,7 +145,7 @@ class Thor
131
145
  # indent<Integer>:: Indent the first column by indent value.
132
146
  # colwidth<Integer>:: Force the first column to colwidth spaces wide.
133
147
  #
134
- def print_table(array, options={})
148
+ def print_table(array, options = {}) # rubocop:disable MethodLength
135
149
  return if array.empty?
136
150
 
137
151
  formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
@@ -140,12 +154,12 @@ class Thor
140
154
  formats << "%-#{colwidth + 2}s" if colwidth
141
155
  start = colwidth ? 1 : 0
142
156
 
143
- colcount = array.max{|a,b| a.size <=> b.size }.size
157
+ colcount = array.max { |a, b| a.size <=> b.size }.size
144
158
 
145
159
  maximas = []
146
160
 
147
161
  start.upto(colcount - 1) do |index|
148
- maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
162
+ maxima = array.map { |row| row[index] ? row[index].to_s.size : 0 }.max
149
163
  maximas << maxima
150
164
  if index == colcount - 1
151
165
  # Don't output 2 trailing spaces when printing the last column
@@ -191,15 +205,13 @@ class Thor
191
205
  # ==== Options
192
206
  # indent<Integer>:: Indent each line of the printed paragraph by indent value.
193
207
  #
194
- def print_wrapped(message, options={})
208
+ def print_wrapped(message, options = {})
195
209
  indent = options[:indent] || 0
196
210
  width = terminal_width - indent
197
211
  paras = message.split("\n\n")
198
212
 
199
213
  paras.map! do |unwrapped|
200
- unwrapped.strip.gsub(/\n/, " ").squeeze(" ").
201
- gsub(/.{1,#{width}}(?:\s|\Z)/){($& + 5.chr).
202
- gsub(/\n\005/,"\n").gsub(/\005/,"\n")}
214
+ unwrapped.strip.gsub(/\n/, " ").squeeze(" ").gsub(/.{1,#{width}}(?:\s|\Z)/) { ($& + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n") }
203
215
  end
204
216
 
205
217
  paras.each do |para|
@@ -218,12 +230,15 @@ class Thor
218
230
  # destination<String>:: the destination file to solve conflicts
219
231
  # block<Proc>:: an optional block that returns the value to be used in diff
220
232
  #
221
- def file_collision(destination)
233
+ def file_collision(destination) # rubocop:disable MethodLength
222
234
  return true if @always_force
223
235
  options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"
224
236
 
225
- while true
226
- answer = ask %[Overwrite #{destination}? (enter "h" for help) #{options}]
237
+ loop do
238
+ answer = ask(
239
+ %[Overwrite #{destination}? (enter "h" for help) #{options}],
240
+ :add_to_history => false
241
+ )
227
242
 
228
243
  case answer
229
244
  when is?(:yes), is?(:force), ""
@@ -233,11 +248,11 @@ class Thor
233
248
  when is?(:always)
234
249
  return @always_force = true
235
250
  when is?(:quit)
236
- say 'Aborting...'
237
- raise SystemExit
251
+ say "Aborting..."
252
+ fail SystemExit
238
253
  when is?(:diff)
239
254
  show_diff(destination, yield) if block_given?
240
- say 'Retrying...'
255
+ say "Retrying..."
241
256
  else
242
257
  say file_collision_help
243
258
  end
@@ -247,12 +262,12 @@ class Thor
247
262
  # This code was copied from Rake, available under MIT-LICENSE
248
263
  # Copyright (c) 2003, 2004 Jim Weirich
249
264
  def terminal_width
250
- if ENV['THOR_COLUMNS']
251
- result = ENV['THOR_COLUMNS'].to_i
265
+ if ENV["THOR_COLUMNS"]
266
+ result = ENV["THOR_COLUMNS"].to_i
252
267
  else
253
268
  result = unix? ? dynamic_width : 80
254
269
  end
255
- (result < 10) ? 80 : result
270
+ result < 10 ? 80 : result
256
271
  rescue
257
272
  80
258
273
  end
@@ -275,6 +290,11 @@ class Thor
275
290
 
276
291
  protected
277
292
 
293
+ def prepare_message(message, *color)
294
+ spaces = " " * padding
295
+ spaces + set_color(message.to_s, *color)
296
+ end
297
+
278
298
  def can_display_colors?
279
299
  false
280
300
  end
@@ -288,10 +308,6 @@ class Thor
288
308
  $stdout
289
309
  end
290
310
 
291
- def stdin
292
- $stdin
293
- end
294
-
295
311
  def stderr
296
312
  $stderr
297
313
  end
@@ -302,23 +318,23 @@ class Thor
302
318
  if value.size == 1
303
319
  /\A#{value}\z/i
304
320
  else
305
- /\A(#{value}|#{value[0,1]})\z/i
321
+ /\A(#{value}|#{value[0, 1]})\z/i
306
322
  end
307
323
  end
308
324
 
309
325
  def file_collision_help #:nodoc:
310
- <<HELP
311
- Y - yes, overwrite
312
- n - no, do not overwrite
313
- a - all, overwrite this and all others
314
- q - quit, abort
315
- d - diff, show the differences between the old and the new
316
- h - help, show this help
317
- HELP
326
+ <<-HELP
327
+ Y - yes, overwrite
328
+ n - no, do not overwrite
329
+ a - all, overwrite this and all others
330
+ q - quit, abort
331
+ d - diff, show the differences between the old and the new
332
+ h - help, show this help
333
+ HELP
318
334
  end
319
335
 
320
336
  def show_diff(destination, content) #:nodoc:
321
- diff_cmd = ENV['THOR_DIFF'] || ENV['RAILS_DIFF'] || 'diff -u'
337
+ diff_cmd = ENV["THOR_DIFF"] || ENV["RAILS_DIFF"] || "diff -u"
322
338
 
323
339
  Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp|
324
340
  temp.write content
@@ -337,11 +353,11 @@ HELP
337
353
  end
338
354
 
339
355
  def dynamic_width_stty
340
- %x{stty size 2>/dev/null}.split[1].to_i
356
+ %x(stty size 2>/dev/null).split[1].to_i
341
357
  end
342
358
 
343
359
  def dynamic_width_tput
344
- %x{tput cols 2>/dev/null}.to_i
360
+ %x(tput cols 2>/dev/null).to_i
345
361
  end
346
362
 
347
363
  def unix?
@@ -354,7 +370,7 @@ HELP
354
370
  if chars.length <= width
355
371
  chars.join
356
372
  else
357
- ( chars[0, width-3].join ) + "..."
373
+ ( chars[0, width - 3].join) + "..."
358
374
  end
359
375
  end
360
376
  end
@@ -372,22 +388,34 @@ HELP
372
388
  end
373
389
  end
374
390
 
375
- def ask_simply(statement, color=nil)
376
- say("#{statement} ", color)
377
- stdin.gets.tap{|text| text.strip! if text}
391
+ def ask_simply(statement, color, options)
392
+ default = options[:default]
393
+ message = [statement, ("(#{default})" if default), nil].uniq.join(" ")
394
+ message = prepare_message(message, color)
395
+ result = Thor::LineEditor.readline(message, options)
396
+
397
+ return unless result
398
+
399
+ result.strip!
400
+
401
+ if default && result == ""
402
+ default
403
+ else
404
+ result
405
+ end
378
406
  end
379
407
 
380
- def ask_filtered(statement, answer_set, *args)
408
+ def ask_filtered(statement, color, options)
409
+ answer_set = options[:limited_to]
381
410
  correct_answer = nil
382
411
  until correct_answer
383
- answer = ask_simply("#{statement} #{answer_set.inspect}", *args)
412
+ answers = answer_set.join(", ")
413
+ answer = ask_simply("#{statement} [#{answers}]", color, options)
384
414
  correct_answer = answer_set.include?(answer) ? answer : nil
385
- answers = answer_set.map(&:inspect).join(", ")
386
415
  say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
387
416
  end
388
417
  correct_answer
389
418
  end
390
-
391
419
  end
392
420
  end
393
421
  end
@@ -1,4 +1,4 @@
1
- require 'thor/shell/basic'
1
+ require "thor/shell/basic"
2
2
 
3
3
  class Thor
4
4
  module Shell
@@ -77,7 +77,9 @@ class Thor
77
77
  # :on_cyan
78
78
  # :on_white
79
79
  def set_color(string, *colors)
80
- if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
80
+ if colors.compact.empty? || !can_display_colors?
81
+ string
82
+ elsif colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
81
83
  ansi_colors = colors.map { |color| lookup_color(color) }
82
84
  "#{ansi_colors.join}#{string}#{CLEAR}"
83
85
  else
@@ -92,57 +94,56 @@ class Thor
92
94
  end
93
95
  end
94
96
 
95
- protected
97
+ protected
96
98
 
97
- def can_display_colors?
98
- stdout.tty?
99
- end
99
+ def can_display_colors?
100
+ stdout.tty?
101
+ end
100
102
 
101
- # Overwrite show_diff to show diff with colors if Diff::LCS is
102
- # available.
103
- #
104
- def show_diff(destination, content) #:nodoc:
105
- if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
106
- actual = File.binread(destination).to_s.split("\n")
107
- content = content.to_s.split("\n")
103
+ # Overwrite show_diff to show diff with colors if Diff::LCS is
104
+ # available.
105
+ #
106
+ def show_diff(destination, content) #:nodoc:
107
+ if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
108
+ actual = File.binread(destination).to_s.split("\n")
109
+ content = content.to_s.split("\n")
108
110
 
109
- Diff::LCS.sdiff(actual, content).each do |diff|
110
- output_diff_line(diff)
111
- end
112
- else
113
- super
111
+ Diff::LCS.sdiff(actual, content).each do |diff|
112
+ output_diff_line(diff)
114
113
  end
114
+ else
115
+ super
115
116
  end
117
+ end
116
118
 
117
- def output_diff_line(diff) #:nodoc:
118
- case diff.action
119
- when '-'
120
- say "- #{diff.old_element.chomp}", :red, true
121
- when '+'
122
- say "+ #{diff.new_element.chomp}", :green, true
123
- when '!'
124
- say "- #{diff.old_element.chomp}", :red, true
125
- say "+ #{diff.new_element.chomp}", :green, true
126
- else
127
- say " #{diff.old_element.chomp}", nil, true
128
- end
119
+ def output_diff_line(diff) #:nodoc:
120
+ case diff.action
121
+ when "-"
122
+ say "- #{diff.old_element.chomp}", :red, true
123
+ when "+"
124
+ say "+ #{diff.new_element.chomp}", :green, true
125
+ when "!"
126
+ say "- #{diff.old_element.chomp}", :red, true
127
+ say "+ #{diff.new_element.chomp}", :green, true
128
+ else
129
+ say " #{diff.old_element.chomp}", nil, true
129
130
  end
131
+ end
130
132
 
131
- # Check if Diff::LCS is loaded. If it is, use it to create pretty output
132
- # for diff.
133
- #
134
- def diff_lcs_loaded? #:nodoc:
135
- return true if defined?(Diff::LCS)
136
- return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
133
+ # Check if Diff::LCS is loaded. If it is, use it to create pretty output
134
+ # for diff.
135
+ #
136
+ def diff_lcs_loaded? #:nodoc:
137
+ return true if defined?(Diff::LCS)
138
+ return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
137
139
 
138
- @diff_lcs_loaded = begin
139
- require 'diff/lcs'
140
- true
141
- rescue LoadError
142
- false
143
- end
140
+ @diff_lcs_loaded = begin
141
+ require "diff/lcs"
142
+ true
143
+ rescue LoadError
144
+ false
144
145
  end
145
-
146
+ end
146
147
  end
147
148
  end
148
149
  end