Created
June 14, 2012 01:15
-
-
Save andrew-d/2927533 to your computer and use it in GitHub Desktop.
Quick hacky recursive gem-dependency search script for Ruby
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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