Skip to content

Instantly share code, notes, and snippets.

@andrew-d
Created June 14, 2012 01:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save andrew-d/2927533 to your computer and use it in GitHub Desktop.
Save andrew-d/2927533 to your computer and use it in GitHub Desktop.
Quick hacky recursive gem-dependency search script for Ruby
#!/usr/bin/env ruby
require 'logger'
require 'optparse'
require 'rubygems'
require 'net/http'
require 'net/https'
require 'json'
@log = Logger.new(STDERR)
@log.level = Logger::INFO
def make_request(url)
@log.debug("Opening: #{url}")
Timeout.timeout(5) do
uri = URI(url)
http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == "https" then
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
http.read_timeout = 5
http.open_timeout = 5
req = Net::HTTP::Get.new(uri.path.empty? ? '/' : uri.path)
http.start do |h|
h.request(req)
end
end
end
def recurse_dependencies(name, depth, block)
# Fetch dependencies for this gem.
url = "http://rubygems.org/api/v1/gems/#{name}.json"
begin
req = make_request(url)
#rescue Exception => e
# @log.error("Exception: #{e.inspect}")
# return
end
info = JSON.parse(req.body)
info['dependencies']['runtime'].each do |obj|
depend = obj['name']
requirements = obj['requirements']
block.call(depend, requirements, depth + 1)
recurse_dependencies(depend, depth + 1, block)
end
end
def get_dependencies(root_gem, &block)
block.call(root_gem, "", 0)
recurse_dependencies(root_gem, 0, block)
end
def main()
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{$0} [options] gem"
opts.on('-v', '--verbosity', 'Verbosity of debugging output') do
@log.level -= 1
end
opts.on('-h', '--help', 'Display this message') do
puts opts
exit(1)
end
end
optparse.parse!
get_dependencies(ARGV[0]) do |name, requirements, depth|
puts((" " * depth) + "#{name} #{requirements}")
end
end
if $0 == __FILE__
ret = main
begin
exit(ret)
rescue TypeError
exit(0)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment