class Dependabot::Bundler::FileParser::GemfileDeclarationFinder

Checks whether a dependency is declared in a Gemfile

Attributes

dependency[R]
gemfile[R]

Public Class Methods

new(dependency:, gemfile:) click to toggle source
# File lib/dependabot/bundler/file_parser/gemfile_declaration_finder.rb, line 11
def initialize(dependency:, gemfile:)
  @dependency = dependency
  @gemfile = gemfile
end

Public Instance Methods

enhanced_req_string() click to toggle source
# File lib/dependabot/bundler/file_parser/gemfile_declaration_finder.rb, line 20
def enhanced_req_string
  return unless gemfile_includes_dependency?

  fallback_string = dependency.fetch("requirement")
  req_nodes = declaration_node.children[3..-1]
  req_nodes = req_nodes.reject { |child| child.type == :hash }

  return fallback_string if req_nodes.none?
  return fallback_string unless req_nodes.all? { |n| n.type == :str }

  original_req_string = req_nodes.map { |n| n.children.last }
  fallback_requirement =
    Gem::Requirement.new(fallback_string.split(", "))
  if fallback_requirement == Gem::Requirement.new(original_req_string)
    original_req_string.join(", ")
  else
    fallback_string
  end
end
gemfile_includes_dependency?() click to toggle source
# File lib/dependabot/bundler/file_parser/gemfile_declaration_finder.rb, line 16
def gemfile_includes_dependency?
  !declaration_node.nil?
end

Private Instance Methods

declaration_node() click to toggle source
# File lib/dependabot/bundler/file_parser/gemfile_declaration_finder.rb, line 44
def declaration_node
  return @declaration_node if defined?(@declaration_node)
  return unless Parser::CurrentRuby.parse(gemfile.content)

  @declaration_node = nil
  Parser::CurrentRuby.parse(gemfile.content).children.any? do |node|
    @declaration_node = deep_search_for_gem(node)
  end
  @declaration_node
end
declares_targeted_gem?(node) click to toggle source
# File lib/dependabot/bundler/file_parser/gemfile_declaration_finder.rb, line 66
def declares_targeted_gem?(node)
  return false unless node.is_a?(Parser::AST::Node)
  return false unless node.children[1] == :gem

  node.children[2].children.first == dependency.fetch("name")
end
deep_search_for_gem(node) click to toggle source
# File lib/dependabot/bundler/file_parser/gemfile_declaration_finder.rb, line 55
def deep_search_for_gem(node)
  return node if declares_targeted_gem?(node)
  return unless node.is_a?(Parser::AST::Node)

  declaration_node = nil
  node.children.find do |child_node|
    declaration_node = deep_search_for_gem(child_node)
  end
  declaration_node
end