Gem::DependencyList is used for installing and uninstalling gems in the correct order to avoid conflicts.
- A
- C
- D
- E
- F
- N
- O
- R
- S
- T
- W
[RW] | development | Allows enabling/disabling use of development dependencies |
[R] | specs |
Creates a DependencyList from a Gem::SourceIndex source_index
Creates a DependencyList from the current specs.
Creates a new DependencyList. If development
is true,
development dependencies will be included.
Adds gemspecs
to the dependency list.
Return a list of the gem specifications in the dependency list, sorted in order so that no gemspec in the list depends on a gemspec earlier in the list.
This is useful when removing gems from a set of installed gems. By removing them in the returned order, you don't get into as many dependency issues.
If there are circular dependencies (yuck!), then gems will be returned in order until only the circular dependents and anything they reference are left. Then arbitrary gemspecs will be returned until the circular dependency is broken, after which gems will be returned in dependency order again.
# File ../ruby/lib/rubygems/dependency_list.rb, line 79 def dependency_order sorted = strongly_connected_components.flatten result = [] seen = {} sorted.each do |spec| if index = seen[spec.name] then if result[index].version < spec.version then result[index] = spec end else seen[spec.name] = result.length result << spec end end result.reverse end
Iterator over #dependency_order
Are all the dependencies in the list satisfied?
Is is ok to remove a gemspec from the dependency list?
If removing the gemspec creates breaks a currently ok dependency, then it is NOT ok to remove the gemspec.
# File ../ruby/lib/rubygems/dependency_list.rb, line 146 def ok_to_remove?(full_name) gem_to_remove = find_name full_name siblings = @specs.find_all { |s| s.name == gem_to_remove.name && s.full_name != gem_to_remove.full_name } deps = [] @specs.each do |spec| spec.dependencies.each do |dep| deps << dep if gem_to_remove.satisfies_requirement?(dep) end end deps.all? { |dep| siblings.any? { |s| s.satisfies_requirement? dep } } end
Removes the gemspec matching full_name
from the dependency
list
Remove everything in the DependencyList that matches but doesn't
satisfy items in dependencies
(a hash of gem names to arrays
of dependencies).
Return a hash of predecessors. result[spec]
is an Array of
gemspecs that have a dependency satisfied by the named gemspec.
# File ../ruby/lib/rubygems/dependency_list.rb, line 192 def spec_predecessors result = Hash.new { |h,k| h[k] = [] } specs = @specs.sort.reverse specs.each do |spec| specs.each do |other| next if spec == other other.dependencies.each do |dep| if spec.satisfies_requirement? dep then result[spec] << other end end end end result end
# File ../ruby/lib/rubygems/dependency_list.rb, line 216 def tsort_each_child(node, &block) specs = @specs.sort.reverse dependencies = node.runtime_dependencies dependencies.push(*node.development_dependencies) if @development dependencies.each do |dep| specs.each do |spec| if spec.satisfies_requirement? dep then begin yield spec rescue TSort::Cyclic # do nothing end break end end end end
# File ../ruby/lib/rubygems/dependency_list.rb, line 121 def why_not_ok? quick = false unsatisfied = Hash.new { |h,k| h[k] = [] } each do |spec| spec.runtime_dependencies.each do |dep| inst = Gem::Specification.any? { |installed_spec| dep.name == installed_spec.name and dep.requirement.satisfied_by? installed_spec.version } unless inst or @specs.find { |s| s.satisfies_requirement? dep } then unsatisfied[spec.name] << dep return unsatisfied if quick end end end unsatisfied end