sprinkle 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/CREDITS +2 -1
  2. data/Manifest.txt +11 -2
  3. data/{README.rdoc → README.txt} +7 -1
  4. data/bin/sprinkle +7 -0
  5. data/config/hoe.rb +2 -2
  6. data/lib/sprinkle/actors/actors.rb +17 -0
  7. data/lib/sprinkle/actors/capistrano.rb +41 -4
  8. data/lib/sprinkle/actors/vlad.rb +39 -4
  9. data/lib/sprinkle/configurable.rb +31 -0
  10. data/lib/sprinkle/deployment.rb +46 -6
  11. data/lib/sprinkle/extensions/arbitrary_options.rb +1 -1
  12. data/lib/sprinkle/extensions/array.rb +1 -3
  13. data/lib/sprinkle/extensions/blank_slate.rb +1 -1
  14. data/lib/sprinkle/extensions/dsl_accessor.rb +1 -1
  15. data/lib/sprinkle/extensions/string.rb +1 -1
  16. data/lib/sprinkle/extensions/symbol.rb +1 -1
  17. data/lib/sprinkle/installers/apt.rb +29 -3
  18. data/lib/sprinkle/installers/gem.rb +34 -6
  19. data/lib/sprinkle/installers/installer.rb +64 -29
  20. data/lib/sprinkle/installers/rake.rb +15 -2
  21. data/lib/sprinkle/installers/rpm.rb +20 -3
  22. data/lib/sprinkle/installers/source.rb +74 -16
  23. data/lib/sprinkle/package.rb +127 -2
  24. data/lib/sprinkle/policy.rb +42 -2
  25. data/lib/sprinkle/script.rb +11 -1
  26. data/lib/sprinkle/verifiers/directory.rb +16 -0
  27. data/lib/sprinkle/verifiers/executable.rb +36 -0
  28. data/lib/sprinkle/verifiers/file.rb +20 -0
  29. data/lib/sprinkle/verifiers/process.rb +21 -0
  30. data/lib/sprinkle/verifiers/ruby.rb +25 -0
  31. data/lib/sprinkle/verifiers/symlink.rb +30 -0
  32. data/lib/sprinkle/verify.rb +114 -0
  33. data/lib/sprinkle/version.rb +1 -1
  34. data/lib/sprinkle.rb +8 -2
  35. data/spec/sprinkle/actors/capistrano_spec.rb +21 -1
  36. data/spec/sprinkle/installers/gem_spec.rb +1 -1
  37. data/spec/sprinkle/installers/installer_spec.rb +55 -29
  38. data/spec/sprinkle/package_spec.rb +137 -0
  39. data/spec/sprinkle/verify_spec.rb +160 -0
  40. data/sprinkle.gemspec +6 -6
  41. metadata +14 -4
  42. data/examples/merb/deploy.rb +0 -5
