thor 0.16.0 → 1.2.1
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/CONTRIBUTING.md +15 -0
- data/README.md +23 -6
- data/bin/thor +1 -1
- data/lib/thor/actions/create_file.rb +34 -35
- data/lib/thor/actions/create_link.rb +9 -5
- data/lib/thor/actions/directory.rb +33 -23
- data/lib/thor/actions/empty_directory.rb +75 -85
- data/lib/thor/actions/file_manipulation.rb +103 -36
- data/lib/thor/actions/inject_into_file.rb +46 -36
- data/lib/thor/actions.rb +90 -68
- data/lib/thor/base.rb +302 -244
- data/lib/thor/command.rb +142 -0
- data/lib/thor/core_ext/hash_with_indifferent_access.rb +52 -24
- data/lib/thor/error.rb +90 -10
- data/lib/thor/group.rb +70 -74
- data/lib/thor/invocation.rb +63 -55
- data/lib/thor/line_editor/basic.rb +37 -0
- data/lib/thor/line_editor/readline.rb +88 -0
- data/lib/thor/line_editor.rb +17 -0
- data/lib/thor/nested_context.rb +29 -0
- data/lib/thor/parser/argument.rb +24 -28
- data/lib/thor/parser/arguments.rb +110 -102
- data/lib/thor/parser/option.rb +53 -15
- data/lib/thor/parser/options.rb +174 -97
- data/lib/thor/parser.rb +4 -4
- data/lib/thor/rake_compat.rb +12 -11
- data/lib/thor/runner.rb +159 -155
- data/lib/thor/shell/basic.rb +216 -93
- data/lib/thor/shell/color.rb +53 -40
- data/lib/thor/shell/html.rb +61 -58
- data/lib/thor/shell.rb +29 -36
- data/lib/thor/util.rb +231 -213
- data/lib/thor/version.rb +1 -1
- data/lib/thor.rb +303 -166
- data/thor.gemspec +27 -24
- metadata +36 -226
- data/.gitignore +0 -44
- data/.rspec +0 -2
- data/.travis.yml +0 -7
- data/CHANGELOG.rdoc +0 -134
- data/Gemfile +0 -15
- data/Thorfile +0 -30
- data/bin/rake2thor +0 -86
- data/lib/thor/core_ext/dir_escape.rb +0 -0
- data/lib/thor/core_ext/file_binary_read.rb +0 -9
- data/lib/thor/core_ext/ordered_hash.rb +0 -100
- data/lib/thor/task.rb +0 -132
- data/spec/actions/create_file_spec.rb +0 -170
- data/spec/actions/create_link_spec.rb +0 -81
- data/spec/actions/directory_spec.rb +0 -149
- data/spec/actions/empty_directory_spec.rb +0 -130
- data/spec/actions/file_manipulation_spec.rb +0 -370
- data/spec/actions/inject_into_file_spec.rb +0 -135
- data/spec/actions_spec.rb +0 -331
- data/spec/base_spec.rb +0 -279
- data/spec/core_ext/hash_with_indifferent_access_spec.rb +0 -43
- data/spec/core_ext/ordered_hash_spec.rb +0 -115
- data/spec/exit_condition_spec.rb +0 -19
- data/spec/fixtures/application.rb +0 -2
- data/spec/fixtures/app{1}/README +0 -3
- data/spec/fixtures/bundle/execute.rb +0 -6
- data/spec/fixtures/bundle/main.thor +0 -1
- data/spec/fixtures/doc/%file_name%.rb.tt +0 -1
- data/spec/fixtures/doc/COMMENTER +0 -10
- data/spec/fixtures/doc/README +0 -3
- data/spec/fixtures/doc/block_helper.rb +0 -3
- data/spec/fixtures/doc/components/.empty_directory +0 -0
- data/spec/fixtures/doc/config.rb +0 -1
- data/spec/fixtures/doc/config.yaml.tt +0 -1
- data/spec/fixtures/enum.thor +0 -10
- data/spec/fixtures/group.thor +0 -114
- data/spec/fixtures/invoke.thor +0 -112
- data/spec/fixtures/path with spaces +0 -0
- data/spec/fixtures/script.thor +0 -190
- data/spec/fixtures/task.thor +0 -10
- data/spec/group_spec.rb +0 -216
- data/spec/invocation_spec.rb +0 -100
- data/spec/parser/argument_spec.rb +0 -53
- data/spec/parser/arguments_spec.rb +0 -66
- data/spec/parser/option_spec.rb +0 -202
- data/spec/parser/options_spec.rb +0 -330
- data/spec/rake_compat_spec.rb +0 -72
- data/spec/register_spec.rb +0 -135
- data/spec/runner_spec.rb +0 -241
- data/spec/shell/basic_spec.rb +0 -300
- data/spec/shell/color_spec.rb +0 -81
- data/spec/shell/html_spec.rb +0 -32
- data/spec/shell_spec.rb +0 -47
- data/spec/spec_helper.rb +0 -59
- data/spec/task_spec.rb +0 -80
- data/spec/thor_spec.rb +0 -418
- data/spec/util_spec.rb +0 -196
@@ -1,149 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
require 'thor/actions'
|
3
|
-
|
4
|
-
describe Thor::Actions::Directory do
|
5
|
-
before 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
|
-
|
125
|
-
it "works with glob characters in the path" do
|
126
|
-
content = invoke!("app{1}")
|
127
|
-
content.should =~ /create app\{1\}\/README/
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe "#revoke!" do
|
132
|
-
it "removes the destination file" do
|
133
|
-
invoke! "doc"
|
134
|
-
revoke! "doc"
|
135
|
-
|
136
|
-
File.exists?(File.join(destination_root, "doc", "README")).should be_false
|
137
|
-
File.exists?(File.join(destination_root, "doc", "config.rb")).should be_false
|
138
|
-
File.exists?(File.join(destination_root, "doc", "components")).should be_false
|
139
|
-
end
|
140
|
-
|
141
|
-
it "works with glob characters in the path" do
|
142
|
-
invoke! "app{1}"
|
143
|
-
File.exists?(File.join(destination_root, "app{1}", "README")).should be_true
|
144
|
-
|
145
|
-
revoke! "app{1}"
|
146
|
-
File.exists?(File.join(destination_root, "app{1}", "README")).should be_false
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
require 'thor/actions'
|
3
|
-
|
4
|
-
describe Thor::Actions::EmptyDirectory do
|
5
|
-
before 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
|
-
|
99
|
-
context "protected methods" do
|
100
|
-
describe "#convert_encoded_instructions" do
|
101
|
-
before do
|
102
|
-
empty_directory("test_dir")
|
103
|
-
@action.base.stub!(:file_name).and_return("expected")
|
104
|
-
end
|
105
|
-
|
106
|
-
it "accepts and executes a 'legal' %\w+% encoded instruction" do
|
107
|
-
@action.send(:convert_encoded_instructions, "%file_name%.txt").should == "expected.txt"
|
108
|
-
end
|
109
|
-
|
110
|
-
it "ignores an 'illegal' %\w+% encoded instruction" do
|
111
|
-
@action.send(:convert_encoded_instructions, "%some_name%.txt").should == "%some_name%.txt"
|
112
|
-
end
|
113
|
-
|
114
|
-
it "ignores incorrectly encoded instruction" do
|
115
|
-
@action.send(:convert_encoded_instructions, "%some.name%.txt").should == "%some.name%.txt"
|
116
|
-
end
|
117
|
-
|
118
|
-
it "raises an error if the instruction refers to a private method" do
|
119
|
-
module PrivExt
|
120
|
-
private
|
121
|
-
def private_file_name
|
122
|
-
"something_hidden"
|
123
|
-
end
|
124
|
-
end
|
125
|
-
@action.base.extend(PrivExt)
|
126
|
-
expect { @action.send(:convert_encoded_instructions, "%private_file_name%.txt") }.to raise_error Thor::PrivateMethodEncodedError
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
@@ -1,370 +0,0 @@
|
|
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 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")
|
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
|
-
|
191
|
-
it "guesses the destination name when given only a source" do
|
192
|
-
action :template, "doc/config.yaml.tt"
|
193
|
-
|
194
|
-
file = File.join(destination_root, "doc/config.yaml")
|
195
|
-
File.exists?(file).should be_true
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
describe "when changing existent files" do
|
200
|
-
before do
|
201
|
-
::FileUtils.cp_r(source_root, destination_root)
|
202
|
-
end
|
203
|
-
|
204
|
-
def file
|
205
|
-
File.join(destination_root, "doc", "README")
|
206
|
-
end
|
207
|
-
|
208
|
-
describe "#remove_file" do
|
209
|
-
it "removes the file given" do
|
210
|
-
action :remove_file, "doc/README"
|
211
|
-
File.exists?(file).should be_false
|
212
|
-
end
|
213
|
-
|
214
|
-
it "removes directories too" do
|
215
|
-
action :remove_dir, "doc"
|
216
|
-
File.exists?(File.join(destination_root, "doc")).should be_false
|
217
|
-
end
|
218
|
-
|
219
|
-
it "does not remove if pretending" do
|
220
|
-
runner(:pretend => true)
|
221
|
-
action :remove_file, "doc/README"
|
222
|
-
File.exists?(file).should be_true
|
223
|
-
end
|
224
|
-
|
225
|
-
it "logs status" do
|
226
|
-
action(:remove_file, "doc/README").should == " remove doc/README\n"
|
227
|
-
end
|
228
|
-
|
229
|
-
it "does not log status if required" do
|
230
|
-
action(:remove_file, "doc/README", :verbose => false).should be_empty
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
describe "#gsub_file" do
|
235
|
-
it "replaces the content in the file" do
|
236
|
-
action :gsub_file, "doc/README", "__start__", "START"
|
237
|
-
File.binread(file).should == "START\nREADME\n__end__\n"
|
238
|
-
end
|
239
|
-
|
240
|
-
it "does not replace if pretending" do
|
241
|
-
runner(:pretend => true)
|
242
|
-
action :gsub_file, "doc/README", "__start__", "START"
|
243
|
-
File.binread(file).should == "__start__\nREADME\n__end__\n"
|
244
|
-
end
|
245
|
-
|
246
|
-
it "accepts a block" do
|
247
|
-
action(:gsub_file, "doc/README", "__start__"){ |match| match.gsub('__', '').upcase }
|
248
|
-
File.binread(file).should == "START\nREADME\n__end__\n"
|
249
|
-
end
|
250
|
-
|
251
|
-
it "logs status" do
|
252
|
-
action(:gsub_file, "doc/README", "__start__", "START").should == " gsub doc/README\n"
|
253
|
-
end
|
254
|
-
|
255
|
-
it "does not log status if required" do
|
256
|
-
action(:gsub_file, file, "__", :verbose => false){ |match| match * 2 }.should be_empty
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
describe "#append_to_file" do
|
261
|
-
it "appends content to the file" do
|
262
|
-
action :append_to_file, "doc/README", "END\n"
|
263
|
-
File.binread(file).should == "__start__\nREADME\n__end__\nEND\n"
|
264
|
-
end
|
265
|
-
|
266
|
-
it "accepts a block" do
|
267
|
-
action(:append_to_file, "doc/README"){ "END\n" }
|
268
|
-
File.binread(file).should == "__start__\nREADME\n__end__\nEND\n"
|
269
|
-
end
|
270
|
-
|
271
|
-
it "logs status" do
|
272
|
-
action(:append_to_file, "doc/README", "END").should == " append doc/README\n"
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
describe "#prepend_to_file" do
|
277
|
-
it "prepends content to the file" do
|
278
|
-
action :prepend_to_file, "doc/README", "START\n"
|
279
|
-
File.binread(file).should == "START\n__start__\nREADME\n__end__\n"
|
280
|
-
end
|
281
|
-
|
282
|
-
it "accepts a block" do
|
283
|
-
action(:prepend_to_file, "doc/README"){ "START\n" }
|
284
|
-
File.binread(file).should == "START\n__start__\nREADME\n__end__\n"
|
285
|
-
end
|
286
|
-
|
287
|
-
it "logs status" do
|
288
|
-
action(:prepend_to_file, "doc/README", "START").should == " prepend doc/README\n"
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
describe "#inject_into_class" do
|
293
|
-
def file
|
294
|
-
File.join(destination_root, "application.rb")
|
295
|
-
end
|
296
|
-
|
297
|
-
it "appends content to a class" do
|
298
|
-
action :inject_into_class, "application.rb", Application, " filter_parameters :password\n"
|
299
|
-
File.binread(file).should == "class Application < Base\n filter_parameters :password\nend\n"
|
300
|
-
end
|
301
|
-
|
302
|
-
it "accepts a block" do
|
303
|
-
action(:inject_into_class, "application.rb", Application){ " filter_parameters :password\n" }
|
304
|
-
File.binread(file).should == "class Application < Base\n filter_parameters :password\nend\n"
|
305
|
-
end
|
306
|
-
|
307
|
-
it "logs status" do
|
308
|
-
action(:inject_into_class, "application.rb", Application, " filter_parameters :password\n").should == " insert application.rb\n"
|
309
|
-
end
|
310
|
-
|
311
|
-
it "does not append if class name does not match" do
|
312
|
-
action :inject_into_class, "application.rb", "App", " filter_parameters :password\n"
|
313
|
-
File.binread(file).should == "class Application < Base\nend\n"
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
describe "when adjusting comments" do
|
319
|
-
before do
|
320
|
-
::FileUtils.cp_r(source_root, destination_root)
|
321
|
-
end
|
322
|
-
|
323
|
-
def file
|
324
|
-
File.join(destination_root, "doc", "COMMENTER")
|
325
|
-
end
|
326
|
-
|
327
|
-
unmodified_comments_file = /__start__\n # greenblue\n# yellowblue\n#yellowred\n #greenred\norange\n purple\n ind#igo\n # ind#igo\n__end__/
|
328
|
-
|
329
|
-
describe "#uncomment_lines" do
|
330
|
-
it "uncomments all matching lines in the file" do
|
331
|
-
action :uncomment_lines, "doc/COMMENTER", "green"
|
332
|
-
File.binread(file).should =~ /__start__\n greenblue\n# yellowblue\n#yellowred\n greenred\norange\n purple\n ind#igo\n # ind#igo\n__end__/
|
333
|
-
|
334
|
-
action :uncomment_lines, "doc/COMMENTER", "red"
|
335
|
-
File.binread(file).should =~ /__start__\n greenblue\n# yellowblue\nyellowred\n greenred\norange\n purple\n ind#igo\n # ind#igo\n__end__/
|
336
|
-
end
|
337
|
-
|
338
|
-
it "correctly uncomments lines with hashes in them" do
|
339
|
-
action :uncomment_lines, "doc/COMMENTER", "ind#igo"
|
340
|
-
File.binread(file).should =~ /__start__\n # greenblue\n# yellowblue\n#yellowred\n #greenred\norange\n purple\n ind#igo\n ind#igo\n__end__/
|
341
|
-
end
|
342
|
-
|
343
|
-
it "does not modify already uncommented lines in the file" do
|
344
|
-
action :uncomment_lines, "doc/COMMENTER", "orange"
|
345
|
-
action :uncomment_lines, "doc/COMMENTER", "purple"
|
346
|
-
File.binread(file).should =~ unmodified_comments_file
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
describe "#comment_lines" do
|
351
|
-
it "comments lines which are not commented" do
|
352
|
-
action :comment_lines, "doc/COMMENTER", "orange"
|
353
|
-
File.binread(file).should =~ /__start__\n # greenblue\n# yellowblue\n#yellowred\n #greenred\n# orange\n purple\n ind#igo\n # ind#igo\n__end__/
|
354
|
-
|
355
|
-
action :comment_lines, "doc/COMMENTER", "purple"
|
356
|
-
File.binread(file).should =~ /__start__\n # greenblue\n# yellowblue\n#yellowred\n #greenred\n# orange\n # purple\n ind#igo\n # ind#igo\n__end__/
|
357
|
-
end
|
358
|
-
|
359
|
-
it "correctly comments lines with hashes in them" do
|
360
|
-
action :comment_lines, "doc/COMMENTER", "ind#igo"
|
361
|
-
File.binread(file).should =~ /__start__\n # greenblue\n# yellowblue\n#yellowred\n #greenred\norange\n purple\n # ind#igo\n # ind#igo\n__end__/
|
362
|
-
end
|
363
|
-
|
364
|
-
it "does not modify already commented lines" do
|
365
|
-
action :comment_lines, "doc/COMMENTER", "green"
|
366
|
-
File.binread(file).should =~ unmodified_comments_file
|
367
|
-
end
|
368
|
-
end
|
369
|
-
end
|
370
|
-
end
|