class Dependabot::Bundler::FileUpdater::RequirementReplacer

Attributes

dependency[R]
file_type[R]
previous_requirement[R]
updated_requirement[R]

Public Class Methods

new(dependency:, file_type:, updated_requirement:, previous_requirement: nil, insert_if_bare: false) click to toggle source
# File lib/dependabot/bundler/file_updater/requirement_replacer.rb, line 13
def initialize(dependency:, file_type:, updated_requirement:,
               previous_requirement: nil, insert_if_bare: false)
  @dependency           = dependency
  @file_type            = file_type
  @updated_requirement  = updated_requirement
  @previous_requirement = previous_requirement
  @insert_if_bare       = insert_if_bare
end

Public Instance Methods

rewrite(content) click to toggle source
# File lib/dependabot/bundler/file_updater/requirement_replacer.rb, line 22
def rewrite(content)
  buffer = Parser::Source::Buffer.new("(gemfile_content)")
  buffer.source = content
  ast = Parser::CurrentRuby.new.parse(buffer)

  updated_content = Rewriter.new(
    dependency: dependency,
    file_type: file_type,
    updated_requirement: updated_requirement,
    insert_if_bare: insert_if_bare?
  ).rewrite(buffer, ast)

  update_comment_spacing_if_required(content, updated_content)
end

Private Instance Methods

insert_if_bare?() click to toggle source
# File lib/dependabot/bundler/file_updater/requirement_replacer.rb, line 39
def insert_if_bare?
  @insert_if_bare
end
length_change() click to toggle source
# File lib/dependabot/bundler/file_updater/requirement_replacer.rb, line 66
def length_change
  return updated_requirement.length - previous_requirement.length unless previous_requirement.start_with?("=")

  updated_requirement.length -
    previous_requirement.gsub(/^=/, "").strip.length
end
update_comment_spacing_if_required(content, updated_content) click to toggle source
# File lib/dependabot/bundler/file_updater/requirement_replacer.rb, line 43
def update_comment_spacing_if_required(content, updated_content)
  return updated_content unless previous_requirement

  return updated_content if updated_content == content
  return updated_content if length_change.zero?

  updated_lines = updated_content.lines
  updated_line_index =
    updated_lines.length.
    times.find { |i| content.lines[i] != updated_content.lines[i] }
  updated_line = updated_lines[updated_line_index]

  updated_line =
    if length_change.positive?
      updated_line.sub(/(?<=\s)\s{#{length_change}}#/, "#")
    elsif length_change.negative?
      updated_line.sub(/(?<=\s{2})#/, " " * length_change.abs + "#")
    end

  updated_lines[updated_line_index] = updated_line
  updated_lines.join
end