class Dependabot::Bundler::FileUpdater::GemfileUpdater

Attributes

dependencies[R]
gemfile[R]

Public Class Methods

new(dependencies:, gemfile:) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 13
def initialize(dependencies:, gemfile:)
  @dependencies = dependencies
  @gemfile = gemfile
end

Public Instance Methods

updated_gemfile_content() click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 18
def updated_gemfile_content
  content = gemfile.content

  dependencies.each do |dependency|
    content = replace_gemfile_version_requirement(
      dependency,
      gemfile,
      content
    )

    content = remove_gemfile_git_source(dependency, content) if remove_git_source?(dependency)

    content = update_gemfile_git_pin(dependency, gemfile, content) if update_git_pin?(dependency)
  end

  content
end

Private Instance Methods

remove_gemfile_git_source(dependency, content) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 93
def remove_gemfile_git_source(dependency, content)
  GitSourceRemover.new(dependency: dependency).rewrite(content)
end
remove_git_source?(dependency) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 68
def remove_git_source?(dependency)
  old_gemfile_req =
    dependency.previous_requirements.
    find { |f| %w(Gemfile gems.rb).include?(f[:file]) }

  return false unless old_gemfile_req&.dig(:source, :type) == "git"

  new_gemfile_req =
    dependency.requirements.
    find { |f| %w(Gemfile gems.rb).include?(f[:file]) }

  new_gemfile_req[:source].nil?
end
replace_gemfile_version_requirement(dependency, file, content) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 40
def replace_gemfile_version_requirement(dependency, file, content)
  return content unless requirement_changed?(file, dependency)

  updated_requirement =
    dependency.requirements.
    find { |r| r[:file] == file.name }.
    fetch(:requirement)

  previous_requirement =
    dependency.previous_requirements.
    find { |r| r[:file] == file.name }.
    fetch(:requirement)

  RequirementReplacer.new(
    dependency: dependency,
    file_type: :gemfile,
    updated_requirement: updated_requirement,
    previous_requirement: previous_requirement
  ).rewrite(content)
end
requirement_changed?(file, dependency) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 61
def requirement_changed?(file, dependency)
  changed_requirements =
    dependency.requirements - dependency.previous_requirements

  changed_requirements.any? { |f| f[:file] == file.name }
end
update_gemfile_git_pin(dependency, file, content) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 97
def update_gemfile_git_pin(dependency, file, content)
  new_pin =
    dependency.requirements.
    find { |f| f[:file] == file.name }.
    fetch(:source).fetch(:ref)

  GitPinReplacer.
    new(dependency: dependency, new_pin: new_pin).
    rewrite(content)
end
update_git_pin?(dependency) click to toggle source
# File lib/dependabot/bundler/file_updater/gemfile_updater.rb, line 82
def update_git_pin?(dependency)
  new_gemfile_req =
    dependency.requirements.
    find { |f| %w(Gemfile gems.rb).include?(f[:file]) }
  return false unless new_gemfile_req&.dig(:source, :type) == "git"

  # If the new requirement is a git dependency with a ref then there's
  # no harm in doing an update
  new_gemfile_req.dig(:source, :ref)
end