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