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.
- data/CHANGES.markdown +91 -0
- data/LICENSE +17 -0
- data/README.markdown +221 -0
- data/Rakefile +87 -0
- data/VERSION +1 -0
- data/bin/puppet-module +7 -0
- data/lib/puppet/module/tool.rb +124 -0
- data/lib/puppet/module/tool/applications.rb +18 -0
- data/lib/puppet/module/tool/applications/application.rb +83 -0
- data/lib/puppet/module/tool/applications/builder.rb +88 -0
- data/lib/puppet/module/tool/applications/checksummer.rb +38 -0
- data/lib/puppet/module/tool/applications/cleaner.rb +14 -0
- data/lib/puppet/module/tool/applications/freezer.rb +20 -0
- data/lib/puppet/module/tool/applications/generator.rb +117 -0
- data/lib/puppet/module/tool/applications/installer.rb +83 -0
- data/lib/puppet/module/tool/applications/registrar.rb +34 -0
- data/lib/puppet/module/tool/applications/releaser.rb +48 -0
- data/lib/puppet/module/tool/applications/searcher.rb +34 -0
- data/lib/puppet/module/tool/applications/unpacker.rb +69 -0
- data/lib/puppet/module/tool/applications/unreleaser.rb +42 -0
- data/lib/puppet/module/tool/cache.rb +56 -0
- data/lib/puppet/module/tool/checksums.rb +52 -0
- data/lib/puppet/module/tool/cli.rb +127 -0
- data/lib/puppet/module/tool/contents_description.rb +84 -0
- data/lib/puppet/module/tool/dependency.rb +26 -0
- data/lib/puppet/module/tool/metadata.rb +80 -0
- data/lib/puppet/module/tool/modulefile.rb +47 -0
- data/lib/puppet/module/tool/repository.rb +74 -0
- data/lib/puppet/module/tool/skeleton.rb +39 -0
- data/lib/puppet/module/tool/utils.rb +9 -0
- data/lib/puppet/module/tool/utils/interrogation.rb +39 -0
- data/lib/puppet/module/tool/utils/settings.rb +36 -0
- data/lib/puppet/module/tool/utils/uri.rb +16 -0
- data/spec/fixtures/releases/jamtur01-apache/Modulefile +2 -0
- data/spec/fixtures/releases/jamtur01-apache/files/httpd +24 -0
- data/spec/fixtures/releases/jamtur01-apache/files/test.vhost +18 -0
- data/spec/fixtures/releases/jamtur01-apache/lib/puppet/provider/a2mod/debian.rb +21 -0
- data/spec/fixtures/releases/jamtur01-apache/lib/puppet/type/a2mod.rb +12 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/dev.pp +5 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/init.pp +34 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/params.pp +17 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/php.pp +5 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/ssl.pp +15 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/vhost.pp +15 -0
- data/spec/fixtures/releases/jamtur01-apache/metadata.json +1 -0
- data/spec/fixtures/releases/jamtur01-apache/templates/vhost-default.conf.erb +20 -0
- data/spec/fixtures/releases/jamtur01-apache/tests/apache.pp +1 -0
- data/spec/fixtures/releases/jamtur01-apache/tests/dev.pp +1 -0
- data/spec/fixtures/releases/jamtur01-apache/tests/init.pp +1 -0
- data/spec/fixtures/releases/jamtur01-apache/tests/php.pp +1 -0
- data/spec/fixtures/releases/jamtur01-apache/tests/ssl.pp +1 -0
- data/spec/fixtures/releases/jamtur01-apache/tests/vhost.pp +2 -0
- data/spec/integration/cli_spec.rb +373 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/output_support.rb +19 -0
- data/spec/support/stub_http_support.rb +14 -0
- data/spec/support/testdir_support.rb +26 -0
- data/spec/unit/application_spec.rb +25 -0
- data/spec/unit/repository_spec.rb +51 -0
- data/templates/generator/Modulefile.erb +5 -0
- data/templates/generator/README.erb +3 -0
- data/templates/generator/files/README.markdown +22 -0
- data/templates/generator/lib/puppet/facter/README.markdown +22 -0
- data/templates/generator/lib/puppet/parser/functions/README.markdown +17 -0
- data/templates/generator/lib/puppet/provider/README.markdown +14 -0
- data/templates/generator/lib/puppet/type/README.markdown +14 -0
- data/templates/generator/manifests/README.markdown +28 -0
- data/templates/generator/manifests/init.pp.erb +17 -0
- data/templates/generator/metadata.json +12 -0
- data/templates/generator/spec/README.markdown +7 -0
- data/templates/generator/spec/spec.opts +6 -0
- data/templates/generator/spec/spec_helper.rb +18 -0
- data/templates/generator/spec/unit/puppet/provider/README.markdown +4 -0
- data/templates/generator/spec/unit/puppet/type/README.markdown +4 -0
- data/templates/generator/templates/README.markdown +23 -0
- data/templates/generator/tests/init.pp.erb +1 -0
- data/vendor/facets-2.8.2-partial/lib/facets/kernel/returning.rb +23 -0
- data/vendor/facets-2.8.2-partial/lib/facets/kernel/tap.rb +39 -0
- data/vendor/multipart-post-1.0/Manifest.txt +9 -0
- data/vendor/multipart-post-1.0/README.txt +61 -0
- data/vendor/multipart-post-1.0/Rakefile +21 -0
- data/vendor/multipart-post-1.0/lib/composite_io.rb +89 -0
- data/vendor/multipart-post-1.0/lib/multipartable.rb +13 -0
- data/vendor/multipart-post-1.0/lib/net/http/post/multipart.rb +27 -0
- data/vendor/multipart-post-1.0/lib/parts.rb +66 -0
- data/vendor/multipart-post-1.0/test/net/http/post/test_multipart.rb +55 -0
- data/vendor/multipart-post-1.0/test/test_composite_io.rb +50 -0
- data/vendor/thor-852190ae/CHANGELOG.rdoc +89 -0
- data/vendor/thor-852190ae/LICENSE +20 -0
- data/vendor/thor-852190ae/README.rdoc +297 -0
- data/vendor/thor-852190ae/REVISION +1 -0
- data/vendor/thor-852190ae/Thorfile +69 -0
- data/vendor/thor-852190ae/bin/rake2thor +86 -0
- data/vendor/thor-852190ae/bin/thor +6 -0
- data/vendor/thor-852190ae/lib/thor.rb +244 -0
- data/vendor/thor-852190ae/lib/thor/actions.rb +275 -0
- data/vendor/thor-852190ae/lib/thor/actions/create_file.rb +103 -0
- data/vendor/thor-852190ae/lib/thor/actions/directory.rb +91 -0
- data/vendor/thor-852190ae/lib/thor/actions/empty_directory.rb +134 -0
- data/vendor/thor-852190ae/lib/thor/actions/file_manipulation.rb +223 -0
- data/vendor/thor-852190ae/lib/thor/actions/inject_into_file.rb +104 -0
- data/vendor/thor-852190ae/lib/thor/base.rb +540 -0
- data/vendor/thor-852190ae/lib/thor/core_ext/file_binary_read.rb +9 -0
- data/vendor/thor-852190ae/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
- data/vendor/thor-852190ae/lib/thor/core_ext/ordered_hash.rb +100 -0
- data/vendor/thor-852190ae/lib/thor/error.rb +30 -0
- data/vendor/thor-852190ae/lib/thor/group.rb +271 -0
- data/vendor/thor-852190ae/lib/thor/invocation.rb +180 -0
- data/vendor/thor-852190ae/lib/thor/parser.rb +4 -0
- data/vendor/thor-852190ae/lib/thor/parser/argument.rb +67 -0
- data/vendor/thor-852190ae/lib/thor/parser/arguments.rb +150 -0
- data/vendor/thor-852190ae/lib/thor/parser/option.rb +128 -0
- data/vendor/thor-852190ae/lib/thor/parser/options.rb +169 -0
- data/vendor/thor-852190ae/lib/thor/rake_compat.rb +66 -0
- data/vendor/thor-852190ae/lib/thor/runner.rb +314 -0
- data/vendor/thor-852190ae/lib/thor/shell.rb +83 -0
- data/vendor/thor-852190ae/lib/thor/shell/basic.rb +239 -0
- data/vendor/thor-852190ae/lib/thor/shell/color.rb +108 -0
- data/vendor/thor-852190ae/lib/thor/task.rb +102 -0
- data/vendor/thor-852190ae/lib/thor/util.rb +230 -0
- data/vendor/thor-852190ae/lib/thor/version.rb +3 -0
- data/vendor/thor-852190ae/spec/actions/create_file_spec.rb +170 -0
- data/vendor/thor-852190ae/spec/actions/directory_spec.rb +131 -0
- data/vendor/thor-852190ae/spec/actions/empty_directory_spec.rb +91 -0
- data/vendor/thor-852190ae/spec/actions/file_manipulation_spec.rb +271 -0
- data/vendor/thor-852190ae/spec/actions/inject_into_file_spec.rb +135 -0
- data/vendor/thor-852190ae/spec/actions_spec.rb +292 -0
- data/vendor/thor-852190ae/spec/base_spec.rb +263 -0
- data/vendor/thor-852190ae/spec/core_ext/hash_with_indifferent_access_spec.rb +43 -0
- data/vendor/thor-852190ae/spec/core_ext/ordered_hash_spec.rb +115 -0
- data/vendor/thor-852190ae/spec/fixtures/application.rb +2 -0
- data/vendor/thor-852190ae/spec/fixtures/bundle/execute.rb +6 -0
- data/vendor/thor-852190ae/spec/fixtures/bundle/main.thor +1 -0
- data/vendor/thor-852190ae/spec/fixtures/doc/%file_name%.rb.tt +1 -0
- data/vendor/thor-852190ae/spec/fixtures/doc/README +3 -0
- data/vendor/thor-852190ae/spec/fixtures/doc/config.rb +1 -0
- data/vendor/thor-852190ae/spec/fixtures/group.thor +83 -0
- data/vendor/thor-852190ae/spec/fixtures/invoke.thor +112 -0
- data/vendor/thor-852190ae/spec/fixtures/script.thor +140 -0
- data/vendor/thor-852190ae/spec/fixtures/task.thor +10 -0
- data/vendor/thor-852190ae/spec/group_spec.rb +171 -0
- data/vendor/thor-852190ae/spec/invocation_spec.rb +107 -0
- data/vendor/thor-852190ae/spec/parser/argument_spec.rb +47 -0
- data/vendor/thor-852190ae/spec/parser/arguments_spec.rb +64 -0
- data/vendor/thor-852190ae/spec/parser/option_spec.rb +202 -0
- data/vendor/thor-852190ae/spec/parser/options_spec.rb +292 -0
- data/vendor/thor-852190ae/spec/rake_compat_spec.rb +68 -0
- data/vendor/thor-852190ae/spec/runner_spec.rb +202 -0
- data/vendor/thor-852190ae/spec/shell/basic_spec.rb +205 -0
- data/vendor/thor-852190ae/spec/shell/color_spec.rb +41 -0
- data/vendor/thor-852190ae/spec/shell_spec.rb +34 -0
- data/vendor/thor-852190ae/spec/spec.opts +1 -0
- data/vendor/thor-852190ae/spec/spec_helper.rb +54 -0
- data/vendor/thor-852190ae/spec/task_spec.rb +69 -0
- data/vendor/thor-852190ae/spec/thor_spec.rb +237 -0
- data/vendor/thor-852190ae/spec/util_spec.rb +167 -0
- data/vendor/thor-852190ae/thor.gemspec +120 -0
- 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
|