Sha256: 29bef2ced18abd37182eecdd53a2d6b930c0cf0cfe8be9446ae88bf0b37b1b80

Contents?: true

Size: 1.58 KB

Versions: 49

Compression:

Stored size: 1.58 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.delete_if {|klass, _| klass.nil? }
    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

49 entries across 49 versions & 1 rubygems

Version Path
dynflow-1.3.0 lib/dynflow/middleware/resolver.rb
dynflow-1.2.3 lib/dynflow/middleware/resolver.rb
dynflow-1.2.2 lib/dynflow/middleware/resolver.rb
dynflow-1.2.1 lib/dynflow/middleware/resolver.rb
dynflow-1.2.0 lib/dynflow/middleware/resolver.rb
dynflow-1.2.0.pre1 lib/dynflow/middleware/resolver.rb
dynflow-1.1.6 lib/dynflow/middleware/resolver.rb
dynflow-1.1.5 lib/dynflow/middleware/resolver.rb
dynflow-1.1.4 lib/dynflow/middleware/resolver.rb
dynflow-1.1.3 lib/dynflow/middleware/resolver.rb
dynflow-1.1.2 lib/dynflow/middleware/resolver.rb
dynflow-1.1.1 lib/dynflow/middleware/resolver.rb
dynflow-1.1.0 lib/dynflow/middleware/resolver.rb
dynflow-1.0.5 lib/dynflow/middleware/resolver.rb
dynflow-1.0.4 lib/dynflow/middleware/resolver.rb
dynflow-1.0.3 lib/dynflow/middleware/resolver.rb
dynflow-1.0.2 lib/dynflow/middleware/resolver.rb
dynflow-1.0.1 lib/dynflow/middleware/resolver.rb
dynflow-1.0.0 lib/dynflow/middleware/resolver.rb
dynflow-0.8.37 lib/dynflow/middleware/resolver.rb