class Bricolage::JobDAG

Public Class Methods

build(jobnets) click to toggle source
# File lib/bricolage/jobnet.rb, line 95
def JobDAG.build(jobnets)
  graph = new
  jobnets.each do |net|
    graph.merge! net
  end
  graph.fix
  graph
end
new() click to toggle source
# File lib/bricolage/jobnet.rb, line 104
def initialize
  @deps = Hash.new { Array.new }   # {JobRef => [JobRef]} (dest->srcs)
end

Public Instance Methods

fix() click to toggle source
# File lib/bricolage/jobnet.rb, line 122
def fix
  @deps.freeze
  check_cycle
  check_orphan
end
merge!(net) click to toggle source
# File lib/bricolage/jobnet.rb, line 116
def merge!(net)
  net.each_dependencies do |ref, deps|
    @deps[ref] |= deps
  end
end
sequential_jobs() click to toggle source
# File lib/bricolage/jobnet.rb, line 128
def sequential_jobs
  tsort.reject {|ref| ref.dummy? }
end
to_hash() click to toggle source
# File lib/bricolage/jobnet.rb, line 108
def to_hash
  h = {}
  @deps.each do |dest, srcs|
    h[dest.to_s] = srcs.map(&:to_s)
  end
  h
end
tsort_each_child(ref, &block) click to toggle source
# File lib/bricolage/jobnet.rb, line 138
def tsort_each_child(ref, &block)
  @deps.fetch(ref).each(&block)
end
tsort_each_node(&block) click to toggle source
# File lib/bricolage/jobnet.rb, line 134
def tsort_each_node(&block)
  @deps.each_key(&block)
end

Private Instance Methods

check_cycle() click to toggle source
# File lib/bricolage/jobnet.rb, line 144
def check_cycle
  each_strongly_connected_component do |refs|
    unless refs.size == 1
      cycle = (refs + [refs.first]).reverse.join(' -> ')
      raise ParameterError, "found cycle in the jobnet: #{cycle}"
    end
  end
end
check_orphan() click to toggle source
# File lib/bricolage/jobnet.rb, line 153
def check_orphan
  orphan_nodes.each do |ref|
    raise ParameterError, "found orphan job in the jobnet: #{ref.location}: #{ref}"
  end
end
orphan_nodes() click to toggle source
# File lib/bricolage/jobnet.rb, line 159
def orphan_nodes
  @deps.to_a.select {|ref, deps| deps.empty? and not ref.dummy? }.map {|ref, *| ref }
end