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

Version Path
dynflow-0.8.7 lib/dynflow/middleware/resolver.rb
dynflow-0.8.6 lib/dynflow/middleware/resolver.rb
dynflow-0.8.5 lib/dynflow/middleware/resolver.rb
dynflow-0.8.4 lib/dynflow/middleware/resolver.rb
dynflow-0.8.3 lib/dynflow/middleware/resolver.rb
dynflow-0.8.2 lib/dynflow/middleware/resolver.rb
dynflow-0.8.1 lib/dynflow/middleware/resolver.rb
dynflow-0.8.0 lib/dynflow/middleware/resolver.rb
dynflow-0.7.9 lib/dynflow/middleware/resolver.rb
dynflow-0.7.8 lib/dynflow/middleware/resolver.rb
dynflow-0.7.7 lib/dynflow/middleware/resolver.rb
dynflow-0.7.6 lib/dynflow/middleware/resolver.rb
dynflow-0.7.5 lib/dynflow/middleware/resolver.rb
dynflow-0.7.4 lib/dynflow/middleware/resolver.rb
dynflow-0.7.3 lib/dynflow/middleware/resolver.rb
dynflow-0.7.2 lib/dynflow/middleware/resolver.rb
dynflow-0.7.1 lib/dynflow/middleware/resolver.rb
dynflow-0.7.0 lib/dynflow/middleware/resolver.rb
dynflow-0.6.2 lib/dynflow/middleware/resolver.rb
dynflow-0.6.1 lib/dynflow/middleware/resolver.rb