crafterm-sprinkle 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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: