puppet-module 0.3.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.
Files changed (159) hide show
  1. data/CHANGES.markdown +91 -0
  2. data/LICENSE +17 -0
  3. data/README.markdown +221 -0
  4. data/Rakefile +87 -0
  5. data/VERSION +1 -0
  6. data/bin/puppet-module +7 -0
  7. data/lib/puppet/module/tool.rb +124 -0
  8. data/lib/puppet/module/tool/applications.rb +18 -0
  9. data/lib/puppet/module/tool/applications/application.rb +83 -0
  10. data/lib/puppet/module/tool/applications/builder.rb +88 -0
  11. data/lib/puppet/module/tool/applications/checksummer.rb +38 -0
  12. data/lib/puppet/module/tool/applications/cleaner.rb +14 -0
  13. data/lib/puppet/module/tool/applications/freezer.rb +20 -0
  14. data/lib/puppet/module/tool/applications/generator.rb +117 -0
  15. data/lib/puppet/module/tool/applications/installer.rb +83 -0
  16. data/lib/puppet/module/tool/applications/registrar.rb +34 -0
  17. data/lib/puppet/module/tool/applications/releaser.rb +48 -0
  18. data/lib/puppet/module/tool/applications/searcher.rb +34 -0
  19. data/lib/puppet/module/tool/applications/unpacker.rb +69 -0
  20. data/lib/puppet/module/tool/applications/unreleaser.rb +42 -0
  21. data/lib/puppet/module/tool/cache.rb +56 -0
  22. data/lib/puppet/module/tool/checksums.rb +52 -0
  23. data/lib/puppet/module/tool/cli.rb +127 -0
  24. data/lib/puppet/module/tool/contents_description.rb +84 -0
  25. data/lib/puppet/module/tool/dependency.rb +26 -0
  26. data/lib/puppet/module/tool/metadata.rb +80 -0
  27. data/lib/puppet/module/tool/modulefile.rb +47 -0
  28. data/lib/puppet/module/tool/repository.rb +74 -0
  29. data/lib/puppet/module/tool/skeleton.rb +39 -0
  30. data/lib/puppet/module/tool/utils.rb +9 -0
  31. data/lib/puppet/module/tool/utils/interrogation.rb +39 -0
  32. data/lib/puppet/module/tool/utils/settings.rb +36 -0
  33. data/lib/puppet/module/tool/utils/uri.rb +16 -0
  34. data/spec/fixtures/releases/jamtur01-apache/Modulefile +2 -0
  35. data/spec/fixtures/releases/jamtur01-apache/files/httpd +24 -0
  36. data/spec/fixtures/releases/jamtur01-apache/files/test.vhost +18 -0
  37. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/provider/a2mod/debian.rb +21 -0
  38. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/type/a2mod.rb +12 -0
  39. data/spec/fixtures/releases/jamtur01-apache/manifests/dev.pp +5 -0
  40. data/spec/fixtures/releases/jamtur01-apache/manifests/init.pp +34 -0
  41. data/spec/fixtures/releases/jamtur01-apache/manifests/params.pp +17 -0
  42. data/spec/fixtures/releases/jamtur01-apache/manifests/php.pp +5 -0
  43. data/spec/fixtures/releases/jamtur01-apache/manifests/ssl.pp +15 -0
  44. data/spec/fixtures/releases/jamtur01-apache/manifests/vhost.pp +15 -0
  45. data/spec/fixtures/releases/jamtur01-apache/metadata.json +1 -0
  46. data/spec/fixtures/releases/jamtur01-apache/templates/vhost-default.conf.erb +20 -0
  47. data/spec/fixtures/releases/jamtur01-apache/tests/apache.pp +1 -0
  48. data/spec/fixtures/releases/jamtur01-apache/tests/dev.pp +1 -0
  49. data/spec/fixtures/releases/jamtur01-apache/tests/init.pp +1 -0
  50. data/spec/fixtures/releases/jamtur01-apache/tests/php.pp +1 -0
  51. data/spec/fixtures/releases/jamtur01-apache/tests/ssl.pp +1 -0
  52. data/spec/fixtures/releases/jamtur01-apache/tests/vhost.pp +2 -0
  53. data/spec/integration/cli_spec.rb +373 -0
  54. data/spec/spec.opts +1 -0
  55. data/spec/spec_helper.rb +15 -0
  56. data/spec/support/output_support.rb +19 -0
  57. data/spec/support/stub_http_support.rb +14 -0
  58. data/spec/support/testdir_support.rb +26 -0
  59. data/spec/unit/application_spec.rb +25 -0
  60. data/spec/unit/repository_spec.rb +51 -0
  61. data/templates/generator/Modulefile.erb +5 -0
  62. data/templates/generator/README.erb +3 -0
  63. data/templates/generator/files/README.markdown +22 -0
  64. data/templates/generator/lib/puppet/facter/README.markdown +22 -0
  65. data/templates/generator/lib/puppet/parser/functions/README.markdown +17 -0
  66. data/templates/generator/lib/puppet/provider/README.markdown +14 -0
  67. data/templates/generator/lib/puppet/type/README.markdown +14 -0
  68. data/templates/generator/manifests/README.markdown +28 -0
  69. data/templates/generator/manifests/init.pp.erb +17 -0
  70. data/templates/generator/metadata.json +12 -0
  71. data/templates/generator/spec/README.markdown +7 -0
  72. data/templates/generator/spec/spec.opts +6 -0
  73. data/templates/generator/spec/spec_helper.rb +18 -0
  74. data/templates/generator/spec/unit/puppet/provider/README.markdown +4 -0
  75. data/templates/generator/spec/unit/puppet/type/README.markdown +4 -0
  76. data/templates/generator/templates/README.markdown +23 -0
  77. data/templates/generator/tests/init.pp.erb +1 -0
  78. data/vendor/facets-2.8.2-partial/lib/facets/kernel/returning.rb +23 -0
  79. data/vendor/facets-2.8.2-partial/lib/facets/kernel/tap.rb +39 -0
  80. data/vendor/multipart-post-1.0/Manifest.txt +9 -0
  81. data/vendor/multipart-post-1.0/README.txt +61 -0
  82. data/vendor/multipart-post-1.0/Rakefile +21 -0
  83. data/vendor/multipart-post-1.0/lib/composite_io.rb +89 -0
  84. data/vendor/multipart-post-1.0/lib/multipartable.rb +13 -0
  85. data/vendor/multipart-post-1.0/lib/net/http/post/multipart.rb +27 -0
  86. data/vendor/multipart-post-1.0/lib/parts.rb +66 -0
  87. data/vendor/multipart-post-1.0/test/net/http/post/test_multipart.rb +55 -0
  88. data/vendor/multipart-post-1.0/test/test_composite_io.rb +50 -0
  89. data/vendor/thor-852190ae/CHANGELOG.rdoc +89 -0
  90. data/vendor/thor-852190ae/LICENSE +20 -0
  91. data/vendor/thor-852190ae/README.rdoc +297 -0
  92. data/vendor/thor-852190ae/REVISION +1 -0
  93. data/vendor/thor-852190ae/Thorfile +69 -0
  94. data/vendor/thor-852190ae/bin/rake2thor +86 -0
  95. data/vendor/thor-852190ae/bin/thor +6 -0
  96. data/vendor/thor-852190ae/lib/thor.rb +244 -0
  97. data/vendor/thor-852190ae/lib/thor/actions.rb +275 -0
  98. data/vendor/thor-852190ae/lib/thor/actions/create_file.rb +103 -0
  99. data/vendor/thor-852190ae/lib/thor/actions/directory.rb +91 -0
  100. data/vendor/thor-852190ae/lib/thor/actions/empty_directory.rb +134 -0
  101. data/vendor/thor-852190ae/lib/thor/actions/file_manipulation.rb +223 -0
  102. data/vendor/thor-852190ae/lib/thor/actions/inject_into_file.rb +104 -0
  103. data/vendor/thor-852190ae/lib/thor/base.rb +540 -0
  104. data/vendor/thor-852190ae/lib/thor/core_ext/file_binary_read.rb +9 -0
  105. data/vendor/thor-852190ae/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  106. data/vendor/thor-852190ae/lib/thor/core_ext/ordered_hash.rb +100 -0
  107. data/vendor/thor-852190ae/lib/thor/error.rb +30 -0
  108. data/vendor/thor-852190ae/lib/thor/group.rb +271 -0
  109. data/vendor/thor-852190ae/lib/thor/invocation.rb +180 -0
  110. data/vendor/thor-852190ae/lib/thor/parser.rb +4 -0
  111. data/vendor/thor-852190ae/lib/thor/parser/argument.rb +67 -0
  112. data/vendor/thor-852190ae/lib/thor/parser/arguments.rb +150 -0
  113. data/vendor/thor-852190ae/lib/thor/parser/option.rb +128 -0
  114. data/vendor/thor-852190ae/lib/thor/parser/options.rb +169 -0
  115. data/vendor/thor-852190ae/lib/thor/rake_compat.rb +66 -0
  116. data/vendor/thor-852190ae/lib/thor/runner.rb +314 -0
  117. data/vendor/thor-852190ae/lib/thor/shell.rb +83 -0
  118. data/vendor/thor-852190ae/lib/thor/shell/basic.rb +239 -0
  119. data/vendor/thor-852190ae/lib/thor/shell/color.rb +108 -0
  120. data/vendor/thor-852190ae/lib/thor/task.rb +102 -0
  121. data/vendor/thor-852190ae/lib/thor/util.rb +230 -0
  122. data/vendor/thor-852190ae/lib/thor/version.rb +3 -0
  123. data/vendor/thor-852190ae/spec/actions/create_file_spec.rb +170 -0
  124. data/vendor/thor-852190ae/spec/actions/directory_spec.rb +131 -0
  125. data/vendor/thor-852190ae/spec/actions/empty_directory_spec.rb +91 -0
  126. data/vendor/thor-852190ae/spec/actions/file_manipulation_spec.rb +271 -0
  127. data/vendor/thor-852190ae/spec/actions/inject_into_file_spec.rb +135 -0
  128. data/vendor/thor-852190ae/spec/actions_spec.rb +292 -0
  129. data/vendor/thor-852190ae/spec/base_spec.rb +263 -0
  130. data/vendor/thor-852190ae/spec/core_ext/hash_with_indifferent_access_spec.rb +43 -0
  131. data/vendor/thor-852190ae/spec/core_ext/ordered_hash_spec.rb +115 -0
  132. data/vendor/thor-852190ae/spec/fixtures/application.rb +2 -0
  133. data/vendor/thor-852190ae/spec/fixtures/bundle/execute.rb +6 -0
  134. data/vendor/thor-852190ae/spec/fixtures/bundle/main.thor +1 -0
  135. data/vendor/thor-852190ae/spec/fixtures/doc/%file_name%.rb.tt +1 -0
  136. data/vendor/thor-852190ae/spec/fixtures/doc/README +3 -0
  137. data/vendor/thor-852190ae/spec/fixtures/doc/config.rb +1 -0
  138. data/vendor/thor-852190ae/spec/fixtures/group.thor +83 -0
  139. data/vendor/thor-852190ae/spec/fixtures/invoke.thor +112 -0
  140. data/vendor/thor-852190ae/spec/fixtures/script.thor +140 -0
  141. data/vendor/thor-852190ae/spec/fixtures/task.thor +10 -0
  142. data/vendor/thor-852190ae/spec/group_spec.rb +171 -0
  143. data/vendor/thor-852190ae/spec/invocation_spec.rb +107 -0
  144. data/vendor/thor-852190ae/spec/parser/argument_spec.rb +47 -0
  145. data/vendor/thor-852190ae/spec/parser/arguments_spec.rb +64 -0
  146. data/vendor/thor-852190ae/spec/parser/option_spec.rb +202 -0
  147. data/vendor/thor-852190ae/spec/parser/options_spec.rb +292 -0
  148. data/vendor/thor-852190ae/spec/rake_compat_spec.rb +68 -0
  149. data/vendor/thor-852190ae/spec/runner_spec.rb +202 -0
  150. data/vendor/thor-852190ae/spec/shell/basic_spec.rb +205 -0
  151. data/vendor/thor-852190ae/spec/shell/color_spec.rb +41 -0
  152. data/vendor/thor-852190ae/spec/shell_spec.rb +34 -0
  153. data/vendor/thor-852190ae/spec/spec.opts +1 -0
  154. data/vendor/thor-852190ae/spec/spec_helper.rb +54 -0
  155. data/vendor/thor-852190ae/spec/task_spec.rb +69 -0
  156. data/vendor/thor-852190ae/spec/thor_spec.rb +237 -0
  157. data/vendor/thor-852190ae/spec/util_spec.rb +167 -0
  158. data/vendor/thor-852190ae/thor.gemspec +120 -0
  159. metadata +229 -0