@@ -0,0 +1,114 @@
1
+ module Sprinkle
2
+ # = Verification Methods
3
+ #
4
+ # As documented in Sprinkle::Package, you may define a block on a package
5
+ # which verifies that a package was installed correctly. If this verification
6
+ # block fails, Sprinkle will stop the script gracefully, raising the error.
7
+ #
8
+ # In addition to checking post install if it was successfully, verification
9
+ # blocks are also ran before an install to see if a package is <em>already</em>
10
+ # installed. If this is the case, the package is skipped and Sprinkle continues
11
+ # with the next package. This behavior can be overriden by setting the -f flag on
12
+ # the sprinkle script or setting Sprinkle::OPTIONS[:force] to true if you're
13
+ # using sprinkle programmatically.
14
+ #
15
+ # == An Example
16
+ #
17
+ # The following verifies that rails was installed correctly be checking to see
18
+ # if the 'rails' command is available on the command line:
19
+ #
20
+ # package :rails do
21
+ # gem 'rails'
22
+ #
23
+ # verify do
24
+ # has_executable 'rails'
25
+ # end
26
+ # end
27
+ #
28
+ # == Available Verifiers
29
+ #
30
+ # There are a variety of available methods for use in the verification block.
31
+ # The standard methods are defined in the Sprinkle::Verifiers module, so see
32
+ # their corresponding documentation.
33
+ #
34
+ # == Custom Verifiers
35
+ #
36
+ # If you feel that the built-in verifiers do not offer a certain aspect of
37
+ # verification which you need, you may create your own verifier! Simply wrap
38
+ # any method in a module which you want to use:
39
+ #
40
+ # module MagicBeansVerifier
41
+ # def has_magic_beans(sauce)
42
+ # @commands << '[ -z "`echo $' + sauce + '`"]'
43
+ # end
44
+ # end
45
+ #
46
+ # The method can append as many commands as it wishes to the @commands array.
47
+ # These commands will be run on the remote server and <b>MUST</b> give an
48
+ # exit status of 0 if successful or other if unsuccessful.
49
+ #
50
+ # To register your verifier, call the register method on Sprinkle::Verify:
51
+ #
52
+ # Sprinle::Verify.register(MagicBeansVerifier)
53
+ #
54
+ # And now you may use it like any other verifier:
55
+ #
56
+ # package :magic_beans do
57
+ # gem 'magic_beans'
58
+ #
59
+ # verify { has_magic_beans('ranch') }
60
+ # end
61
+ class Verify
62
+ include Sprinkle::Configurable
63
+ attr_accessor :package, :description, :commands #:nodoc:
64
+
65
+ class <<self
66
+ # Register a verification module
67
+ def register(new_module)
68
+ class_eval { include new_module }
69
+ end
70
+ end
71
+
72
+ def initialize(package, description = '', &block) #:nodoc:
73
+ raise 'Verify requires a block.' unless block
74
+
75
+ @package = package
76
+ @description = description
77
+ @commands = []
78
+ @options ||= {}
79
+ @options[:padding] = 4
80
+
81
+ self.instance_eval(&block)
82
+ end
83
+
84
+ def process(roles, pre = false) #:nodoc:
85
+ assert_delivery
86
+
87
+ description = @description.empty? ? @package.name : @description
88
+
89
+ if logger.debug?
90
+ logger.debug "#{@package.name}#{description} verification sequence: #{@commands.join('; ')} for roles: #{roles}\n"
91
+ end
92
+
93
+ unless Sprinkle::OPTIONS[:testing]
94
+ logger.info "#{" " * @options[:padding]}--> Verifying #{description}..."
95
+
96
+ unless @delivery.process(@package.name, @commands, roles, true)
97
+ # Verification failed, halt sprinkling gracefully.
98
+ raise Sprinkle::VerificationFailed.new(@package, description)
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ class VerificationFailed < Exception #:nodoc:
105
+ attr_accessor :package, :description
106
+
107
+ def initialize(package, description)
108
+ super("Verifying #{package.name}#{description} failed.")
109
+
110
+ @package = package
111
+ @description = description
112
+ end
113
+ end
114
+ end
@@ -2,7 +2,7 @@ module Sprinkle #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 5
5
+ TINY = 6
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/lib/sprinkle.rb CHANGED
@@ -10,17 +10,23 @@ Dependencies.load_paths << File.dirname(__FILE__)
10
10
 
11
11
  # Load up extensions to existing classes
12
12
  Dir[File.dirname(__FILE__) + '/sprinkle/extensions/*.rb'].each { |e| require e }
13
+ # Load up the verifiers so they can register themselves
14
+ Dir[File.dirname(__FILE__) + '/sprinkle/verifiers/*.rb'].each { |e| require e }
13
15
 
14
16
  # Configuration options
15
17
  module Sprinkle
16
- OPTIONS = { :testing => false, :verbose => false }
18
+ OPTIONS = { :testing => false, :verbose => false, :force => false }
17
19
  end
18
20
 
