class Dependabot::Bundler::FileFetcher::ChildGemfileFinder

Finds the paths of any Gemfiles declared using `eval_gemfile` in the passed Gemfile.

Attributes

gemfile[R]

Public Class Methods

new(gemfile:) click to toggle source
# File lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb, line 14
def initialize(gemfile:)
  @gemfile = gemfile
end

Public Instance Methods

child_gemfile_paths() click to toggle source
# File lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb, line 18
def child_gemfile_paths
  ast = Parser::CurrentRuby.parse(gemfile.content)
  find_child_gemfile_paths(ast)
rescue Parser::SyntaxError
  raise Dependabot::DependencyFileNotParseable, gemfile.path
end

Private Instance Methods

current_dir() click to toggle source
# File lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb, line 52
def current_dir
  @current_dir ||= gemfile.name.rpartition("/").first
  @current_dir = nil if @current_dir == ""
  @current_dir
end
declares_eval_gemfile?(node) click to toggle source
# File lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb, line 58
def declares_eval_gemfile?(node)
  return false unless node.is_a?(Parser::AST::Node)

  node.children[1] == :eval_gemfile
end
find_child_gemfile_paths(node) click to toggle source
# File lib/dependabot/bundler/file_fetcher/child_gemfile_finder.rb, line 29
def find_child_gemfile_paths(node)
  return [] unless node.is_a?(Parser::AST::Node)

  if declares_eval_gemfile?(node)
    path_node = node.children[2]
    unless path_node.type == :str
      path = gemfile.path
      msg = "Dependabot only supports uninterpolated string arguments "\
            "to eval_gemfile. Got "\
            "`#{path_node.loc.expression.source}`"
      raise Dependabot::DependencyFileNotParseable.new(path, msg)
    end

    path = path_node.loc.expression.source.gsub(/['"]/, "")
    path = File.join(current_dir, path) unless current_dir.nil?
    return [Pathname.new(path).cleanpath.to_path]
  end

  node.children.flat_map do |child_node|
    find_child_gemfile_paths(child_node)
  end
end