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.
Files changed (75) hide show
  1. data/CHANGELOG.rdoc +103 -0
  2. data/LICENSE +20 -0
  3. data/README.md +307 -0
  4. data/Thorfile +24 -0
  5. data/bin/rake2thor +86 -0
  6. data/bin/thor +6 -0
  7. data/lib/thor.rb +334 -0
  8. data/lib/thor/actions.rb +314 -0
  9. data/lib/thor/actions/create_file.rb +105 -0
  10. data/lib/thor/actions/create_link.rb +57 -0
  11. data/lib/thor/actions/directory.rb +93 -0
  12. data/lib/thor/actions/empty_directory.rb +134 -0
  13. data/lib/thor/actions/file_manipulation.rb +270 -0
  14. data/lib/thor/actions/inject_into_file.rb +109 -0
  15. data/lib/thor/base.rb +579 -0
  16. data/lib/thor/core_ext/file_binary_read.rb +9 -0
  17. data/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  18. data/lib/thor/core_ext/ordered_hash.rb +100 -0
  19. data/lib/thor/error.rb +30 -0
  20. data/lib/thor/group.rb +273 -0
  21. data/lib/thor/invocation.rb +168 -0
  22. data/lib/thor/parser.rb +4 -0
  23. data/lib/thor/parser/argument.rb +67 -0
  24. data/lib/thor/parser/arguments.rb +161 -0
  25. data/lib/thor/parser/option.rb +120 -0
  26. data/lib/thor/parser/options.rb +173 -0
  27. data/lib/thor/rake_compat.rb +66 -0
  28. data/lib/thor/runner.rb +309 -0
  29. data/lib/thor/shell.rb +88 -0
  30. data/lib/thor/shell/basic.rb +290 -0
  31. data/lib/thor/shell/color.rb +108 -0
  32. data/lib/thor/shell/html.rb +121 -0
  33. data/lib/thor/task.rb +114 -0
  34. data/lib/thor/util.rb +229 -0
  35. data/lib/thor/version.rb +3 -0
  36. data/spec/actions/create_file_spec.rb +170 -0
  37. data/spec/actions/directory_spec.rb +136 -0
  38. data/spec/actions/empty_directory_spec.rb +98 -0
  39. data/spec/actions/file_manipulation_spec.rb +310 -0
  40. data/spec/actions/inject_into_file_spec.rb +135 -0
  41. data/spec/actions_spec.rb +322 -0
  42. data/spec/base_spec.rb +269 -0
  43. data/spec/core_ext/hash_with_indifferent_access_spec.rb +43 -0
  44. data/spec/core_ext/ordered_hash_spec.rb +115 -0
  45. data/spec/fixtures/application.rb +2 -0
  46. data/spec/fixtures/bundle/execute.rb +6 -0
  47. data/spec/fixtures/bundle/main.thor +1 -0
  48. data/spec/fixtures/doc/%file_name%.rb.tt +1 -0
  49. data/spec/fixtures/doc/README +3 -0
  50. data/spec/fixtures/doc/block_helper.rb +3 -0
  51. data/spec/fixtures/doc/components/.empty_directory +0 -0
  52. data/spec/fixtures/doc/config.rb +1 -0
  53. data/spec/fixtures/group.thor +114 -0
  54. data/spec/fixtures/invoke.thor +112 -0
  55. data/spec/fixtures/path with spaces b/data/spec/fixtures/path with → spaces +0 -0
  56. data/spec/fixtures/script.thor +184 -0
  57. data/spec/fixtures/task.thor +10 -0
  58. data/spec/group_spec.rb +178 -0
  59. data/spec/invocation_spec.rb +100 -0
  60. data/spec/parser/argument_spec.rb +47 -0
  61. data/spec/parser/arguments_spec.rb +64 -0
  62. data/spec/parser/option_spec.rb +202 -0
  63. data/spec/parser/options_spec.rb +319 -0
  64. data/spec/rake_compat_spec.rb +68 -0
  65. data/spec/register_spec.rb +104 -0
  66. data/spec/runner_spec.rb +210 -0
  67. data/spec/shell/basic_spec.rb +223 -0
  68. data/spec/shell/color_spec.rb +41 -0
  69. data/spec/shell/html_spec.rb +27 -0
  70. data/spec/shell_spec.rb +47 -0
  71. data/spec/spec_helper.rb +54 -0
  72. data/spec/task_spec.rb +74 -0
  73. data/spec/thor_spec.rb +334 -0
  74. data/spec/util_spec.rb +163 -0
  75. metadata +193 -0
@@ -0,0 +1,3 @@
1
+ class Thor
2
+ VERSION = "0.14.6".freeze
3
+ end
@@ -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