21
+ # Object is extended to give the package, policy, and deployment methods. To
22
+ # read about each method, see the corresponding module which is included.
23
+ #--
19
24
  # Define a logging target and understand packages, policies and deployment DSL
25
+ #++
20
26
  class Object
21
27
  include Sprinkle::Package, Sprinkle::Policy, Sprinkle::Deployment
22
28
 
23
- def logger
29
+ def logger # :nodoc:
24
30
  @@__log__ ||= ActiveSupport::BufferedLogger.new($stdout, ActiveSupport::BufferedLogger::Severity::INFO)
25
31
  end
26
32
  end
@@ -99,6 +99,8 @@ describe Sprinkle::Actors::Capistrano do
99
99
 
100
100
  @cap = create_cap do; recipes 'deploy'; end
101
101
  @cap.stub!(:run).and_return
102
+
103
+ @testing_errors = false
102
104
  end
103
105
 
104
106
  it 'should dynamically create a capistrano task containing the commands' do
@@ -108,9 +110,27 @@ describe Sprinkle::Actors::Capistrano do
108
110
  it 'should invoke capistrano task after creation' do
109
111
  @cap.should_receive(:run).with(@name).and_return
110
112
  end
113
+
114
+ it 'should raise capistrano errors when suppressing parameter is not set' do
115
+ @testing_errors = true
116
+
117
+ @cap.should_receive(:run).and_raise(::Capistrano::CommandError)
118
+ lambda { @cap.process @name, @commands, @roles }.should raise_error(::Capistrano::CommandError)
119
+ end
120
+
121
+ it 'should not raise errors and instead return false when suppressing parameter is set' do
122
+ @testing_errors = true
123
+
124
+ @cap.should_receive(:run).and_raise(::Capistrano::CommandError)
125
+
126
+ value = nil
127
+ lambda { value = @cap.process(@name, @commands, @roles, true) }.should_not raise_error(::Capistrano::CommandError)
128
+
129
+ value.should_not be
130
+ end
111
131
 
112
132
  after do
113
- @cap.process @name, @commands, @roles
133
+ @cap.process @name, @commands, @roles unless @testing_errors
114
134
  end
115
135
 
116
136
  end
@@ -69,7 +69,7 @@ describe Sprinkle::Installers::Gem do
69
69
  end
70
70
 
71
71
  end
72
-
72
+
73
73
  end
74
74
 
75
75
  end
@@ -53,37 +53,10 @@ describe Sprinkle::Installers::Installer do
53
53
  end
54
54
 
55
55
  describe 'during configuration' do
56
-
57
- before do
58
- @default = Proc.new { }
59
- @defaults = { :installer => @default }
60
- @deployment.stub!(:defaults).and_return(@defaults)
61
- end
62
-
63
- it 'should be configurable via external defaults' do
56
+ # We just check to make sure it has the Sprinkle::Configurable method
57
+ it 'should be configurable' do
64
58
  @installer.should respond_to(:defaults)
65
59
  end
66
-
67
- it 'should select the defaults for the particular concrete installer class' do
68
- @deployment.should_receive(:defaults).and_return(@defaults)
69
- @defaults.should_receive(:[]).with(:installer).and_return(@default)
70
- end
71
-
72
- it 'should configure the installer delivery mechansim' do
73
- @installer.should_receive(:instance_eval)
74
- end
75
-
76
- it 'should maintain an options hash set arbitrarily via method missing' do
77
- @installer.instance_eval do
78
- hsv 'gts'
79
- end
80
- @installer.hsv.should == 'gts'
81
- end
82
-
83
- after do
84
- @installer.defaults(@deployment)
85
- end
86
-
87
60
  end
88
61
 
89
62
  describe 'during installation' do
@@ -114,6 +87,59 @@ describe Sprinkle::Installers::Installer do
114
87
  @delivery.should_receive(:process).with(@package.name, @sequence, @roles)
115
88
  end
116
89
  end
90
+
91
+ describe "with a pre command" do
92
+
93
+ def create_installer_with_pre_command(cmd="")
94
+ installer = Sprinkle::Installers::Installer.new @package do
95
+ pre :install, cmd
96
+
97
+ def install_commands
98
+ ["installer"]
99
+ end
100
+ end
101
+
102
+ installer.stub!(:puts).and_return
103
+ installer.delivery = @delivery
104
+ installer
105
+ end
106
+ before do
107
+ @installer = create_installer_with_pre_command('run')
108
+ end
109
+ describe "string commands" do
110
+ it "should insert the pre command for the specific package in the installation process" do
111
+ @installer.send(:install_sequence).should == [ 'run', 'installer' ]
112
+ end
113
+ end
114
+ describe "blocks as commands" do
115
+ before(:each) do
116
+ @installer = Sprinkle::Installers::Installer.new @package do
117
+ pre :install do
118
+ %w(a b c)
119
+ end
120
+
121
+ def install_commands
122
+ ["installer"]
123
+ end
124
+ end
125
+
126
+ @installer.stub!(:puts).and_return
127
+ @installer.delivery = @delivery
128
+ end
129
+ it "should be able to store a block if it's the pre command" do
130
+ @installer.send(:install_sequence).should == [ "a", "b", "c", 'installer' ]
131
+ end
132
+ end
133
+ describe "blocks as commands" do
134
+ before(:each) do
135
+ @array = ["a", "b"]
136
+ @installer = create_installer_with_pre_command(@array)
137
+ end
138
+ it "should be able to store a block if it's the pre command" do
139
+ @installer.send(:install_sequence).should == [ @array, 'installer' ].flatten
140
+ end
141
+ end
142
+ end
117
143
 
118
144
  after do
119
145
  @installer.process(@roles)
@@ -26,6 +26,16 @@ describe Sprinkle::Package do
26
26
  }.should change { pre_count }.by(1)
27
27
  CODE
28
28
  end
29
+
30
+ # More of Mitchell's meta-programming to dry up specs.
31
+ def create_package_with_blank_verify(n = 1)
32
+ eval(<<CODE)
33
+ @pkg = package @name do
34
+ gem 'gem'
35
+ #{"verify 'stuff happens' do; end\n" * n}
36
+ end
37
+ CODE
38
+ end
29
39
 
30
40
  describe 'when created' do
31
41
 
@@ -221,8 +231,105 @@ CODE
221
231
  end
222
232
 
223
233
  end
234
+
235
+ describe 'with verifications' do
236
+ before do
237
+ @pkg = create_package_with_blank_verify(3)
238
+ @pkg.installer = @installer
239
+ @installer.stub!(:defaults)
240
+ @installer.stub!(:process)
241
+ end
242
+
243
+ describe 'with forcing' do
244
+ before do
245
+ # Being explicit
246
+ Sprinkle::OPTIONS[:force] = true
247
+ end
248
+
249
+ it 'should process verifications only once' do
250
+ @pkg.should_receive(:process_verifications).once
251
+ @pkg.process(@deployment, @roles)
252
+ end
253
+
254
+ after do
255
+ # Being explicit
256
+ Sprinkle::OPTIONS[:force] = false
257
+ end
258
+ end
259
+
260
+ describe 'without forcing' do
261
+ before do
262
+ # Being explicit
263
+ Sprinkle::OPTIONS[:force] = false
264
+ end
265
+
266
+ it 'should process verifications twice' do
267
+ @pkg.should_receive(:process_verifications).once.with(@deployment, @roles, true).and_raise(Sprinkle::VerificationFailed.new(@pkg, ''))
268
+ @pkg.should_receive(:process_verifications).once.with(@deployment, @roles).and_raise(Sprinkle::VerificationFailed.new(@pkg, ''))
269
+ end
270
+
271
+ it 'should continue with installation if pre-verification fails' do
272
+ @pkg.should_receive(:process_verifications).twice.and_raise(Sprinkle::VerificationFailed.new(@pkg, ''))
273
+ @installer.should_receive(:defaults)
274
+ @installer.should_receive(:process)
275
+ end
276
+
277
+ it 'should only process verifications once and should not process installer if verifications succeed' do
278
+ @pkg.should_receive(:process_verifications).once.and_return(nil)
279
+ @installer.should_not_receive(:defaults)
280
+ @installer.should_not_receive(:process)
281
+ end
282
+
283
+ after do
284
+ begin
285
+ @pkg.process(@deployment, @roles)
286
+ rescue Sprinkle::VerificationFailed => e; end
287
+ end
288
+ end
289
+ end
224
290
 
