class Gem::DependencyResolver::InstallerSet

Attributes

always_install[R]

List of Gem::Specification objects that must always be installed.

ignore_dependencies[RW]

Only install gems in the #always_install list

ignore_installed[RW]

Do not look in the installed set when finding specifications. This is used by the –install-dir option to `gem install`

Public Class Methods

new(domain) click to toggle source
# File lib/rubygems/dependency_resolver/installer_set.rb, line 19
def initialize domain
  @domain = domain

  @f = Gem::SpecFetcher.fetcher

  @all = Hash.new { |h,k| h[k] = [] }
  @always_install      = []
  @ignore_dependencies = false
  @ignore_installed    = false
  @loaded_remote_specs = []
  @specs               = {}
end

Public Instance Methods

consider_local?() click to toggle source

Should local gems should be considered?

# File lib/rubygems/dependency_resolver/installer_set.rb, line 35
def consider_local?
  @domain == :both or @domain == :local
end
consider_remote?() click to toggle source

Should remote gems should be considered?

# File lib/rubygems/dependency_resolver/installer_set.rb, line 42
def consider_remote?
  @domain == :both or @domain == :remote
end
find_all(req) click to toggle source

Returns an array of IndexSpecification objects matching DependencyRequest req.

# File lib/rubygems/dependency_resolver/installer_set.rb, line 50
def find_all req
  res = []

  dep  = req.dependency

  return res if @ignore_dependencies and
            @always_install.none? { |spec| dep.matches_spec? spec }

  name = dep.name

  dep.matching_specs.each do |gemspec|
    next if @always_install.include? gemspec

    res << Gem::DependencyResolver::InstalledSpecification.new(self, gemspec)
  end unless @ignore_installed

  if consider_local? then
    local_source = Gem::Source::Local.new

    if spec = local_source.find_gem(name, dep.requirement) then
      res << Gem::DependencyResolver::IndexSpecification.new(
        self, spec.name, spec.version, local_source, spec.platform)
    end
  end

  if consider_remote? then
    load_remote_specs dep

    @all[name].each do |remote_source, n|
      if dep.match? n then
        res << Gem::DependencyResolver::IndexSpecification.new(
          self, n.name, n.version, remote_source, n.platform)
      end
    end
  end

  res
end
load_remote_specs(dep) click to toggle source

Loads remote prerelease specs if dep is a prerelease dependency

# File lib/rubygems/dependency_resolver/installer_set.rb, line 100
def load_remote_specs dep
  types = [:released]
  types << :prerelease if dep.prerelease?

  types.each do |type|
    next if @loaded_remote_specs.include? type
    @loaded_remote_specs << type

    list, = @f.available_specs type

    list.each do |uri, specs|
      specs.each do |n|
        @all[n.name] << [uri, n]
      end
    end
  end
end
load_spec(name, ver, platform, source) click to toggle source

Called from IndexSpecification to get a true Specification object.

# File lib/rubygems/dependency_resolver/installer_set.rb, line 122
def load_spec name, ver, platform, source
  key = "#{name}-#{ver}-#{platform}"

  @specs.fetch key do
    tuple = Gem::NameTuple.new name, ver, platform

    @specs[key] = source.fetch_spec tuple
  end
end
prefetch(reqs) click to toggle source

No prefetching needed since we load the whole index in initially.

# File lib/rubygems/dependency_resolver/installer_set.rb, line 135
def prefetch(reqs)
end