Sha256: 7ec173dafa45e1c35b0e4678b6b38fbe97d91f6cff29bec4ca0befd91fbbb141
Contents?: true
Size: 1.55 KB
Versions: 26
Compression:
Stored size: 1.55 KB
Contents
require 'tsort' module Dynflow class Middleware::Resolver include TSort include Algebrick::TypeCheck def initialize(register) @register = Type! register, Middleware::Register end def result @result ||= begin @deps = normalize_rules(@register.rules) self.tsort end end private # Takes eliminate :replace and :before rules. # Returns hash, that maps middleware classes to their dependencies 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 end def tsort_each_node(&block) @deps.each_key(&block) end def tsort_each_child(node, &block) @deps.fetch(node).each(&block) end end end
Version data entries
26 entries across 26 versions & 1 rubygems