thor 0.18.1 → 0.19.0
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.
- checksums.yaml +7 -0
- data/README.md +13 -7
- data/Thorfile +4 -5
- data/bin/thor +1 -1
- data/lib/thor.rb +78 -67
- data/lib/thor/actions.rb +57 -56
- data/lib/thor/actions/create_file.rb +33 -35
- data/lib/thor/actions/create_link.rb +2 -3
- data/lib/thor/actions/directory.rb +37 -38
- data/lib/thor/actions/empty_directory.rb +67 -69
- data/lib/thor/actions/file_manipulation.rb +17 -15
- data/lib/thor/actions/inject_into_file.rb +27 -29
- data/lib/thor/base.rb +193 -189
- data/lib/thor/command.rb +20 -23
- data/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -24
- data/lib/thor/core_ext/io_binary_read.rb +2 -4
- data/lib/thor/core_ext/ordered_hash.rb +9 -11
- data/lib/thor/error.rb +5 -1
- data/lib/thor/group.rb +53 -54
- data/lib/thor/invocation.rb +44 -38
- data/lib/thor/line_editor.rb +17 -0
- data/lib/thor/line_editor/basic.rb +35 -0
- data/lib/thor/line_editor/readline.rb +88 -0
- data/lib/thor/parser.rb +4 -4
- data/lib/thor/parser/argument.rb +28 -29
- data/lib/thor/parser/arguments.rb +102 -98
- data/lib/thor/parser/option.rb +26 -22
- data/lib/thor/parser/options.rb +86 -86
- data/lib/thor/rake_compat.rb +9 -10
- data/lib/thor/runner.rb +141 -141
- data/lib/thor/shell.rb +27 -34
- data/lib/thor/shell/basic.rb +91 -63
- data/lib/thor/shell/color.rb +44 -43
- data/lib/thor/shell/html.rb +59 -60
- data/lib/thor/util.rb +24 -27
- data/lib/thor/version.rb +1 -1
- data/spec/actions/create_file_spec.rb +25 -27
- data/spec/actions/create_link_spec.rb +19 -18
- data/spec/actions/directory_spec.rb +31 -31
- data/spec/actions/empty_directory_spec.rb +18 -18
- data/spec/actions/file_manipulation_spec.rb +38 -28
- data/spec/actions/inject_into_file_spec.rb +13 -13
- data/spec/actions_spec.rb +43 -43
- data/spec/base_spec.rb +45 -38
- data/spec/command_spec.rb +13 -14
- data/spec/core_ext/hash_with_indifferent_access_spec.rb +19 -19
- data/spec/core_ext/ordered_hash_spec.rb +6 -6
- data/spec/exit_condition_spec.rb +4 -4
- data/spec/fixtures/invoke.thor +19 -0
- data/spec/fixtures/script.thor +1 -1
- data/spec/group_spec.rb +30 -24
- data/spec/helper.rb +28 -15
- data/spec/invocation_spec.rb +39 -19
- data/spec/line_editor/basic_spec.rb +28 -0
- data/spec/line_editor/readline_spec.rb +69 -0
- data/spec/line_editor_spec.rb +43 -0
- data/spec/parser/argument_spec.rb +12 -12
- data/spec/parser/arguments_spec.rb +11 -11
- data/spec/parser/option_spec.rb +33 -25
- data/spec/parser/options_spec.rb +66 -52
- data/spec/quality_spec.rb +75 -0
- data/spec/rake_compat_spec.rb +10 -10
- data/spec/register_spec.rb +60 -30
- data/spec/runner_spec.rb +67 -62
- data/spec/sandbox/application.rb +2 -0
- data/spec/sandbox/app{1}/README +3 -0
- data/spec/sandbox/bundle/execute.rb +6 -0
- data/spec/sandbox/bundle/main.thor +1 -0
- data/spec/sandbox/command.thor +10 -0
- data/spec/sandbox/doc/%file_name%.rb.tt +1 -0
- data/spec/sandbox/doc/COMMENTER +11 -0
- data/spec/sandbox/doc/README +3 -0
- data/spec/sandbox/doc/block_helper.rb +3 -0
- data/spec/sandbox/doc/config.rb +1 -0
- data/spec/sandbox/doc/config.yaml.tt +1 -0
- data/spec/sandbox/doc/excluding/%file_name%.rb.tt +1 -0
- data/spec/sandbox/enum.thor +10 -0
- data/spec/sandbox/group.thor +128 -0
- data/spec/sandbox/invoke.thor +131 -0
- data/spec/sandbox/path with spaces b/data/spec/sandbox/path with → spaces +0 -0
- data/spec/sandbox/preserve/script.sh +3 -0
- data/spec/sandbox/script.thor +220 -0
- data/spec/sandbox/subcommand.thor +17 -0
- data/spec/shell/basic_spec.rb +107 -86
- data/spec/shell/color_spec.rb +32 -8
- data/spec/shell/html_spec.rb +3 -4
- data/spec/shell_spec.rb +7 -7
- data/spec/subcommand_spec.rb +20 -2
- data/spec/thor_spec.rb +111 -97
- data/spec/util_spec.rb +30 -30
- data/thor.gemspec +14 -14
- metadata +69 -25
data/lib/thor/shell/html.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "thor/shell/basic"
|
2
2
|
|
3
3
|
class Thor
|
4
4
|
module Shell
|
@@ -10,38 +10,38 @@ class Thor
|
|
10
10
|
BOLD = "font-weight: bold"
|
11
11
|
|
12
12
|
# Set the terminal's foreground HTML color to black.
|
13
|
-
BLACK =
|
13
|
+
BLACK = "color: black"
|
14
14
|
# Set the terminal's foreground HTML color to red.
|
15
|
-
RED =
|
15
|
+
RED = "color: red"
|
16
16
|
# Set the terminal's foreground HTML color to green.
|
17
|
-
GREEN =
|
17
|
+
GREEN = "color: green"
|
18
18
|
# Set the terminal's foreground HTML color to yellow.
|
19
|
-
YELLOW =
|
19
|
+
YELLOW = "color: yellow"
|
20
20
|
# Set the terminal's foreground HTML color to blue.
|
21
|
-
BLUE =
|
21
|
+
BLUE = "color: blue"
|
22
22
|
# Set the terminal's foreground HTML color to magenta.
|
23
|
-
MAGENTA =
|
23
|
+
MAGENTA = "color: magenta"
|
24
24
|
# Set the terminal's foreground HTML color to cyan.
|
25
|
-
CYAN =
|
25
|
+
CYAN = "color: cyan"
|
26
26
|
# Set the terminal's foreground HTML color to white.
|
27
|
-
WHITE =
|
27
|
+
WHITE = "color: white"
|
28
28
|
|
29
29
|
# Set the terminal's background HTML color to black.
|
30
|
-
ON_BLACK =
|
30
|
+
ON_BLACK = "background-color: black"
|
31
31
|
# Set the terminal's background HTML color to red.
|
32
|
-
ON_RED =
|
32
|
+
ON_RED = "background-color: red"
|
33
33
|
# Set the terminal's background HTML color to green.
|
34
|
-
ON_GREEN =
|
34
|
+
ON_GREEN = "background-color: green"
|
35
35
|
# Set the terminal's background HTML color to yellow.
|
36
|
-
ON_YELLOW =
|
36
|
+
ON_YELLOW = "background-color: yellow"
|
37
37
|
# Set the terminal's background HTML color to blue.
|
38
|
-
ON_BLUE =
|
38
|
+
ON_BLUE = "background-color: blue"
|
39
39
|
# Set the terminal's background HTML color to magenta.
|
40
|
-
ON_MAGENTA =
|
40
|
+
ON_MAGENTA = "background-color: magenta"
|
41
41
|
# Set the terminal's background HTML color to cyan.
|
42
|
-
ON_CYAN =
|
42
|
+
ON_CYAN = "background-color: cyan"
|
43
43
|
# Set the terminal's background HTML color to white.
|
44
|
-
ON_WHITE =
|
44
|
+
ON_WHITE = "background-color: white"
|
45
45
|
|
46
46
|
# Set color by using a string or one of the defined constants. If a third
|
47
47
|
# option is set to true, it also adds bold to the string. This is based
|
@@ -67,61 +67,60 @@ class Thor
|
|
67
67
|
# ask("What is your name?")
|
68
68
|
#
|
69
69
|
# TODO: Implement #ask for Thor::Shell::HTML
|
70
|
-
def ask(statement, color=nil)
|
71
|
-
|
70
|
+
def ask(statement, color = nil)
|
71
|
+
fail NotImplementedError, "Implement #ask for Thor::Shell::HTML"
|
72
72
|
end
|
73
73
|
|
74
|
-
|
74
|
+
protected
|
75
75
|
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
def can_display_colors?
|
77
|
+
true
|
78
|
+
end
|
79
79
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
80
|
+
# Overwrite show_diff to show diff with colors if Diff::LCS is
|
81
|
+
# available.
|
82
|
+
#
|
83
|
+
def show_diff(destination, content) #:nodoc:
|
84
|
+
if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
|
85
|
+
actual = File.binread(destination).to_s.split("\n")
|
86
|
+
content = content.to_s.split("\n")
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
end
|
91
|
-
else
|
92
|
-
super
|
88
|
+
Diff::LCS.sdiff(actual, content).each do |diff|
|
89
|
+
output_diff_line(diff)
|
93
90
|
end
|
91
|
+
else
|
92
|
+
super
|
94
93
|
end
|
94
|
+
end
|
95
95
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
end
|
96
|
+
def output_diff_line(diff) #:nodoc:
|
97
|
+
case diff.action
|
98
|
+
when "-"
|
99
|
+
say "- #{diff.old_element.chomp}", :red, true
|
100
|
+
when "+"
|
101
|
+
say "+ #{diff.new_element.chomp}", :green, true
|
102
|
+
when "!"
|
103
|
+
say "- #{diff.old_element.chomp}", :red, true
|
104
|
+
say "+ #{diff.new_element.chomp}", :green, true
|
105
|
+
else
|
106
|
+
say " #{diff.old_element.chomp}", nil, true
|
108
107
|
end
|
108
|
+
end
|
109
109
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
110
|
+
# Check if Diff::LCS is loaded. If it is, use it to create pretty output
|
111
|
+
# for diff.
|
112
|
+
#
|
113
|
+
def diff_lcs_loaded? #:nodoc:
|
114
|
+
return true if defined?(Diff::LCS)
|
115
|
+
return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
|
116
116
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
117
|
+
@diff_lcs_loaded = begin
|
118
|
+
require "diff/lcs"
|
119
|
+
true
|
120
|
+
rescue LoadError
|
121
|
+
false
|
123
122
|
end
|
124
|
-
|
123
|
+
end
|
125
124
|
end
|
126
125
|
end
|
127
126
|
end
|
data/lib/thor/util.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "rbconfig"
|
2
2
|
|
3
3
|
class Thor
|
4
4
|
module Sandbox #:nodoc:
|
@@ -15,9 +15,7 @@ class Thor
|
|
15
15
|
# Thor::Util.load_thorfile("~/.thor/foo")
|
16
16
|
#
|
17
17
|
module Util
|
18
|
-
|
19
18
|
class << self
|
20
|
-
|
21
19
|
# Receives a namespace and search for it in the Thor::Base subclasses.
|
22
20
|
#
|
23
21
|
# ==== Parameters
|
@@ -25,7 +23,7 @@ class Thor
|
|
25
23
|
#
|
26
24
|
def find_by_namespace(namespace)
|
27
25
|
namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
|
28
|
-
Thor::Base.subclasses.
|
26
|
+
Thor::Base.subclasses.detect { |klass| klass.namespace == namespace }
|
29
27
|
end
|
30
28
|
|
31
29
|
# Receives a constant and converts it to a Thor namespace. Since Thor
|
@@ -57,7 +55,7 @@ class Thor
|
|
57
55
|
# ==== Returns
|
58
56
|
# Array[Object]
|
59
57
|
#
|
60
|
-
def namespaces_in_content(contents, file=__FILE__)
|
58
|
+
def namespaces_in_content(contents, file = __FILE__)
|
61
59
|
old_constants = Thor::Base.subclasses.dup
|
62
60
|
Thor::Base.subclasses.clear
|
63
61
|
|
@@ -66,7 +64,7 @@ class Thor
|
|
66
64
|
new_constants = Thor::Base.subclasses.dup
|
67
65
|
Thor::Base.subclasses.replace(old_constants)
|
68
66
|
|
69
|
-
new_constants.map!{ |c| c.namespace }
|
67
|
+
new_constants.map! { |c| c.namespace }
|
70
68
|
new_constants.compact!
|
71
69
|
new_constants
|
72
70
|
end
|
@@ -77,7 +75,7 @@ class Thor
|
|
77
75
|
stringfied_constants = klass.constants.map { |c| c.to_s }
|
78
76
|
Thor::Base.subclasses.select do |subclass|
|
79
77
|
next unless subclass.name
|
80
|
-
stringfied_constants.include?(subclass.name.gsub("#{klass.name}::",
|
78
|
+
stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ""))
|
81
79
|
end
|
82
80
|
end
|
83
81
|
|
@@ -91,8 +89,8 @@ class Thor
|
|
91
89
|
#
|
92
90
|
def snake_case(str)
|
93
91
|
return str.downcase if str =~ /^[A-Z_]+$/
|
94
|
-
str.gsub(/\B[A-Z]/, '_\&').squeeze(
|
95
|
-
|
92
|
+
str.gsub(/\B[A-Z]/, '_\&').squeeze("_") =~ /_*(.*)/
|
93
|
+
$+.downcase
|
96
94
|
end
|
97
95
|
|
98
96
|
# Receives a string and convert it to camel case. camel_case returns CamelCase.
|
@@ -105,7 +103,7 @@ class Thor
|
|
105
103
|
#
|
106
104
|
def camel_case(str)
|
107
105
|
return str if str !~ /_/ && str =~ /[A-Z]+.*/
|
108
|
-
str.split(
|
106
|
+
str.split("_").map { |i| i.capitalize }.join
|
109
107
|
end
|
110
108
|
|
111
109
|
# Receives a namespace and tries to retrieve a Thor or Thor::Group class
|
@@ -131,7 +129,7 @@ class Thor
|
|
131
129
|
# namespace<String>
|
132
130
|
#
|
133
131
|
def find_class_and_command_by_namespace(namespace, fallback = true)
|
134
|
-
if namespace.include?(
|
132
|
+
if namespace.include?(":") # look for a namespaced command
|
135
133
|
pieces = namespace.split(":")
|
136
134
|
command = pieces.pop
|
137
135
|
klass = Thor::Util.find_by_namespace(pieces.join(":"))
|
@@ -141,21 +139,21 @@ class Thor
|
|
141
139
|
end
|
142
140
|
if !klass && fallback # try a command in the default namespace
|
143
141
|
command = namespace
|
144
|
-
klass = Thor::Util.find_by_namespace(
|
142
|
+
klass = Thor::Util.find_by_namespace("")
|
145
143
|
end
|
146
|
-
|
144
|
+
[klass, command]
|
147
145
|
end
|
148
|
-
|
146
|
+
alias_method :find_class_and_task_by_namespace, :find_class_and_command_by_namespace
|
149
147
|
|
150
148
|
# Receives a path and load the thor file in the path. The file is evaluated
|
151
149
|
# inside the sandbox to avoid namespacing conflicts.
|
152
150
|
#
|
153
|
-
def load_thorfile(path, content=nil, debug=false)
|
151
|
+
def load_thorfile(path, content = nil, debug = false)
|
154
152
|
content ||= File.binread(path)
|
155
153
|
|
156
154
|
begin
|
157
155
|
Thor::Sandbox.class_eval(content, path)
|
158
|
-
rescue
|
156
|
+
rescue StandardError => e
|
159
157
|
$stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
|
160
158
|
if debug
|
161
159
|
$stderr.puts(*e.backtrace)
|
@@ -165,7 +163,7 @@ class Thor
|
|
165
163
|
end
|
166
164
|
end
|
167
165
|
|
168
|
-
def user_home
|
166
|
+
def user_home # rubocop:disable MethodLength
|
169
167
|
@@user_home ||= if ENV["HOME"]
|
170
168
|
ENV["HOME"]
|
171
169
|
elsif ENV["USERPROFILE"]
|
@@ -190,7 +188,7 @@ class Thor
|
|
190
188
|
# Returns the root where thor files are located, depending on the OS.
|
191
189
|
#
|
192
190
|
def thor_root
|
193
|
-
File.join(user_home, ".thor").gsub(/\\/,
|
191
|
+
File.join(user_home, ".thor").gsub(/\\/, "/")
|
194
192
|
end
|
195
193
|
|
196
194
|
# Returns the files in the thor root. On Windows thor_root will be something
|
@@ -218,17 +216,17 @@ class Thor
|
|
218
216
|
# Return the path to the ruby interpreter taking into account multiple
|
219
217
|
# installations and windows extensions.
|
220
218
|
#
|
221
|
-
def ruby_command
|
219
|
+
def ruby_command # rubocop:disable MethodLength
|
222
220
|
@ruby_command ||= begin
|
223
|
-
ruby_name = RbConfig::CONFIG[
|
224
|
-
ruby = File.join(RbConfig::CONFIG[
|
225
|
-
ruby << RbConfig::CONFIG[
|
221
|
+
ruby_name = RbConfig::CONFIG["ruby_install_name"]
|
222
|
+
ruby = File.join(RbConfig::CONFIG["bindir"], ruby_name)
|
223
|
+
ruby << RbConfig::CONFIG["EXEEXT"]
|
226
224
|
|
227
225
|
# avoid using different name than ruby (on platforms supporting links)
|
228
|
-
if ruby_name !=
|
226
|
+
if ruby_name != "ruby" && File.respond_to?(:readlink)
|
229
227
|
begin
|
230
|
-
alternate_ruby = File.join(RbConfig::CONFIG[
|
231
|
-
alternate_ruby << RbConfig::CONFIG[
|
228
|
+
alternate_ruby = File.join(RbConfig::CONFIG["bindir"], "ruby")
|
229
|
+
alternate_ruby << RbConfig::CONFIG["EXEEXT"]
|
232
230
|
|
233
231
|
# ruby is a symlink
|
234
232
|
if File.symlink? alternate_ruby
|
@@ -237,7 +235,7 @@ class Thor
|
|
237
235
|
# symlink points to 'ruby_install_name'
|
238
236
|
ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
|
239
237
|
end
|
240
|
-
rescue NotImplementedError
|
238
|
+
rescue NotImplementedError # rubocop:disable HandleExceptions
|
241
239
|
# just ignore on windows
|
242
240
|
end
|
243
241
|
end
|
@@ -264,7 +262,6 @@ class Thor
|
|
264
262
|
def escape_globs(path)
|
265
263
|
path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
|
266
264
|
end
|
267
|
-
|
268
265
|
end
|
269
266
|
end
|
270
267
|
end
|
data/lib/thor/version.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "helper"
|
2
|
+
require "thor/actions"
|
3
3
|
|
4
4
|
describe Thor::Actions::CreateFile do
|
5
5
|
before do
|
6
|
+
@silence = false
|
6
7
|
::FileUtils.rm_rf(destination_root)
|
7
8
|
end
|
8
9
|
|
9
|
-
def create_file(destination=nil, config={}, options={})
|
10
|
-
@base = MyCounter.new([1, 2], options,
|
11
|
-
@base.
|
10
|
+
def create_file(destination = nil, config = {}, options = {})
|
11
|
+
@base = MyCounter.new([1, 2], options, :destination_root => destination_root)
|
12
|
+
allow(@base).to receive(:file_name).and_return("rdoc")
|
12
13
|
|
13
|
-
@action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION",
|
14
|
-
{ :verbose => !@silence }.merge(config))
|
14
|
+
@action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION", {:verbose => !@silence}.merge(config))
|
15
15
|
end
|
16
16
|
|
17
17
|
def invoke!
|
@@ -30,13 +30,13 @@ describe Thor::Actions::CreateFile do
|
|
30
30
|
it "creates a file" do
|
31
31
|
create_file("doc/config.rb")
|
32
32
|
invoke!
|
33
|
-
expect(File.
|
33
|
+
expect(File.exist?(File.join(destination_root, "doc/config.rb"))).to be true
|
34
34
|
end
|
35
35
|
|
36
36
|
it "does not create a file if pretending" do
|
37
37
|
create_file("doc/config.rb", {}, :pretend => true)
|
38
38
|
invoke!
|
39
|
-
expect(File.
|
39
|
+
expect(File.exist?(File.join(destination_root, "doc/config.rb"))).to be false
|
40
40
|
end
|
41
41
|
|
42
42
|
it "shows created status to the user" do
|
@@ -59,7 +59,7 @@ describe Thor::Actions::CreateFile do
|
|
59
59
|
it "converts encoded instructions" do
|
60
60
|
create_file("doc/%file_name%.rb.tt")
|
61
61
|
invoke!
|
62
|
-
expect(File.
|
62
|
+
expect(File.exist?(File.join(destination_root, "doc/rdoc.rb.tt"))).to be true
|
63
63
|
end
|
64
64
|
|
65
65
|
describe "when file exists" do
|
@@ -78,7 +78,7 @@ describe Thor::Actions::CreateFile do
|
|
78
78
|
|
79
79
|
describe "and is not identical" do
|
80
80
|
before do
|
81
|
-
File.open(File.join(destination_root,
|
81
|
+
File.open(File.join(destination_root, "doc/config.rb"), "w") { |f| f.write("FOO = 3") }
|
82
82
|
end
|
83
83
|
|
84
84
|
it "shows forced status to the user if force is given" do
|
@@ -101,34 +101,32 @@ describe Thor::Actions::CreateFile do
|
|
101
101
|
expect(invoke!).to eq(" skip doc/config.rb\n")
|
102
102
|
end
|
103
103
|
|
104
|
-
it "shows conflict status to
|
104
|
+
it "shows conflict status to the user" do
|
105
|
+
file = File.join(destination_root, "doc/config.rb")
|
105
106
|
expect(create_file("doc/config.rb")).not_to be_identical
|
106
|
-
|
107
|
-
file = File.join(destination_root, 'doc/config.rb')
|
107
|
+
expect(Thor::LineEditor).to receive(:readline).with("Overwrite #{file}? (enter \"h\" for help) [Ynaqdh] ", anything).and_return("s")
|
108
108
|
|
109
109
|
content = invoke!
|
110
110
|
expect(content).to match(/conflict doc\/config\.rb/)
|
111
|
-
expect(content).to match(/Overwrite #{file}\? \(enter "h" for help\) \[Ynaqdh\]/)
|
112
111
|
expect(content).to match(/skip doc\/config\.rb/)
|
113
112
|
end
|
114
113
|
|
115
114
|
it "creates the file if the file collision menu returns true" do
|
116
115
|
create_file("doc/config.rb")
|
117
|
-
|
116
|
+
expect(Thor::LineEditor).to receive(:readline).and_return("y")
|
118
117
|
expect(invoke!).to match(/force doc\/config\.rb/)
|
119
118
|
end
|
120
119
|
|
121
120
|
it "skips the file if the file collision menu returns false" do
|
122
121
|
create_file("doc/config.rb")
|
123
|
-
|
122
|
+
expect(Thor::LineEditor).to receive(:readline).and_return("n")
|
124
123
|
expect(invoke!).to match(/skip doc\/config\.rb/)
|
125
124
|
end
|
126
125
|
|
127
126
|
it "executes the block given to show file content" do
|
128
127
|
create_file("doc/config.rb")
|
129
|
-
|
130
|
-
|
131
|
-
@base.shell.should_receive(:system).with(/diff -u/)
|
128
|
+
expect(Thor::LineEditor).to receive(:readline).and_return("d", "n")
|
129
|
+
expect(@base.shell).to receive(:system).with(/diff -u/)
|
132
130
|
invoke!
|
133
131
|
end
|
134
132
|
end
|
@@ -140,31 +138,31 @@ describe Thor::Actions::CreateFile do
|
|
140
138
|
create_file("doc/config.rb")
|
141
139
|
invoke!
|
142
140
|
revoke!
|
143
|
-
expect(File.
|
141
|
+
expect(File.exist?(@action.destination)).to be false
|
144
142
|
end
|
145
143
|
|
146
144
|
it "does not raise an error if the file does not exist" do
|
147
145
|
create_file("doc/config.rb")
|
148
146
|
revoke!
|
149
|
-
expect(File.
|
147
|
+
expect(File.exist?(@action.destination)).to be false
|
150
148
|
end
|
151
149
|
end
|
152
150
|
|
153
151
|
describe "#exists?" do
|
154
152
|
it "returns true if the destination file exists" do
|
155
153
|
create_file("doc/config.rb")
|
156
|
-
expect(@action.exists?).to
|
154
|
+
expect(@action.exists?).to be false
|
157
155
|
invoke!
|
158
|
-
expect(@action.exists?).to
|
156
|
+
expect(@action.exists?).to be true
|
159
157
|
end
|
160
158
|
end
|
161
159
|
|
162
160
|
describe "#identical?" do
|
163
|
-
it "returns true if the destination file and is identical" do
|
161
|
+
it "returns true if the destination file exists and is identical" do
|
164
162
|
create_file("doc/config.rb")
|
165
|
-
expect(@action.identical?).to
|
163
|
+
expect(@action.identical?).to be false
|
166
164
|
invoke!
|
167
|
-
expect(@action.identical?).to
|
165
|
+
expect(@action.identical?).to be true
|
168
166
|
end
|
169
167
|
end
|
170
168
|
end
|