class Gem::Resolver::InstallerSet

A set of gems for installation sourced from remote sources and local .gem files

Public Class Methods

new(domain) click to toggle source

Creates a new InstallerSet that will look for gems in domain.

Calls superclass method BasicObject::new
# File lib/rubygems/resolver/installer_set.rb, line 37
def initialize(domain)
  super()

  @domain = domain

  @f = Gem::SpecFetcher.fetcher

  @always_install      = []
  @ignore_dependencies = false
  @ignore_installed    = false
  @local               = {}
  @local_source        = Gem::Source::Local.new
  @remote_set          = Gem::Resolver::BestSet.new
  @force               = false
  @specs               = {}
end

Public Instance Methods

add_always_install(dependency) click to toggle source

Looks up the latest specification for dependency and adds it to the always_install list.

# File lib/rubygems/resolver/installer_set.rb, line 58
def add_always_install(dependency)
  request = Gem::Resolver::DependencyRequest.new dependency, nil

  found = find_all request

  found.delete_if do |s|
    s.version.prerelease? && !s.local?
  end unless dependency.prerelease?

  found = found.select do |s|
    Gem::Source::SpecificFile === s.source ||
      Gem::Platform.match(s.platform)
  end

  found = found.sort_by do |s|
    [s.version, Gem::Platform.sort_priority(s.platform)]
  end

  newest = found.last

  unless newest
    exc = Gem::UnsatisfiableDependencyError.new request
    exc.errors = errors

    raise exc
  end

  unless @force
    found_matching_metadata = found.reverse.find do |spec|
      metadata_satisfied?(spec)
    end

    if found_matching_metadata.nil?
      ensure_required_ruby_version_met(newest.spec)
      ensure_required_rubygems_version_met(newest.spec)
    else
      newest = found_matching_metadata
    end
  end

  @always_install << newest.spec
end
add_local(dep_name, spec, source) click to toggle source

Adds a local gem requested using dep_name with the given spec that can be loaded and installed using the source.

# File lib/rubygems/resolver/installer_set.rb, line 105
def add_local(dep_name, spec, source)
  @local[dep_name] = [spec, source]
end
errors() click to toggle source

Errors encountered while resolving gems

# File lib/rubygems/resolver/installer_set.rb, line 126
def errors
  @errors + @remote_set.errors
end
find_all(req) click to toggle source

Returns an array of IndexSpecification objects matching DependencyRequest req.

# File lib/rubygems/resolver/installer_set.rb, line 134
def find_all(req)
  res = []

  dep = req.dependency

  return res if @ignore_dependencies &&
                @always_install.none? {|spec| dep.match? spec }

  name = dep.name

  dep.matching_specs.each do |gemspec|
    next if @always_install.any? {|spec| spec.name == gemspec.name }

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

  if consider_local?
    matching_local = @local.values.select do |spec, _|
      req.match? spec
    end.map do |spec, source|
      Gem::Resolver::LocalSpecification.new self, spec, source
    end

    res.concat matching_local

    begin
      if local_spec = @local_source.find_gem(name, dep.requirement)
        res << Gem::Resolver::IndexSpecification.new(
          self, local_spec.name, local_spec.version,
          @local_source, local_spec.platform)
      end
    rescue Gem::Package::FormatError
      # ignore
    end
  end

  res.concat @remote_set.find_all req if consider_remote?

  res
end
prefetch(reqs) click to toggle source
# File lib/rubygems/resolver/installer_set.rb, line 175
def prefetch(reqs)
  @remote_set.prefetch(reqs) if consider_remote?
end
prerelease=(allow_prerelease) click to toggle source
Calls superclass method
# File lib/rubygems/resolver/installer_set.rb, line 179
def prerelease=(allow_prerelease)
  super

  @remote_set.prerelease = allow_prerelease
end

Private Instance Methods

metadata_satisfied?(spec) click to toggle source
# File lib/rubygems/resolver/installer_set.rb, line 244
def metadata_satisfied?(spec)
  spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
    spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
end