225
291
  end
292
+
293
+ describe 'when processing verifications' do
294
+ before do
295
+ @deployment = mock(Sprinkle::Deployment)
296
+ @roles = [ :app, :db ]
297
+ @installer = mock(Sprinkle::Installers::Installer, :defaults => true, :process => true)
298
+ @pkg = create_package_with_blank_verify(3)
299
+ @pkg.installer = @installer
300
+ @installer.stub!(:defaults)
301
+ @installer.stub!(:process)
302
+ @logger = mock(ActiveSupport::BufferedLogger, :debug => true, :debug? => true)
303
+ @logger.stub!(:info)
304
+ end
305
+
306
+ it 'should request _each_ verification to configure itself against the deployment context' do
307
+ @pkg.verifications.each do |v|
308
+ v.should_receive(:defaults).with(@deployment).once
309
+ v.stub!(:process)
310
+ end
311
+ end
312
+
313
+ it 'should request _each_ verification to process' do
314
+ @pkg.verifications.each do |v|
315
+ v.stub!(:defaults)
316
+ v.should_receive(:process).with(@roles).once
317
+ end
318
+ end
319
+
320
+ it 'should enter a log info event to notify user whats happening' do
321
+ @pkg.verifications.each do |v|
322
+ v.stub!(:defaults)
323
+ v.stub!(:process)
324
+ end
325
+
326
+ @pkg.should_receive(:logger).once.and_return(@logger)
327
+ end
328
+
329
+ after do
330
+ @pkg.process_verifications(@deployment, @roles)
331
+ end
332
+ end
226
333
 
227
334
  describe 'hierarchies' do
228
335
 
@@ -281,5 +388,35 @@ CODE
281
388
  end
282
389
 
283
390
  end
391
+
392
+ describe 'with verifications' do
393
+ it 'should create a Sprinkle::Verification object for the verify block' do
394
+ Sprinkle::Verify.should_receive(:new).once
395
+
396
+ create_package_with_blank_verify
397
+ end
398
+
399
+ it 'should create multiple Sprinkle::Verification objects for multiple verify blocks' do
400
+ Sprinkle::Verify.should_receive(:new).twice
401
+
402
+ create_package_with_blank_verify(2)
403
+ end
404
+
405
+ it 'should add each Sprinkle::Verificaton object to the @verifications array' do
406
+ @pkg = create_package_with_blank_verify(3)
407
+ @pkg.verifications.length.should eql(3)
408
+ end
409
+
410
+ it 'should initialize Sprinkle::Verification with the package name, description, and block' do
411
+ Sprinkle::Verify.should_receive(:new) do |pkg, desc|
412
+ pkg.name.should eql(@name)
413
+ desc.should eql('stuff happens')
414
+ end
415
+
416
+ # We do a should_not raise_error because if a block was NOT passed, an error
417
+ # is raised. This is specced in verification_spec.rb
418
+ lambda { create_package_with_blank_verify }.should_not raise_error
419
+ end
420
+ end
284
421
 
285
422
  end
