# File lib/dynflow/middleware/resolver.rb, line 9 def initialize(register) @register = Type! register, Middleware::Register end
# File lib/dynflow/middleware/resolver.rb, line 13 def result @result ||= begin @deps = normalize_rules(@register.rules) self.tsort end end
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
# File lib/dynflow/middleware/resolver.rb, line 58 def tsort_each_child(node, &block) @deps.fetch(node).each(&block) end
# File lib/dynflow/middleware/resolver.rb, line 54 def tsort_each_node(&block) @deps.each_key(&block) end