sprinkle 0.7.6.2 → 0.7.7
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/Gemfile.lock +3 -3
- data/bin/sprinkle +8 -8
- data/lib/sprinkle/actors/capistrano.rb +5 -3
- data/lib/sprinkle/installers/binary.rb +3 -3
- data/lib/sprinkle/installers/gem.rb +1 -1
- data/lib/sprinkle/installers/group.rb +1 -1
- data/lib/sprinkle/installers/installer.rb +1 -1
- data/lib/sprinkle/package.rb +17 -9
- data/lib/sprinkle/package/chooser.rb +3 -4
- data/lib/sprinkle/policy.rb +55 -23
- data/lib/sprinkle/verify.rb +18 -4
- data/lib/sprinkle/version.rb +1 -1
- data/spec/sprinkle/actors/local_spec.rb +1 -1
- data/spec/sprinkle/installers/binary_spec.rb +14 -4
- data/spec/sprinkle/installers/gem_spec.rb +11 -0
- data/spec/sprinkle/package_spec.rb +1 -1
- data/spec/sprinkle/policy_spec.rb +31 -2
- data/spec/sprinkle/verify_spec.rb +3 -3
- data/sprinkle.gemspec +1 -1
- metadata +10 -4
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -3,7 +3,7 @@ PATH | |
| 3 3 | 
             
              specs:
         | 
| 4 4 | 
             
                sprinkle (0.7.6.2)
         | 
| 5 5 | 
             
                  activesupport (>= 2.0.2)
         | 
