Sha256: 64efc26e3f6b38fa2c079f9368f3158ce124d5ad38ddd111213a1b9d1a8a94ce

Contents?: true

Size: 962 Bytes

Versions: 4

Compression:

Stored size: 962 Bytes

Contents

require 'tsort'

module Pallets
  class Graph
    include TSort

    def initialize
      @nodes = {}
    end

    def add(node, dependencies)
      raise WorkflowError, "Task #{node} is already defined in this workflow. "\
                           "Use `task '#{node}', as: 'FooBar'` to define an "\
                           "alias and reuse task" if nodes.key?(node)

      nodes[node] = dependencies
    end

    def parents(node)
      nodes[node]
    end

    def empty?
      nodes.empty?
    end

    def each
      return enum_for(__method__) unless block_given?

      tsort_each do |node|
        yield(node, parents(node))
      end
    end

    private

    attr_reader :nodes

    def tsort_each_node(&block)
      nodes.each_key(&block)
    end

    def tsort_each_child(node, &block)
      nodes.fetch(node).each(&block)
    rescue KeyError
      raise WorkflowError, "Task #{node} is marked as a dependency but not defined"
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
pallets-0.11.0 lib/pallets/graph.rb
pallets-0.10.0 lib/pallets/graph.rb
pallets-0.9.0 lib/pallets/graph.rb
pallets-0.8.0 lib/pallets/graph.rb