Sha256: 2419859b361b519112db1c5017cf38c1a36e19ba09bd834b5e1dc51b2ddadb09

Contents?: true

Size: 1.48 KB

Versions: 2

Compression:

Stored size: 1.48 KB

Contents

require 'set'
module Capistrano
  class Configuration
    class Servers
      include Enumerable

      def add_host(host, properties = {})
        find_or_create_server(host).tap do |host|
          Array(properties.delete(:roles) || properties.delete("roles")).each do |role|
            host.add_role(role)
          end
          properties.each do |key, value|
            unless host.properties.respond_to?(key)
              host.properties.send(:"#{key}=", value)
            end
          end
          servers.add host
        end
      end

      def add_role(role, hosts)
        Array(hosts).each do |host|
          server = find_or_create_server(host)
          server.add_role(role)
          servers.add server
        end
      end

      def fetch_roles(names)
        roles_for(names)
      end

      def fetch_primary(role)
        fetch(role).select { |h| h.properties.primary }.first || fetch(role).first
      end

      def each
        servers.each { |server| yield server }
      end

      private

      def find_or_create_server(host)
        servers.find { |server| server.matches?(host) } || Server.new(host)
      end

      def fetch(name)
        servers.find_all { |server| server.has_role? name }
      end

      def roles_for(names)
        if Array(names).map(&:to_sym).include?(:all)
          servers
        else
          Array(names).flat_map { |name| fetch name }.uniq
        end
      end

      def servers
        @servers ||= Set.new
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
capistrano-3.0.0.pre2 lib/capistrano/configuration/servers.rb
capistrano-3.0.0.pre lib/capistrano/configuration/servers.rb