crafterm-sprinkle 0.1.1 → 0.1.2

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/CREDITS CHANGED
@@ -9,3 +9,5 @@ Jim Freeze (http://www.artima.com/rubycs/articles/ruby_as_dslP.html)
9
9
  Matthew Tanase (http://www.slicehost.com)
10
10
  Jared Kuolt (http://www.slicehost.com)
11
11
  Jamis Buck (http://www.capify.org)
12
+ Matt Allen (http://blog.allen.com.au)
13
+ Eric Hodel (http://blog.segment7.net)
data/Manifest.txt CHANGED
@@ -16,8 +16,10 @@ examples/rails/packages/rails.rb
16
16
  examples/rails/packages/search.rb
17
17
  examples/rails/packages/server.rb
18
18
  examples/rails/rails.rb
19
+ examples/sprinkle/sprinkle.rb
19
20
  lib/sprinkle.rb
20
21
  lib/sprinkle/actors/capistrano.rb
22
+ lib/sprinkle/actors/vlad.rb
21
23
  lib/sprinkle/deployment.rb
22
24
  lib/sprinkle/extensions/arbitrary_options.rb
23
25
  lib/sprinkle/extensions/array.rb
@@ -29,6 +31,7 @@ lib/sprinkle/installers/apt.rb
29
31
  lib/sprinkle/installers/gem.rb
30
32
  lib/sprinkle/installers/installer.rb
31
33
  lib/sprinkle/installers/rake.rb
34
+ lib/sprinkle/installers/rpm.rb
32
35
  lib/sprinkle/installers/source.rb
33
36
  lib/sprinkle/package.rb
34
37
  lib/sprinkle/policy.rb
@@ -45,11 +48,13 @@ spec/sprinkle/extensions/string_spec.rb
45
48
  spec/sprinkle/installers/apt_spec.rb
46
49
  spec/sprinkle/installers/gem_spec.rb
47
50
  spec/sprinkle/installers/installer_spec.rb
51
+ spec/sprinkle/installers/rpm_spec.rb
48
52
  spec/sprinkle/installers/source_spec.rb
49
53
  spec/sprinkle/package_spec.rb
50
54
  spec/sprinkle/policy_spec.rb
51
55
  spec/sprinkle/script_spec.rb
52
56
  spec/sprinkle/sprinkle_spec.rb
57
+ sprinkle.gemspec
53
58
  tasks/deployment.rake
54
59
  tasks/environment.rake
55
60
  tasks/rspec.rake
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env sprinkle -s
2
+
3
+ # Example of a simple Sprinkle script to install a single gem on a remote host.
4
+
5
+ # Packages, sprinkle and its dependencies including rubygems and ruby, delivery mechanism
6
+ # uses Vlad
7
+
8
+ package :build_essential do
9
+ description 'Build tools'
10
+ apt 'build-essential'
11
+ end
12
+
13
+ package :ruby do
14
+ description 'Ruby Virtual Machine'
15
+ version '1.8.6'
16
+ source "ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-#{version}-p111.tar.gz" # implicit :style => :gnu
17
+ requires :ruby_dependencies
18
+ end
19
+
20
+ package :ruby_dependencies do
21
+ description 'Ruby Virtual Machine Build Dependencies'
22
+ apt %w( bison zlib1g-dev libssl-dev libreadline5-dev libncurses5-dev file )
23
+ end
24
+
25
+ package :rubygems do
26
+ description 'Ruby Gems Package Management System'
27
+ version '1.0.1'
28
+ source "http://rubyforge.org/frs/download.php/29548/rubygems-#{version}.tgz" do
29
+ custom_install 'ruby setup.rb'
30
+ end
31
+ requires :ruby
32
+ end
33
+
34
+ package :sprinkle do
35
+ description 'Sprinkle Provisioning Tool'
36
+ gem 'sprinkle' do
37
+ source 'http://gems.github.com' # use alternate gem server
38
+ end
39
+ end
40
+
41
+
42
+ # Policy, sprinkle policy requires only the sprinkle gem
43
+
44
+ policy :sprinkle, :roles => :app do
45
+ requires :sprinkle
46
+ end
47
+
48
+
49
+ # Deployment
50
+
51
+ deployment do
52
+
53
+ # mechanism for deployment
54
+ delivery :vlad do
55
+ role :app, 'yourhost.com'
56
+ end
57
+
58
+ end
59
+
60
+ # End of script, given the above information, Spinkle will apply the defined policy on all roles using the
61
+ # deployment settings specified.
data/lib/sprinkle.rb CHANGED
@@ -16,13 +16,10 @@ module Sprinkle
16
16
  OPTIONS = { :testing => false, :verbose => false }
17
17
  end
18
18
 
19
- # Understand packages, policies and deployment DSL
19
+ # Define a logging target and understand packages, policies and deployment DSL
20
20
  class Object
21
21
  include Sprinkle::Package, Sprinkle::Policy, Sprinkle::Deployment
22
- end
23
22
 
24
- # Define a logging target
25
- class Object
26
23
  def logger
27
24
  @@__log__ ||= ActiveSupport::BufferedLogger.new($stdout, ActiveSupport::BufferedLogger::Severity::INFO)
28
25
  end
@@ -0,0 +1,30 @@
1
+ module Sprinkle
2
+ module Actors
3
+ class Vlad
4
+ require 'vlad'
5
+ attr_accessor :loaded_recipes
6
+
7
+ def initialize(&block)
8
+ self.instance_eval &block if block
9
+ end
10
+
11
+ def script(name)
12
+ @loaded_recipes ||= []
13
+ self.load name
14
+ @loaded_recipes << script
15
+ end
16
+
17
+ def process(name, commands, roles)
18
+ commands = commands.join ' && ' if commands.is_a? Array
19
+ t = remote_task(task_sym(name), :roles => roles) { run commands }
20
+ t.invoke
21
+ end
22
+
23
+ private
24
+
25
+ def task_sym(name)
26
+ "install_#{name.to_task_name}".to_sym
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module Sprinkle
2
+ module Installers
3
+ class Rpm < Installer
4
+ attr_accessor :packages
5
+
6
+ def initialize(parent, packages, &block)
7
+ super parent, &block
8
+ packages = [packages] unless packages.is_a? Array
9
+ @packages = packages
10
+ end
11
+
12
+ protected
13
+
14
+ def install_sequence
15
+ "rpm -Uvh #{@packages.join(' ')}"
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -30,6 +30,10 @@ module Sprinkle
30
30
  @installer = Sprinkle::Installers::Apt.new(self, *names)
31
31
  end
32
32
 
33
+ def rpm(*names)
34
+ @installer = Sprinkle::Installers::Rpm.new(self, *names)
35
+ end
36
+
33
37
  def gem(name, options = {}, &block)
34
38
  @dependencies << :rubygems
35
39
  @installer = Sprinkle::Installers::Gem.new(self, name, options, &block)
@@ -2,7 +2,7 @@ module Sprinkle #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Sprinkle::Installers::Rpm do
4
+
5
+ before do
6
+ @package = mock(Sprinkle::Package, :name => 'package')
7
+ end
8
+
9
+ def create_rpm(debs, &block)
10
+ Sprinkle::Installers::Rpm.new(@package, debs, &block)
11
+ end
12
+
13
+ describe 'when created' do
14
+
15
+ it 'should accept a single package to install' do
16
+ @installer = create_rpm 'ruby'
17
+ @installer.packages.should == [ 'ruby' ]
18
+ end
19
+
20
+ it 'should accept an array of packages to install' do
21
+ @installer = create_rpm %w( gcc gdb g++ )
22
+ @installer.packages.should == ['gcc', 'gdb', 'g++']
23
+ end
24
+
25
+ end
26
+
27
+ describe 'during installation' do
28
+
29
+ before do
30
+ @installer = create_rpm 'ruby'
31
+ @install_sequence = @installer.send :install_sequence
32
+ end
33
+
34
+ it 'should invoke the apt installer for all specified packages' do
35
+ @install_sequence.should =~ /rpm -Uvh ruby/
36
+ end
37
+
38
+ it 'should specify a non interactive mode to the apt installer'
39
+ it 'should install a specific version if defined'
40
+
41
+ end
42
+
43
+ end
@@ -3,201 +3,209 @@ require File.dirname(__FILE__) + '/../spec_helper'
3
3
  describe Sprinkle::Package do
4
4
  include Sprinkle::Package
5
5
 
6
- before do
6
+ before do
7
7
  @name = :package_name
8
8
  @empty = Proc.new { }
9
9
  @opts = { }
10
10
  end
11
-
11
+
12
12
  describe Sprinkle::Package, 'when created' do
13
-
14
- it 'should be invalid without a block descriptor' do
13
+
14
+ it 'should be invalid without a block descriptor' do
15
15
  lambda { package @name }.should raise_error
16
16
  end
17
-
17
+
18
18
  it 'should be invalid without a name' do
19
19
  lambda { package nil, &@empty }.should raise_error
20
20
  lambda { package @name, &@empty }.should_not raise_error
21
21
  end
22
-
22
+
23
23
  it 'should optionally accept a description' do
24
24
  pkg = package @name do
25
25
  description 'my package description'
26
26
  end
27
27
  pkg.description.should == 'my package description'
28
28
  end
29
-
29
+
30
30
  it 'should optionally accept a version' do
31
31
  pkg = package @name do
32
32
  version '2.0.2'
33
33
  end
34
34
  pkg.version.should == '2.0.2'
35
35
  end
36
-
37
- it 'should optionally accept an installer' do
36
+
37
+ it 'should optionally accept an installer' do
38
38
  pkg = package @name do
39
39
  gem 'rails'
40
40
  end
41
41
  pkg.installer.should_not be_nil
42
42
  end
43
-
44
- it 'should optionally accept dependencies' do
43
+
44
+ it 'should optionally accept dependencies' do
45
45
  pkg = package @name do
46
46
  requires :webserver, :database
47
47
  end
48
48
  pkg.dependencies.should == [:webserver, :database]
49
49
  end
50
-
51
- it 'should optionally define a virtual package implementation' do
50
+
51
+ it 'should optionally define a virtual package implementation' do
52
52
  pkg = package @name, :provides => :database do; end
53
53
  pkg.provides.should == :database
54
54
  end
55
-
56
- it 'should be able to represent itself as a string' do
55
+
56
+ it 'should be able to represent itself as a string' do
57
57
  pkg = package @name do; end
58
58
  pkg.to_s.should == @name
59
59
  end
60
60
 
61
61
  end
62
62
 
63
- describe Sprinkle::Package, 'helper method' do
64
-
65
- it 'should added new packages to the global package hash' do
63
+ describe Sprinkle::Package, 'helper method' do
64
+
65
+ it 'should added new packages to the global package hash' do
66
66
  pkg = package @name do; end
67
67
  Sprinkle::Package::PACKAGES[@name].should == pkg
68
68
  end
69
-
70
- it 'should add the new package to the provides list if specified' do
69
+
70
+ it 'should add the new package to the provides list if specified' do
71
71
  pkg = package @name, :provides => :database do; end
72
72
  Sprinkle::Package::PACKAGES[:database].last.should == pkg
73
73
  end
74
-
74
+
75
75
  end
76
76
 
77
77
  describe Sprinkle::Package, 'installer configuration' do
78
-
79
- it 'should optionally accept an apt installer' do
78
+
79
+ it 'should optionally accept an apt installer' do
80
80
  pkg = package @name do
81
81
  apt %w( deb1 deb2 )
82
82
  end
83
83
  pkg.should respond_to(:apt)
84
84
  pkg.installer.class.should == Sprinkle::Installers::Apt
85
85
  end
86
-
87
- it 'should optionally accept a gem installer' do
86
+
87
+ it 'should optionally accept an rpm installer' do
88
+ pkg = package @name do
89
+ rpm %w( rpm1 rpm2 )
90
+ end
91
+ pkg.should respond_to(:rpm)
92
+ pkg.installer.class.should == Sprinkle::Installers::Rpm
93
+ end
94
+
95
+ it 'should optionally accept a gem installer' do
88
96
  pkg = package @name do
89
97
  gem 'gem'
90
98
  end
91
99
  pkg.should respond_to(:gem)
92
100
  pkg.installer.class.should == Sprinkle::Installers::Gem
93
101
  end
94
-
95
- it 'should optionally accept a source installer' do
102
+
103
+ it 'should optionally accept a source installer' do
96
104
  pkg = package @name do
97
105
  source 'archive'
98
106
  end
99
107
  pkg.should respond_to(:source)
100
108
  pkg.installer.class.should == Sprinkle::Installers::Source
101
109
  end
102
-
110
+
103
111
  end
104
112
 
105
113
  describe Sprinkle::Package, 'with a source installer' do
106
-
107
- it 'should optionally accept a block containing customisations' do
114
+
115
+ it 'should optionally accept a block containing customisations' do
108
116
  pkg = package @name do
109
117
  source 'archive' do; end
110
118
  end
111
119
  pkg.should respond_to(:source)
112
120
  pkg.installer.class.should == Sprinkle::Installers::Source
113
121
  end
114
-
115
- it 'should automatically add a build essential dependency' do
122
+
123
+ it 'should automatically add a build essential dependency' do
116
124
  pkg = package @name do
117
125
  source 'archive'
118
126
  end
119
127
  pkg.dependencies.should include(:build_essential)
120
128
  end
121
-
129
+
122
130
  end
123
131
 
124
132
  describe Sprinkle::Package, 'with an gem installer' do
125
-
126
- it 'should automatically add a rubygems dependency' do
133
+
134
+ it 'should automatically add a rubygems dependency' do
127
135
  pkg = package @name do
128
136
  gem 'gem'
129
137
  end
130
138
  pkg.dependencies.should include(:rubygems)
131
139
  end
132
-
140
+
133
141
  end
134
142
 
135
143
  describe Sprinkle::Package, 'when processing' do
136
-
137
- before do
144
+
145
+ before do
138
146
  @deployment = mock(Sprinkle::Deployment)
139
147
  @roles = [ :app, :db ]
140
148
  @installer = mock(Sprinkle::Installers::Installer, :defaults => true, :process => true)
141
149
  @package = package @name do; end
142
150
  end
143
-
144
- describe Sprinkle::Package, 'with an installer' do
145
-
146
- before do
151
+
152
+ describe Sprinkle::Package, 'with an installer' do
153
+
154
+ before do
147
155
  @package.installer = @installer
148
156
  end
149
157
 
150
- it 'should configure itself against the deployment context' do
158
+ it 'should configure itself against the deployment context' do
151
159
  @installer.should_receive(:defaults).with(@deployment).and_return
152
160
  end
153
-
154
- it 'should request the installer to process itself' do
161
+
162
+ it 'should request the installer to process itself' do
155
163
  @installer.should_receive(:process).with(@roles).and_return
156
164
  end
157
-
158
- after do
165
+
166
+ after do
159
167
  @package.process(@deployment, @roles)
160
168
  end
161
169
  end
162
-
163
- describe Sprinkle::Package, 'without an installer' do
164
-
165
- it 'should not request the installer to process if the package is a metapackage' do
170
+
171
+ describe Sprinkle::Package, 'without an installer' do
172
+
173
+ it 'should not request the installer to process if the package is a metapackage' do
166
174
  @installer.should_not_receive(:process)
167
175
  @package.process(@deployment, @roles)
168
176
  end
169
-
177
+
170
178
  end
171
-
179
+
172
180
  end
173
181
 
174
182
  describe Sprinkle::Package, 'hierarchies' do
175
-
176
- before do
183
+
184
+ before do
177
185
  @a = package :a do; requires :b; end
178
186
  @b = package :b do; requires :c; end
179
187
  @c = package :c do; end
180
188
  end
181
-
182
- it 'should be able to return a dependency hierarchy tree' do
189
+
190
+ it 'should be able to return a dependency hierarchy tree' do
183
191
  @a.tree.flatten.should == [ @c, @b, @a ]
184
192
  @b.tree.flatten.should == [ @c, @b ]
185
193
  @c.tree.flatten.should == [ @c ]
186
194
  end
187
-
188
- it 'should optionally accept a block to call upon item in the tree during hierarchy traversal' do
195
+
196
+ it 'should optionally accept a block to call upon item in the tree during hierarchy traversal' do
189
197
  @count = 0
190
198
  @a.tree do
191
199
  @count += 1
192
200
  end
193
201
  @count.should == 2
194
202
  end
195
-
196
- it 'should maintain a depth count of how deep the hierarchy is' do
203
+
204
+ it 'should maintain a depth count of how deep the hierarchy is' do
197
205
  @b.should_receive(:tree).with(2).and_return([@b])
198
206
  @a.tree do; end
199
207
  end
200
-
208
+
201
209
  end
202
210
 
203
211
  end
data/sprinkle.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{sprinkle}
3
+ s.version = "0.1.2"
4
+
5
+ s.specification_version = 2 if s.respond_to? :specification_version=
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Marcus Crafter"]
9
+ s.date = %q{2008-06-03}
10
+ s.default_executable = %q{sprinkle}
11
+ s.description = %q{Ruby DSL based software provisioning tool}
12
+ s.email = ["crafterm@redartisan.com"]
13
+ s.executables = ["sprinkle"]
14
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
15
+ s.files = ["CREDITS", "History.txt", "MIT-LICENSE", "Manifest.txt", "README.txt", "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/deploy.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", "thoughts.txt"]
16
+ s.has_rdoc = true
17
+ s.homepage = %q{http://sprinkle.rubyforge.org}
18
+ s.rdoc_options = ["--main", "README.txt"]
19
+ s.require_paths = ["lib"]
20
+ s.rubyforge_project = %q{sprinkle}
21
+ s.rubygems_version = %q{1.1.1}
22
+ s.summary = %q{Ruby DSL based software provisioning tool}
23
+
24
+ s.add_dependency(%q<activesupport>, [">= 2.0.2"])
25
+ s.add_dependency(%q<highline>, [">= 1.4.0"])
26
+ s.add_dependency(%q<capistrano>, [">= 2.2.0"])
27
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crafterm-sprinkle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcus Crafter
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-27 00:00:00 -07:00
12
+ date: 2008-06-03 00:00:00 -07:00
13
13
  default_executable: sprinkle
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -69,8 +69,11 @@ files:
69
69
  - examples/rails/packages/search.rb
70
70
  - examples/rails/packages/server.rb
71
71
  - examples/rails/rails.rb
72
+ - examples/sprinkle/deploy.rb
73
+ - examples/sprinkle/sprinkle.rb
72
74
  - lib/sprinkle.rb
73
75
  - lib/sprinkle/actors/capistrano.rb
76
+ - lib/sprinkle/actors/vlad.rb
74
77
  - lib/sprinkle/deployment.rb
75
78
  - lib/sprinkle/extensions/arbitrary_options.rb
76
79
  - lib/sprinkle/extensions/array.rb
@@ -82,6 +85,7 @@ files:
82
85
  - lib/sprinkle/installers/gem.rb
83
86
  - lib/sprinkle/installers/installer.rb
84
87
  - lib/sprinkle/installers/rake.rb
88
+ - lib/sprinkle/installers/rpm.rb
85
89
  - lib/sprinkle/installers/source.rb
86
90
  - lib/sprinkle/package.rb
87
91
  - lib/sprinkle/policy.rb
@@ -98,14 +102,17 @@ files:
98
102
  - spec/sprinkle/installers/apt_spec.rb
99
103
  - spec/sprinkle/installers/gem_spec.rb
100
104
  - spec/sprinkle/installers/installer_spec.rb
105
+ - spec/sprinkle/installers/rpm_spec.rb
101
106
  - spec/sprinkle/installers/source_spec.rb
102
107
  - spec/sprinkle/package_spec.rb
103
108
  - spec/sprinkle/policy_spec.rb
104
109
  - spec/sprinkle/script_spec.rb
105
110
  - spec/sprinkle/sprinkle_spec.rb
111
+ - sprinkle.gemspec
106
112
  - tasks/deployment.rake
107
113
  - tasks/environment.rake
108
114
  - tasks/rspec.rake
115
+ - thoughts.txt
109
116
  has_rdoc: true
110
117
  homepage: http://sprinkle.rubyforge.org
111
118
  post_install_message: