Skip to content

Instantly share code, notes, and snippets.

@tlehman
Last active September 5, 2024 21:48
Show Gist options
  • Save tlehman/553fddc29ae27667dc3ed66c906ae294 to your computer and use it in GitHub Desktop.
Save tlehman/553fddc29ae27667dc3ed66c906ae294 to your computer and use it in GitHub Desktop.
Get transitive gem dependencies
#!/usr/bin/env ruby
require 'set'
def get_gem_dependencies(gem_name, version = nil)
require 'open-uri'
require 'yaml'
url = if version
"https://rubygems.org/api/v2/rubygems/#{gem_name}/versions/#{version}.yaml"
else
"https://rubygems.org/api/v1/gems/#{gem_name}.yaml"
end
begin
yaml_content = URI.open(url).read
gem_info = YAML.safe_load(yaml_content)
gem_info['dependencies']['runtime'] || []
rescue OpenURI::HTTPError => e
puts "Error fetching gem info: #{e.message}"
[]
end
end
def get_transitive_dependencies(gem_name, version = nil, visited = Set.new)
return [] if visited.include?(gem_name)
visited.add(gem_name)
dependencies = get_gem_dependencies(gem_name, version)
transitive_deps = dependencies.flat_map do |dep|
dep_name = dep["name"]
[dep] + get_transitive_dependencies(dep_name, nil, visited)
end
transitive_deps.uniq
end
if ARGV.empty?
puts "Usage: #{$PROGRAM_NAME} GEM_NAME [VERSION]"
exit 1
end
gem_name = ARGV[0]
version = ARGV[1]
begin
dependencies = get_transitive_dependencies(gem_name, version)
puts "Transitive dependencies for #{gem_name}#{version ? " (#{version})" : ""}:"
dependencies.each { |dep| puts "- #{dep['name']} (#{dep['requirements']}) " }
rescue => e
puts "Error: #{e.message}"
exit 1
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment