Repository URL to install this package:
Version:
8.5.0.pre.alpha.7 ▾
|
require "bundler"
module Danger
class GemsResolver
def initialize(gem_names)
@gem_names = gem_names
@dir = Dir.mktmpdir # We want it to persist until OS cleans it on reboot
end
# Returns an Array of paths (plugin lib file paths) and gems (of metadata)
def call
path_gems = []
Bundler.with_clean_env do
Dir.chdir(dir) do
create_gemfile_from_gem_names
`bundle install --path vendor/gems`
path_gems = all_gems_metadata
end
end
return path_gems
end
private
attr_reader :gem_names, :dir
def all_gems_metadata
return paths, gems
end
def create_gemfile_from_gem_names
gemfile = File.new("Gemfile", "w")
gemfile.write "source 'https://rubygems.org'"
gem_names.each do |plugin|
gemfile.write "\ngem '#{plugin}'"
end
gemfile.close
end
# The paths are relative to dir.
def paths
relative_paths = gem_names.flat_map do |plugin|
Dir.glob("vendor/gems/ruby/*/gems/#{plugin}*/lib/**/**/**/**.rb")
end
relative_paths.map { |path| File.join(dir, path) }
end
def gems
real_gems.map { |gem| gem_metadata(gem) }
end
def real_gems
spec_paths = gem_names.flat_map do |plugin|
Dir.glob("vendor/gems/ruby/*/specifications/#{plugin}*.gemspec").first
end
spec_paths.map { |path| Gem::Specification.load path }
end
def gem_metadata(gem)
{
name: gem.name,
gem: gem.name,
author: gem.authors,
url: gem.homepage,
description: gem.summary,
license: gem.license || "Unknown",
version: gem.version.to_s
}
end
end
end