@@ -0,0 +1,91 @@
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], options, { :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.must == 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.must == 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.must == '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.must == '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")).must be_true
58
+ end
59
+
60
+ it "shows created status to the user" do
61
+ empty_directory("doc")
62
+ invoke!.must == " create doc\n"
63
+ end
64
+
65
+ describe "when directory exists" do
66
+ it "shows exist status" do
67
+ empty_directory("doc")
68
+ invoke!
69
+ invoke!.must == " exist doc\n"
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "#revoke!" do
75
+ it "removes the destination file" do
76
+ empty_directory("doc")
77
+ invoke!
78
+ revoke!
79
+ File.exists?(@action.destination).must be_false
80
+ end
81
+ end
82
+
83
+ describe "#exists?" do
84
+ it "returns true if the destination file exists" do
85
+ empty_directory("doc")
86
+ @action.exists?.must be_false
87
+ invoke!
88
+ @action.exists?.must be_true
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,271 @@
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).must be_true
17
+
18
+ source = File.join(source_root, source)
19
+ FileUtils.must 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).must == " 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).must 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").must == " 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")).must =~ /^OMG/
80
+ end
81
+ end
82
+
83
+ describe "#get" do
84
+ it "copies file from source to the specified destination" do
85
+ action :get, "doc/README", "docs/README"
86
+ exists_and_identical?("doc/README", "docs/README")
87
+ end
88
+
89
+ it "uses just the source basename as destination if none is specified" do
90
+ action :get, "doc/README"
91
+ exists_and_identical?("doc/README", "README")
92
+ end
93
+
94
+ it "allows the destination to be set as a block result" do
95
+ action(:get, "doc/README"){ |c| "docs/README" }
96
+ exists_and_identical?("doc/README", "docs/README")
97
+ end
98
+
99
+ it "yields file content to a block" do
100
+ action :get, "doc/README" do |content|
101
+ content.must == "__start__\nREADME\n__end__\n"
102
+ end
103
+ end
104
+
105
+ it "logs status" do
106
+ action(:get, "doc/README", "docs/README").must == " create docs/README\n"
107
+ end
108
+
109
+ it "accepts http remote sources" do
110
+ body = "__start__\nHTTPFILE\n__end__\n"
111
+ FakeWeb.register_uri(:get, 'http://example.com/file.txt', :body => body)
112
+ action :get, 'http://example.com/file.txt' do |content|
113
+ content.must == body
114
+ end
115
+ FakeWeb.clean_registry
116
+ end
117
+ end
118
+
119
+ describe "#template" do
120
+ it "evaluates the template given as source" do
121
+ runner.instance_variable_set("@klass", "Config")
122
+ action :template, "doc/config.rb"
123
+
124
+ file = File.join(destination_root, "doc/config.rb")
125
+ File.read(file).must == "class Config; end\n"
126
+ end
127
+
128
+ it "copies the template to the specified destination" do
129
+ action :template, "doc/config.rb", "doc/configuration.rb"
130
+ file = File.join(destination_root, "doc/configuration.rb")
131
+ File.exists?(file).must be_true
132
+ end
133
+
134
+ it "converts enconded instructions" do
135
+ runner.should_receive(:file_name).and_return("rdoc")
136
+ action :template, "doc/%file_name%.rb.tt"
137
+ file = File.join(destination_root, "doc/rdoc.rb.tt")
138
+ File.exists?(file).must be_true
139
+ end
140
+
141
+ it "logs status" do
142
+ capture(:stdout){ runner.template("doc/config.rb") }.must == " create doc/config.rb\n"
143
+ end
144
+
145
+ it "accepts a block to change output" do
146
+ action :template, "doc/config.rb" do |content|
147
+ "OMG" + content
148
+ end
149
+ File.read(File.join(destination_root, "doc/config.rb")).must =~ /^OMG/
150
+ end
151
+ end
152
+
153
+ describe "when changing existent files" do
154
+ before(:each) do
155
+ ::FileUtils.cp_r(source_root, destination_root)
156
+ end
157
+
158
+ def file
159
+ File.join(destination_root, "doc", "README")
160
+ end
161
+
162
+ describe "#remove_file" do
163
+ it "removes the file given" do
164
+ action :remove_file, "doc/README"
165
+ File.exists?(file).must be_false
166
+ end
167
+
168
+ it "removes directories too" do
169
+ action :remove_dir, "doc"
170
+ File.exists?(File.join(destination_root, "doc")).must be_false
171
+ end
172
+
173
+ it "does not remove if pretending" do
174
+ runner(:pretend => true)
175
+ action :remove_file, "doc/README"
176
+ File.exists?(file).must be_true
177
+ end
178
+
179
+ it "logs status" do
180
+ action(:remove_file, "doc/README").must == " remove doc/README\n"
181
+ end
182
+
183
+ it "does not log status if required" do
184
+ action(:remove_file, "doc/README", :verbose => false).must be_empty
185
+ end
186
+ end
187
+
188
+ describe "#gsub_file" do
189
+ it "replaces the content in the file" do
190
+ action :gsub_file, "doc/README", "__start__", "START"
191
+ File.binread(file).must == "START\nREADME\n__end__\n"
192
+ end
193
+
194
+ it "does not replace if pretending" do
195
+ runner(:pretend => true)
196
+ action :gsub_file, "doc/README", "__start__", "START"
197
+ File.binread(file).must == "__start__\nREADME\n__end__\n"
198
+ end
199
+
200
+ it "accepts a block" do
201
+ action(:gsub_file, "doc/README", "__start__"){ |match| match.gsub('__', '').upcase }
202
+ File.binread(file).must == "START\nREADME\n__end__\n"
203
+ end
204
+
205
+ it "logs status" do
206
+ action(:gsub_file, "doc/README", "__start__", "START").must == " gsub doc/README\n"
207
+ end
208
+
209
+ it "does not log status if required" do
210
+ action(:gsub_file, file, "__", :verbose => false){ |match| match * 2 }.must be_empty
211
+ end
212
+ end
213
+
214
+ describe "#append_file" do
215
+ it "appends content to the file" do
216
+ action :append_file, "doc/README", "END\n"
217
+ File.binread(file).must == "__start__\nREADME\n__end__\nEND\n"
218
+ end
219
+
220
+ it "accepts a block" do
221
+ action(:append_file, "doc/README"){ "END\n" }
222
+ File.binread(file).must == "__start__\nREADME\n__end__\nEND\n"
223
+ end
224
+
225
+ it "logs status" do
226
+ action(:append_file, "doc/README", "END").must == " append doc/README\n"
227
+ end
228
+ end
229
+
230
+ describe "#prepend_file" do
231
+ it "prepends content to the file" do
232
+ action :prepend_file, "doc/README", "START\n"
233
+ File.binread(file).must == "START\n__start__\nREADME\n__end__\n"
234
+ end
235
+
236
+ it "accepts a block" do
237
+ action(:prepend_file, "doc/README"){ "START\n" }
238
+ File.binread(file).must == "START\n__start__\nREADME\n__end__\n"
239
+ end
240
+
241
+ it "logs status" do
242
+ action(:prepend_file, "doc/README", "START").must == " prepend doc/README\n"
243
+ end
244
+ end
245
+
246
+ describe "#inject_into_class" do
247
+ def file
248
+ File.join(destination_root, "application.rb")
249
+ end
250
+
251
+ it "appends content to a class" do
252
+ action :inject_into_class, "application.rb", Application, " filter_parameters :password\n"
253
+ File.binread(file).must == "class Application < Base\n filter_parameters :password\nend\n"
254
+ end
255
+
256
+ it "accepts a block" do
257
+ action(:inject_into_class, "application.rb", Application){ " filter_parameters :password\n" }
258
+ File.binread(file).must == "class Application < Base\n filter_parameters :password\nend\n"
259
+ end
260
+
261
+ it "logs status" do
262
+ action(:inject_into_class, "application.rb", Application, " filter_parameters :password\n").must == " inject application.rb\n"
263
+ end
264
+
265
+ it "does not append if class name does not match" do
266
+ action :inject_into_class, "application.rb", "App", " filter_parameters :password\n"
267
+ File.binread(file).must == "class Application < Base\nend\n"
268
+ end
269
+ end
270
+ end
271
+ end
@@ -0,0 +1,135 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'thor/actions'
3
+
4
+ describe Thor::Actions::InjectIntoFile do
5
+ before(:each) do
6
+ ::FileUtils.rm_rf(destination_root)
7
+ ::FileUtils.cp_r(source_root, destination_root)
8
+ end
9
+
10
+ def invoker(options={})
11
+ @invoker ||= MyCounter.new([1,2], options, { :destination_root => destination_root })
12
+ end
13
+
14
+ def revoker
15
+ @revoker ||= MyCounter.new([1,2], {}, { :destination_root => destination_root, :behavior => :revoke })
16
+ end
17
+
18
+ def invoke!(*args, &block)
19
+ capture(:stdout){ invoker.inject_into_file(*args, &block) }
20
+ end
21
+
22
+ def revoke!(*args, &block)
23
+ capture(:stdout){ revoker.inject_into_file(*args, &block) }
24
+ end
25
+
26
+ def file
27
+ File.join(destination_root, "doc/README")
28
+ end
29
+
30
+ describe "#invoke!" do
31
+ it "changes the file adding content after the flag" do
32
+ invoke! "doc/README", "\nmore content", :after => "__start__"
33
+ File.read(file).must == "__start__\nmore content\nREADME\n__end__\n"
34
+ end
35
+
36
+ it "changes the file adding content before the flag" do
37
+ invoke! "doc/README", "more content\n", :before => "__end__"
38
+ File.read(file).must == "__start__\nREADME\nmore content\n__end__\n"
39
+ end
40
+
41
+ it "accepts data as a block" do
42
+ invoke! "doc/README", :before => "__end__" do
43
+ "more content\n"
44
+ end
45
+
46
+ File.read(file).must == "__start__\nREADME\nmore content\n__end__\n"
47
+ end
48
+
49
+ it "logs status" do
50
+ invoke!("doc/README", "\nmore content", :after => "__start__").must == " inject doc/README\n"
51
+ end
52
+
53
+ it "does not change the file if pretending" do
54
+ invoker :pretend => true
55
+ invoke! "doc/README", "\nmore content", :after => "__start__"
56
+ File.read(file).must == "__start__\nREADME\n__end__\n"
57
+ end
58
+
59
+ it "does not change the file if already include content" do
60
+ invoke! "doc/README", :before => "__end__" do
61
+ "more content\n"
62
+ end
63
+
64
+ File.read(file).must == "__start__\nREADME\nmore content\n__end__\n"
65
+
66
+ invoke! "doc/README", :before => "__end__" do
67
+ "more content\n"
68
+ end
69
+
70
+ File.read(file).must == "__start__\nREADME\nmore content\n__end__\n"
71
+ end
72
+
73
+ it "does change the file if already include content and :force == true" do
74
+ invoke! "doc/README", :before => "__end__" do
75
+ "more content\n"
76
+ end
77
+
78
+ File.read(file).must == "__start__\nREADME\nmore content\n__end__\n"
79
+
80
+ invoke! "doc/README", :before => "__end__", :force => true do
81
+ "more content\n"
82
+ end
83
+
84
+ File.read(file).must == "__start__\nREADME\nmore content\nmore content\n__end__\n"
85
+ end
86
+
87
+ end
88
+
89
+ describe "#revoke!" do
90
+ it "deinjects the destination file after injection" do
91
+ invoke! "doc/README", "\nmore content", :after => "__start__"
92
+ revoke! "doc/README", "\nmore content", :after => "__start__"
93
+ File.read(file).must == "__start__\nREADME\n__end__\n"
94
+ end
95
+
96
+ it "deinjects the destination file before injection" do
97
+ invoke! "doc/README", "more content\n", :before => "__start__"
98
+ revoke! "doc/README", "more content\n", :before => "__start__"
99
+ File.read(file).must == "__start__\nREADME\n__end__\n"
100
+ end
101
+
102
+ it "deinjects even with double after injection" do
103
+ invoke! "doc/README", "\nmore content", :after => "__start__"
104
+ invoke! "doc/README", "\nanother stuff", :after => "__start__"
105
+ revoke! "doc/README", "\nmore content", :after => "__start__"
106
+ File.read(file).must == "__start__\nanother stuff\nREADME\n__end__\n"
107
+ end
108
+
109
+ it "deinjects even with double before injection" do
110
+ invoke! "doc/README", "more content\n", :before => "__start__"
111
+ invoke! "doc/README", "another stuff\n", :before => "__start__"
112
+ revoke! "doc/README", "more content\n", :before => "__start__"
113
+ File.read(file).must == "another stuff\n__start__\nREADME\n__end__\n"
114
+ end
115
+
116
+ it "deinjects when prepending" do
117
+ invoke! "doc/README", "more content\n", :after => /\A/
118
+ invoke! "doc/README", "another stuff\n", :after => /\A/
119
+ revoke! "doc/README", "more content\n", :after => /\A/
120
+ File.read(file).must == "another stuff\n__start__\nREADME\n__end__\n"
121
+ end
122
+
123
+ it "deinjects when appending" do
124
+ invoke! "doc/README", "more content\n", :before => /\z/
125
+ invoke! "doc/README", "another stuff\n", :before => /\z/
126
+ revoke! "doc/README", "more content\n", :before => /\z/
127
+ File.read(file).must == "__start__\nREADME\n__end__\nanother stuff\n"
128
+ end
129
+
130
+ it "shows progress information to the user" do
131
+ invoke!("doc/README", "\nmore content", :after => "__start__")
132
+ revoke!("doc/README", "\nmore content", :after => "__start__").must == " deinject doc/README\n"
133
+ end
134
+ end
135
+ end