A set of gems for installation sourced from remote sources and local .gem files
Creates a new InstallerSet that will look
for gems in domain.
# File rubygems/resolver/installer_set.rb, line 31
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
Looks up the latest specification for dependency and adds it
to the always_install list.
# File rubygems/resolver/installer_set.rb, line 51
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
Adds a local gem requested using dep_name with the given
spec that can be loaded and installed using the
source.
# File rubygems/resolver/installer_set.rb, line 84
def add_local dep_name, spec, source
@local[dep_name] = [spec, source]
end
Errors encountered while resolving gems
# File rubygems/resolver/installer_set.rb, line 105
def errors
@errors + @remote_set.errors
end
Returns an array of IndexSpecification objects matching DependencyRequest
req.
# File rubygems/resolver/installer_set.rb, line 113
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
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
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
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.