class Bundler::Definition

def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil, optional_groups = [], gemfiles = [])

Parameters:
  • optional_groups (Array(String)) -- A list of optional groups
  • ruby_version (Bundler::RubyVersion, nil) -- Requested Ruby Version
  • unlock (Hash, Boolean, nil) -- Gems that have been requested
  • sources (Bundler::SourceList) --
  • dependencies (Array(Bundler::Dependency)) -- array of dependencies from Gemfile
  • lockfile (Pathname) -- Path to Gemfile.lock
def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil, optional_groups = [], gemfiles = [])
  if [true, false].include?(unlock)
    @unlocking_bundler = false
    @unlocking = unlock
  else
    @unlocking_bundler = unlock.delete(:bundler)
    @unlocking = unlock.any? {|_k, v| !Array(v).empty? }
  end
  @dependencies    = dependencies
  @sources         = sources
  @unlock          = unlock
  @optional_groups = optional_groups
  @prefer_local    = false
  @specs           = nil
  @ruby_version    = ruby_version
  @gemfiles        = gemfiles
  @lockfile               = lockfile
  @lockfile_contents      = String.new
  @locked_bundler_version = nil
  @resolved_bundler_version = nil
  @locked_ruby_version = nil
  @new_platforms = []
  @removed_platform = nil
  if lockfile_exists?
    @lockfile_contents = Bundler.read_file(lockfile)
    @locked_gems = LockfileParser.new(@lockfile_contents)
    @locked_platforms = @locked_gems.platforms
    @platforms = @locked_platforms.dup
    @locked_bundler_version = @locked_gems.bundler_version
    @locked_ruby_version = @locked_gems.ruby_version
    @originally_locked_deps = @locked_gems.dependencies
    @originally_locked_specs = SpecSet.new(@locked_gems.specs)
    @locked_checksums = @locked_gems.checksums
    if unlock != true
      @locked_deps    = @originally_locked_deps
      @locked_specs   = @originally_locked_specs
      @locked_sources = @locked_gems.sources
    else
      @unlock         = {}
      @locked_deps    = {}
      @locked_specs   = SpecSet.new([])
      @locked_sources = []
    end
  else
    @unlock         = {}
    @platforms      = []
    @locked_gems    = nil
    @locked_deps    = {}
    @locked_specs   = SpecSet.new([])
    @originally_locked_deps = {}
    @originally_locked_specs = @locked_specs
    @locked_sources = []
    @locked_platforms = []
    @locked_checksums = Bundler.feature_flag.bundler_3_mode?
  end
  locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) }
  @multisource_allowed = locked_gem_sources.size == 1 && locked_gem_sources.first.multiple_remotes? && Bundler.frozen_bundle?
  if @multisource_allowed
    unless sources.aggregate_global_source?
      msg = "Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure."
      Bundler::SharedHelpers.major_deprecation 2, msg
    end
    @sources.merged_gem_lockfile_sections!(locked_gem_sources.first)
  end
  @sources_to_unlock = @unlock.delete(:sources) || []
  @unlock[:ruby] ||= if @ruby_version && locked_ruby_version_object
    @ruby_version.diff(locked_ruby_version_object)
  end
  @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
  @current_platform_missing = add_current_platform unless Bundler.frozen_bundle?
  converge_path_sources_to_gemspec_sources
  @path_changes = converge_paths
  @source_changes = converge_sources
  @explicit_unlocks = @unlock.delete(:gems) || []
  if @unlock[:conservative]
    @gems_to_unlock = @explicit_unlocks.any? ? @explicit_unlocks : @dependencies.map(&:name)
  else
    eager_unlock = @explicit_unlocks.map {|name| Dependency.new(name, ">= 0") }
    @gems_to_unlock = @locked_specs.for(eager_unlock, false, platforms).map(&:name).uniq
  end
  @dependency_changes = converge_dependencies
  @local_changes = converge_locals
  check_lockfile
end