@@ -0,0 +1,160 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Sprinkle::Verify do
4
+ before do
5
+ @name = :package
6
+ @package = package @name do
7
+ gem 'nonexistent'
8
+ verify 'moo' do
9
+ # Check a file exists
10
+ has_file 'my_file.txt'
11
+
12
+ # Check a directory exists
13
+ has_directory 'mydir'
14
+
15
+ # Check a symlink exists
16
+ has_symlink 'mypointer'
17
+
18
+ # Check a symlink points to a certain file
19
+ has_symlink 'mypointer', 'myfile'
20
+
21
+ # Check if an executable exists
22
+ has_executable '/usr/bin/ruby'
23
+
24
+ # Check if a global executable exists (in PATH)
25
+ has_executable 'rails'
26
+
27
+ # Check for a process
28
+ has_process 'httpd'
29
+
30
+ # Check that ruby can include files
31
+ ruby_can_load 'a', 'b', 'c'
32
+
33
+ # Check that a gem exists
34
+ has_gem 'rails'
35
+ has_gem 'rails', '2.1.0'
36
+ end
37
+ end
38
+ @verification = @package.verifications[0]
39
+ @delivery = mock(Sprinkle::Deployment, :process => true)
40
+ @verification.delivery = @delivery
41
+ end
42
+
43
+ describe 'when created' do
44
+ it 'should raise error without a block' do
45
+ lambda { Verify.new(nil, '') }.should raise_error
46
+ end
47
+ end
48
+
49
+ describe 'with checks' do
50
+ it 'should do a "test -f" on the has_file check' do
51
+ @verification.commands.should include('test -f my_file.txt')
52
+ end
53
+
54
+ it 'should do a "test -d" on the has_directory check' do
55
+ @verification.commands.should include('test -d mydir')
56
+ end
57
+
58
+ it 'should do a "test -L" to check something is a symbolic link' do
59
+ @verification.commands.should include('test -L mypointer')
60
+ end
61
+
62
+ it 'should do a test equality to check a symlink points to a specific file' do
63
+ @verification.commands.should include("test 'myfile' = `readlink mypointer`")
64
+ end
65
+
66
+ it 'should do a "test -x" to check for an executable' do
67
+ @verification.commands.should include("test -x /usr/bin/ruby")
68
+ end
69
+
70
+ it 'should test the "which" command to look for a global executable' do
71
+ @verification.commands.should include('[ -n "`echo \`which rails\``" ]')
72
+ end
73
+
74
+ it 'should test the process list to find a process' do
75
+ @verification.commands.should include("ps aux | grep 'httpd' | grep -v grep")
76
+ end
77
+
78
+ it 'should check if ruby can include a, b, c' do
79
+ @verification.commands.should include("ruby -e \"require 'rubygems';require 'a';require 'b';require 'c'\"")
80
+ end
81
+
82
+ it 'should check that a ruby gem is installed' do
83
+ @verification.commands.should include("sudo gem list | grep -e '^rails (.*.*)$'")
84
+ @verification.commands.should include("sudo gem list | grep -e '^rails (.*2\\.1\\.0.*)$'")
85
+ end
86
+ end
87
+
88
+ describe 'with configurations' do
89
+ # Make sure it includes Sprinkle::Configurable
90
+ it 'should respond to configurable methods' do
91
+ @verification.should respond_to(:defaults)
92
+ end
93
+
94
+ it 'should default padding option to 4' do
95
+ @verification.padding.should eql(4)
96
+ end
97
+ end
98
+
99
+ describe 'with process' do
100
+ it 'should raise an error when no delivery mechanism is set' do
101
+ @verification.instance_variable_set(:@delivery, nil)
102
+ lambda { @verification.process([]) }.should raise_error
103
+ end
104
+
105
+ describe 'when not testing' do
106
+ before do
107
+ # To be explicit
108
+ Sprinkle::OPTIONS[:testing] = false
109
+ end
110
+
111
+ it 'should call process on the delivery with the correct parameters' do
112
+ @delivery.should_receive(:process).with(@name, @verification.commands, [:app], true).once.and_return(true)
113
+ @verification.process([:app])
114
+ end
115
+
116
+ it 'should raise Sprinkle::VerificationFailed exception when commands fail' do
117
+ @delivery.should_receive(:process).once.and_return(false)
118
+ lambda { @verification.process([:app]) }.should raise_error(Sprinkle::VerificationFailed) do |error|
119
+ error.package.should eql(@package)
120
+ error.description.should eql('moo')
121
+ end
122
+ end
123
+ end
124
+
125
+ describe 'when testing' do
126
+ before do
127
+ Sprinkle::OPTIONS[:testing] = true
128
+ @logger = mock(ActiveSupport::BufferedLogger, :debug => true, :debug? => true)
129
+ end
130
+
131
+ it 'should not call process on the delivery' do
132
+ @delivery.should_not_receive(:process)
133
+ end
134
+
135
+ it 'should print the install sequence to the console' do
136
+ @verification.should_receive(:logger).twice.and_return(@logger)
137
+ end
138
+
139
+ after do
140
+ @verification.process([:app])
141
+ Sprinkle::OPTIONS[:testing] = false
142
+ end
143
+ end
144
+ end
145
+
146
+ describe 'with registering new verification modules' do
147
+ module MyModule
148
+ def rawr; end
149
+ end
150
+
151
+ it 'should not respond to rawr initially' do
152
+ @verification.should_not respond_to(:rawr)
153
+ end
154
+
155
+ it 'should respond to rawr after registering the module' do
156
+ Sprinkle::Verify.register(MyModule)
157
+ @verification.should respond_to(:rawr)
158
+ end
159
+ end
160
+ end
data/sprinkle.gemspec CHANGED
@@ -1,16 +1,16 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{sprinkle}
3
- s.version = "0.1.5"
3
+ s.version = "0.1.6"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
- s.authors = ["Marcus Crafter"]
7
- s.date = %q{2008-07-16}
6
+ s.authors = ["Marcus Crafter", "Mitchell Hashimoto"]
7
+ s.date = %q{2008-07-19}
8
8
  s.default_executable = %q{sprinkle}
