Class: Gem::Resolver
Relationships & Source Files | |
Namespace Children | |
Classes:
APISet,
APISpecification,
ActivationRequest,
BestSet,
ComposedSet,
Conflict,
CurrentSet,
DependencyRequest,
GitSet,
GitSpecification,
IndexSet,
IndexSpecification,
InstalledSpecification,
InstallerSet,
LocalSpecification,
LockSet,
LockSpecification,
RequirementList,
Set,
SpecSpecification,
Specification,
State,
Stats,
VendorSet,
VendorSpecification
| |
Inherits: | Object |
Defined in: | lib/rubygems/resolver.rb |
Overview
Given a set of Dependency objects as needed
and a way to query the set of available specs via set
, calculates a set of ActivationRequest objects which indicate all the specs that should be activated to meet the all the requirements.
Constant Summary
-
DEBUG_RESOLVER =
If the
DEBUG_RESOLVER
environment variable is set then debugging mode is enabled for the resolver. This will display information about the state of the resolver while a set of dependencies is being resolved.!ENV['DEBUG_RESOLVER'].nil?
Class Method Summary
-
.compose_sets(*sets)
Combines
sets
into a ComposedSet that allows specification lookup in a uniform manner. -
.for_current_gems(needed)
Creates a
Resolver
that queries only against the already installed gems for theneeded
dependencies. -
.new(needed, set = nil) ⇒ Resolver
constructor
Create Resolver object which will resolve the tree starting with
needed
Dependency objects.
Instance Attribute Summary
-
#development
rw
Set to true if all development dependencies should be considered.
-
#development_shallow
rw
Set to true if immediate development dependencies should be considered.
-
#ignore_dependencies
rw
When true, no dependencies are looked up for requested gems.
-
#skip_gems
rw
Hash of gems to skip resolution.
-
#soft_missing
rw
When a missing dependency, don't stop.
-
#conflicts
readonly
Contains all the conflicts encountered while doing resolution.
-
#missing
readonly
List of dependencies that could not be found in the configured sources.
- #stats readonly
Instance Method Summary
-
#resolve
Proceed with resolution! Returns an array of ActivationRequest objects.
Constructor Details
.new(needed, set = nil) ⇒ Resolver
Create Resolver object which will resolve the tree starting with needed
Dependency objects.
set
is an object that provides where to look for specifications to satisfy the Dependencies. This defaults to Resolver::IndexSet, which will query rubygems.org.
# File 'lib/rubygems/resolver.rb', line 109
def initialize needed, set = nil @set = set || Gem::Resolver::IndexSet.new @needed = needed @conflicts = [] @development = false @development_shallow = false @ignore_dependencies = false @missing = [] @skip_gems = {} @soft_missing = false @stats = Gem::Resolver::Stats.new end
Class Method Details
.compose_sets(*sets)
Combines sets
into a Resolver::ComposedSet that allows specification lookup in a uniform manner. If one of the sets
is itself a Resolver::ComposedSet its sets are flattened into the result Resolver::ComposedSet.
# File 'lib/rubygems/resolver.rb', line 69
def self.compose_sets *sets sets.compact! sets = sets.map do |set| case set when Gem::Resolver::BestSet then set when Gem::Resolver::ComposedSet then set.sets else set end end.flatten case sets.length when 0 then raise ArgumentError, 'one set in the composition must be non-nil' when 1 then sets.first else Gem::Resolver::ComposedSet.new(*sets) end end
.for_current_gems(needed)
Creates a Resolver
that queries only against the already installed gems for the needed
dependencies.
# File 'lib/rubygems/resolver.rb', line 97
def self.for_current_gems needed new needed, Gem::Resolver::CurrentSet.new end
Instance Attribute Details
#conflicts (readonly)
Contains all the conflicts encountered while doing resolution
# File 'lib/rubygems/resolver.rb', line 28
attr_reader :conflicts
#development (rw)
Resolver::Set to true if all development dependencies should be considered.
# File 'lib/rubygems/resolver.rb', line 33
attr_accessor :development
#development_shallow (rw)
Resolver::Set to true if immediate development dependencies should be considered.
# File 'lib/rubygems/resolver.rb', line 38
attr_accessor :development_shallow
#ignore_dependencies (rw)
When true, no dependencies are looked up for requested gems.
# File 'lib/rubygems/resolver.rb', line 43
attr_accessor :ignore_dependencies
#missing (readonly)
List of dependencies that could not be found in the configured sources.
# File 'lib/rubygems/resolver.rb', line 48
attr_reader :missing
#skip_gems (rw)
Hash of gems to skip resolution. Keyed by gem name, with arrays of gem specifications as values.
# File 'lib/rubygems/resolver.rb', line 56
attr_accessor :skip_gems
#soft_missing (rw)
When a missing dependency, don't stop. Just go on and record what was missing.
# File 'lib/rubygems/resolver.rb', line 62
attr_accessor :soft_missing
#stats (readonly)
[ GitHub ]# File 'lib/rubygems/resolver.rb', line 50
attr_reader :stats
Instance Method Details
#resolve
Proceed with resolution! Returns an array of Resolver::ActivationRequest objects.
# File 'lib/rubygems/resolver.rb', line 182
def resolve @conflicts = [] needed = Gem::Resolver::RequirementList.new @needed.reverse_each do |n| request = Gem::Resolver::DependencyRequest.new n, nil needed.add request @stats.requirement! end @stats.record_requirements needed res = resolve_for needed, nil raise Gem::DependencyResolutionError, res if res.kind_of? Gem::Resolver::Conflict res.to_a end