def run!
      @cookbooks.each do |name, c|
        cookbook = c[:cookbook]
        strainerfile = c[:strainerfile]

        Strainer.ui.debug "Starting Runner for #{cookbook.cookbook_name} (#{cookbook.version})"
        Strainer.ui.header("# Straining '#{cookbook.cookbook_name} (v#{cookbook.version})'")

        strainerfile.commands.each do |command|
          success = command.run!

          @report[cookbook.cookbook_name] ||= {}
          @report[cookbook.cookbook_name][command.label] = success
          Strainer.ui.debug "Strainer::Runner#report: #{@report.inspect}"

          if options[:fail_fast] && !success
            Strainer.ui.debug "Run was not successful and --fail-fast was specified"
            Strainer.ui.fatal "Exited early because '--fail-fast' was specified. Some tests may have been skipped!"
            return false
          end
        end
      end

      # Move the logfile back over
      if File.exist?(Strainer.sandbox_path.join('strainer.out'))
        FileUtils.mv(Strainer.logfile_path, Strainer.sandbox_path.join('strainer.out'))
      end

      success = @report.values.collect(&:values).flatten.all?

      msg = success ? "Strainer marked build OK" : "Strainer marked build as failure"
      Strainer.ui.say msg

      return success
    end
def run!
      @cookbooks.each do |name, c|
        cookbook = c[:cookbook]
        strainerfile = c[:strainerfile]

        Strainer.ui.debug "Starting Runner for #{cookbook.cookbook_name} (#{cookbook.version})"
        Strainer.ui.header("# Straining '#{cookbook.cookbook_name} (v#{cookbook.version})'")

        strainerfile.commands.each do |command|
          success = command.run!

          @report[cookbook.cookbook_name] ||= {}
          @report[cookbook.cookbook_name][command.label] = success
          Strainer.ui.debug "Strainer::Runner#report: #{@report.inspect}"

          if options[:fail_fast] && !success
            Strainer.ui.debug "Run was not successful and --fail-fast was specified"
            Strainer.ui.fatal "Exited early because '--fail-fast' was specified. Some tests may have been skipped!"
            return false
          end
        end
      end

      # Move the logfile back over
      if File.exist?(Strainer.sandbox_path.join('strainer.out'))
        FileUtils.mv(Strainer.logfile_path, Strainer.sandbox_path.join('strainer.out'))
      end

      success = @report.values.collect(&:values).flatten.all?

      msg = success ? "Strainer marked build OK" : "Strainer marked build as failure"
      Strainer.ui.say msg

      return success
    end
Creates a Strainer runner

 @param [Array<String>] cookbook_names
   an array of cookbook_names to test and load into the sandbox
 @param [Hash] options
   a list of options to pass along
 Runs the Strainer runner