9
9
  s.description = %q{Ruby DSL based software provisioning tool}
10
- s.email = ["crafterm@redartisan.com"]
10
+ s.email = ["crafterm@redartisan.com", "mitchell.hashimoto@citrusbyte.com"]
11
11
  s.executables = ["sprinkle"]
12
- s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
13
- s.files = ["CREDITS", "History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "bin/sprinkle", "config/hoe.rb", "config/requirements.rb", "examples/merb/deploy.rb", "examples/rails/README", "examples/rails/deploy.rb", "examples/rails/packages/database.rb", "examples/rails/packages/essential.rb", "examples/rails/packages/rails.rb", "examples/rails/packages/search.rb", "examples/rails/packages/server.rb", "examples/rails/rails.rb", "examples/sprinkle/sprinkle.rb", "lib/sprinkle.rb", "lib/sprinkle/actors/capistrano.rb", "lib/sprinkle/actors/vlad.rb", "lib/sprinkle/deployment.rb", "lib/sprinkle/extensions/arbitrary_options.rb", "lib/sprinkle/extensions/array.rb", "lib/sprinkle/extensions/blank_slate.rb", "lib/sprinkle/extensions/dsl_accessor.rb", "lib/sprinkle/extensions/string.rb", "lib/sprinkle/extensions/symbol.rb", "lib/sprinkle/installers/apt.rb", "lib/sprinkle/installers/gem.rb", "lib/sprinkle/installers/installer.rb", "lib/sprinkle/installers/rake.rb", "lib/sprinkle/installers/rpm.rb", "lib/sprinkle/installers/source.rb", "lib/sprinkle/package.rb", "lib/sprinkle/policy.rb", "lib/sprinkle/script.rb", "lib/sprinkle/version.rb", "script/destroy", "script/generate", "spec/spec.opts", "spec/spec_helper.rb", "spec/sprinkle/actors/capistrano_spec.rb", "spec/sprinkle/deployment_spec.rb", "spec/sprinkle/extensions/array_spec.rb", "spec/sprinkle/extensions/string_spec.rb", "spec/sprinkle/installers/apt_spec.rb", "spec/sprinkle/installers/gem_spec.rb", "spec/sprinkle/installers/installer_spec.rb", "spec/sprinkle/installers/rpm_spec.rb", "spec/sprinkle/installers/source_spec.rb", "spec/sprinkle/package_spec.rb", "spec/sprinkle/policy_spec.rb", "spec/sprinkle/script_spec.rb", "spec/sprinkle/sprinkle_spec.rb", "sprinkle.gemspec", "tasks/deployment.rake", "tasks/environment.rake", "tasks/rspec.rake"]
12
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
13
+ s.files = ["CREDITS", "History.txt", "MIT-LICENSE", "Manifest.txt", "README.txt", "Rakefile", "bin/sprinkle", "config/hoe.rb", "config/requirements.rb", "examples/rails/README", "examples/rails/deploy.rb", "examples/rails/packages/database.rb", "examples/rails/packages/essential.rb", "examples/rails/packages/rails.rb", "examples/rails/packages/search.rb", "examples/rails/packages/server.rb", "examples/rails/rails.rb", "examples/sprinkle/sprinkle.rb", "lib/sprinkle.rb", "lib/sprinkle/actors/actors.rb", "lib/sprinkle/actors/capistrano.rb", "lib/sprinkle/actors/vlad.rb", "lib/sprinkle/configurable.rb", "lib/sprinkle/deployment.rb", "lib/sprinkle/extensions/arbitrary_options.rb", "lib/sprinkle/extensions/array.rb", "lib/sprinkle/extensions/blank_slate.rb", "lib/sprinkle/extensions/dsl_accessor.rb", "lib/sprinkle/extensions/string.rb", "lib/sprinkle/extensions/symbol.rb", "lib/sprinkle/installers/apt.rb", "lib/sprinkle/installers/gem.rb", "lib/sprinkle/installers/installer.rb", "lib/sprinkle/installers/rake.rb", "lib/sprinkle/installers/rpm.rb", "lib/sprinkle/installers/source.rb", "lib/sprinkle/package.rb", "lib/sprinkle/policy.rb", "lib/sprinkle/script.rb", "lib/sprinkle/verifiers/directory.rb", "lib/sprinkle/verifiers/executable.rb", "lib/sprinkle/verifiers/file.rb", "lib/sprinkle/verifiers/process.rb", "lib/sprinkle/verifiers/ruby.rb", "lib/sprinkle/verifiers/symlink.rb", "lib/sprinkle/verify.rb", "lib/sprinkle/version.rb", "script/destroy", "script/generate", "spec/spec.opts", "spec/spec_helper.rb", "spec/sprinkle/actors/capistrano_spec.rb", "spec/sprinkle/configurable_spec.rb", "spec/sprinkle/deployment_spec.rb", "spec/sprinkle/extensions/array_spec.rb", "spec/sprinkle/extensions/string_spec.rb", "spec/sprinkle/installers/apt_spec.rb", "spec/sprinkle/installers/gem_spec.rb", "spec/sprinkle/installers/installer_spec.rb", "spec/sprinkle/installers/rpm_spec.rb", "spec/sprinkle/installers/source_spec.rb", "spec/sprinkle/package_spec.rb", "spec/sprinkle/policy_spec.rb", "spec/sprinkle/script_spec.rb", "spec/sprinkle/sprinkle_spec.rb", "spec/sprinkle/verify_spec.rb", "sprinkle.gemspec", "tasks/deployment.rake", "tasks/environment.rake", "tasks/rspec.rake"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://sprinkle.rubyforge.org}
16
16
  s.rdoc_options = ["--main", "README.txt"]