Sha256: 7a8510af868e32714e6c4390aed7f5ab4cd0b6844431d2a8be9cdd102e47ccf8

Contents?: true

Size: 1.96 KB

Versions: 7

Compression:

Stored size: 1.96 KB

Contents


module Capricorn
  class Satellite
    class DependencyLoader
      
      attr_reader :names, :specs, :engines
      
      def self.load_for(engines)
        dependency_loader = self.new(engines)
        dependency_loader.add_dependecies!
        dependency_loader.order_by_dependecies!
        
        return dependency_loader
      end
      
      def initialize(engines)
        specs = engines.collect do |k,r|
          s = Gem.source_index.find_name(k, Gem::Requirement.new(r[:version] || ">= 0.0.0"))
          s.last
        end.compact
        
        @names = specs.collect { |spec| spec.name }
        @specs = specs.inject({}) { |h, spec| h[spec.name] = spec ; h }
        @engines = engines
      end
      
      def add_dependecies!
        @specs.values.each do |spec|
          add_dependecies_for spec
        end
      end
      
      def order_by_dependecies!
        @names = tsort
      end
      
      def each
        @names.each do |name|
          yield(@specs[name])
        end
      end
      
      def reverse_each
        @names.reverse.each do |name|
          yield(@specs[name])
        end
      end
      
    private
      
      include TSort
      
      def add_dependecies_for(spec)
        engine_dependencies = spec.engine_dependencies || {}
        engine_dependencies.each do |name, options|
          gems = Gem.source_index.find_name(name, [options[:version]].compact)
          next unless gem = gems.last
          next if @names.include?(name) and gem.version <= @specs[gem.name].version
          @specs[gem.name] = gem
          @names.push(gem.name)
          add_dependecies_for(gem)
        end
        @engines = @engines.merge(engine_dependencies)
      end
      
      def tsort_each_node(&block)
        @names.each(&block)
      end
      
      def tsort_each_child(node, &block)
        engine_dependencies = @specs[node].engine_dependencies || {}
        engine_dependencies.keys.each(&block)
      end
      
    end
  end
end

Version data entries

7 entries across 7 versions & 2 rubygems

Version Path
simonmenke-capricorn-0.2.00 lib/capricorn/satellite/dependency_loader.rb
simonmenke-capricorn-0.2.03 lib/capricorn/satellite/dependency_loader.rb
capricorn-0.2.04 lib/capricorn/satellite/dependency_loader.rb
capricorn-0.2.03 lib/capricorn/satellite/dependency_loader.rb
capricorn-0.2.02 lib/capricorn/satellite/dependency_loader.rb
capricorn-0.2.01 lib/capricorn/satellite/dependency_loader.rb
capricorn-0.2.00 lib/capricorn/satellite/dependency_loader.rb