class Bundler::Resolver::Base - bundler: Ruby Standard Library Documentation

# class Bundler::Resolver::Base

### Attributes

packages[R]
requirements[R]
source_requirements[R]

### Public Class Methods

new(source_requirements, dependencies, base, platforms, options) click to toggle source

    # File bundler/resolver/base.rb, line 10
    def initialize(source_requirements, dependencies, base, platforms, options)
      @source_requirements = source_requirements

      @base = base

      @packages = Hash.new do |hash, name|
        hash[name] = Package.new(name, platforms, **options)
      end

      @requirements = dependencies.filter_map do |dep|
        dep_platforms = dep.gem_platforms(platforms)

        # Dependencies scoped to external platforms are ignored
        next if dep_platforms.empty?

        name = dep.name

        @packages[name] = Package.new(name, dep_platforms, **options.merge(dependency: dep))

        dep
      end
    end

### Public Instance Methods

[](name) click to toggle source

    # File bundler/resolver/base.rb, line 33
    def [](name)
      @base[name]
    end

base_requirements() click to toggle source

    # File bundler/resolver/base.rb, line 45
    def base_requirements
      @base_requirements ||= build_base_requirements
    end

delete(specs) click to toggle source

    # File bundler/resolver/base.rb, line 37
    def delete(specs)
      @base.delete(specs)
    end

get_package(name) click to toggle source

    # File bundler/resolver/base.rb, line 41
    def get_package(name)
      @packages[name]
    end

include_prereleases(names) click to toggle source

    # File bundler/resolver/base.rb, line 65
    def include_prereleases(names)
      names.each do |name|
        get_package(name).consider_prereleases!
      end
    end

include_remote_specs(names) click to toggle source

    # File bundler/resolver/base.rb, line 71
    def include_remote_specs(names)
      names.each do |name|
        get_package(name).consider_remote_versions!
      end
    end

unlock_names(names) click to toggle source

    # File bundler/resolver/base.rb, line 49
    def unlock_names(names)
      indirect_pins = indirect_pins(names)

      if indirect_pins.any?
        loosen_names(indirect_pins)
      else
        pins = pins(names)

        if pins.any?
          loosen_names(pins)
        else
          unrestrict_names(names)
        end
      end
    end

### Private Instance Methods

build_base_requirements() click to toggle source

    # File bundler/resolver/base.rb, line 103
    def build_base_requirements
      base_requirements = {}
      @base.each do |ls|
        if ls.source_changed? && ls.source.specs.search(ls.name).empty?
          raise GemNotFound, "Could not find gem '#{ls.name}' in #{ls.source}"
        end

        req = Gem::Requirement.new(ls.version)
        base_requirements[ls.name] = req
      end
      base_requirements
    end

indirect_pins(names) click to toggle source

    # File bundler/resolver/base.rb, line 79
    def indirect_pins(names)
      names.select {|name| @base_requirements[name].exact? && @requirements.none? {|dep| dep.name == name } }
    end

loosen_names(names) click to toggle source

    # File bundler/resolver/base.rb, line 87
    def loosen_names(names)
      names.each do |name|
        version = @base_requirements[name].requirements.first[1]

        @base_requirements[name] = Gem::Requirement.new(">= #{version}")

        @base.delete_by_name(name)
      end
    end

pins(names) click to toggle source

    # File bundler/resolver/base.rb, line 83
    def pins(names)
      names.select {|name| @base_requirements[name].exact? }
    end

unrestrict_names(names) click to toggle source

    # File bundler/resolver/base.rb, line 97
    def unrestrict_names(names)
      names.each do |name|
        @base_requirements.delete(name)
      end
    end