Sha256: 1deb33ba026e2b7c0332da743b9c9d0b21257c07ea18b9cc8b303095d1c964f1

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 KB

Contents

require "virtus"
require "docktor/container"

module Docktor
  class Manifest
    include Virtus.model

    class ContainerNotFound < StandardError; end

    values do
      attribute :containers_for_execution, Array[String]
      attribute :containers, Array[Docktor::Container]
    end

    def select_container_for_execution(container_name)
      select_containers_for_execution([container_name])
    end

    def select_containers_for_execution(container_names)
      self.containers_for_execution = []

      container_names.each do |name|
        container = find_container_by_name(name)

        fail ContainerNotFound, %(There is no container "#{name}") if container.nil?

        containers_for_execution << container
        self.containers_for_execution += find_container_links(container)
      end

      containers_for_execution.uniq!
      sort_containers_for_execution!
    end

    def find_container_by_name(name)
      containers.find { |container| container.name == name }
    end

    def find_container_links(container)
      container.links.map { |link| find_container_by_name link }
    end

    def sort_containers_for_execution!
      sorted_containers = []

      containers_for_execution.each do |container|
        links_indexes = container.links.map { |link| sorted_containers.index link }
        sorted_containers.insert((links_indexes.max || -1) + 1, container)
      end

      self.containers_for_execution = sorted_containers
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
docktor-0.2.0 lib/docktor/manifest.rb