crafterm-sprinkle 0.1.2 → 0.1.4
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 +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
|