wijet-thor 0.14.6
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.
- data/CHANGELOG.rdoc +103 -0
- data/LICENSE +20 -0
- data/README.md +307 -0
- data/Thorfile +24 -0
- data/bin/rake2thor +86 -0
- data/bin/thor +6 -0
- data/lib/thor.rb +334 -0
- data/lib/thor/actions.rb +314 -0
- data/lib/thor/actions/create_file.rb +105 -0
- data/lib/thor/actions/create_link.rb +57 -0
- data/lib/thor/actions/directory.rb +93 -0
- data/lib/thor/actions/empty_directory.rb +134 -0
- data/lib/thor/actions/file_manipulation.rb +270 -0
- data/lib/thor/actions/inject_into_file.rb +109 -0
- data/lib/thor/base.rb +579 -0
- data/lib/thor/core_ext/file_binary_read.rb +9 -0
- data/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
- data/lib/thor/core_ext/ordered_hash.rb +100 -0
- data/lib/thor/error.rb +30 -0
- data/lib/thor/group.rb +273 -0
- data/lib/thor/invocation.rb +168 -0
- data/lib/thor/parser.rb +4 -0
- data/lib/thor/parser/argument.rb +67 -0
- data/lib/thor/parser/arguments.rb +161 -0
- data/lib/thor/parser/option.rb +120 -0
- data/lib/thor/parser/options.rb +173 -0
- data/lib/thor/rake_compat.rb +66 -0
- data/lib/thor/runner.rb +309 -0
- data/lib/thor/shell.rb +88 -0
- data/lib/thor/shell/basic.rb +290 -0
- data/lib/thor/shell/color.rb +108 -0
- data/lib/thor/shell/html.rb +121 -0
- data/lib/thor/task.rb +114 -0
- data/lib/thor/util.rb +229 -0
- data/lib/thor/version.rb +3 -0
- data/spec/actions/create_file_spec.rb +170 -0
- data/spec/actions/directory_spec.rb +136 -0
- data/spec/actions/empty_directory_spec.rb +98 -0
- data/spec/actions/file_manipulation_spec.rb +310 -0
- data/spec/actions/inject_into_file_spec.rb +135 -0
- data/spec/actions_spec.rb +322 -0
- data/spec/base_spec.rb +269 -0
- data/spec/core_ext/hash_with_indifferent_access_spec.rb +43 -0
- data/spec/core_ext/ordered_hash_spec.rb +115 -0
- data/spec/fixtures/application.rb +2 -0
- data/spec/fixtures/bundle/execute.rb +6 -0
- data/spec/fixtures/bundle/main.thor +1 -0
- data/spec/fixtures/doc/%file_name%.rb.tt +1 -0
- data/spec/fixtures/doc/README +3 -0
- data/spec/fixtures/doc/block_helper.rb +3 -0
- data/spec/fixtures/doc/components/.empty_directory +0 -0
- data/spec/fixtures/doc/config.rb +1 -0
- data/spec/fixtures/group.thor +114 -0
- data/spec/fixtures/invoke.thor +112 -0
- data/spec/fixtures/path with spaces b/data/spec/fixtures/path with → spaces +0 -0
- data/spec/fixtures/script.thor +184 -0
- data/spec/fixtures/task.thor +10 -0
- data/spec/group_spec.rb +178 -0
- data/spec/invocation_spec.rb +100 -0
- data/spec/parser/argument_spec.rb +47 -0
- data/spec/parser/arguments_spec.rb +64 -0
- data/spec/parser/option_spec.rb +202 -0
- data/spec/parser/options_spec.rb +319 -0
- data/spec/rake_compat_spec.rb +68 -0
- data/spec/register_spec.rb +104 -0
- data/spec/runner_spec.rb +210 -0
- data/spec/shell/basic_spec.rb +223 -0
- data/spec/shell/color_spec.rb +41 -0
- data/spec/shell/html_spec.rb +27 -0
- data/spec/shell_spec.rb +47 -0
- data/spec/spec_helper.rb +54 -0
- data/spec/task_spec.rb +74 -0
- data/spec/thor_spec.rb +334 -0
- data/spec/util_spec.rb +163 -0
- metadata +193 -0
data/lib/thor/version.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'thor/actions'
|
3
|
+
|
4
|
+
describe Thor::Actions::CreateFile do
|
5
|
+
before(:each) do
|
6
|
+
::FileUtils.rm_rf(destination_root)
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_file(destination=nil, config={}, options={})
|
10
|
+
@base = MyCounter.new([1,2], options, { :destination_root => destination_root })
|
11
|
+
@base.stub!(:file_name).and_return('rdoc')
|
12
|
+
|
13
|
+
@action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION",
|
14
|
+
{ :verbose => !@silence }.merge(config))
|
15
|
+
end
|
16
|
+
|
17
|
+
def invoke!
|
18
|
+
capture(:stdout){ @action.invoke! }
|
19
|
+
end
|
20
|
+
|
21
|
+
def revoke!
|
22
|
+
capture(:stdout){ @action.revoke! }
|
23
|
+
end
|
24
|
+
|
25
|
+
def silence!
|
26
|
+
@silence = true
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#invoke!" do
|
30
|
+
it "creates a file" do
|
31
|
+
create_file("doc/config.rb")
|
32
|
+
invoke!
|
33
|
+
File.exists?(File.join(destination_root, "doc/config.rb")).should be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not create a file if pretending" do
|
37
|
+
create_file("doc/config.rb", {}, :pretend => true)
|
38
|
+
invoke!
|
39
|
+
File.exists?(File.join(destination_root, "doc/config.rb")).should be_false
|
40
|
+
end
|
41
|
+
|
42
|
+
it "shows created status to the user" do
|
43
|
+
create_file("doc/config.rb")
|
44
|
+
invoke!.should == " create doc/config.rb\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "does not show any information if log status is false" do
|
48
|
+
silence!
|
49
|
+
create_file("doc/config.rb")
|
50
|
+
invoke!.should be_empty
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns the given destination" do
|
54
|
+
capture(:stdout) do
|
55
|
+
create_file("doc/config.rb").invoke!.should == "doc/config.rb"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it "converts encoded instructions" do
|
60
|
+
create_file("doc/%file_name%.rb.tt")
|
61
|
+
invoke!
|
62
|
+
File.exists?(File.join(destination_root, "doc/rdoc.rb.tt")).should be_true
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "when file exists" do
|
66
|
+
before(:each) do
|
67
|
+
create_file("doc/config.rb")
|
68
|
+
invoke!
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "and is identical" do
|
72
|
+
it "shows identical status" do
|
73
|
+
create_file("doc/config.rb")
|
74
|
+
invoke!
|
75
|
+
invoke!.should == " identical doc/config.rb\n"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "and is not identical" do
|
80
|
+
before(:each) do
|
81
|
+
File.open(File.join(destination_root, 'doc/config.rb'), 'w'){ |f| f.write("FOO = 3") }
|
82
|
+
end
|
83
|
+
|
84
|
+
it "shows forced status to the user if force is given" do
|
85
|
+
create_file("doc/config.rb", {}, :force => true).should_not be_identical
|
86
|
+
invoke!.should == " force doc/config.rb\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
it "shows skipped status to the user if skip is given" do
|
90
|
+
create_file("doc/config.rb", {}, :skip => true).should_not be_identical
|
91
|
+
invoke!.should == " skip doc/config.rb\n"
|
92
|
+
end
|
93
|
+
|
94
|
+
it "shows forced status to the user if force is configured" do
|
95
|
+
create_file("doc/config.rb", :force => true).should_not be_identical
|
96
|
+
invoke!.should == " force doc/config.rb\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
it "shows skipped status to the user if skip is configured" do
|
100
|
+
create_file("doc/config.rb", :skip => true).should_not be_identical
|
101
|
+
invoke!.should == " skip doc/config.rb\n"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "shows conflict status to ther user" do
|
105
|
+
create_file("doc/config.rb").should_not be_identical
|
106
|
+
$stdin.should_receive(:gets).and_return('s')
|
107
|
+
file = File.join(destination_root, 'doc/config.rb')
|
108
|
+
|
109
|
+
content = invoke!
|
110
|
+
content.should =~ /conflict doc\/config\.rb/
|
111
|
+
content.should =~ /Overwrite #{file}\? \(enter "h" for help\) \[Ynaqdh\]/
|
112
|
+
content.should =~ /skip doc\/config\.rb/
|
113
|
+
end
|
114
|
+
|
115
|
+
it "creates the file if the file collision menu returns true" do
|
116
|
+
create_file("doc/config.rb")
|
117
|
+
$stdin.should_receive(:gets).and_return('y')
|
118
|
+
invoke!.should =~ /force doc\/config\.rb/
|
119
|
+
end
|
120
|
+
|
121
|
+
it "skips the file if the file collision menu returns false" do
|
122
|
+
create_file("doc/config.rb")
|
123
|
+
$stdin.should_receive(:gets).and_return('n')
|
124
|
+
invoke!.should =~ /skip doc\/config\.rb/
|
125
|
+
end
|
126
|
+
|
127
|
+
it "executes the block given to show file content" do
|
128
|
+
create_file("doc/config.rb")
|
129
|
+
$stdin.should_receive(:gets).and_return('d')
|
130
|
+
$stdin.should_receive(:gets).and_return('n')
|
131
|
+
@base.shell.should_receive(:system).with(/diff -u/)
|
132
|
+
invoke!
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe "#revoke!" do
|
139
|
+
it "removes the destination file" do
|
140
|
+
create_file("doc/config.rb")
|
141
|
+
invoke!
|
142
|
+
revoke!
|
143
|
+
File.exists?(@action.destination).should be_false
|
144
|
+
end
|
145
|
+
|
146
|
+
it "does not raise an error if the file does not exist" do
|
147
|
+
create_file("doc/config.rb")
|
148
|
+
revoke!
|
149
|
+
File.exists?(@action.destination).should be_false
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "#exists?" do
|
154
|
+
it "returns true if the destination file exists" do
|
155
|
+
create_file("doc/config.rb")
|
156
|
+
@action.exists?.should be_false
|
157
|
+
invoke!
|
158
|
+
@action.exists?.should be_true
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "#identical?" do
|
163
|
+
it "returns true if the destination file and is identical" do
|
164
|
+
create_file("doc/config.rb")
|
165
|
+
@action.identical?.should be_false
|
166
|
+
invoke!
|
167
|
+
@action.identical?.should be_true
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'thor/actions'
|
3
|
+
|
4
|
+
describe Thor::Actions::Directory do
|
5
|
+
before(:each) do
|
6
|
+
::FileUtils.rm_rf(destination_root)
|
7
|
+
invoker.stub!(:file_name).and_return("rdoc")
|
8
|
+
end
|
9
|
+
|
10
|
+
def invoker
|
11
|
+
@invoker ||= WhinyGenerator.new([1,2], {}, { :destination_root => destination_root })
|
12
|
+
end
|
13
|
+
|
14
|
+
def revoker
|
15
|
+
@revoker ||= WhinyGenerator.new([1,2], {}, { :destination_root => destination_root, :behavior => :revoke })
|
16
|
+
end
|
17
|
+
|
18
|
+
def invoke!(*args, &block)
|
19
|
+
capture(:stdout){ invoker.directory(*args, &block) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def revoke!(*args, &block)
|
23
|
+
capture(:stdout){ revoker.directory(*args, &block) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def exists_and_identical?(source_path, destination_path)
|
27
|
+
%w(config.rb README).each do |file|
|
28
|
+
source = File.join(source_root, source_path, file)
|
29
|
+
destination = File.join(destination_root, destination_path, file)
|
30
|
+
|
31
|
+
File.exists?(destination).should be_true
|
32
|
+
FileUtils.identical?(source, destination).should be_true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#invoke!" do
|
37
|
+
it "raises an error if the source does not exist" do
|
38
|
+
lambda {
|
39
|
+
invoke! "unknown"
|
40
|
+
}.should raise_error(Thor::Error, /Could not find "unknown" in any of your source paths/)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not create a directory in pretend mode" do
|
44
|
+
invoke! "doc", "ghost", :pretend => true
|
45
|
+
File.exists?("ghost").should be_false
|
46
|
+
end
|
47
|
+
|
48
|
+
it "copies the whole directory recursively to the default destination" do
|
49
|
+
invoke! "doc"
|
50
|
+
exists_and_identical?("doc", "doc")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "copies the whole directory recursively to the specified destination" do
|
54
|
+
invoke! "doc", "docs"
|
55
|
+
exists_and_identical?("doc", "docs")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "copies only the first level files if recursive" do
|
59
|
+
invoke! ".", "tasks", :recursive => false
|
60
|
+
|
61
|
+
file = File.join(destination_root, "tasks", "group.thor")
|
62
|
+
File.exists?(file).should be_true
|
63
|
+
|
64
|
+
file = File.join(destination_root, "tasks", "doc")
|
65
|
+
File.exists?(file).should be_false
|
66
|
+
|
67
|
+
file = File.join(destination_root, "tasks", "doc", "README")
|
68
|
+
File.exists?(file).should be_false
|
69
|
+
end
|
70
|
+
|
71
|
+
it "copies files from the source relative to the current path" do
|
72
|
+
invoker.inside "doc" do
|
73
|
+
invoke! "."
|
74
|
+
end
|
75
|
+
exists_and_identical?("doc", "doc")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "copies and evaluates templates" do
|
79
|
+
invoke! "doc", "docs"
|
80
|
+
file = File.join(destination_root, "docs", "rdoc.rb")
|
81
|
+
File.exists?(file).should be_true
|
82
|
+
File.read(file).should == "FOO = FOO\n"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "copies directories" do
|
86
|
+
invoke! "doc", "docs"
|
87
|
+
file = File.join(destination_root, "docs", "components")
|
88
|
+
File.exists?(file).should be_true
|
89
|
+
File.directory?(file).should be_true
|
90
|
+
end
|
91
|
+
|
92
|
+
it "does not copy .empty_directory files" do
|
93
|
+
invoke! "doc", "docs"
|
94
|
+
file = File.join(destination_root, "docs", "components", ".empty_directory")
|
95
|
+
File.exists?(file).should be_false
|
96
|
+
end
|
97
|
+
|
98
|
+
it "copies directories even if they are empty" do
|
99
|
+
invoke! "doc/components", "docs/components"
|
100
|
+
file = File.join(destination_root, "docs", "components")
|
101
|
+
File.exists?(file).should be_true
|
102
|
+
end
|
103
|
+
|
104
|
+
it "does not copy empty directories twice" do
|
105
|
+
content = invoke!("doc/components", "docs/components")
|
106
|
+
content.should_not =~ /exist/
|
107
|
+
end
|
108
|
+
|
109
|
+
it "logs status" do
|
110
|
+
content = invoke!("doc")
|
111
|
+
content.should =~ /create doc\/README/
|
112
|
+
content.should =~ /create doc\/config\.rb/
|
113
|
+
content.should =~ /create doc\/rdoc\.rb/
|
114
|
+
content.should =~ /create doc\/components/
|
115
|
+
end
|
116
|
+
|
117
|
+
it "yields a block" do
|
118
|
+
checked = false
|
119
|
+
invoke!("doc") do |content|
|
120
|
+
checked ||= !!(content =~ /FOO/)
|
121
|
+
end
|
122
|
+
checked.should be_true
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "#revoke!" do
|
127
|
+
it "removes the destination file" do
|
128
|
+
invoke! "doc"
|
129
|
+
revoke! "doc"
|
130
|
+
|
131
|
+
File.exists?(File.join(destination_root, "doc", "README")).should be_false
|
132
|
+
File.exists?(File.join(destination_root, "doc", "config.rb")).should be_false
|
133
|
+
File.exists?(File.join(destination_root, "doc", "components")).should be_false
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'thor/actions'
|
3
|
+
|
4
|
+
describe Thor::Actions::EmptyDirectory do
|
5
|
+
before(:each) do
|
6
|
+
::FileUtils.rm_rf(destination_root)
|
7
|
+
end
|
8
|
+
|
9
|
+
def empty_directory(destination, options={})
|
10
|
+
@action = Thor::Actions::EmptyDirectory.new(base, destination)
|
11
|
+
end
|
12
|
+
|
13
|
+
def invoke!
|
14
|
+
capture(:stdout){ @action.invoke! }
|
15
|
+
end
|
16
|
+
|
17
|
+
def revoke!
|
18
|
+
capture(:stdout){ @action.revoke! }
|
19
|
+
end
|
20
|
+
|
21
|
+
def base
|
22
|
+
@base ||= MyCounter.new([1,2], {}, { :destination_root => destination_root })
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#destination" do
|
26
|
+
it "returns the full destination with the destination_root" do
|
27
|
+
empty_directory('doc').destination.should == File.join(destination_root, 'doc')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "takes relative root into account" do
|
31
|
+
base.inside('doc') do
|
32
|
+
empty_directory('contents').destination.should == File.join(destination_root, 'doc', 'contents')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#relative_destination" do
|
38
|
+
it "returns the relative destination to the original destination root" do
|
39
|
+
base.inside('doc') do
|
40
|
+
empty_directory('contents').relative_destination.should == 'doc/contents'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#given_destination" do
|
46
|
+
it "returns the destination supplied by the user" do
|
47
|
+
base.inside('doc') do
|
48
|
+
empty_directory('contents').given_destination.should == 'contents'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#invoke!" do
|
54
|
+
it "copies the file to the specified destination" do
|
55
|
+
empty_directory("doc")
|
56
|
+
invoke!
|
57
|
+
File.exists?(File.join(destination_root, "doc")).should be_true
|
58
|
+
end
|
59
|
+
|
60
|
+
it "shows created status to the user" do
|
61
|
+
empty_directory("doc")
|
62
|
+
invoke!.should == " create doc\n"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "does not create a directory if pretending" do
|
66
|
+
base.inside("foo", :pretend => true) do
|
67
|
+
empty_directory("ghost")
|
68
|
+
end
|
69
|
+
File.exists?(File.join(base.destination_root, "ghost")).should be_false
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "when directory exists" do
|
73
|
+
it "shows exist status" do
|
74
|
+
empty_directory("doc")
|
75
|
+
invoke!
|
76
|
+
invoke!.should == " exist doc\n"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#revoke!" do
|
82
|
+
it "removes the destination file" do
|
83
|
+
empty_directory("doc")
|
84
|
+
invoke!
|
85
|
+
revoke!
|
86
|
+
File.exists?(@action.destination).should be_false
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#exists?" do
|
91
|
+
it "returns true if the destination file exists" do
|
92
|
+
empty_directory("doc")
|
93
|
+
@action.exists?.should be_false
|
94
|
+
invoke!
|
95
|
+
@action.exists?.should be_true
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,310 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
class Application; end
|
4
|
+
|
5
|
+
describe Thor::Actions do
|
6
|
+
def runner(options={})
|
7
|
+
@runner ||= MyCounter.new([1], options, { :destination_root => destination_root })
|
8
|
+
end
|
9
|
+
|
10
|
+
def action(*args, &block)
|
11
|
+
capture(:stdout){ runner.send(*args, &block) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def exists_and_identical?(source, destination)
|
15
|
+
destination = File.join(destination_root, destination)
|
16
|
+
File.exists?(destination).should be_true
|
17
|
+
|
18
|
+
source = File.join(source_root, source)
|
19
|
+
FileUtils.should be_identical(source, destination)
|
20
|
+
end
|
21
|
+
|
22
|
+
def file
|
23
|
+
File.join(destination_root, "foo")
|
24
|
+
end
|
25
|
+
|
26
|
+
before(:each) do
|
27
|
+
::FileUtils.rm_rf(destination_root)
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#chmod" do
|
31
|
+
it "executes the command given" do
|
32
|
+
FileUtils.should_receive(:chmod_R).with(0755, file)
|
33
|
+
action :chmod, "foo", 0755
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not execute the command if pretending given" do
|
37
|
+
FileUtils.should_not_receive(:chmod_R)
|
38
|
+
runner(:pretend => true)
|
39
|
+
action :chmod, "foo", 0755
|
40
|
+
end
|
41
|
+
|
42
|
+
it "logs status" do
|
43
|
+
FileUtils.should_receive(:chmod_R).with(0755, file)
|
44
|
+
action(:chmod, "foo", 0755).should == " chmod foo\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "does not log status if required" do
|
48
|
+
FileUtils.should_receive(:chmod_R).with(0755, file)
|
49
|
+
action(:chmod, "foo", 0755, :verbose => false).should be_empty
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#copy_file" do
|
54
|
+
it "copies file from source to default destination" do
|
55
|
+
action :copy_file, "task.thor"
|
56
|
+
exists_and_identical?("task.thor", "task.thor")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "copies file from source to the specified destination" do
|
60
|
+
action :copy_file, "task.thor", "foo.thor"
|
61
|
+
exists_and_identical?("task.thor", "foo.thor")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "copies file from the source relative to the current path" do
|
65
|
+
runner.inside("doc") do
|
66
|
+
action :copy_file, "README"
|
67
|
+
end
|
68
|
+
exists_and_identical?("doc/README", "doc/README")
|
69
|
+
end
|
70
|
+
|
71
|
+
it "logs status" do
|
72
|
+
action(:copy_file, "task.thor").should == " create task.thor\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
it "accepts a block to change output" do
|
76
|
+
action :copy_file, "task.thor" do |content|
|
77
|
+
"OMG" + content
|
78
|
+
end
|
79
|
+
File.read(File.join(destination_root, "task.thor")).should =~ /^OMG/
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#link_file" do
|
84
|
+
it "links file from source to default destination" do
|
85
|
+
action :link_file, "task.thor"
|
86
|
+
exists_and_identical?("task.thor", "task.thor")
|
87
|
+
end
|
88
|
+
|
89
|
+
it "links file from source to the specified destination" do
|
90
|
+
action :link_file, "task.thor", "foo.thor"
|
91
|
+
exists_and_identical?("task.thor", "foo.thor")
|
92
|
+
end
|
93
|
+
|
94
|
+
it "links file from the source relative to the current path" do
|
95
|
+
runner.inside("doc") do
|
96
|
+
action :link_file, "README"
|
97
|
+
end
|
98
|
+
exists_and_identical?("doc/README", "doc/README")
|
99
|
+
end
|
100
|
+
|
101
|
+
it "logs status" do
|
102
|
+
action(:link_file, "task.thor").should == " create task.thor\n"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "#get" do
|
107
|
+
it "copies file from source to the specified destination" do
|
108
|
+
action :get, "doc/README", "docs/README"
|
109
|
+
exists_and_identical?("doc/README", "docs/README")
|
110
|
+
end
|
111
|
+
|
112
|
+
it "uses just the source basename as destination if none is specified" do
|
113
|
+
action :get, "doc/README"
|
114
|
+
exists_and_identical?("doc/README", "README")
|
115
|
+
end
|
116
|
+
|
117
|
+
it "allows the destination to be set as a block result" do
|
118
|
+
action(:get, "doc/README"){ |c| "docs/README" }
|
119
|
+
exists_and_identical?("doc/README", "docs/README")
|
120
|
+
end
|
121
|
+
|
122
|
+
it "yields file content to a block" do
|
123
|
+
action :get, "doc/README" do |content|
|
124
|
+
content.should == "__start__\nREADME\n__end__\n"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
it "logs status" do
|
129
|
+
action(:get, "doc/README", "docs/README").should == " create docs/README\n"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "accepts http remote sources" do
|
133
|
+
body = "__start__\nHTTPFILE\n__end__\n"
|
134
|
+
FakeWeb.register_uri(:get, 'http://example.com/file.txt', :body => body)
|
135
|
+
action :get, 'http://example.com/file.txt' do |content|
|
136
|
+
content.should == body
|
137
|
+
end
|
138
|
+
FakeWeb.clean_registry
|
139
|
+
end
|
140
|
+
|
141
|
+
it "accepts https remote sources" do
|
142
|
+
body = "__start__\nHTTPSFILE\n__end__\n"
|
143
|
+
FakeWeb.register_uri(:get, 'https://example.com/file.txt', :body => body)
|
144
|
+
action :get, 'https://example.com/file.txt' do |content|
|
145
|
+
content.should == body
|
146
|
+
end
|
147
|
+
FakeWeb.clean_registry
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "#template" do
|
152
|
+
it "allows using block helpers in the template" do
|
153
|
+
action :template, "doc/block_helper.rb"
|
154
|
+
|
155
|
+
file = File.join(destination_root, "doc/block_helper.rb")
|
156
|
+
File.read(file).should == "Hello world!"
|
157
|
+
end
|
158
|
+
|
159
|
+
it "evaluates the template given as source" do
|
160
|
+
runner.instance_variable_set("@klass", "Config")
|
161
|
+
action :template, "doc/config.rb"
|
162
|
+
|
163
|
+
file = File.join(destination_root, "doc/config.rb")
|
164
|
+
File.read(file).should == "class Config; end\n"
|
165
|
+
end
|
166
|
+
|
167
|
+
it "copies the template to the specified destination" do
|
168
|
+
action :template, "doc/config.rb", "doc/configuration.rb"
|
169
|
+
file = File.join(destination_root, "doc/configuration.rb")
|
170
|
+
File.exists?(file).should be_true
|
171
|
+
end
|
172
|
+
|
173
|
+
it "converts enconded instructions" do
|
174
|
+
runner.should_receive(:file_name).and_return("rdoc")
|
175
|
+
action :template, "doc/%file_name%.rb.tt"
|
176
|
+
file = File.join(destination_root, "doc/rdoc.rb.tt")
|
177
|
+
File.exists?(file).should be_true
|
178
|
+
end
|
179
|
+
|
180
|
+
it "logs status" do
|
181
|
+
capture(:stdout){ runner.template("doc/config.rb") }.should == " create doc/config.rb\n"
|
182
|
+
end
|
183
|
+
|
184
|
+
it "accepts a block to change output" do
|
185
|
+
action :template, "doc/config.rb" do |content|
|
186
|
+
"OMG" + content
|
187
|
+
end
|
188
|
+
File.read(File.join(destination_root, "doc/config.rb")).should =~ /^OMG/
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "when changing existent files" do
|
193
|
+
before(:each) do
|
194
|
+
::FileUtils.cp_r(source_root, destination_root)
|
195
|
+
end
|
196
|
+
|
197
|
+
def file
|
198
|
+
File.join(destination_root, "doc", "README")
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "#remove_file" do
|
202
|
+
it "removes the file given" do
|
203
|
+
action :remove_file, "doc/README"
|
204
|
+
File.exists?(file).should be_false
|
205
|
+
end
|
206
|
+
|
207
|
+
it "removes directories too" do
|
208
|
+
action :remove_dir, "doc"
|
209
|
+
File.exists?(File.join(destination_root, "doc")).should be_false
|
210
|
+
end
|
211
|
+
|
212
|
+
it "does not remove if pretending" do
|
213
|
+
runner(:pretend => true)
|
214
|
+
action :remove_file, "doc/README"
|
215
|
+
File.exists?(file).should be_true
|
216
|
+
end
|
217
|
+
|
218
|
+
it "logs status" do
|
219
|
+
action(:remove_file, "doc/README").should == " remove doc/README\n"
|
220
|
+
end
|
221
|
+
|
222
|
+
it "does not log status if required" do
|
223
|
+
action(:remove_file, "doc/README", :verbose => false).should be_empty
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe "#gsub_file" do
|
228
|
+
it "replaces the content in the file" do
|
229
|
+
action :gsub_file, "doc/README", "__start__", "START"
|
230
|
+
File.binread(file).should == "START\nREADME\n__end__\n"
|
231
|
+
end
|
232
|
+
|
233
|
+
it "does not replace if pretending" do
|
234
|
+
runner(:pretend => true)
|
235
|
+
action :gsub_file, "doc/README", "__start__", "START"
|
236
|
+
File.binread(file).should == "__start__\nREADME\n__end__\n"
|
237
|
+
end
|
238
|
+
|
239
|
+
it "accepts a block" do
|
240
|
+
action(:gsub_file, "doc/README", "__start__"){ |match| match.gsub('__', '').upcase }
|
241
|
+
File.binread(file).should == "START\nREADME\n__end__\n"
|
242
|
+
end
|
243
|
+
|
244
|
+
it "logs status" do
|
245
|
+
action(:gsub_file, "doc/README", "__start__", "START").should == " gsub doc/README\n"
|
246
|
+
end
|
247
|
+
|
248
|
+
it "does not log status if required" do
|
249
|
+
action(:gsub_file, file, "__", :verbose => false){ |match| match * 2 }.should be_empty
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
describe "#append_to_file" do
|
254
|
+
it "appends content to the file" do
|
255
|
+
action :append_to_file, "doc/README", "END\n"
|
256
|
+
File.binread(file).should == "__start__\nREADME\n__end__\nEND\n"
|
257
|
+
end
|
258
|
+
|
259
|
+
it "accepts a block" do
|
260
|
+
action(:append_to_file, "doc/README"){ "END\n" }
|
261
|
+
File.binread(file).should == "__start__\nREADME\n__end__\nEND\n"
|
262
|
+
end
|
263
|
+
|
264
|
+
it "logs status" do
|
265
|
+
action(:append_to_file, "doc/README", "END").should == " append doc/README\n"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
describe "#prepend_to_file" do
|
270
|
+
it "prepends content to the file" do
|
271
|
+
action :prepend_to_file, "doc/README", "START\n"
|
272
|
+
File.binread(file).should == "START\n__start__\nREADME\n__end__\n"
|
273
|
+
end
|
274
|
+
|
275
|
+
it "accepts a block" do
|
276
|
+
action(:prepend_to_file, "doc/README"){ "START\n" }
|
277
|
+
File.binread(file).should == "START\n__start__\nREADME\n__end__\n"
|
278
|
+
end
|
279
|
+
|
280
|
+
it "logs status" do
|
281
|
+
action(:prepend_to_file, "doc/README", "START").should == " prepend doc/README\n"
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe "#inject_into_class" do
|
286
|
+
def file
|
287
|
+
File.join(destination_root, "application.rb")
|
288
|
+
end
|
289
|
+
|
290
|
+
it "appends content to a class" do
|
291
|
+
action :inject_into_class, "application.rb", Application, " filter_parameters :password\n"
|
292
|
+
File.binread(file).should == "class Application < Base\n filter_parameters :password\nend\n"
|
293
|
+
end
|
294
|
+
|
295
|
+
it "accepts a block" do
|
296
|
+
action(:inject_into_class, "application.rb", Application){ " filter_parameters :password\n" }
|
297
|
+
File.binread(file).should == "class Application < Base\n filter_parameters :password\nend\n"
|
298
|
+
end
|
299
|
+
|
300
|
+
it "logs status" do
|
301
|
+
action(:inject_into_class, "application.rb", Application, " filter_parameters :password\n").should == " insert application.rb\n"
|
302
|
+
end
|
303
|
+
|
304
|
+
it "does not append if class name does not match" do
|
305
|
+
action :inject_into_class, "application.rb", "App", " filter_parameters :password\n"
|
306
|
+
File.binread(file).should == "class Application < Base\nend\n"
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|