Skip to content

Commit

Permalink
Add gem details fetching
Browse files Browse the repository at this point in the history
  • Loading branch information
khasinski committed Oct 5, 2022
1 parent 8cb3145 commit 457706d
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 9 deletions.
27 changes: 23 additions & 4 deletions lib/dependency_parser/ruby/parse.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@ def initialize(content)

def call
deps = Bundler::LockfileParser.new(content)
parsed = deps.specs.map do |spec|
{ repos: [{ name: spec.name }], language: "ruby" }
end
JSON.pretty_generate(parsed)
@direct = deps.specs.map do |spec|
fetch_spec(name: spec.name, version: spec.version)
end.compact
end

def direct
{ repos: @direct, language: "ruby" }
end

private
Expand All @@ -26,6 +29,22 @@ def self.valid_gemfile?(content)
rescue
false
end

def fetch_spec(name:, version: nil)
full_spec = fetcher.fetch_spec([name, version])
{ name: full_spec.name, url: extract_url(full_spec), description: full_spec.description }
rescue
nil
end

def extract_url(full_spec)
url = full_spec.metadata["source_code_uri"] || full_spec.homepage
url if url.include? "https://github.com/"
end

def fetcher
@fetcher ||= Bundler::Fetcher.new(Bundler::Source::Rubygems::Remote.new('https://rubygems.org'))
end
end
end
end
25 changes: 20 additions & 5 deletions test/dependency_parsers/ruby_parser_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@

class UserMailerTest < ActiveSupport::TestCase
test "returns nothing on invalid Gemfile.lock" do
deps = DependencyParser::Ruby::Parse.new("invalid").call
assert_equal [], JSON.parse(deps)
parser = DependencyParser::Ruby::Parse.new("invalid")
parser.call
assert_equal [], parser.direct
end

test "returns the list of gems for a small Gemfle" do
gemfile_lock = <<-LOCKFILE
GEM
remote: https://rubygems.org/
specs:
actioncable (6.1.4.1)
solid_use_case (2.2.0)
actionpack (= 6.1.4.1)
activesupport (= 6.1.4.1)
nio4r (~> 2.0)
Expand All @@ -34,7 +35,21 @@ class UserMailerTest < ActiveSupport::TestCase
LOCKFILE

deps = DependencyParser::Ruby::Parse.new(gemfile_lock).call
assert_equal [{ "repos" => [{ "name" => "actioncable" }], "language" => "ruby" }], JSON.parse(deps)
parser = DependencyParser::Ruby::Parse.new(gemfile_lock)
VCR.use_cassette("dependency_parser/rubygems") do
parser.call
end

gem_data = {
repos:
[{
name: "solid_use_case",
url: "https://github.com/mindeavor/solid_use_case",
description: "Create use cases the way they were meant to be. Easily verify inputs at each step and seamlessly fail with custom error data and convenient pattern matching."
}],
language: "ruby"
}

assert_equal gem_data, parser.direct
end
end
74 changes: 74 additions & 0 deletions test/vcr_cassettes/dependency_parser/rubygems.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 457706d

Please sign in to comment.