mirror of
https://github.com/pry/pry.git
synced 2022-11-09 12:35:05 -05:00
337262c76f
thanks to @dannytatom for the original gem-stats rubygems plugin, which inspired this Pry command. it returns some general statistics about a rubygem when given a name. note that rubygems rate limits the requests, and thanks to that this command can be a "Fail Whale" although the error is handled gracefully. This commit depends on pull request: https://github.com/pry/pry/pull/1701
81 lines
2.1 KiB
Ruby
81 lines
2.1 KiB
Ruby
class Pry::Command::GemStat < Pry::ClassCommand
|
|
require 'json'
|
|
require 'net/http'
|
|
STAT_HOST = "rubygems.org"
|
|
STAT_PORT = 443
|
|
STAT_PATH = "/api/v1/gems/%s.json"
|
|
FAIL_WHALE = <<-FAILWHALE
|
|
W W W
|
|
W W W W
|
|
'. W
|
|
.-""-._ \ \.--|
|
|
/ "-..__) .-'
|
|
| _ /
|
|
\'-.__, .__.,'
|
|
`'----'._\--'
|
|
VVVVVVVVVVVVVVVVVVVVV
|
|
FAILWHALE
|
|
|
|
match 'gem-stat'
|
|
description 'Show the statistics of a gem (requires internet connection)'
|
|
group 'Gems'
|
|
command_options argument_required: true
|
|
banner <<-BANNER
|
|
gem-stats name
|
|
|
|
Show the statistics of a gem.
|
|
Requires an internet connection.
|
|
BANNER
|
|
|
|
def process(name)
|
|
client = Net::HTTP.start STAT_HOST, STAT_PORT, use_ssl: true
|
|
res = client.get STAT_PATH % URI.encode_www_form_component(name)
|
|
case res
|
|
when Net::HTTPOK
|
|
_pry_.pager.page format_gem(JSON.parse(res.body))
|
|
when Net::HTTPServiceUnavailable
|
|
_pry_.pager.page <<-FAILURE
|
|
#{bright_blue(FAIL_WHALE)}
|
|
#{bright_red('Ruby On Rails')}
|
|
#{bright_red('Net::HTTPServiceUnavailable')}
|
|
FAILURE
|
|
else
|
|
raise Pry::CommandError, "Bad response (#{res.class})"
|
|
end
|
|
ensure
|
|
client.finish if client
|
|
end
|
|
|
|
private
|
|
def format_gem(h)
|
|
h = Pry::Config.from_hash(h, nil)
|
|
format_str = unindent <<-FORMAT
|
|
%{name} %{version}
|
|
--
|
|
Total Downloads : %{downloads}
|
|
Version Downloads : %{version_downloads}
|
|
|
|
#{red('Dependencies')} (runtime)
|
|
--
|
|
%{rdependencies}
|
|
|
|
#{red('Dependencies')} (development)
|
|
%{ddependencies}
|
|
FORMAT
|
|
format_str % {name: green(h.name),
|
|
version: bold("v#{h.version}"),
|
|
downloads: h.downloads,
|
|
version_downloads: h.version_downloads,
|
|
rdependencies: format_dependencies(h.dependencies.runtime),
|
|
ddependencies: format_dependencies(h.dependencies.development)}
|
|
end
|
|
|
|
def format_dependencies(rdeps)
|
|
rdeps.empty? ?
|
|
bold("None") :
|
|
with_line_numbers(rdeps.map {|h|
|
|
"%{name} (%{requirements})" % {name: h["name"], requirements: h["requirements"]}
|
|
}.join($/), 1, :bold)
|
|
end
|
|
Pry::Commands.add_command(self)
|
|
end
|