class Dynflow::Middleware::Resolver
Public Class Methods
new(register)
click to toggle source
# File lib/dynflow/middleware/resolver.rb, line 10 def initialize(register) @register = Type! register, Middleware::Register end
Public Instance Methods
result()
click to toggle source
# File lib/dynflow/middleware/resolver.rb, line 14 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 25 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 59 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 55 def tsort_each_node(&block) @deps.each_key(&block) end