class Bundler::PubGrub::VersionSolver

Attributes

logger[R]
solution[R]
source[R]

Public Class Methods

new(source:, root: Package.root, logger: Bundler::PubGrub.logger) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb, line 12
def initialize(source:, root: Package.root, logger: Bundler::PubGrub.logger)
  @logger = logger

  @source = source

  # { package => [incompatibility, ...]}
  @incompatibilities = Hash.new do |h, k|
    h[k] = []
  end

  @seen_incompatibilities = {}

  @solution = PartialSolution.new

  add_incompatibility Incompatibility.new([
    Term.new(VersionConstraint.any(root), false)
  ], cause: :root)

  propagate(root)
end

Public Instance Methods

result()
Alias for: solve
solve() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb, line 57
def solve
  work until solved?

  solution.decisions
end
Also aliased as: result
solved?() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb, line 33
def solved?
  solution.unsatisfied.empty?
end
work() click to toggle source

Returns true if there is more work to be done, false otherwise

# File bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb, line 38
def work
  return false if solved?

  next_package = choose_package_version
  propagate(next_package)

  if solved?
    logger.info { "Solution found after #{solution.attempted_solutions} attempts:" }
    solution.decisions.each do |package, version|
      next if Package.root?(package)
      logger.info { "* #{package} #{version}" }
    end

    false
  else
    true
  end
end