| 6 | 
            -
                  capistrano ( | 
| 6 | 
            +
                  capistrano (>= 2.5.5, < 3)
         | 
| 7 7 | 
             
                  erubis (>= 2.7.0)
         | 
| 8 8 | 
             
                  highline (>= 1.4.0)
         | 
| 9 9 | 
             
                  open4 (>= 1.1.0)
         | 
| @@ -28,12 +28,12 @@ GEM | |
| 28 28 | 
             
                  i18n (= 0.6.1)
         | 
| 29 29 | 
             
                  multi_json (~> 1.0)
         | 
| 30 30 | 
             
                builder (3.0.4)
         | 
| 31 | 
            -
                capistrano (2.5 | 
| 31 | 
            +
                capistrano (2.15.5)
         | 
| 32 32 | 
             
                  highline
         | 
| 33 33 | 
             
                  net-scp (>= 1.0.0)
         | 
| 34 34 | 
             
                  net-sftp (>= 2.0.0)
         | 
| 35 35 | 
             
                  net-ssh (>= 2.0.14)
         | 
| 36 | 
            -
                  net-ssh-gateway (>= 1. | 
| 36 | 
            +
                  net-ssh-gateway (>= 1.1.0)
         | 
| 37 37 | 
             
                coderay (1.0.9)
         | 
| 38 38 | 
             
                diff-lcs (1.2.4)
         | 
| 39 39 | 
             
                erubis (2.7.0)
         | 
    
        data/bin/sprinkle
    CHANGED
    
    | @@ -46,19 +46,19 @@ Options are: | |
| 46 46 | 
             
            BANNER
         | 
| 47 47 | 
             
              opts.separator ""
         | 
| 48 48 | 
             
              opts.on("-s", "--script=PATH", String,
         | 
| 49 | 
            -
                      " | 
| 49 | 
            +
                      "path to a sprinkle script to run") { |v| OPTIONS[:path] = v }
         | 
| 50 50 | 
             
              opts.on("--only [ROLE]", String,
         | 
| 51 | 
            -
                      " | 
| 51 | 
            +
                      "only run sprinkle policies for given role") { |v| OPTIONS[:only_role] = v }
         | 
| 52 52 | 
             
              opts.on("-t", "--test",
         | 
| 53 | 
            -
                      " | 
| 54 | 
            -
              opts.on("-v", "--verbose",
         | 
| 55 | 
            -
                      "Verbose output") { |v| OPTIONS[:verbose] = v }
         | 
| 53 | 
            +
                      "process but don't perform any actions","(this does not connect to any servers)") { |v| OPTIONS[:testing] = v }
         | 
| 56 54 | 
             
              opts.on("-c", "--cloud",
         | 
| 57 | 
            -
                      " | 
| 55 | 
            +
                      "show powder cloud, package hierarchy","and installation order") { |v| OPTIONS[:cloud] = v }
         | 
| 58 56 | 
             
              opts.on("-f", "--force",
         | 
| 59 | 
            -
                      " | 
| 57 | 
            +
                      "force installation of all packages","by skipping pre-verify checks.") { |v| OPTIONS[:force] = v }
         | 
| 58 | 
            +
              opts.on("-v", "--verbose",
         | 
| 59 | 
            +
                      "verbose output") { |v| OPTIONS[:verbose] = v }
         | 
| 60 60 | 
             
              opts.on("-h", "--help",
         | 
| 61 | 
            -
                      " | 
| 61 | 
            +
                      "show this help message") { puts opts; exit }
         | 
| 62 62 | 
             
              opts.parse!(ARGV)
         | 
| 63 63 |  | 
| 64 64 | 
             
              if MANDATORY_OPTIONS && MANDATORY_OPTIONS.find { |option| OPTIONS[option.to_sym].nil? }
         | 
| @@ -25,6 +25,8 @@ module Sprinkle | |
| 25 25 | 
             
                    @config = ::Capistrano::Configuration.new
         | 
| 26 26 | 
             
                    @config.logger.level = Sprinkle::OPTIONS[:verbose] ? ::Capistrano::Logger::INFO : ::Capistrano::Logger::IMPORTANT
         | 
| 27 27 | 
             
                    @config.set(:password) { ::Capistrano::CLI.password_prompt }
         | 
| 28 | 
            +
                    # default sudo to false, we must turn it on
         | 
| 29 | 
            +
                    @config.set(:run_method) { @config.fetch(:use_sudo, false) ? :sudo : :run }
         | 
| 28 30 |  | 
| 29 31 | 
             
                    @config.set(:_sprinkle_actor, self)
         | 
| 30 32 |  | 
| @@ -40,7 +42,7 @@ module Sprinkle | |
| 40 42 | 
             
                  end
         | 
| 41 43 |  | 
| 42 44 | 
             
                  def sudo? #:nodoc:
         | 
| 43 | 
            -
                    @config.fetch(:run_method | 
| 45 | 
            +
                    @config.fetch(:run_method) == :sudo
         | 
| 44 46 | 
             
                  end
         | 
| 45 47 |  | 
| 46 48 | 
             
                  def sudo_command #:nodoc:
         | 
| @@ -98,7 +100,7 @@ module Sprinkle | |
| 98 100 | 
             
                    @log_recorder = log_recorder = Sprinkle::Utility::LogRecorder.new
         | 
| 99 101 | 
             
                    commands = commands.map {|x| rewrite_command(x)}
         | 
| 100 102 | 
             
                    define_task(name, roles) do
         | 
| 101 | 
            -
                      via = fetch(:run_method | 
| 103 | 
            +
                      via = fetch(:run_method)
         | 
| 102 104 | 
             
                      commands.each do |command|
         | 
| 103 105 | 
             
                        if command.is_a? Commands::Transfer
         | 
| 104 106 | 
             
                          upload command.source, command.destination, :via => :scp, 
         | 
| @@ -123,7 +125,7 @@ module Sprinkle | |
| 123 125 | 
             
                    # rip out any double sudos from the beginning of the command
         | 
| 124 126 | 
             
                    def rewrite_command(cmd)
         | 
| 125 127 | 
             
                      return cmd if cmd.is_a?(Symbol)
         | 
| 126 | 
            -
                      via = @config.fetch(:run_method | 
| 128 | 
            +
                      via = @config.fetch(:run_method)
         | 
| 127 129 | 
             
                      if via == :sudo and cmd =~ /^#{sudo_command}/
         | 
| 128 130 | 
             
                        cmd.gsub(/^#{sudo_command}\s?/,"")
         | 
| 129 131 | 
             
                      else
         | 
| @@ -13,13 +13,13 @@ module Sprinkle | |
| 13 13 | 
             
                # This example will download archive.tar.gz to /home/user/sources and then
         | 
| 14 14 | 
             
                # extract it into /home/user/local.
         | 
| 15 15 | 
             
                class Binary < Installer
         | 
| 16 | 
            -
             | 
| 16 | 
            +
             | 
| 17 17 | 
             
                  api do
         | 
| 18 18 | 
             
                    def binary(source, options = {}, &block)
         | 
| 19 19 | 
             
                      install Binary.new(self, source, options, &block)
         | 
| 20 20 | 
             
                    end
         | 
| 21 21 | 
             
                  end
         | 
| 22 | 
            -
             | 
| 22 | 
            +
             | 
| 23 23 | 
             
                  def initialize(parent, binary_archive, options = {}, &block) #:nodoc:
         | 
| 24 24 | 
             
                    @binary_archive = binary_archive
         | 
| 25 25 | 
             
                    super parent, options, &block
         | 
| @@ -35,7 +35,7 @@ module Sprinkle | |
| 35 35 |  | 
| 36 36 | 
             
                  def install_commands #:nodoc:
         | 
| 37 37 | 
             
                    commands = [ "bash -c 'wget -cq --directory-prefix=#{@options[:archives]} #{@binary_archive}'" ]
         | 
| 38 | 
            -
                    commands << "bash -c \"cd #{@options[:prefix]} && #{extract_command} '#{@options[:archives]}/#{archive_name}'\""
         | 
| 38 | 
            +
                    commands << "bash -c \"cd #{@options[:prefix]} && #{sudo_cmd} #{extract_command} '#{@options[:archives]}/#{archive_name}'\""
         | 
| 39 39 | 
             
                  end
         | 
| 40 40 |  | 
| 41 41 | 
             
                  def archive_name #:nodoc:
         | 
| @@ -49,7 +49,7 @@ module Sprinkle | |
| 49 49 | 
             
                    # rubygems 0.9.5+ installs dependencies by default, and does platform selection
         | 
| 50 50 |  | 
| 51 51 | 
             
                    def install_commands #:nodoc:
         | 
| 52 | 
            -
                      cmd = "gem install #{gem}"
         | 
| 52 | 
            +
                      cmd = "#{sudo_cmd}gem install #{gem}"
         | 
| 53 53 | 
             
                      cmd << " --version '#{version}'" if version
         | 
| 54 54 | 
             
                      cmd << " --source #{source}" if source
         | 
| 55 55 | 
             
                      cmd << " --install-dir #{repository}" if option?(:repository)
         | 
| @@ -14,7 +14,7 @@ module Sprinkle | |
| 14 14 | 
             
                # pre/post installation hooks. This gives you the ability to specify
         | 
| 15 15 | 
             
                # commands to run before and after an installation takes place.
         | 
| 16 16 | 
             
                # There are three ways to specify a pre/post hook.
         | 
| 17 | 
            -
             | 
| 17 | 
            +
                #
         | 
| 18 18 | 
             
                # Note about sudo:
         | 
| 19 19 | 
             
                # When using the Capistrano actor all commands by default are run using
         | 
| 20 20 | 
             
                # sudo (unless your Capfile includes "set :use_sudo, false").  If you wish
         | 
    
        data/lib/sprinkle/package.rb
    CHANGED
    
    | @@ -143,7 +143,7 @@ module Sprinkle | |
| 143 143 | 
             
                    @verifications = []
         | 
| 144 144 | 
             
                    @install_queues ||= [[]]
         | 
| 145 145 | 
             
                    @block = block
         | 
| 146 | 
            -
                    @use_sudo =  | 
| 146 | 
            +
                    @use_sudo = nil
         | 
| 147 147 | 
             
                    @version = nil
         | 
| 148 148 | 
             
                    # this should probably not be done twice
         | 
| 149 149 | 
             
                    self.instance_eval(&block)
         | 
| @@ -167,7 +167,7 @@ module Sprinkle | |
| 167 167 | 
             
                  end
         | 
| 168 168 |  | 
| 169 169 | 
             
                  def sudo?
         | 
| 170 | 
            -
                     | 
| 170 | 
            +
                    !!@use_sudo
         | 
| 171 171 | 
             
                  end
         | 
| 172 172 |  | 
| 173 173 | 
             
                  def use_sudo(flag=true)
         | 
| @@ -204,14 +204,10 @@ module Sprinkle | |
| 204 204 | 
             
                  def verify(description = '', &block)
         | 
| 205 205 | 
             
                    @verifications << Sprinkle::Verify.new(self, description, &block)
         | 
| 206 206 | 
             
                  end
         | 
| 207 | 
            -
             | 
| 207 | 
            +
                  
         | 
| 208 208 | 
             
                  def process(deployment, roles)
         | 
| 209 | 
            -
                     | 
| 209 | 
            +
                    output_name
         | 
| 210 210 | 
             
                    return if meta_package?
         | 
| 211 | 
            -
                    opts.each_with_index do |(k, v), index|
         | 
| 212 | 
            -
                      branch = (index == opts.size - 1) ? "└" : "├"
         | 
| 213 | 
            -
                      logger.debug "    #{branch}─ #{k}: #{v}"
         | 
| 214 | 
            -
                    end
         | 
| 215 211 |  | 
| 216 212 | 
             
                    # Run a pre-test to see if the software is already installed. If so,
         | 
| 217 213 | 
             
                    # we can skip it, unless we have the force option turned on!
         | 
| @@ -246,7 +242,7 @@ module Sprinkle | |
| 246 242 |  | 
| 247 243 | 
             
                    @verifications.each do |v|
         | 
| 248 244 | 
             
                      v.defaults(deployment)
         | 
| 249 | 
            -
                      v.process(roles)
         | 
| 245 | 
            +
                      v.process(roles, pre)
         | 
| 250 246 | 
             
                    end
         | 
| 251 247 | 
             
                  end
         | 
| 252 248 |  | 
| @@ -302,6 +298,18 @@ module Sprinkle | |
| 302 298 | 
             
                  end
         | 
| 303 299 |  | 
| 304 300 | 
             
                private
         | 
| 301 | 
            +
                
         | 
| 302 | 
            +
                  def output_name
         | 
| 303 | 
            +
                    logger.info "  * #{name} #{output_arguments}" 
         | 
| 304 | 
            +
                    opts.each_with_index do |(k, v), index|
         | 
| 305 | 
            +
                      branch = (index == opts.size - 1) ? "└" : "├"
         | 
| 306 | 
            +
                      logger.debug "    #{branch}─ #{k}: #{v}"
         | 
| 307 | 
            +
                    end
         | 
| 308 | 
            +
                  end
         | 
| 309 | 
            +
                
         | 
| 310 | 
            +
                  def output_arguments
         | 
| 311 | 
            +
                    (opts.empty? or Sprinkle::OPTIONS[:verbose]) ? "" :  opts.inspect.gsub(/^\{(.*)\}$/, "\\1" )
         | 
| 312 | 
            +
                  end
         | 
| 305 313 |  | 
| 306 314 | 
             
                  def add_dependencies(packages, kind)
         | 
| 307 315 | 
             
                    opts = packages.extract_options!
         | 
| @@ -7,13 +7,12 @@ module Sprinkle::Package | |
| 7 7 | 
             
                  else
         | 
| 8 8 | 
             
                    package = choose do |menu|
         | 
| 9 9 | 
             
                      menu.prompt = "Multiple choices exist for virtual package #{name}"
         | 
| 10 | 
            -
                       | 
| 10 | 
            +
                      packages.each do |pkg|
         | 
| 11 | 
            +
                        menu.choice(pkg.to_s) { pkg; }
         | 
| 12 | 
            +
                      end
         | 
| 11 13 | 
             
                    end
         | 
| 12 | 
            -
                    package = Sprinkle::Package::PACKAGES.first(package)
         | 
| 13 14 | 
             
                  end
         | 
| 14 | 
            -
             | 
| 15 15 | 
             
                  cloud_info "Selecting #{package.to_s} for virtual package #{name}"
         | 
| 16 | 
            -
             | 
| 17 16 | 
             
                  package
         | 
| 18 17 | 
             
                end
         | 
| 19 18 |  | 
    
        data/lib/sprinkle/policy.rb
    CHANGED
    
    | @@ -52,6 +52,31 @@ module Sprinkle | |
| 52 52 | 
             
              # The capistrano and vlad syntax is the same for that. If you're using a
         | 
| 53 53 | 
             
              # custom actor, you may have to do it differently.
         | 
| 54 54 | 
             
              #
         | 
| 55 | 
            +
              # == Requiring a package more than once with different options
         | 
| 56 | 
            +
              #
         | 
| 57 | 
            +
              # This works exactly as you might expect:
         | 
| 58 | 
            +
              #
         | 
| 59 | 
            +
              #   policy :bootstrap, :roles => :app do
         | 
| 60 | 
            +
              #     require :user_settings, :for => "john"
         | 
| 61 | 
            +
              #     require :user_settings, :for => "suzy"
         | 
| 62 | 
            +
              #     require :user_settings, :for => "dorothy"
         | 
| 63 | 
            +
              #   end
         | 
| 64 | 
            +
              #
         | 
| 65 | 
            +
              # Multiple requires for a package with no options will be 
         | 
| 66 | 
            +
              # collapsed; that package will be installed once.
         | 
| 67 | 
            +
              #
         | 
| 68 | 
            +
              #   policy :apache, :roles => :app do
         | 
| 69 | 
            +
              #     require :devtools
         | 
| 70 | 
            +
              #     ...
         | 
| 71 | 
            +
              #   end
         | 
| 72 | 
            +
              #   policy :git, :roles => :app do
         | 
| 73 | 
            +
              #     require :devtools
         | 
| 74 | 
            +
              #     ...
         | 
| 75 | 
            +
              #   end
         | 
| 76 | 
            +
              # 
         | 
| 77 | 
            +
              # In this example devtools will only be installed once, prior to
         | 
| 78 | 
            +
              # apache and git.
         | 
| 79 | 
            +
              #
         | 
| 55 80 | 
             
              # == Multiple Policies
         | 
| 56 81 | 
             
              #
         | 
| 57 82 | 
             
              # You may specify as many policies as you'd like. If the packages you're
         | 
| @@ -92,38 +117,45 @@ module Sprinkle | |
| 92 117 | 
             
                def process(deployment) #:nodoc:
         | 
| 93 118 | 
             
                  raise NoMatchingServersError.new(@name, @roles) unless deployment.style.servers_for_role?(@roles)
         | 
| 94 119 |  | 
| 95 | 
            -
                  all = []
         | 
| 96 | 
            -
             | 
| 97 120 | 
             
                  logger.info "[#{name}]"
         | 
| 98 121 |  | 
| 99 | 
            -
                   | 
| 100 | 
            -
             | 
| 101 | 
            -
                  @packages.each do |p, args|
         | 
| 102 | 
            -
                    cloud_info "  * requires package #{p}"
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                    opts = args.clone.extract_options!
         | 
| 105 | 
            -
                    package = Sprinkle::Package::PACKAGES.find_all(p, opts)
         | 
| 106 | 
            -
                    raise MissingPackageError.new(p) unless package.any?
         | 
| 107 | 
            -
                    package = Sprinkle::Package::Chooser.select_package(p, package) if package.is_a? Array # handle virtual package selection
         | 
| 108 | 
            -
                    # get an instance of the package and pass our config options
         | 
| 109 | 
            -
                    package = package.instance(*args)
         | 
| 110 | 
            -
             | 
| 111 | 
            -
                    tree = package.tree do |parent, child, depth|
         | 
| 112 | 
            -
                      indent = "\t" * depth; cloud_info "#{indent}Package #{parent.name} requires #{child.name}"
         | 
| 113 | 
            -
                    end
         | 
| 114 | 
            -
             | 
| 115 | 
            -
                    all << tree
         | 
| 116 | 
            -
                  end
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                  normalize(all).each do |package|
         | 
| 122 | 
            +
                  package_install_tree.each do |package|
         | 
| 119 123 | 
             
                    package.process(deployment, @roles)
         | 
| 120 124 | 
             
                  end
         | 
| 121 125 | 
             
                end
         | 
| 126 | 
            +
                
         | 
| 127 | 
            +
                def package_install_tree
         | 
| 128 | 
            +
                  @install_tree ||= normalize(tree)
         | 
| 129 | 
            +
                end
         | 
| 122 130 |  | 
| 123 131 | 
             
                private
         | 
| 132 | 
            +
                
         | 
| 133 | 
            +
                  def tree()
         | 
| 134 | 
            +
                    all = []
         | 
| 135 | 
            +
                    
         | 
| 136 | 
            +
                    cloud_info "--> Cloud hierarchy for policy #{@name}"
         | 
| 137 | 
            +
                    
         | 
| 138 | 
            +
                    @packages.each do |p, args|
         | 
| 139 | 
            +
                      cloud_info "  * requires package #{p}"
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                      opts = args.clone.extract_options!
         | 
| 142 | 
            +
                      package = Sprinkle::Package::PACKAGES.find_all(p, opts)
         | 
| 143 | 
            +
                      raise MissingPackageError.new(p) unless package.any?
         | 
| 144 | 
            +
                      package = Sprinkle::Package::Chooser.select_package(p, package) if package.is_a? Array # handle virtual package selection
         | 
| 145 | 
            +
                      # get an instance of the package and pass our config options
         | 
| 146 | 
            +
                      package = package.instance(*args)
         | 
| 147 | 
            +
                      tree = package.tree do |parent, child, depth|
         | 
| 148 | 
            +
                        indent = "\t" * depth; cloud_info "#{indent}Package #{parent.name} requires #{child.name}"
         | 
| 149 | 
            +
                      end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                      all << tree
         | 
| 152 | 
            +
                    end
         | 
| 153 | 
            +
                    all
         | 
| 154 | 
            +
                    
         | 
| 155 | 
            +
                  end
         | 
| 124 156 |  | 
| 125 157 | 
             
                  def normalize(all, &block)
         | 
| 126 | 
            -
                    all = all.flatten.uniq {|x| [x.name, x.version] }
         | 
| 158 | 
            +
                    all = all.flatten.uniq {|x| [x.name, x.version, x.opts] }
         | 
| 127 159 | 
             
                    cloud_info "--> Normalized installation order for all packages: #{all.collect(&:name).join(', ')}\n"
         | 
| 128 160 | 
             
                    all
         | 
| 129 161 | 
             
                  end
         | 
    
        data/lib/sprinkle/verify.rb
    CHANGED
    
    | @@ -62,7 +62,7 @@ module Sprinkle | |
| 62 62 | 
             
                include Sprinkle::Attributes
         | 
| 63 63 | 
             
                include Sprinkle::Package::Rendering::Helpers
         | 
| 64 64 | 
             
                include Sprinkle::Sudo
         | 
| 65 | 
            -
                attr_accessor :package, :description, : | 
| 65 | 
            +
                attr_accessor :package, :description, :options #:nodoc:
         | 
| 66 66 |  | 
| 67 67 | 
             
                delegate :opts, :to => :package
         | 
| 68 68 | 
             
                delegate :args, :to => :package
         | 
| @@ -87,8 +87,19 @@ module Sprinkle | |
| 87 87 | 
             
                  @options ||= {}
         | 
| 88 88 | 
             
                  @options[:padding] = 4
         | 
| 89 89 | 
             
                  @delivery = nil
         | 
| 90 | 
            -
                  
         | 
| 91 | 
            -
             | 
| 90 | 
            +
                  @block = block
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
                
         | 
| 93 | 
            +
                def commands
         | 
| 94 | 
            +
                  prepare
         | 
| 95 | 
            +
                  @commands
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
                
         | 
| 98 | 
            +
                def prepare
         | 
| 99 | 
            +
                  return if @prepared
         | 
| 100 | 
            +
                  @commands = []
         | 
| 101 | 
            +
                  self.instance_eval(&@block)
         | 
| 102 | 
            +
                  @prepared = true
         | 
| 92 103 | 
             
                end
         | 
| 93 104 |  | 
| 94 105 | 
             
                def runner(*cmds)
         | 
| @@ -109,7 +120,10 @@ module Sprinkle | |
| 109 120 | 
             
                    logger.debug "#{@package.name}#{description} verification sequence: #{@commands.join('; ')} for roles: #{roles}\n"
         | 
| 110 121 | 
             
                  end
         | 
| 111 122 |  | 
| 112 | 
            -
                   | 
| 123 | 
            +
                  if Sprinkle::OPTIONS[:testing]
         | 
| 124 | 
            +
                    # always fail when testing to force an install
         | 
| 125 | 
            +
                    raise Sprinkle::VerificationFailed.new(@package, description) if pre
         | 
| 126 | 
            +
                  else
         | 
| 113 127 | 
             
                    logger.debug "#{" " * @options[:padding]}--> Verifying #{description}..."
         | 
| 114 128 |  | 
| 115 129 | 
             
                    unless @delivery.verify(self, roles)
         | 
    
        data/lib/sprinkle/version.rb
    CHANGED
    
    
| @@ -3,7 +3,7 @@ require File.expand_path("../../spec_helper", File.dirname(__FILE__)) | |
| 3 3 | 
             
            describe Sprinkle::Installers::Binary do
         | 
| 4 4 | 
             
              include Sprinkle::Deployment
         | 
| 5 5 |  | 
| 6 | 
            -
              def create_context(source = 'http://www.example.com/archive.tar.gz')
         | 
| 6 | 
            +
              def create_context(source = 'http://www.example.com/archive.tar.gz', sudo = false)
         | 
| 7 7 | 
             
                deployment = deployment do
         | 
| 8 8 | 
             
                  delivery :capistrano
         | 
| 9 9 | 
             
                  binary source do
         | 
| @@ -12,7 +12,7 @@ describe Sprinkle::Installers::Binary do | |
| 12 12 | 
             
                  end
         | 
| 13 13 | 
             
                end
         | 
| 14 14 |  | 
| 15 | 
            -
                installer = create_binary source do
         | 
| 15 | 
            +
                installer = create_binary source, sudo do
         | 
| 16 16 | 
             
                  prefix   '/prefix/directory'
         | 
| 17 17 | 
             
                  archives '/archives/directory'
         | 
| 18 18 | 
             
                end
         | 
| @@ -22,8 +22,8 @@ describe Sprinkle::Installers::Binary do | |
| 22 22 | 
             
                [source, deployment, installer]
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 | 
            -
              def create_binary(binary, version = nil, &block)
         | 
| 26 | 
            -
                @package  | 
| 25 | 
            +
              def create_binary(binary, sudo, version = nil, &block)
         | 
| 26 | 
            +
                @package ||= double(Sprinkle::Package, :name => 'package', :version => version, :sudo? => sudo)
         | 
| 27 27 | 
             
                Sprinkle::Installers::Binary.new(@package, binary, &block)
         | 
| 28 28 | 
             
              end
         | 
| 29 29 |  | 
| @@ -59,6 +59,16 @@ describe Sprinkle::Installers::Binary do | |
| 59 59 | 
             
                end
         | 
| 60 60 | 
             
              end
         | 
| 61 61 |  | 
| 62 | 
            +
              describe "binary#install_commands", "with sudo support" do
         | 
| 63 | 
            +
                before do
         | 
| 64 | 
            +
                  @binary, @deployment, @installer = create_context 'http://www.example.com/archive.tar.gz', true
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                it "should sudo the command when required" do
         | 
| 68 | 
            +
                  @installer.send(:install_commands)[1].should =~ /sudo/
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 62 72 | 
             
              describe "when source contains spaces (%20's) in path" do
         | 
| 63 73 | 
             
                before do
         | 
| 64 74 | 
             
                  _, _, @installer = create_context('http://c758482.r82.cf2.rackcdn.com/Sublime%20Text%202.0.1%20x64.tar.bz2')
         | 
| @@ -86,6 +86,17 @@ describe Sprinkle::Installers::Gem do | |
| 86 86 |  | 
| 87 87 | 
             
                end
         | 
| 88 88 |  | 
| 89 | 
            +
                describe "with sudo" do
         | 
| 90 | 
            +
                  before do
         | 
| 91 | 
            +
                    @installer = create_gem @gem, nil, :sudo => true
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                  
         | 
| 94 | 
            +
                  it 'should call sudo' do
         | 
| 95 | 
            +
                    @installer.send(:install_commands).should == "sudo gem install #{@gem} --no-rdoc --no-ri"
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
                  
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
                
         | 
| 89 100 | 
             
                describe 'with build flags' do
         | 
| 90 101 |  | 
| 91 102 | 
             
                  before do
         | 
| @@ -51,6 +51,35 @@ describe Sprinkle::Policy do | |
| 51 51 | 
             
                end
         | 
| 52 52 |  | 
| 53 53 | 
             
              end
         | 
| 54 | 
            +
              
         | 
| 55 | 
            +
              describe 'with the same package multiple times' do
         | 
| 56 | 
            +
                include Sprinkle::Package
         | 
| 57 | 
            +
                
         | 
| 58 | 
            +
                before do
         | 
| 59 | 
            +
                  @deployment = double(Sprinkle::Deployment)
         | 
| 60 | 
            +
                  actor = double(:servers_for_role? => true)
         | 
| 61 | 
            +
                  @deployment.stub(:style).and_return(actor)
         | 
| 62 | 
            +
                  Sprinkle::Package::PACKAGES.clear # reset full package list before each spec is run
         | 
| 63 | 
            +
                  
         | 
| 64 | 
            +
                  @user = package :user do; end
         | 
| 65 | 
            +
                  
         | 
| 66 | 
            +
                  @policy = policy :test, :roles => :app do
         | 
| 67 | 
            +
                    requires :user, :name => "josh"
         | 
| 68 | 
            +
                    requires :user, :name => "bill"
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
                
         | 
| 72 | 
            +
                it "should call process on both users" do
         | 
| 73 | 
            +
                  (all=@policy.package_install_tree).size.should == 2
         | 
| 74 | 
            +
                  all.each do |p|
         | 
| 75 | 
            +
                    p.should_receive(:process).and_return
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
                
         | 
| 79 | 
            +
                after do
         | 
| 80 | 
            +
                  @policy.process(@deployment)
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
              end
         | 
| 54 83 |  | 
| 55 84 | 
             
              describe 'with packages' do
         | 
| 56 85 | 
             
                include Sprinkle::Package
         | 
| @@ -72,7 +101,7 @@ describe Sprinkle::Policy do | |
| 72 101 | 
             
                  @d.stub(:instance).and_return(@d)
         | 
| 73 102 |  | 
| 74 103 | 
             
                  @policy = policy :test, :roles => :app do; requires :a; end
         | 
| 75 | 
            -
                  $terminal.stub(:choose).and_return( | 
| 104 | 
            +
                  $terminal.stub(:choose).and_return(@c) # stub out highline asking questions
         | 
| 76 105 | 
             
                end
         | 
| 77 106 |  | 
| 78 107 | 
             
                describe 'when applying' do
         | 
| @@ -123,7 +152,7 @@ describe Sprinkle::Policy do | |
| 123 152 |  | 
| 124 153 | 
             
                  it 'should ask the user for the concrete package implementation to use for a virtual one when more than one possible choice exists' do
         | 
| 125 154 | 
             
                    @policy = policy :virtual, :roles => :app do; requires :abc; end
         | 
| 126 | 
            -
                    $terminal.should_receive(:choose).and_return( | 
| 155 | 
            +
                    $terminal.should_receive(:choose).and_return(@c)
         | 
| 127 156 | 
             
                    @c.should_receive(:process)
         | 
| 128 157 | 
             
                  end
         | 
| 129 158 |  | 
| @@ -65,7 +65,7 @@ describe Sprinkle::Verify do | |
| 65 65 | 
             
                  end
         | 
| 66 66 | 
             
                end
         | 
| 67 67 | 
             
                @verification = @package.verifications[0]
         | 
| 68 | 
            -
                @delivery = double(Sprinkle::Deployment, :process => true, :sudo_command => "sudo")
         | 
| 68 | 
            +
                @delivery = double(Sprinkle::Deployment, :process => true, :sudo_command => "sudo", :sudo? => false)
         | 
| 69 69 | 
             
                @verification.delivery = @delivery
         | 
| 70 70 | 
             
              end
         | 
| 71 71 |  | 
| @@ -136,8 +136,8 @@ describe Sprinkle::Verify do | |
| 136 136 | 
             
                  @verification.commands.should include('id bob')
         | 
| 137 137 | 
             
                end
         | 
| 138 138 |  | 
| 139 | 
            -
                it 'should use  | 
| 140 | 
            -
                  @verification.commands.should include(' | 
| 139 | 
            +
                it 'should use egrep to check a group exists' do
         | 
| 140 | 
            +
                  @verification.commands.should include('egrep -i "^bobgroup:" /etc/group')
         | 
| 141 141 | 
             
                end
         | 
| 142 142 |  | 
| 143 143 | 
             
                it 'should do a "test -L" to check something is a symbolic link' do
         | 
    
        data/sprinkle.gemspec
    CHANGED
    
    | @@ -34,7 +34,7 @@ Gem::Specification.new do |s| | |
| 34 34 | 
             
              s.add_runtime_dependency(%q<open4>, [">= 1.1.0"])
         | 
| 35 35 | 
             
              s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
         | 
| 36 36 | 
             
              s.add_runtime_dependency(%q<highline>, [">= 1.4.0"])
         | 
| 37 | 
            -
              s.add_runtime_dependency(%q<capistrano>, [" | 
| 37 | 
            +
              s.add_runtime_dependency(%q<capistrano>, [">= 2.5.5", '< 3'])
         | 
| 38 38 |  | 
| 39 39 | 
             
            end
         | 
| 40 40 |  | 
    
        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.7. | 
| 4 | 
            +
              version: 0.7.7
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date:  | 
| 13 | 
            +
            date: 2014-07-17 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: rspec
         | 
| @@ -129,17 +129,23 @@ dependencies: | |
| 129 129 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 130 130 | 
             
                none: false
         | 
| 131 131 | 
             
                requirements:
         | 
| 132 | 
            -
                - -  | 
| 132 | 
            +
                - - ! '>='
         | 
| 133 133 | 
             
                  - !ruby/object:Gem::Version
         | 
| 134 134 | 
             
                    version: 2.5.5
         | 
| 135 | 
            +
                - - <
         | 
| 136 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 137 | 
            +
                    version: '3'
         | 
| 135 138 | 
             
              type: :runtime
         | 
| 136 139 | 
             
              prerelease: false
         | 
| 137 140 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 138 141 | 
             
                none: false
         | 
| 139 142 | 
             
                requirements:
         | 
| 140 | 
            -
                - -  | 
| 143 | 
            +
                - - ! '>='
         | 
| 141 144 | 
             
                  - !ruby/object:Gem::Version
         | 
| 142 145 | 
             
                    version: 2.5.5
         | 
| 146 | 
            +
                - - <
         | 
| 147 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 148 | 
            +
                    version: '3'
         | 
| 143 149 | 
             
            description: Ruby DSL based software provisioning tool
         | 
| 144 150 | 
             
            email: crafterm@redartisan.com
         | 
| 145 151 | 
             
            executables:
         |