crafterm-sprinkle 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +2 -1
- data/examples/rails/packages/rails.rb +3 -3
- data/examples/rails/packages/server.rb +2 -2
- data/examples/rails/rails.rb +1 -1
- data/examples/sprinkle/sprinkle.rb +11 -34
- data/lib/sprinkle/installers/apt.rb +1 -1
- data/lib/sprinkle/installers/gem.rb +3 -1
- data/lib/sprinkle/installers/installer.rb +39 -1
- data/lib/sprinkle/installers/rake.rb +2 -1
- data/lib/sprinkle/installers/rpm.rb +3 -3
- data/lib/sprinkle/installers/source.rb +4 -21
- data/lib/sprinkle/package.rb +17 -3
- data/lib/sprinkle/version.rb +1 -1
- data/spec/sprinkle/installers/apt_spec.rb +11 -4
- data/spec/sprinkle/installers/gem_spec.rb +17 -6
- data/spec/sprinkle/installers/installer_spec.rb +1 -1
- data/spec/sprinkle/installers/rpm_spec.rb +11 -4
- data/spec/sprinkle/package_spec.rb +54 -18
- data/sprinkle.gemspec +25 -9
- metadata +12 -5
data/CREDITS
CHANGED
@@ -10,4 +10,5 @@ Matthew Tanase (http://www.slicehost.com)
|
|
10
10
|
Jared Kuolt (http://www.slicehost.com)
|
11
11
|
Jamis Buck (http://www.capify.org)
|
12
12
|
Matt Allen (http://blog.allen.com.au)
|
13
|
-
Eric Hodel (http://blog.segment7.net)
|
13
|
+
Eric Hodel (http://blog.segment7.net)
|
14
|
+
Pete Yandell (http://notahat.com)
|
@@ -14,8 +14,8 @@ end
|
|
14
14
|
|
15
15
|
package :rubygems do
|
16
16
|
description 'Ruby Gems Package Management System'
|
17
|
-
version '1.0
|
18
|
-
source "http://rubyforge.org/frs/download.php/
|
17
|
+
version '1.2.0'
|
18
|
+
source "http://rubyforge.org/frs/download.php/38646/rubygems-#{version}.tgz" do
|
19
19
|
custom_install 'ruby setup.rb'
|
20
20
|
end
|
21
21
|
requires :ruby
|
@@ -24,5 +24,5 @@ end
|
|
24
24
|
package :rails do
|
25
25
|
description 'Ruby on Rails'
|
26
26
|
gem 'rails'
|
27
|
-
version '2.0
|
27
|
+
version '2.1.0'
|
28
28
|
end
|
@@ -13,8 +13,8 @@ end
|
|
13
13
|
|
14
14
|
package :apache, :provides => :webserver do
|
15
15
|
description 'Apache 2 HTTP Server'
|
16
|
-
version '2.2.
|
17
|
-
source "http://apache.
|
16
|
+
version '2.2.9'
|
17
|
+
source "http://www.apache.org/dist/httpd/httpd-#{version}.tar.bz2" do
|
18
18
|
enable %w( mods-shared=all proxy proxy-balancer proxy-http rewrite cache headers ssl deflate so )
|
19
19
|
prefix "/opt/local/apache2-#{version}"
|
20
20
|
post :install, 'install -m 755 support/apachectl /etc/init.d/apache2', 'update-rc.d -f apache2 defaults'
|
data/examples/rails/rails.rb
CHANGED
@@ -34,7 +34,7 @@ require 'packages/search'
|
|
34
34
|
# the user is requested to select which one to use.
|
35
35
|
|
36
36
|
policy :rails, :roles => :app do
|
37
|
-
requires :rails, :version => '2.0
|
37
|
+
requires :rails, :version => '2.1.0'
|
38
38
|
requires :appserver
|
39
39
|
requires :database
|
40
40
|
requires :webserver
|
@@ -1,56 +1,33 @@
|
|
1
|
-
#!/usr/bin/env sprinkle -s
|
1
|
+
#!/usr/bin/env sprinkle -c -s
|
2
2
|
|
3
|
-
# Example of
|
3
|
+
# Example of the simplest Sprinkle script to install a single gem on a remote host. This
|
4
|
+
# particular script assumes that rubygems (and ruby, etc) are already installed on the remote
|
5
|
+
# host. To see a larger example of installing an entire ruby, rubygems, gem stack from source,
|
6
|
+
# please see the rails example.
|
4
7
|
|
5
|
-
# Packages, sprinkle
|
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
|
8
|
+
# Packages, only sprinkle is defined in this world
|
33
9
|
|
34
10
|
package :sprinkle do
|
35
11
|
description 'Sprinkle Provisioning Tool'
|
36
|
-
gem 'sprinkle' do
|
12
|
+
gem 'crafterm-sprinkle' do
|
37
13
|
source 'http://gems.github.com' # use alternate gem server
|
14
|
+
#repository '/opt/local/gems' # specify an alternate local gem repository
|
38
15
|
end
|
39
16
|
end
|
40
17
|
|
41
18
|
|
42
|
-
#
|
19
|
+
# Policies, sprinkle policy requires only the sprinkle gem
|
43
20
|
|
44
21
|
policy :sprinkle, :roles => :app do
|
45
22
|
requires :sprinkle
|
46
23
|
end
|
47
24
|
|
48
25
|
|
49
|
-
# Deployment
|
26
|
+
# Deployment settings
|
50
27
|
|
51
28
|
deployment do
|
52
29
|
|
53
|
-
#
|
30
|
+
# use vlad for deployment
|
54
31
|
delivery :vlad do
|
55
32
|
role :app, 'yourhost.com'
|
56
33
|
end
|
@@ -20,12 +20,14 @@ module Sprinkle
|
|
20
20
|
|
21
21
|
# rubygems 0.9.5+ installs dependencies by default, and does platform selection
|
22
22
|
|
23
|
-
def
|
23
|
+
def install_commands
|
24
24
|
cmd = "gem install #{gem}"
|
25
25
|
cmd << " --version '#{version}'" if version
|
26
26
|
cmd << " --source #{source}" if source
|
27
|
+
cmd << " --install-dir #{repository}" if repository
|
27
28
|
cmd
|
28
29
|
end
|
30
|
+
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
@@ -1,14 +1,25 @@
|
|
1
1
|
module Sprinkle
|
2
2
|
module Installers
|
3
3
|
class Installer
|
4
|
-
attr_accessor :delivery, :package, :options
|
4
|
+
attr_accessor :delivery, :package, :options, :pre, :post
|
5
5
|
|
6
6
|
def initialize(package, options = {}, &block)
|
7
7
|
@package = package
|
8
8
|
@options = options
|
9
|
+
@pre = {}; @post = {}
|
9
10
|
self.instance_eval(&block) if block
|
10
11
|
end
|
11
12
|
|
13
|
+
def pre(stage, *commands)
|
14
|
+
@pre[stage] ||= []
|
15
|
+
@pre[stage] += commands
|
16
|
+
end
|
17
|
+
|
18
|
+
def post(stage, *commands)
|
19
|
+
@post[stage] ||= []
|
20
|
+
@post[stage] += commands
|
21
|
+
end
|
22
|
+
|
12
23
|
def defaults(deployment)
|
13
24
|
defaults = deployment.defaults[self.class.name.split(/::/).last.downcase.to_sym]
|
14
25
|
self.instance_eval(&defaults) if defaults
|
@@ -39,9 +50,36 @@ module Sprinkle
|
|
39
50
|
|
40
51
|
protected
|
41
52
|
|
53
|
+
# Installation is separated into two styles that concrete derivative installer classes
|
54
|
+
# can implement.
|
55
|
+
#
|
56
|
+
# Simple installers that issue a single or set of commands can overwride
|
57
|
+
# install_commands (eg. apt, gem, rpm). Pre/post install commands are included in this
|
58
|
+
# style for free.
|
59
|
+
#
|
60
|
+
# More complicated installers that have different stages, and require pre/post commands
|
61
|
+
# within stages can override install_sequence and take complete control of the install
|
62
|
+
# command sequence construction (eg. source based installer).
|
63
|
+
|
42
64
|
def install_sequence
|
65
|
+
commands = pre_commands(:install) + [ install_commands ] + post_commands(:install)
|
66
|
+
commands.flatten
|
67
|
+
end
|
68
|
+
|
69
|
+
def install_commands
|
43
70
|
raise 'Concrete installers implement this to specify commands to run to install their respective packages'
|
44
71
|
end
|
72
|
+
|
73
|
+
def pre_commands(stage)
|
74
|
+
dress @pre[stage] || [], :pre
|
75
|
+
end
|
76
|
+
|
77
|
+
def post_commands(stage)
|
78
|
+
dress @post[stage] || [], :post
|
79
|
+
end
|
80
|
+
|
81
|
+
def dress(commands, stage); commands; end
|
82
|
+
|
45
83
|
end
|
46
84
|
end
|
47
85
|
end
|
@@ -1,24 +1,13 @@
|
|
1
1
|
module Sprinkle
|
2
2
|
module Installers
|
3
3
|
class Source < Installer
|
4
|
-
attr_accessor :source
|
4
|
+
attr_accessor :source
|
5
5
|
|
6
6
|
def initialize(parent, source, options = {}, &block)
|
7
|
-
@pre = {}; @post = {}
|
8
7
|
@source = source
|
9
8
|
super parent, options, &block
|
10
9
|
end
|
11
10
|
|
12
|
-
def pre(stage, *commands)
|
13
|
-
@pre[stage] ||= []
|
14
|
-
@pre[stage] += commands
|
15
|
-
end
|
16
|
-
|
17
|
-
def post(stage, *commands)
|
18
|
-
@post[stage] ||= []
|
19
|
-
@post[stage] += commands
|
20
|
-
end
|
21
|
-
|
22
11
|
protected
|
23
12
|
|
24
13
|
def install_sequence
|
@@ -83,20 +72,14 @@ module Sprinkle
|
|
83
72
|
dress @options[:custom_install], :install
|
84
73
|
end
|
85
74
|
|
86
|
-
|
87
|
-
|
88
|
-
def pre_commands(stage)
|
89
|
-
dress @pre[stage] || [], :pre
|
90
|
-
end
|
91
|
-
|
92
|
-
def post_commands(stage)
|
93
|
-
dress @post[stage] || [], :post
|
94
|
-
end
|
75
|
+
protected
|
95
76
|
|
96
77
|
def dress(commands, stage)
|
97
78
|
commands.collect { |command| "bash -c 'cd #{build_dir} && #{command} >> #{@package.name}-#{stage}.log 2>&1'" }
|
98
79
|
end
|
99
80
|
|
81
|
+
private
|
82
|
+
|
100
83
|
def create_options(key, prefix)
|
101
84
|
@options[key].inject(' ') { |m, option| m << "#{prefix}-#{option} "; m }
|
102
85
|
end
|
data/lib/sprinkle/package.rb
CHANGED
@@ -15,7 +15,7 @@ module Sprinkle
|
|
15
15
|
|
16
16
|
class Package
|
17
17
|
include ArbitraryOptions
|
18
|
-
attr_accessor :name, :provides, :installer, :dependencies
|
18
|
+
attr_accessor :name, :provides, :installer, :dependencies, :recommends
|
19
19
|
|
20
20
|
def initialize(name, metadata = {}, &block)
|
21
21
|
raise 'No package name supplied' unless name
|
@@ -23,6 +23,7 @@ module Sprinkle
|
|
23
23
|
@name = name
|
24
24
|
@provides = metadata[:provides]
|
25
25
|
@dependencies = []
|
26
|
+
@recommends = []
|
26
27
|
self.instance_eval &block
|
27
28
|
end
|
28
29
|
|
@@ -35,12 +36,12 @@ module Sprinkle
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def gem(name, options = {}, &block)
|
38
|
-
@
|
39
|
+
@recommends << :rubygems
|
39
40
|
@installer = Sprinkle::Installers::Gem.new(self, name, options, &block)
|
40
41
|
end
|
41
42
|
|
42
43
|
def source(source, options = {}, &block)
|
43
|
-
@
|
44
|
+
@recommends << :build_essential # Ubuntu/Debian
|
44
45
|
@installer = Sprinkle::Installers::Source.new(self, source, options, &block)
|
45
46
|
end
|
46
47
|
|
@@ -56,11 +57,24 @@ module Sprinkle
|
|
56
57
|
@dependencies.flatten!
|
57
58
|
end
|
58
59
|
|
60
|
+
def recommends(*packages)
|
61
|
+
@recommends << packages
|
62
|
+
@recommends.flatten!
|
63
|
+
end
|
64
|
+
|
59
65
|
def tree(depth = 1, &block)
|
60
66
|
packages = []
|
61
67
|
|
68
|
+
@recommends.each do |dep|
|
69
|
+
package = PACKAGES[dep]
|
70
|
+
next unless package # skip missing recommended packages as they can be optional
|
71
|
+
block.call(self, package, depth) if block
|
72
|
+
packages << package.tree(depth + 1, &block)
|
73
|
+
end
|
74
|
+
|
62
75
|
@dependencies.each do |dep|
|
63
76
|
package = PACKAGES[dep]
|
77
|
+
raise "Package definition not found for key: #{dep}" unless package
|
64
78
|
block.call(self, package, depth) if block
|
65
79
|
packages << package.tree(depth + 1, &block)
|
66
80
|
end
|
data/lib/sprinkle/version.rb
CHANGED
@@ -27,16 +27,23 @@ describe Sprinkle::Installers::Apt do
|
|
27
27
|
describe 'during installation' do
|
28
28
|
|
29
29
|
before do
|
30
|
-
@installer = create_apt 'ruby'
|
31
|
-
|
30
|
+
@installer = create_apt 'ruby' do
|
31
|
+
pre :install, 'op1'
|
32
|
+
post :install, 'op2'
|
33
|
+
end
|
34
|
+
@install_commands = @installer.send :install_commands
|
32
35
|
end
|
33
36
|
|
34
37
|
it 'should invoke the apt installer for all specified packages' do
|
35
|
-
@
|
38
|
+
@install_commands.should =~ /apt-get -qyu install ruby/
|
36
39
|
end
|
37
40
|
|
38
41
|
it 'should specify a non interactive mode to the apt installer' do
|
39
|
-
@
|
42
|
+
@install_commands.should =~ /DEBIAN_FRONTEND=noninteractive/
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should automatically insert pre/post commands for the specified package' do
|
46
|
+
@installer.send(:install_sequence).should == [ 'op1', %(DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get -qyu install ruby), 'op2' ]
|
40
47
|
end
|
41
48
|
|
42
49
|
it 'should install a specific version if defined'
|
@@ -5,11 +5,11 @@ describe Sprinkle::Installers::Gem do
|
|
5
5
|
before do
|
6
6
|
@gem = 'rails'
|
7
7
|
@version = '2.0.2'
|
8
|
-
@options = { :source => 'http://gems.github.com/' }
|
8
|
+
@options = { :source => 'http://gems.github.com/', :repository => '/tmp/gems' }
|
9
9
|
end
|
10
10
|
|
11
11
|
def create_gem(gem, version = nil, options = {}, &block)
|
12
|
-
@package = mock(Sprinkle::Package, :name => gem, :version => version, :source => nil)
|
12
|
+
@package = mock(Sprinkle::Package, :name => gem, :version => version, :source => nil, :repository => nil)
|
13
13
|
Sprinkle::Installers::Gem.new(@package, gem, options, &block)
|
14
14
|
end
|
15
15
|
|
@@ -31,6 +31,10 @@ describe Sprinkle::Installers::Gem do
|
|
31
31
|
@installer.source.should == 'http://gems.github.com/'
|
32
32
|
end
|
33
33
|
|
34
|
+
it 'should optionally store the repository location where gems are to be installed' do
|
35
|
+
@installer.repository.should == @options[:repository]
|
36
|
+
end
|
37
|
+
|
34
38
|
end
|
35
39
|
|
36
40
|
describe 'during installation' do
|
@@ -38,11 +42,18 @@ describe Sprinkle::Installers::Gem do
|
|
38
42
|
describe 'without a version' do
|
39
43
|
|
40
44
|
before do
|
41
|
-
@installer = create_gem @gem
|
45
|
+
@installer = create_gem @gem do
|
46
|
+
pre :install, 'op1'
|
47
|
+
post :install, 'op2'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should invoke the gem installer for the specified package' do
|
52
|
+
@installer.send(:install_commands).should == "gem install #{@gem}"
|
42
53
|
end
|
43
54
|
|
44
|
-
it 'should
|
45
|
-
@installer.send(:install_sequence).should == "gem install #{@gem}"
|
55
|
+
it 'should automatically insert pre/post commands for the specified package' do
|
56
|
+
@installer.send(:install_sequence).should == [ 'op1', "gem install #{@gem}", 'op2' ]
|
46
57
|
end
|
47
58
|
|
48
59
|
end
|
@@ -54,7 +65,7 @@ describe Sprinkle::Installers::Gem do
|
|
54
65
|
end
|
55
66
|
|
56
67
|
it 'should install a specific version if defined' do
|
57
|
-
@installer.send(:
|
68
|
+
@installer.send(:install_commands).should == "gem install #{@gem} --version '#{@version}'"
|
58
69
|
end
|
59
70
|
|
60
71
|
end
|
@@ -86,7 +86,7 @@ describe Sprinkle::Installers::Installer do
|
|
86
86
|
|
87
87
|
end
|
88
88
|
|
89
|
-
describe
|
89
|
+
describe 'during installation' do
|
90
90
|
|
91
91
|
it 'should request the install sequence from the concrete class' do
|
92
92
|
@installer.should_receive(:install_sequence).and_return(@sequence)
|
@@ -27,12 +27,19 @@ describe Sprinkle::Installers::Rpm do
|
|
27
27
|
describe 'during installation' do
|
28
28
|
|
29
29
|
before do
|
30
|
-
@installer = create_rpm 'ruby'
|
31
|
-
|
30
|
+
@installer = create_rpm 'ruby' do
|
31
|
+
pre :install, 'op1'
|
32
|
+
post :install, 'op2'
|
33
|
+
end
|
34
|
+
@install_commands = @installer.send :install_commands
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should invoke the rpm installer for all specified packages' do
|
38
|
+
@install_commands.should =~ /rpm -Uvh ruby/
|
32
39
|
end
|
33
40
|
|
34
|
-
it 'should
|
35
|
-
@install_sequence.should
|
41
|
+
it 'should automatically insert pre/post commands for the specified package' do
|
42
|
+
@installer.send(:install_sequence).should == [ 'op1', 'rpm -Uvh ruby', 'op2' ]
|
36
43
|
end
|
37
44
|
|
38
45
|
it 'should specify a non interactive mode to the apt installer'
|
@@ -9,7 +9,7 @@ describe Sprinkle::Package do
|
|
9
9
|
@opts = { }
|
10
10
|
end
|
11
11
|
|
12
|
-
describe
|
12
|
+
describe 'when created' do
|
13
13
|
|
14
14
|
it 'should be invalid without a block descriptor' do
|
15
15
|
lambda { package @name }.should raise_error
|
@@ -48,6 +48,13 @@ describe Sprinkle::Package do
|
|
48
48
|
pkg.dependencies.should == [:webserver, :database]
|
49
49
|
end
|
50
50
|
|
51
|
+
it 'should optionally accept recommended dependencies' do
|
52
|
+
pkg = package @name do
|
53
|
+
recommends :webserver, :database
|
54
|
+
end
|
55
|
+
pkg.recommends.should == [:webserver, :database]
|
56
|
+
end
|
57
|
+
|
51
58
|
it 'should optionally define a virtual package implementation' do
|
52
59
|
pkg = package @name, :provides => :database do; end
|
53
60
|
pkg.provides.should == :database
|
@@ -60,7 +67,7 @@ describe Sprinkle::Package do
|
|
60
67
|
|
61
68
|
end
|
62
69
|
|
63
|
-
describe
|
70
|
+
describe 'helper method' do
|
64
71
|
|
65
72
|
it 'should added new packages to the global package hash' do
|
66
73
|
pkg = package @name do; end
|
@@ -74,7 +81,7 @@ describe Sprinkle::Package do
|
|
74
81
|
|
75
82
|
end
|
76
83
|
|
77
|
-
describe
|
84
|
+
describe 'installer configuration' do
|
78
85
|
|
79
86
|
it 'should optionally accept an apt installer' do
|
80
87
|
pkg = package @name do
|
@@ -110,7 +117,7 @@ describe Sprinkle::Package do
|
|
110
117
|
|
111
118
|
end
|
112
119
|
|
113
|
-
describe
|
120
|
+
describe 'with a source installer' do
|
114
121
|
|
115
122
|
it 'should optionally accept a block containing customisations' do
|
116
123
|
pkg = package @name do
|
@@ -120,27 +127,27 @@ describe Sprinkle::Package do
|
|
120
127
|
pkg.installer.class.should == Sprinkle::Installers::Source
|
121
128
|
end
|
122
129
|
|
123
|
-
it 'should automatically add a build essential
|
130
|
+
it 'should automatically add a build essential recommendation' do
|
124
131
|
pkg = package @name do
|
125
132
|
source 'archive'
|
126
133
|
end
|
127
|
-
pkg.
|
134
|
+
pkg.recommends.should include(:build_essential)
|
128
135
|
end
|
129
136
|
|
130
137
|
end
|
131
138
|
|
132
|
-
describe
|
139
|
+
describe 'with an gem installer' do
|
133
140
|
|
134
|
-
it 'should automatically add a rubygems
|
141
|
+
it 'should automatically add a rubygems recommendation' do
|
135
142
|
pkg = package @name do
|
136
143
|
gem 'gem'
|
137
144
|
end
|
138
|
-
pkg.
|
145
|
+
pkg.recommends.should include(:rubygems)
|
139
146
|
end
|
140
147
|
|
141
148
|
end
|
142
149
|
|
143
|
-
describe
|
150
|
+
describe 'when processing' do
|
144
151
|
|
145
152
|
before do
|
146
153
|
@deployment = mock(Sprinkle::Deployment)
|
@@ -149,7 +156,7 @@ describe Sprinkle::Package do
|
|
149
156
|
@package = package @name do; end
|
150
157
|
end
|
151
158
|
|
152
|
-
describe
|
159
|
+
describe 'with an installer' do
|
153
160
|
|
154
161
|
before do
|
155
162
|
@package.installer = @installer
|
@@ -168,7 +175,7 @@ describe Sprinkle::Package do
|
|
168
175
|
end
|
169
176
|
end
|
170
177
|
|
171
|
-
describe
|
178
|
+
describe 'without an installer' do
|
172
179
|
|
173
180
|
it 'should not request the installer to process if the package is a metapackage' do
|
174
181
|
@installer.should_not_receive(:process)
|
@@ -179,18 +186,32 @@ describe Sprinkle::Package do
|
|
179
186
|
|
180
187
|
end
|
181
188
|
|
182
|
-
describe
|
189
|
+
describe 'hierarchies' do
|
183
190
|
|
184
191
|
before do
|
185
192
|
@a = package :a do; requires :b; end
|
186
193
|
@b = package :b do; requires :c; end
|
187
|
-
@c = package :c do; end
|
194
|
+
@c = package :c do; recommends :d; end
|
195
|
+
@d = package :d do; end
|
188
196
|
end
|
189
197
|
|
190
198
|
it 'should be able to return a dependency hierarchy tree' do
|
191
|
-
@a.tree.flatten.should == [ @c, @b, @a ]
|
192
|
-
@b.tree.flatten.should == [ @c, @b ]
|
193
|
-
@c.tree.flatten.should == [ @c ]
|
199
|
+
@a.tree.flatten.should == [ @d, @c, @b, @a ]
|
200
|
+
@b.tree.flatten.should == [ @d, @c, @b ]
|
201
|
+
@c.tree.flatten.should == [ @d, @c ]
|
202
|
+
@d.tree.flatten.should == [ @d ]
|
203
|
+
end
|
204
|
+
|
205
|
+
describe 'with missing recommendations' do
|
206
|
+
|
207
|
+
before do
|
208
|
+
@d.recommends :e
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'should ignore missing recommendations' do
|
212
|
+
@d.tree.flatten.should == [ @d ]
|
213
|
+
end
|
214
|
+
|
194
215
|
end
|
195
216
|
|
196
217
|
it 'should optionally accept a block to call upon item in the tree during hierarchy traversal' do
|
@@ -198,7 +219,7 @@ describe Sprinkle::Package do
|
|
198
219
|
@a.tree do
|
199
220
|
@count += 1
|
200
221
|
end
|
201
|
-
@count.should ==
|
222
|
+
@count.should == 3
|
202
223
|
end
|
203
224
|
|
204
225
|
it 'should maintain a depth count of how deep the hierarchy is' do
|
@@ -208,4 +229,19 @@ describe Sprinkle::Package do
|
|
208
229
|
|
209
230
|
end
|
210
231
|
|
232
|
+
describe 'with missing dependencies' do
|
233
|
+
|
234
|
+
before do
|
235
|
+
@pkg = package @name do
|
236
|
+
gem 'gem'
|
237
|
+
requires :missing
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'should raise an error if a package is missing' do
|
242
|
+
lambda { @pkg.tree }.should raise_error
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
|
211
247
|
end
|
data/sprinkle.gemspec
CHANGED
@@ -1,27 +1,43 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{sprinkle}
|
3
|
-
s.version = "0.1.
|
4
|
-
|
5
|
-
s.specification_version = 2 if s.respond_to? :specification_version=
|
3
|
+
s.version = "0.1.4"
|
6
4
|
|
7
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
6
|
s.authors = ["Marcus Crafter"]
|
9
|
-
s.date = %q{2008-
|
7
|
+
s.date = %q{2008-07-13}
|
10
8
|
s.default_executable = %q{sprinkle}
|
11
9
|
s.description = %q{Ruby DSL based software provisioning tool}
|
12
10
|
s.email = ["crafterm@redartisan.com"]
|
13
11
|
s.executables = ["sprinkle"]
|
14
12
|
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/
|
13
|
+
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/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"]
|
16
14
|
s.has_rdoc = true
|
17
15
|
s.homepage = %q{http://sprinkle.rubyforge.org}
|
18
16
|
s.rdoc_options = ["--main", "README.txt"]
|
19
17
|
s.require_paths = ["lib"]
|
20
18
|
s.rubyforge_project = %q{sprinkle}
|
21
|
-
s.rubygems_version = %q{1.
|
19
|
+
s.rubygems_version = %q{1.2.0}
|
22
20
|
s.summary = %q{Ruby DSL based software provisioning tool}
|
23
21
|
|
24
|
-
s.
|
25
|
-
|
26
|
-
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
25
|
+
|
26
|
+
if current_version >= 3 then
|
27
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
|
28
|
+
s.add_runtime_dependency(%q<highline>, [">= 1.4.0"])
|
29
|
+
s.add_runtime_dependency(%q<capistrano>, [">= 2.2.0"])
|
30
|
+
s.add_development_dependency(%q<hoe>, [">= 1.7.0"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
33
|
+
s.add_dependency(%q<highline>, [">= 1.4.0"])
|
34
|
+
s.add_dependency(%q<capistrano>, [">= 2.2.0"])
|
35
|
+
s.add_dependency(%q<hoe>, [">= 1.7.0"])
|
36
|
+
end
|
37
|
+
else
|
38
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
39
|
+
s.add_dependency(%q<highline>, [">= 1.4.0"])
|
40
|
+
s.add_dependency(%q<capistrano>, [">= 2.2.0"])
|
41
|
+
s.add_dependency(%q<hoe>, [">= 1.7.0"])
|
42
|
+
end
|
27
43
|
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.
|
4
|
+
version: 0.1.4
|
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-
|
12
|
+
date: 2008-07-13 00:00:00 -07:00
|
13
13
|
default_executable: sprinkle
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -39,6 +39,15 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.2.0
|
41
41
|
version:
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: hoe
|
44
|
+
version_requirement:
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.7.0
|
50
|
+
version:
|
42
51
|
description: Ruby DSL based software provisioning tool
|
43
52
|
email:
|
44
53
|
- crafterm@redartisan.com
|
@@ -69,7 +78,6 @@ files:
|
|
69
78
|
- examples/rails/packages/search.rb
|
70
79
|
- examples/rails/packages/server.rb
|
71
80
|
- examples/rails/rails.rb
|
72
|
-
- examples/sprinkle/deploy.rb
|
73
81
|
- examples/sprinkle/sprinkle.rb
|
74
82
|
- lib/sprinkle.rb
|
75
83
|
- lib/sprinkle/actors/capistrano.rb
|
@@ -112,7 +120,6 @@ files:
|
|
112
120
|
- tasks/deployment.rake
|
113
121
|
- tasks/environment.rake
|
114
122
|
- tasks/rspec.rake
|
115
|
-
- thoughts.txt
|
116
123
|
has_rdoc: true
|
117
124
|
homepage: http://sprinkle.rubyforge.org
|
118
125
|
post_install_message:
|
@@ -136,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
143
|
requirements: []
|
137
144
|
|
138
145
|
rubyforge_project: sprinkle
|
139
|
-
rubygems_version: 1.0
|
146
|
+
rubygems_version: 1.2.0
|
140
147
|
signing_key:
|
141
148
|
specification_version: 2
|
142
149
|
summary: Ruby DSL based software provisioning tool
|