class Dependabot::Bundler::FileUpdater::RubyRequirementSetter

Constants

RUBY_VERSIONS

Attributes

gemspec[R]

Public Class Methods

new(gemspec:) click to toggle source
# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 19
def initialize(gemspec:)
  @gemspec = gemspec
end

Public Instance Methods

rewrite(content) click to toggle source
# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 23
def rewrite(content)
  return content unless gemspec_declares_ruby_requirement?

  buffer = Parser::Source::Buffer.new("(gemfile_content)")
  buffer.source = content
  ast = Parser::CurrentRuby.new.parse(buffer)

  if declares_ruby_version?(ast)
    GemfileRewriter.new(
      ruby_version: ruby_version
    ).rewrite(buffer, ast)
  else
    "ruby '#{ruby_version}'\n" + content
  end
end

Private Instance Methods

declares_ruby_requirement?(node) click to toggle source
# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 93
def declares_ruby_requirement?(node)
  return false unless node.is_a?(Parser::AST::Node)

  node.children[1] == :required_ruby_version=
end
declares_ruby_version?(node) click to toggle source
# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 45
def declares_ruby_version?(node)
  return false unless node.is_a?(Parser::AST::Node)
  return true if node.type == :send && node.children[1] == :ruby

  node.children.any? { |cn| declares_ruby_version?(cn) }
end
find_ruby_requirement_node(node) click to toggle source

rubocop:enable Security/Eval

# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 83
def find_ruby_requirement_node(node)
  return unless node.is_a?(Parser::AST::Node)
  return node if declares_ruby_requirement?(node)

  node.children.find do |cn|
    requirement_node = find_ruby_requirement_node(cn)
    break requirement_node if requirement_node
  end
end
gemspec_declares_ruby_requirement?() click to toggle source
# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 41
def gemspec_declares_ruby_requirement?
  !ruby_requirement.nil?
end
ruby_requirement() click to toggle source

rubocop:disable Security/Eval

# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 70
def ruby_requirement
  ast = Parser::CurrentRuby.parse(gemspec.content)
  requirement_node = find_ruby_requirement_node(ast)
  return unless requirement_node

  begin
    eval(requirement_node.children[2].loc.expression.source)
  rescue StandardError
    nil # If we can't evaluate the expression just return nil
  end
end
ruby_version() click to toggle source
# File lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb, line 52
def ruby_version
  requirement = if ruby_requirement.is_a?(Gem::Requirement)
                  ruby_requirement
                else
                  Dependabot::Bundler::Requirement.new(ruby_requirement)
                end

  ruby_version =
    RUBY_VERSIONS.
    map { |v| Gem::Version.new(v) }.sort.
    find { |v| requirement.satisfied_by?(v) }

  raise RubyVersionNotFound unless ruby_version

  ruby_version
end