class Dynflow::Middleware::Resolver

Public Class Methods

new(register) click to toggle source
# File lib/dynflow/middleware/resolver.rb, line 9
def initialize(register)
  @register = Type! register, Middleware::Register
end

Public Instance Methods

result() click to toggle source
# File lib/dynflow/middleware/resolver.rb, line 13
def result
  @result ||= begin
    @deps = normalize_rules(@register.rules)
    self.tsort
  end
end

Private Instance Methods

normalize_rules(rules) click to toggle source

Takes eliminate :replace and :before rules. Returns hash, that maps middleware classes to their dependencies

# File lib/dynflow/middleware/resolver.rb, line 24
def normalize_rules(rules)
  deps          = Hash.new { |h, k| h[k] = [] }
  substitutions = {}

  # replace before with after on oposite direction and build the
  # substitutions dictionary
  rules.each do |middleware_class, middleware_rules|
    deps[middleware_class].concat(middleware_rules[:after])
    middleware_rules[:before].each do |dependent_class|
      deps[dependent_class] << middleware_class
    end
    middleware_rules[:replace].each do |replaced|
      substitutions[replaced] = middleware_class
    end
  end

  # replace the middleware to be substituted
  substitutions.each do |old, new|
    deps[new].concat(deps[old])
    deps.delete(old)
  end

  # ignore deps, that are not present in the stack
  deps.each do |middleware_class, middleware_deps|
    middleware_deps.reject! { |dep| !deps.has_key?(dep) }
  end

  return deps.delete_if {|klass, _| klass.nil? }
end
tsort_each_child(node, &block) click to toggle source
# File lib/dynflow/middleware/resolver.rb, line 58
def tsort_each_child(node, &block)
  @deps.fetch(node).each(&block)
end
tsort_each_node(&block) click to toggle source
# File lib/dynflow/middleware/resolver.rb, line 54
def tsort_each_node(&block)
  @deps.each_key(&block)
end