class Bundler::Source::RubygemsAggregate - bundler: Ruby Standard Library Documentation

# class Bundler::Source::RubygemsAggregate

### Attributes

source_map[R]
sources[R]

### Public Class Methods

new(sources, source_map) click to toggle source

    # File bundler/source/rubygems_aggregate.rb, line 8
    def initialize(sources, source_map)
      @sources = sources
      @source_map = source_map

      @index = build_index
    end

### Public Instance Methods

identifier() click to toggle source

    # File bundler/source/rubygems_aggregate.rb, line 19
    def identifier
      to_s
    end

specs() click to toggle source

    # File bundler/source/rubygems_aggregate.rb, line 15
    def specs
      @index
    end

to_s() click to toggle source

    # File bundler/source/rubygems_aggregate.rb, line 23
    def to_s
      "any of the sources"
    end

### Private Instance Methods

build_index() click to toggle source

    # File bundler/source/rubygems_aggregate.rb, line 29
    def build_index
      Index.build do |idx|
        dependency_names = source_map.pinned_spec_names

        sources.all_sources.each do |source|
          source.dependency_names = dependency_names - source_map.pinned_spec_names(source)
          idx.add_source source.specs
          dependency_names.concat(source.unmet_deps).uniq!
        end

        double_check_for_index(idx, dependency_names)
      end
    end

double_check_for_index(idx, dependency_names) click to toggle source

Suppose the gem Foo depends on the gem Bar. Foo exists in `Source` A. Bar has some versions that exist in both sources A and B. At this point, the API request will have found all the versions of Bar in source A, but will not have found any versions of Bar from source B, which is a problem if the requested version of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for each spec we found, we add all possible versions from all sources to the index.

    # File bundler/source/rubygems_aggregate.rb, line 48
    def double_check_for_index(idx, dependency_names)
      pinned_names = source_map.pinned_spec_names

      names = :names # do this so we only have to traverse to get dependency_names from the index once
      unmet_dependency_names = lambda do
        return names unless names == :names
        new_names = sources.all_sources.map(&:dependency_names_to_double_check)
        return names = nil if new_names.compact!
        names = new_names.flatten(1).concat(dependency_names)
        names.uniq!
        names -= pinned_names
        names
      end

      sources.all_sources.each do |source|
        source.double_check_for(unmet_dependency_names)
      end
    end