123456789_123456789_123456789_123456789_123456789_

Class: Gem::Resolver::InstallerSet

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Set
Instance Chain:
self, Set
Inherits: Gem::Resolver::Set
Defined in: lib/rubygems/resolver/installer_set.rb

Overview

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

Class Method Summary

Instance Attribute Summary

Set - Inherited

#errors

Errors encountered when resolving gems.

#prerelease

When true, allows matching of requests to prerelease gems.

#remote

Set to true to disable network access for this set.

Instance Method Summary

Set - Inherited

#find_all

The find_all method must be implemented.

#prefetch

The #prefetch method may be overridden, but this is not necessary.

Constructor Details

.new(domain) ⇒ InstallerSet

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

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 32

def initialize domain
  super()

  @domain = domain
  @remote = consider_remote?

  @f = Gem::SpecFetcher.fetcher

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

Instance Attribute Details

#prerelease=(allow_prerelease) (writeonly)

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 165

def prerelease= allow_prerelease
  super

  @remote_set.prerelease = allow_prerelease
end

Instance Method Details

#add_always_install(dependency)

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

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 52

def add_always_install dependency
  request = Gem::Resolver::DependencyRequest.new dependency, nil

  found = find_all request

  found.delete_if { |s|
    s.version.prerelease? and not s.local?
  } unless dependency.prerelease?

  found = found.select do |s|
    Gem::Source::SpecificFile === s.source or
      Gem::Platform::RUBY == s.platform or
      Gem::Platform.local === s.platform
  end

  if found.empty? then
    exc = Gem::UnsatisfiableDependencyError.new request
    exc.errors = errors

    raise exc
  end

  newest = found.max_by do |s|
    [s.version, s.platform == Gem::Platform::RUBY ? -1 : 1]
  end

  @always_install << newest.spec
end

#add_local(dep_name, spec, source)

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

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 85

def add_local dep_name, spec, source
  @local[dep_name] = [spec, source]
end

#errors

Errors encountered while resolving gems

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 106

def errors
  @errors + @remote_set.errors
end

#find_all(req)

Returns an array of IndexSpecification objects matching DependencyRequest req.

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 114

def find_all req
  res = []

  dep  = req.dependency

  return res if @ignore_dependencies and
            @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? then
    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

    local_source = Gem::Source::Local.new

    begin
      if local_spec = local_source.find_gem(name, dep.requirement) then
        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.delete_if do |spec|
    spec.version.prerelease? and not dep.prerelease?
  end

  res.concat @remote_set.find_all req if consider_remote?

  res
end

#prefetch(reqs)

[ GitHub ]

  
# File 'lib/rubygems/resolver/installer_set.rb', line 161

def prefetch(reqs)
  @remote_set.prefetch(reqs) if consider_remote?
end