diff --git a/CHANGELOG.md b/CHANGELOG.md index 420ba7aa..c5d4d612 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ### HEAD * Add 'gem-readme' command, prints the README file bundled with a rubygem +* Add 'gem-search' command, searches for a gem with the rubygems.org HTTP API ### 0.10.1 diff --git a/lib/pry/commands/gem_search.rb b/lib/pry/commands/gem_search.rb new file mode 100644 index 00000000..cac9f3a3 --- /dev/null +++ b/lib/pry/commands/gem_search.rb @@ -0,0 +1,40 @@ +class Pry::Command::GemSearch < Pry::ClassCommand + match 'gem-search' + description 'Search for a gem with the rubygems.org JSON API' + group 'Gems' + command_options argument_required: true + banner <<-BANNER + gem-search [options] gem + Search for a gem with the rubygems.org HTTP API + BANNER + + API_ENDPOINT = 'https://rubygems.org/api/v1/search.json' + + def setup + require 'json' unless defined?(JSON) + require 'net/http' unless defined?(Net::HTTP) + end + + def options(opt) + opt.on :l, :limit, 'Limit the number of results (max: 30)', + default: 10, + as: Integer, + argument: true + end + + def process(str) + uri = URI.parse(API_ENDPOINT) + uri.query = URI.encode_www_form(query: str) + gems = JSON.load Net::HTTP.get(uri) + _pry_.pager.page list_as_string(gems, opts[:limit]) + end + +private + def list_as_string(gems, limit = 10) + gems[0..limit-1].map do |gem| + name, version, info = gem.values_at 'name', 'version', 'info' + "#{text.bold(name)} #{text.bold('v'+version)} \n#{info}\n\n" + end.join + end + Pry::Commands.add_command(self) +end