sprinkle 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.9.2
5
+ - 1.8.7
6
+ - ree
data/CREDITS CHANGED
@@ -1,8 +1,10 @@
1
1
  = CREDITS
2
2
 
3
- Many thanks to the following people who have submitted ideas, patches, helped with testing
4
- and/or generally provided support to Sprinkle, I really appreciate your help:
3
+ Many thanks to the following people who have submitted ideas, patches, helped with
4
+ testing and/or generally provided support to Sprinkle, I really appreciate your help:
5
5
 
6
+ Koen Punt (http://github.com/koenpunt)
7
+ Manuel Meurer (http://github.com/manuelmeurer)
6
8
  Kristin Baumann (http://crafterm.net/kristin/blog/)
7
9
  Ben Schwarz (http://germanforblack.com/)
8
10
  Jim Freeze (http://www.artima.com/rubycs/articles/ruby_as_dslP.html)
@@ -31,4 +33,5 @@ Geoff Garside (http://geoffgarside.co.uk/)
31
33
  Oliver Kiessler (http://inceedo.com)
32
34
  Nick Plante (http://blog.zerosum.org)
33
35
 
34
- The transfer installer contains a piece of exception reporting code copied from the Chef library (http://wiki.opscode.com/display/chef/Home)
36
+ The transfer installer contains a piece of exception reporting code copied from
37
+ the Chef library (http://wiki.opscode.com/display/chef/Home)
data/README.md CHANGED
@@ -6,6 +6,7 @@ its been created.
6
6
 
7
7
  [![Build Status](https://travis-ci.org/sprinkle-tool/sprinkle.png?branch=master)](https://travis-ci.org/sprinkle-tool/sprinkle)
8
8
 
9
+ * `#sprinkle` channel on the Freenode IRC Network
9
10
  * <http://redartisan.com/2008/5/27/sprinkle-intro>
10
11
  * <http://github.com/sprinkle-tool/sprinkle>
11
12
  * <http://github.com/benschwarz/passenger-stack>
data/bin/sprinkle CHANGED
@@ -90,8 +90,7 @@ def verbosity(options)
90
90
  end
91
91
 
92
92
  def log_level(options)
93
- severity = ActiveSupport::BufferedLogger::Severity
94
- Object.logger.level = options[:verbose] ? severity::DEBUG : severity::INFO
93
+ Object.logger.level = OPTIONS[:verbose] ? Logger::Severity::DEBUG : Logger::Severity::INFO
95
94
  end
96
95
 
97
96
  require File.dirname(__FILE__) + '/../lib/sprinkle'
data/lib/sprinkle.rb CHANGED
@@ -37,6 +37,9 @@ class Object
37
37
  include Sprinkle::Package, Sprinkle::Policy, Sprinkle::Deployment
38
38
 
39
39
  def logger # :nodoc:
40
- @@__log__ ||= ActiveSupport::BufferedLogger.new($stdout, ActiveSupport::BufferedLogger::Severity::INFO)
40
+ # ActiveSupport::BufferedLogger was deprecated and replaced by ActiveSupport::Logger in Rails 4.
41
+ # Use ActiveSupport::Logger if available.
42
+ active_support_logger = defined?(ActiveSupport::Logger) ? ActiveSupport::Logger : ActiveSupport::BufferedLogger
43
+ @@__log__ ||= active_support_logger.new($stdout, active_support_logger::Severity::INFO)
41
44
  end
42
45
  end
@@ -0,0 +1,44 @@
1
+ module Sprinkle
2
+ module Actors
3
+ # An actor is a method of command delivery to a remote machine. Actors are the
4
+ # layer setting between Sprinkle and the systems you and wanting to apply
5
+ # policies to. All actors should inherit from Sprinkle::Actors::Actor.
6
+ #
7
+ # Sprinkle ships with actors for Capistrano, Vlad, localhost and pure SSH.
8
+ # 99% of the time these should be sufficient but you can always write your
9
+ # own actor otherwise.
10
+ #
11
+ # == Writing an actor
12
+ #
13
+ # Actors must provide only 3 methods:
14
+ #
15
+ # * install (installer, roles, options)
16
+ # * verify (verifier, roles, options)
17
+ # * servers_for_role? (roles)
18
+ #
19
+ # Hopefully these methods are kind of fairly obvious. They should return true
20
+ # to indicate success and false to indicate failure.
21
+ # The actual commands you need to execute can be retrived from
22
+ # +installer.install_sequence+ and +verifier.commands+.
23
+ class Actor
24
+
25
+ # an actor must define this method so that each policy can ask the actor
26
+ # if there are any servers with that policy's roles so the policy knows
27
+ # whether it should execute or not
28
+ #
29
+ # input: a single role or array of roles
30
+ def servers_for_role?(r)
31
+ raise "please define servers_for_role?"
32
+ end
33
+
34
+ def install(*args)
35
+ raise "you must define install"
36
+ end
37
+
38
+ def verify(*args)
39
+ raise "you must define verify"
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -17,7 +17,7 @@ module Sprinkle
17
17
  # Recipes is given a list of files which capistrano will include and load.
18
18
  # These recipes are mainly to set variables such as :user, :password, and to
19
19
  # set the app domain which will be sprinkled.
20
- class Capistrano
20
+ class Capistrano < Actor
21
21
  attr_accessor :config, :loaded_recipes #:nodoc:
22
22
 
23
23
  def initialize(&block) #:nodoc:
@@ -37,6 +37,13 @@ module Sprinkle
37
37
  @config.load 'deploy' # normally in the config directory for rails
38
38
  end
39
39
  end
40
+
41
+ # Determines if there are any servers for the given roles
42
+ def servers_for_role?(roles)
43
+ roles=Array(roles)
44
+ roles.any? { |r| @config.roles.keys.include? (r) }
45
+ end
46
+
40
47
 
41
48
  # Defines a recipe file which will be included by capistrano. Use these
42
49
  # recipe files to set capistrano specific configurations. Default recipe
@@ -3,24 +3,7 @@ require 'pp'
3
3
 
4
4
  module Sprinkle
5
5
  module Actors
6
- # = Capistrano Delivery Method
7
- #
8
- # Capistrano is one of the delivery method options available out of the
9
- # box with Sprinkle. If you have the capistrano gem install, you may use
10
- # this delivery. The only configuration option available, and which is
11
- # mandatory to include is +recipes+. An example:
12
- #
13
- # deployment do
14
- # delivery :capistrano do
15
- # recipes 'deploy'
16
- # end
17
- # end
18
- #
19
- # Recipes is given a list of files which capistrano will include and load.
20
- # These recipes are mainly to set variables such as :user, :password, and to
21
- # set the app domain which will be sprinkled.
22
- class Dummy #:nodoc:
23
- attr_accessor :config, :loaded_recipes #:nodoc:
6
+ class Dummy < Actor #:nodoc:
24
7
 
25
8
  def initialize(&block) #:nodoc:
26
9
  # @config.set(:_sprinkle_actor, self)
@@ -28,26 +11,17 @@ module Sprinkle
28
11
  self.instance_eval &block
29
12
  end
30
13
 
31
- # Defines a recipe file which will be included by capistrano. Use these
32
- # recipe files to set capistrano specific configurations. Default recipe
33
- # included is "deploy." But if any other recipe is specified, it will
34
- # include that instead. Multiple recipes may be specified through multiple
35
- # recipes calls, an example:
36
- #
37
- # deployment do
38
- # delivery :capistrano do
39
- # recipes 'deploy'
40
- # recipes 'magic_beans'
41
- # end
42
- # end
43
- # def recipes(script)
44
- # end
45
-
46
14
  def role(role, server, opts={})
47
15
  @roles[role]||=[]
48
16
  @roles[role] << [ server, opts ]
49
17
  end
50
18
 
19
+ # Determines if there are any servers for the given roles
20
+ def servers_for_role?(roles)
21
+ roles=Array(roles)
22
+ roles.any? { |r| @roles.keys.include? (r) }
23
+ end
24
+
51
25
  def install(installer, roles, opts={})
52
26
  if per_host=opts.delete(:per_host)
53
27
  servers_per_role(roles).each do |server|
@@ -74,54 +48,6 @@ module Sprinkle
74
48
  # return false if suppress_and_return_failures
75
49
  true
76
50
  end
77
-
78
- def transfer(name, source, destination, roles, recursive = true, suppress_and_return_failures = false)
79
-
80
- end
81
-
82
- private
83
-
84
- # REVISIT: can we set the description somehow?
85
- def define_task(name, roles, &block)
86
- @config.task task_sym(name), :roles => roles, &block
87
- end
88
-
89
- def run(task)
90
- @config.send task_sym(task)
91
- end
92
-
93
- def task_sym(name)
94
- "install_#{name.to_task_name}".to_sym
95
- end
96
51
  end
97
52
  end
98
- end
99
-
100
-
101
- =begin
102
-
103
- # channel: the SSH channel object used for this response
104
- # stream: either :err or :out, for stderr or stdout responses
105
- # output: the text that the server is sending, might be in chunks
106
- run "apt-get update" do |channel, stream, output|
107
- if output =~ /Are you sure?/
108
- answer = Capistrano::CLI.ui.ask("Are you sure: ")
109
- channel.send_data(answer + "\n")
110
- else
111
- # allow the default callback to be processed
112
- Capistrano::Configuration.default_io_proc.call[channel, stream, output]
113
- end
114
- end
115
-
116
-
117
-
118
- You can tell subversion to use a different username+password by
119
- setting a couple variables:
120
- set :svn_username, "my svn username"
121
- set :svn_password, "my svn password"
122
- If you don't want to set the password explicitly in your recipe like
123
- that, you can make capistrano prompt you for it like this:
124
- set(:svn_password) { Capistrano::CLI.password_prompt("Subversion
125
- password: ") }
126
- - Jamis
127
- =end
53
+ end
@@ -16,10 +16,14 @@ module Sprinkle
16
16
  #
17
17
  # Note: The local actor completely ignores roles and behaves as if your
18
18
  # local system was a member of all roles defined.
19
- class Local
19
+ class Local < Actor
20
20
 
21
21
  class LocalCommandError < StandardError; end
22
22
 
23
+ def servers_for_role?
24
+ true
25
+ end
26
+
23
27
  def install(installer, roles, opts = {}) #:nodoc:
24
28
  # all local installer cares about is the commands
25
29
  @installer = installer
@@ -25,7 +25,7 @@ module Sprinkle
25
25
  # gateway "work.sshgateway.com"
26
26
  # end
27
27
  # end
28
- class SSH
28
+ class SSH < Actor
29
29
  attr_accessor :options #:nodoc:
30
30
 
31
31
  class SSHCommandFailure < StandardError #:nodoc:
@@ -43,7 +43,7 @@ module Sprinkle
43
43
 
44
44
  def initialize(options = {}, &block) #:nodoc:
45
45
  @options = options.update(:user => 'root')
46
- @roles = {}
46
+ @roles = {}.with_indifferent_access
47
47
  @connection_cache = SSHConnectionCache.new
48
48
  self.instance_eval &block if block
49
49
  raise "You must define at least a single role." if @roles.empty?
@@ -55,6 +55,12 @@ module Sprinkle
55
55
  def roles(roles)
56
56
  @roles = roles
57
57
  end
58
+
59
+ # Determines if there are any servers for the given roles
60
+ def servers_for_role?(roles)
61
+ roles=Array(roles)
62
+ roles.any? { |r| @roles.keys.include? (r) }
63
+ end
58
64
 
59
65
  # Define a role and add servers to it
60
66
  #
@@ -16,12 +16,17 @@ module Sprinkle
16
16
  # script is given a list of files which vlad will include and load.
17
17
  # These recipes are mainly to set variables such as :user, :password, and to
18
18
  # set the app domain which will be sprinkled.
19
- class Vlad
19
+ class Vlad < Actor
20
20
  attr_accessor :loaded_recipes #:nodoc:
21
21
 
22
22
  def initialize(&block) #:nodoc:
23
23
  self.instance_eval &block if block
24
24
  end
25
+
26
+ def servers_for_role?
27
+ raise "The vlad actor needs a maintainer. "+
28
+ "Please file an issue on github.com/sprinkle-tool/sprinkle if you can help."
29
+ end
25
30
 
26
31
  # Defines a script file which will be included by vlad. Use these
27
32
  # script files to set vlad specific configurations. Multiple scripts
@@ -82,11 +82,15 @@ module Sprinkle
82
82
  def sudo_cmd
83
83
  "sudo " if sudo?
84
84
  end
85
-
85
+
86
86
  def sudo?
87
87
  options[:sudo] or package.sudo?
88
88
  end
89
-
89
+
90
+ def escape_shell_arg(str)
91
+ str.gsub("'", "'\\\\''").gsub("/", "\\\\/").gsub("\n", '\n').gsub('&', '\\\&')
92
+ end
93
+
90
94
  def pre(stage, *commands)
91
95
  @pre[stage] ||= []
92
96
  @pre[stage] += commands
@@ -47,12 +47,20 @@ module Sprinkle
47
47
  @path = path
48
48
  end
49
49
 
50
+ def announce
51
+ log "--> Append '#{@text}' to file #{@path}"
52
+ end
53
+
50
54
  protected
51
55
 
52
56
  def install_commands #:nodoc:
53
- "#{"#{sudo_cmd}grep \"^#{@text.gsub("'", "'\\\\''").gsub("\n", '\n')}$\" #{@path} || " if option?(:idempotent) }/bin/echo -e '#{@text.gsub("'", "'\\\\''").gsub("\n", '\n')}' |#{sudo_cmd}tee -a #{@path}"
57
+ escaped_text = escape_shell_arg(@text)
58
+ escaped_regex = Regexp.escape(@text)
59
+ command = ""
60
+ command << "#{sudo_cmd}grep -qPzo '^#{escaped_regex}$' #{@path} || " if option?(:idempotent)
61
+ command << "/bin/echo -e '#{escaped_text}' |#{sudo_cmd}tee -a #{@path}"
62
+ command
54
63
  end
55
-
56
64
  end
57
65
  end
58
66
  end
@@ -13,7 +13,7 @@ module Sprinkle
13
13
  # end
14
14
  #
15
15
  # If you user has access to 'sudo' and theres a file that requires
16
- # priveledges, you can pass :sudo => true
16
+ # privileges, you can pass :sudo => true
17
17
  #
18
18
  # package :magic_beans do
19
19
  # replace_text 'Port 22', 'Port 2500', '/etc/ssh/sshd_config', :sudo => true
@@ -46,7 +46,7 @@ module Sprinkle
46
46
  protected
47
47
 
48
48
  def install_commands #:nodoc:
49
- "#{'sudo ' if option?(:sudo)}sed -i 's/#{@regex.gsub("'", "'\\\\''").gsub("/", "\\\\/").gsub("\n", '\n')}/#{@text.gsub("'", "'\\\\''").gsub("/", "\\\\/").gsub("\n", '\n')}/g' #{@path}"
49
+ "#{sudo_cmd}sed -i 's/#{escape_shell_arg(@regex)}/#{escape_shell_arg(@text)}/g' #{@path}"
50
50
  end
51
51
 
52
52
  end
@@ -49,7 +49,18 @@ module Sprinkle
49
49
  POLICIES << p
50
50
  p
51
51
  end
52
-
52
+
53
+ class NoMatchingServersError < StandardError #:nodoc:
54
+ def initialize(name, roles)
55
+ @name = name
56
+ @roles = roles
57
+ end
58
+
59
+ def to_s
60
+ "Policy #{@name} is to be installed on #{@roles.inspect} but no server has such a role."
61
+ end
62
+ end
63
+
53
64
  class Policy #:nodoc:
54
65
  attr_reader :name, :roles
55
66
 
@@ -73,6 +84,8 @@ module Sprinkle
73
84
  def to_s; name; end
74
85
 
75
86
  def process(deployment)
87
+ raise NoMatchingServersError.new(@name, @roles) unless deployment.style.servers_for_role?(@roles)
88
+
76
89
  all = []
77
90
 
78
91
  logger.info "[#{name}]"
@@ -1,3 +1,3 @@
1
1
  module Sprinkle
2
- Version = "0.5"
2
+ Version = "0.5.1"
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,10 @@ require 'sprinkle'
3
3
 
4
4
  class Object
5
5
  def logger
6
+ # ActiveSupport::BufferedLogger was deprecated and replaced by ActiveSupport::Logger in Rails 4.
7
+ # Use ActiveSupport::Logger if available.
8
+ active_support_logger = defined?(ActiveSupport::Logger) ? ActiveSupport::Logger : ActiveSupport::BufferedLogger
6
9
  @@__log_file__ ||= StringIO.new
7
- @@__log__ = ActiveSupport::BufferedLogger.new @@__log_file__, ActiveSupport::BufferedLogger::Severity::INFO
10
+ @@__log__ = active_support_logger.new @@__log_file__, active_support_logger::Severity::INFO
8
11
  end
9
12
  end
@@ -69,7 +69,7 @@ describe Sprinkle::Installers::Installer do
69
69
 
70
70
  before do
71
71
  Sprinkle::OPTIONS[:testing] = true
72
- @logger = mock(ActiveSupport::BufferedLogger, :debug => true, :debug? => true)
72
+ @logger = mock(:debug => true, :debug? => true)
73
73
  end
74
74
 
75
75
  it 'should not invoke the delivery mechanism with the install sequence' do
@@ -39,7 +39,22 @@ describe Sprinkle::Installers::PushText do
39
39
  @install_commands = @installer.send :install_commands
40
40
  end
41
41
  it "should grep for existing of the string" do
42
- @install_commands.should == %q[grep "^another-hair-brained-idea$" /dev/mind/late-night || /bin/echo -e 'another-hair-brained-idea' |tee -a /dev/mind/late-night]
42
+ @install_commands.should == %q<grep -qPzo '^another\-hair\-brained\-idea$' /dev/mind/late-night || /bin/echo -e 'another-hair-brained-idea' |tee -a /dev/mind/late-night>
43
+ end
44
+ end
45
+
46
+ describe 'with multiline idempotent' do
47
+ before do
48
+ mline = <<-MULTI
49
+ ^search( [adnor]{2,3} rescue)?$
50
+ ^fries( [adnor]{2,3} barbecue)?
51
+ ^songs( [adnor]{2,3} autocue)?
52
+ MULTI
53
+ @installer = create_text mline.strip, '/dev/mind/late-night', :idempotent => true
54
+ @install_commands = @installer.send :install_commands
55
+ end
56
+ it "should grep for existence of the string" do
57
+ @install_commands.should == %q<grep -qPzo '^\^search\(\ \[adnor\]\{2,3\}\ rescue\)\?\$\n\^fries\(\ \[adnor\]\{2,3\}\ barbecue\)\?\n\^songs\(\ \[adnor\]\{2,3\}\ autocue\)\?$' /dev/mind/late-night || /bin/echo -e '^search( [adnor]{2,3} rescue)?$\n^fries( [adnor]{2,3} barbecue)?\n^songs( [adnor]{2,3} autocue)?' |tee -a /dev/mind/late-night>
43
58
  end
44
59
  end
45
60
 
@@ -3,8 +3,7 @@ require File.expand_path("../../spec_helper", File.dirname(__FILE__))
3
3
  describe Sprinkle::Installers::ReplaceText do
4
4
 
5
5
  before do
6
- @package = mock(Sprinkle::Package, :name => 'package')
7
- @options = {:sudo => true}
6
+ @package = mock(Sprinkle::Package, :name => 'package', :sudo? => false)
8
7
  end
9
8
 
10
9
  def create_replacement_text(regex, text, path, options={}, &block)
@@ -20,6 +19,13 @@ describe Sprinkle::Installers::ReplaceText do
20
19
  @installer.path.should == '/etc/example/foo.conf'
21
20
  end
22
21
 
22
+ it 'should not escape original search string and replacement' do
23
+ @installer = create_replacement_text "some option with 'quotes' & ampersand", "other 'quotes' & ampersand", '/etc/example/foo.conf'
24
+ @installer.regex.should == %q[some option with 'quotes' & ampersand]
25
+ @installer.text.should == %q[other 'quotes' & ampersand]
26
+ @installer.path.should == '/etc/example/foo.conf'
27
+ end
28
+
23
29
  end
24
30
 
25
31
  describe 'during installation' do
@@ -40,6 +46,10 @@ describe Sprinkle::Installers::ReplaceText do
40
46
  @installer.send(:install_sequence).should == [ 'op1', "sed -i 's/bad option/super option/g' /etc/brand/new.conf", 'op2' ]
41
47
  end
42
48
 
49
+ it 'should correctly escape search string and replacement' do
50
+ installer = create_replacement_text "some option with 'quotes' & ampersand", "other 'quotes' & ampersand", '/etc/example/foo.conf'
51
+ installer.send(:install_commands).should == "sed -i 's/some option with '\\''quotes'\\'' \\& ampersand/other '\\''quotes'\\'' \\& ampersand/g' /etc/example/foo.conf"
52
+ end
43
53
  end
44
54
 
45
55
  end
@@ -352,7 +352,7 @@ CODE
352
352
  @pkg.installers = [ @installer ]
353
353
  @installer.stub!(:defaults)
354
354
  @installer.stub!(:process)
355
- @logger = mock(ActiveSupport::BufferedLogger, :debug => true, :debug? => true)
355
+ @logger = mock(:debug => true, :debug? => true)
356
356
  @logger.stub!(:info)
357
357
  end
358
358
 
@@ -6,6 +6,17 @@ describe Sprinkle::Policy do
6
6
  before do
7
7
  @name = 'a policy'
8
8
  end
9
+
10
+ describe 'with a role with no matching servers' do
11
+ before do
12
+ @policy = policy @name, :roles => :app do; end
13
+ end
14
+
15
+ it "should raise an error" do
16
+ @deployment = mock(:style => Sprinkle::Actors::Dummy.new {})
17
+ lambda { @policy.process(@deployment) }.should raise_error(Sprinkle::Policy::NoMatchingServersError)
18
+ end
19
+ end
9
20
 
10
21
  describe 'when created' do
11
22
 
@@ -46,6 +57,8 @@ describe Sprinkle::Policy do
46
57
 
47
58
  before do
48
59
  @deployment = mock(Sprinkle::Deployment)
60
+ actor = mock(:servers_for_role? => true)
61
+ @deployment.stub!(:style).and_return(actor)
49
62
  Sprinkle::Package::PACKAGES.clear # reset full package list before each spec is run
50
63
 
51
64
  @a = package :a do; requires :b; requires :c; end
@@ -125,6 +138,8 @@ describe Sprinkle::Policy, 'with missing packages' do
125
138
 
126
139
  before do
127
140
  @deployment = mock(Sprinkle::Deployment)
141
+ actor = mock(:servers_for_role? => true)
142
+ @deployment.stub!(:style).and_return(actor)
128
143
  Sprinkle::Package::PACKAGES.clear # reset full package list before each spec is run
129
144
 
130
145
  @policy = policy :test, :roles => :app do; requires :z; end
@@ -15,11 +15,14 @@ describe Sprinkle do
15
15
  it 'should automatically create a logger object on Kernel' do
16
16
  Object.should respond_to(:logger)
17
17
  logger.should_not be_nil
18
- logger.class.should == ActiveSupport::BufferedLogger
18
+ # ActiveSupport::BufferedLogger was deprecated and replaced by ActiveSupport::Logger in Rails 4.
19
+ # Use ActiveSupport::Logger if available
20
+ active_support_logger = defined?(ActiveSupport::Logger) ? ActiveSupport::Logger : ActiveSupport::BufferedLogger
21
+ logger.class.should == active_support_logger
19
22
  end
20
23
 
21
24
  it 'should create a logger of level INFO' do
22
- logger.level.should == ActiveSupport::BufferedLogger::Severity::INFO
25
+ logger.level.should == Logger::Severity::INFO
23
26
  end
24
27
 
25
28
  end
@@ -180,7 +180,7 @@ describe Sprinkle::Verify do
180
180
  describe 'when testing' do
181
181
  before do
182
182
  Sprinkle::OPTIONS[:testing] = true
183
- @logger = mock(ActiveSupport::BufferedLogger, :debug => true, :debug? => true)
183
+ @logger = mock(:debug => true, :debug? => true)
184
184
  end
185
185
 
186
186
  it 'should not call process on the delivery' do
data/sprinkle.gemspec CHANGED
@@ -1,6 +1,8 @@
1
+ require "./lib/sprinkle/version"
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = "sprinkle"
3
- s.version = "0.5.0"
5
+ s.version = Sprinkle::Version
4
6
 
5
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
8
  s.authors = ["Marcus Crafter", "Josh Goebel"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sprinkle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -133,6 +133,7 @@ extra_rdoc_files:
133
133
  - README.md
134
134
  files:
135
135
  - .gitignore
136
+ - .travis.yml
136
137
  - CREDITS
137
138
  - Gemfile
138
139
  - Gemfile.lock
@@ -161,7 +162,7 @@ files:
161
162
  - examples/rails/rails.rb
162
163
  - examples/sprinkle/sprinkle.rb
163
164
  - lib/sprinkle.rb
164
- - lib/sprinkle/actors/actors.rb
165
+ - lib/sprinkle/actors/actor.rb
165
166
  - lib/sprinkle/actors/capistrano.rb
166
167
  - lib/sprinkle/actors/dummy.rb
167
168
  - lib/sprinkle/actors/local.rb
@@ -1,32 +0,0 @@
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. Actors are the
10
- # layer setting between Sprinkle and the systems you and wanting to apply
11
- # policies to.
12
- #
13
- # Sprinkle ships with actors for Capistrano, Vlad, localhost and pure SSH.
14
- # 99% of the time these should be sufficient but you can always write your
15
- # own actor otherwise.
16
- #
17
- # == Writing an actor
18
- #
19
- # Actors must provide only 3 methods:
20
- #
21
- # * install (installer, roles, options)
22
- # * verify (verifier, roles, options)
23
- # * transfer (source, destination, roles, options)
24
- #
25
- # Hopefully these methods are kind of fairly obvious. They should return true
26
- # to indicate success and false to indicate failure.
27
- # The actual commands you need to execute can be retrived from
28
- # +installer.install_sequence+ and +verifier.commands+.
29
-
30
- module Actors
31
- end
32
- end