auser-sprinkle 0.1.5 → 0.1.6
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/Manifest.txt +4 -2
- data/{README.rdoc → README.txt} +0 -0
- data/config/hoe.rb +2 -2
- data/lib/sprinkle.rb +5 -1
- data/lib/sprinkle/actors/actors.rb +17 -0
- data/lib/sprinkle/actors/capistrano.rb +31 -3
- data/lib/sprinkle/actors/vlad.rb +29 -3
- data/lib/sprinkle/configurable.rb +4 -1
- data/lib/sprinkle/deployment.rb +46 -6
- data/lib/sprinkle/extensions/arbitrary_options.rb +1 -1
- data/lib/sprinkle/extensions/array.rb +1 -3
- data/lib/sprinkle/extensions/blank_slate.rb +1 -1
- data/lib/sprinkle/extensions/dsl_accessor.rb +1 -1
- data/lib/sprinkle/extensions/string.rb +1 -1
- data/lib/sprinkle/extensions/symbol.rb +1 -1
- data/lib/sprinkle/installers/apt.rb +29 -3
- data/lib/sprinkle/installers/gem.rb +32 -4
- data/lib/sprinkle/installers/installer.rb +60 -14
- data/lib/sprinkle/installers/rake.rb +15 -2
- data/lib/sprinkle/installers/rpm.rb +20 -3
- data/lib/sprinkle/installers/source.rb +74 -16
- data/lib/sprinkle/package.rb +93 -1
- data/lib/sprinkle/policy.rb +42 -2
- data/lib/sprinkle/script.rb +11 -1
- data/lib/sprinkle/verifiers/directory.rb +5 -0
- data/lib/sprinkle/verifiers/executable.rb +20 -1
- data/lib/sprinkle/verifiers/file.rb +9 -0
- data/lib/sprinkle/verifiers/process.rb +21 -0
- data/lib/sprinkle/verifiers/ruby.rb +19 -0
- data/lib/sprinkle/verifiers/symlink.rb +15 -0
- data/lib/sprinkle/verify.rb +63 -4
- data/lib/sprinkle/version.rb +1 -1
- data/spec/sprinkle/verify_spec.rb +15 -1
- data/sprinkle.gemspec +6 -6
- metadata +9 -4
- data/examples/merb/deploy.rb +0 -5
data/Manifest.txt
CHANGED
@@ -2,12 +2,11 @@ CREDITS
|
|
2
2
|
History.txt
|
3
3
|
MIT-LICENSE
|
4
4
|
Manifest.txt
|
5
|
-
README.
|
5
|
+
README.txt
|
6
6
|
Rakefile
|
7
7
|
bin/sprinkle
|
8
8
|
config/hoe.rb
|
9
9
|
config/requirements.rb
|
10
|
-
examples/merb/deploy.rb
|
11
10
|
examples/rails/README
|
12
11
|
examples/rails/deploy.rb
|
13
12
|
examples/rails/packages/database.rb
|
@@ -18,6 +17,7 @@ examples/rails/packages/server.rb
|
|
18
17
|
examples/rails/rails.rb
|
19
18
|
examples/sprinkle/sprinkle.rb
|
20
19
|
lib/sprinkle.rb
|
20
|
+
lib/sprinkle/actors/actors.rb
|
21
21
|
lib/sprinkle/actors/capistrano.rb
|
22
22
|
lib/sprinkle/actors/vlad.rb
|
23
23
|
lib/sprinkle/configurable.rb
|
@@ -40,6 +40,8 @@ lib/sprinkle/script.rb
|
|
40
40
|
lib/sprinkle/verifiers/directory.rb
|
41
41
|
lib/sprinkle/verifiers/executable.rb
|
42
42
|
lib/sprinkle/verifiers/file.rb
|
43
|
+
lib/sprinkle/verifiers/process.rb
|
44
|
+
lib/sprinkle/verifiers/ruby.rb
|
43
45
|
lib/sprinkle/verifiers/symlink.rb
|
44
46
|
lib/sprinkle/verify.rb
|
45
47
|
lib/sprinkle/version.rb
|
data/{README.rdoc → README.txt}
RENAMED
File without changes
|
data/config/hoe.rb
CHANGED
@@ -35,7 +35,7 @@ VERS = Sprinkle::VERSION::STRING + (REV ? ".#{REV}" : "")
|
|
35
35
|
RDOC_OPTS = ['--quiet', '--title', 'sprinkle documentation',
|
36
36
|
"--opname", "index.html",
|
37
37
|
"--line-numbers",
|
38
|
-
"--main", "README",
|
38
|
+
"--main", "README.txt",
|
39
39
|
"--inline-source"]
|
40
40
|
|
41
41
|
class Hoe
|
@@ -59,7 +59,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
59
59
|
# == Optional
|
60
60
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
61
61
|
p.extra_deps = [ ['activesupport', '>= 2.0.2'], ['highline', '>= 1.4.0'], ['capistrano', '>= 2.2.0'] ] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
62
|
-
|
62
|
+
|
63
63
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
64
64
|
|
65
65
|
end
|
data/lib/sprinkle.rb
CHANGED
@@ -18,11 +18,15 @@ module Sprinkle
|
|
18
18
|
OPTIONS = { :testing => false, :verbose => false, :force => false }
|
19
19
|
end
|
20
20
|
|
21
|
+
# Object is extended to give the package, policy, and deployment methods. To
|
22
|
+
# read about each method, see the corresponding module which is included.
|
23
|
+
#--
|
21
24
|
# Define a logging target and understand packages, policies and deployment DSL
|
25
|
+
#++
|
22
26
|
class Object
|
23
27
|
include Sprinkle::Package, Sprinkle::Policy, Sprinkle::Deployment
|
24
28
|
|
25
|
-
def logger
|
29
|
+
def logger # :nodoc:
|
26
30
|
@@__log__ ||= ActiveSupport::BufferedLogger.new($stdout, ActiveSupport::BufferedLogger::Severity::INFO)
|
27
31
|
end
|
28
32
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#--
|
2
|
+
# The only point of this file is to give RDoc a definition for
|
3
|
+
# Sprinkle::Actors. This file in production is never actually included
|
4
|
+
# since ActiveSupport only on-demand loads classes which are needed
|
5
|
+
# and this module is never explicitly needed.
|
6
|
+
#++
|
7
|
+
|
8
|
+
module Sprinkle
|
9
|
+
# An actor is a method of command delivery to a remote machine. It is the
|
10
|
+
# layer between sprinkle and the SSH connection to run commands. This gives
|
11
|
+
# you the flexibility to define custom actors, for whatever purpose you need.
|
12
|
+
#
|
13
|
+
# 99% of the time, however, the two built-in actors Sprinkle::Actors::Capistrano
|
14
|
+
# and Sprinkle::Actors::Vlad will be enough.
|
15
|
+
module Actors
|
16
|
+
end
|
17
|
+
end
|
@@ -2,10 +2,26 @@ require 'capistrano/cli'
|
|
2
2
|
|
3
3
|
module Sprinkle
|
4
4
|
module Actors
|
5
|
+
# = Capistrano Delivery Method
|
6
|
+
#
|
7
|
+
# Capistrano is one of the delivery method options available out of the
|
8
|
+
# box with Sprinkle. If you have the capistrano gem install, you may use
|
9
|
+
# this delivery. The only configuration option available, and which is
|
10
|
+
# mandatory to include is +recipes+. An example:
|
11
|
+
#
|
12
|
+
# deployment do
|
13
|
+
# delivery :capistrano do
|
14
|
+
# recipes 'deploy'
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# Recipes is given a list of files which capistrano will include and load.
|
19
|
+
# These recipes are mainly to set variables such as :user, :password, and to
|
20
|
+
# set the app domain which will be sprinkled.
|
5
21
|
class Capistrano
|
6
|
-
attr_accessor :config, :loaded_recipes
|
22
|
+
attr_accessor :config, :loaded_recipes #:nodoc:
|
7
23
|
|
8
|
-
def initialize(&block)
|
24
|
+
def initialize(&block) #:nodoc:
|
9
25
|
@config = ::Capistrano::Configuration.new
|
10
26
|
@config.logger.level = Sprinkle::OPTIONS[:verbose] ? ::Capistrano::Logger::INFO : ::Capistrano::Logger::IMPORTANT
|
11
27
|
@config.set(:password) { ::Capistrano::CLI.password_prompt }
|
@@ -16,13 +32,25 @@ module Sprinkle
|
|
16
32
|
end
|
17
33
|
end
|
18
34
|
|
35
|
+
# Defines a recipe file which will be included by capistrano. Use these
|
36
|
+
# recipe files to set capistrano specific configurations. Default recipe
|
37
|
+
# included is "deploy." But if any other recipe is specified, it will
|
38
|
+
# include that instead. Multiple recipes may be specified through multiple
|
39
|
+
# recipes calls, an example:
|
40
|
+
#
|
41
|
+
# deployment do
|
42
|
+
# delivery :capistrano do
|
43
|
+
# recipes 'deploy'
|
44
|
+
# recipes 'magic_beans'
|
45
|
+
# end
|
46
|
+
# end
|
19
47
|
def recipes(script)
|
20
48
|
@loaded_recipes ||= []
|
21
49
|
@config.load script
|
22
50
|
@loaded_recipes << script
|
23
51
|
end
|
24
52
|
|
25
|
-
def process(name, commands, roles, suppress_and_return_failures = false)
|
53
|
+
def process(name, commands, roles, suppress_and_return_failures = false) #:nodoc:
|
26
54
|
define_task(name, roles) do
|
27
55
|
via = fetch(:run_method, :sudo)
|
28
56
|
commands.each do |command|
|
data/lib/sprinkle/actors/vlad.rb
CHANGED
@@ -1,20 +1,46 @@
|
|
1
1
|
module Sprinkle
|
2
2
|
module Actors
|
3
|
+
# = Vlad Delivery Method
|
4
|
+
#
|
5
|
+
# Vlad is one of the delivery method options available out of the
|
6
|
+
# box with Sprinkle. If you have the vlad the deployer gem install, you
|
7
|
+
# may use this delivery. The only configuration option available, and
|
8
|
+
# which is mandatory to include is +script+. An example:
|
9
|
+
#
|
10
|
+
# deployment do
|
11
|
+
# delivery :vlad do
|
12
|
+
# script 'deploy'
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# script is given a list of files which capistrano will include and load.
|
17
|
+
# These recipes are mainly to set variables such as :user, :password, and to
|
18
|
+
# set the app domain which will be sprinkled.
|
3
19
|
class Vlad
|
4
20
|
require 'vlad'
|
5
|
-
attr_accessor :loaded_recipes
|
21
|
+
attr_accessor :loaded_recipes #:nodoc:
|
6
22
|
|
7
|
-
def initialize(&block)
|
23
|
+
def initialize(&block) #:nodoc:
|
8
24
|
self.instance_eval &block if block
|
9
25
|
end
|
10
26
|
|
27
|
+
# Defines a script file which will be included by vlad. Use these
|
28
|
+
# script files to set vlad specific configurations. Multiple scripts
|
29
|
+
# may be specified through multiple script calls, an example:
|
30
|
+
#
|
31
|
+
# deployment do
|
32
|
+
# delivery :vlad do
|
33
|
+
# script 'deploy'
|
34
|
+
# script 'magic_beans'
|
35
|
+
# end
|
36
|
+
# end
|
11
37
|
def script(name)
|
12
38
|
@loaded_recipes ||= []
|
13
39
|
self.load name
|
14
40
|
@loaded_recipes << script
|
15
41
|
end
|
16
42
|
|
17
|
-
def process(name, commands, roles, suppress_and_return_failures = false)
|
43
|
+
def process(name, commands, roles, suppress_and_return_failures = false) #:nodoc:
|
18
44
|
commands = commands.join ' && ' if commands.is_a? Array
|
19
45
|
t = remote_task(task_sym(name), :roles => roles) { run commands }
|
20
46
|
|
data/lib/sprinkle/deployment.rb
CHANGED
@@ -1,29 +1,69 @@
|
|
1
1
|
module Sprinkle
|
2
|
+
# Deployment blocks specify deployment specific information about a
|
3
|
+
# sprinkle script. An example:
|
4
|
+
#
|
5
|
+
# deployment do
|
6
|
+
# # mechanism for deployment
|
7
|
+
# delivery :capistrano do
|
8
|
+
# recipes 'deploy'
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# # source based package installer defaults
|
12
|
+
# source do
|
13
|
+
# prefix '/usr/local'
|
14
|
+
# archives '/usr/local/sources'
|
15
|
+
# builds '/usr/local/build'
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# What the above example does is tell sprinkle that we will be using
|
20
|
+
# *capistrano* (Sprinkle::Actors::Capistrano) for deployment and
|
21
|
+
# everything within the block is capistrano specific configuration.
|
22
|
+
# For more information on what options are available, check the corresponding
|
23
|
+
# Sprinkle::Actors doc page.
|
24
|
+
#
|
25
|
+
# In addition to what delivery mechanism we're using, we specify some
|
26
|
+
# configuration options for the "source" command. The only things
|
27
|
+
# configurable, at this time, in the deployment block other than
|
28
|
+
# the delivery method are installers. If installers are configurable,
|
29
|
+
# they will say so on their corresponding documentation page. See
|
30
|
+
# Sprinkle::Installers
|
31
|
+
#
|
32
|
+
# <b>Only one deployment block is on any given sprinkle script</b>
|
2
33
|
module Deployment
|
34
|
+
# The method outlined above which specifies deployment specific information
|
35
|
+
# for a sprinkle script. For more information, read the header of this module.
|
3
36
|
def deployment(&block)
|
4
37
|
@deployment = Deployment.new(&block)
|
5
38
|
end
|
6
39
|
|
7
40
|
class Deployment
|
8
|
-
attr_accessor :style, :defaults
|
41
|
+
attr_accessor :style, :defaults #:nodoc:
|
9
42
|
|
10
|
-
def initialize(&block)
|
43
|
+
def initialize(&block) #:nodoc:
|
11
44
|
@defaults = {}
|
12
45
|
self.instance_eval(&block)
|
13
46
|
raise 'No delivery mechanism defined' unless @style
|
14
47
|
end
|
15
48
|
|
16
|
-
|
49
|
+
# Specifies which Sprinkle::Actors to use for delivery. Although all
|
50
|
+
# actors jobs are the same: to run remote commands on a server, you
|
51
|
+
# may have a personal preference. The block you pass is used to configure
|
52
|
+
# the actor. For more information on what configuration options are
|
53
|
+
# available, view the corresponding Sprinkle::Actors page.
|
54
|
+
def delivery(type, &block) #:doc:
|
17
55
|
@style = Actors.const_get(type.to_s.titleize).new &block
|
18
56
|
end
|
19
57
|
|
20
|
-
def method_missing(sym, *args, &block)
|
58
|
+
def method_missing(sym, *args, &block) #:nodoc:
|
21
59
|
@defaults[sym] = block
|
22
60
|
end
|
23
61
|
|
24
|
-
def respond_to?(sym)
|
62
|
+
def respond_to?(sym) #:nodoc:
|
63
|
+
!!@defaults[sym]
|
64
|
+
end
|
25
65
|
|
26
|
-
def process
|
66
|
+
def process #:nodoc:
|
27
67
|
POLICIES.each do |policy|
|
28
68
|
policy.process(self)
|
29
69
|
end
|
@@ -1,9 +1,35 @@
|
|
1
1
|
module Sprinkle
|
2
2
|
module Installers
|
3
|
+
# = Apt Package Installer
|
4
|
+
#
|
5
|
+
# The Apt package installer uses the +apt-get+ command to install
|
6
|
+
# packages. The apt installer has only one option which can be
|
7
|
+
# modified which is the +dependencies_only+ option. When this is
|
8
|
+
# set to true, the installer uses +build-dep+ instead of +install+
|
9
|
+
# to only build the dependencies.
|
10
|
+
#
|
11
|
+
# == Example Usage
|
12
|
+
#
|
13
|
+
# First, a simple installation of the magic_beans package:
|
14
|
+
#
|
15
|
+
# package :magic_beans do
|
16
|
+
# description "Beans beans they're good for your heart..."
|
17
|
+
# apt 'magic_beans_package'
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# Second, only build the magic_beans dependencies:
|
21
|
+
#
|
22
|
+
# package :magic_beans_depends do
|
23
|
+
# apt 'magic_beans_package' { dependencies_only true }
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# As you can see, setting options is as simple as creating a
|
27
|
+
# block and calling the option as a method with the value as
|
28
|
+
# its parameter.
|
3
29
|
class Apt < Installer
|
4
|
-
attr_accessor :packages
|
30
|
+
attr_accessor :packages #:nodoc:
|
5
31
|
|
6
|
-
def initialize(parent, *packages, &block)
|
32
|
+
def initialize(parent, *packages, &block) #:nodoc:
|
7
33
|
super parent, &block
|
8
34
|
packages.flatten!
|
9
35
|
|
@@ -16,7 +42,7 @@ module Sprinkle
|
|
16
42
|
|
17
43
|
protected
|
18
44
|
|
19
|
-
def install_commands
|
45
|
+
def install_commands #:nodoc:
|
20
46
|
"DEBCONF_TERSE='yes' DEBIAN_PRIORITY='critical' DEBIAN_FRONTEND=noninteractive apt-get -qyu #{@command} #{@packages.join(' ')}"
|
21
47
|
end
|
22
48
|
|
@@ -1,14 +1,42 @@
|
|
1
1
|
module Sprinkle
|
2
2
|
module Installers
|
3
|
+
# = Ruby Gem Package Installer
|
4
|
+
#
|
5
|
+
# The gem package installer installs ruby gems.
|
6
|
+
#
|
7
|
+
# The installer has a single optional configuration: source.
|
8
|
+
# By changing source you can specify a given ruby gems
|
9
|
+
# repository from which to install.
|
10
|
+
#
|
11
|
+
# == Example Usage
|
12
|
+
#
|
13
|
+
# First, a simple installation of the magic_beans gem:
|
14
|
+
#
|
15
|
+
# package :magic_beans do
|
16
|
+
# description "Beans beans they're good for your heart..."
|
17
|
+
# gem 'magic_beans'
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# Second, install magic_beans gem from github:
|
21
|
+
#
|
22
|
+
# package :magic_beans do
|
23
|
+
# gem 'magic_beans_package' do
|
24
|
+
# source 'http://gems.github.com'
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# As you can see, setting options is as simple as creating a
|
29
|
+
# block and calling the option as a method with the value as
|
30
|
+
# its parameter.
|
3
31
|
class Gem < Installer
|
4
|
-
attr_accessor :gem
|
32
|
+
attr_accessor :gem #:nodoc:
|
5
33
|
|
6
|
-
def initialize(parent, gem, options = {}, &block)
|
34
|
+
def initialize(parent, gem, options = {}, &block) #:nodoc:
|
7
35
|
super parent, options, &block
|
8
36
|
@gem = gem
|
9
37
|
end
|
10
38
|
|
11
|
-
def source(location = nil)
|
39
|
+
def source(location = nil) #:nodoc:
|
12
40
|
# package defines an installer called source so here we specify a method directly
|
13
41
|
# rather than rely on the automatic options processing since packages' method missing
|
14
42
|
# won't be run
|
@@ -20,7 +48,7 @@ module Sprinkle
|
|
20
48
|
|
21
49
|
# rubygems 0.9.5+ installs dependencies by default, and does platform selection
|
22
50
|
|
23
|
-
def install_commands
|
51
|
+
def install_commands #:nodoc:
|
24
52
|
cmd = "gem install #{gem}"
|
25
53
|
cmd << " --version '#{version}'" if version
|
26
54
|
cmd << " --source #{source}" if source
|
@@ -1,10 +1,49 @@
|
|
1
1
|
module Sprinkle
|
2
2
|
module Installers
|
3
|
+
# The base class which all installers must subclass, this class makes
|
4
|
+
# sure all installers share some general features, which are outlined
|
5
|
+
# below.
|
6
|
+
#
|
7
|
+
# = Pre/Post Installation Hooks
|
8
|
+
#
|
9
|
+
# With all intallation methods you have the ability to specify multiple
|
10
|
+
# pre/post installation hooks. This gives you the ability to specify
|
11
|
+
# commands to run before and after an installation takes place. All
|
12
|
+
# commands by default are sudo'd so there is no need to include "sudo"
|
13
|
+
# in the command itself. There are three ways to specify a pre/post hook.
|
14
|
+
#
|
15
|
+
# First, a single command:
|
16
|
+
#
|
17
|
+
# pre :install, 'echo "Hello, World!"'
|
18
|
+
# post :install, 'rm -rf /'
|
19
|
+
#
|
20
|
+
# Second, an array of commands:
|
21
|
+
#
|
22
|
+
# commands = ['echo "First"', 'echo "Then Another"']
|
23
|
+
# pre :install, commands
|
24
|
+
# post :install, commands
|
25
|
+
#
|
26
|
+
# Third, a block which returns either a single or multiple commands:
|
27
|
+
#
|
28
|
+
# pre :install do
|
29
|
+
# amount = 7 * 3
|
30
|
+
# "echo 'Before we install, lets plant #{amount} magic beans...'"
|
31
|
+
# end
|
32
|
+
# post :install do
|
33
|
+
# ['echo "Now... let's hope they sprout!", 'echo "Indeed they have!"']
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# = Other Pre/Post Hooks
|
37
|
+
#
|
38
|
+
# Some installation methods actually grant you more fine grained
|
39
|
+
# control of when commands are run rather than a blanket pre :install
|
40
|
+
# or post :install. If this is the case, it will be documented on
|
41
|
+
# the installation method's corresponding documentation page.
|
3
42
|
class Installer
|
4
43
|
include Sprinkle::Configurable
|
5
|
-
attr_accessor :delivery, :package, :options, :pre, :post
|
44
|
+
attr_accessor :delivery, :package, :options, :pre, :post #:nodoc:
|
6
45
|
|
7
|
-
def initialize(package, options = {}, &block)
|
46
|
+
def initialize(package, options = {}, &block) #:nodoc:
|
8
47
|
@package = package
|
9
48
|
@options = options
|
10
49
|
@pre = {}; @post = {}
|
@@ -23,7 +62,7 @@ module Sprinkle
|
|
23
62
|
@post[stage] += [yield] if block_given?
|
24
63
|
end
|
25
64
|
|
26
|
-
def process(roles)
|
65
|
+
def process(roles) #:nodoc:
|
27
66
|
assert_delivery
|
28
67
|
|
29
68
|
if logger.debug?
|
@@ -38,35 +77,42 @@ module Sprinkle
|
|
38
77
|
end
|
39
78
|
|
40
79
|
protected
|
41
|
-
|
42
|
-
# Installation is separated into two styles that concrete derivative installer classes
|
43
|
-
# can implement.
|
44
|
-
#
|
45
|
-
# Simple installers that issue a single or set of commands can overwride
|
46
|
-
# install_commands (eg. apt, gem, rpm). Pre/post install commands are included in this
|
47
|
-
# style for free.
|
48
|
-
#
|
49
80
|
# More complicated installers that have different stages, and require pre/post commands
|
50
81
|
# within stages can override install_sequence and take complete control of the install
|
51
82
|
# command sequence construction (eg. source based installer).
|
52
|
-
|
53
83
|
def install_sequence
|
54
84
|
commands = pre_commands(:install) + [ install_commands ] + post_commands(:install)
|
55
85
|
commands.flatten
|
56
86
|
end
|
57
87
|
|
88
|
+
# A concrete installer (subclass of this virtual class) must override this method
|
89
|
+
# and return the commands it needs to run as either a string or an array.
|
90
|
+
#
|
91
|
+
# <b>Overriding this method is required.</b>
|
58
92
|
def install_commands
|
59
93
|
raise 'Concrete installers implement this to specify commands to run to install their respective packages'
|
60
94
|
end
|
61
95
|
|
62
|
-
def pre_commands(stage)
|
96
|
+
def pre_commands(stage) #:nodoc:
|
63
97
|
dress @pre[stage] || [], :pre
|
64
98
|
end
|
65
99
|
|
66
|
-
def post_commands(stage)
|
100
|
+
def post_commands(stage) #:nodoc:
|
67
101
|
dress @post[stage] || [], :post
|
68
102
|
end
|
69
103
|
|
104
|
+
# Concrete installers (subclasses of this virtual class) can override this method to
|
105
|
+
# specify stage-specific (pre-installation, post-installation, etc.) modifications
|
106
|
+
# of commands.
|
107
|
+
#
|
108
|
+
# An example usage of overriding this would be to prefix all commands for a
|
109
|
+
# certain stage to change to a certain directory. An example is given below:
|
110
|
+
#
|
111
|
+
# def dress(commands, stage)
|
112
|
+
# commands.collect { |x| "cd #{magic_beans_path} && #{x}" }
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# By default, no modifications are made to the commands.
|
70
116
|
def dress(commands, stage); commands; end
|
71
117
|
|
72
118
|
end
|