summaryrefslogtreecommitdiff
path: root/lib/rubygems/commands/query_command.rb
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-10 07:48:56 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-10 07:48:56 +0000
commitfbf59bdbea63efd34ccc144e648467d2f52e7345 (patch)
tree244f0e7ae112cc7dd135e5d1ac24e6c70ba71b4a /lib/rubygems/commands/query_command.rb
parent7a4aad75356496559460041a6c063bdb736c7236 (diff)
Import RubyGems trunk revision 1493.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13862 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rubygems/commands/query_command.rb')
-rw-r--r--lib/rubygems/commands/query_command.rb118
1 files changed, 118 insertions, 0 deletions
diff --git a/lib/rubygems/commands/query_command.rb b/lib/rubygems/commands/query_command.rb
new file mode 100644
index 0000000000..581d4bb734
--- /dev/null
+++ b/lib/rubygems/commands/query_command.rb
@@ -0,0 +1,118 @@
+require 'rubygems/command'
+require 'rubygems/local_remote_options'
+require 'rubygems/source_info_cache'
+
+class Gem::Commands::QueryCommand < Gem::Command
+
+ include Gem::LocalRemoteOptions
+
+ def initialize(name = 'query',
+ summary = 'Query gem information in local or remote repositories')
+ super name, summary,
+ :name => /.*/, :domain => :local, :details => false, :versions => true
+
+ add_option('-n', '--name-matches REGEXP',
+ 'Name of gem(s) to query on matches the',
+ 'provided REGEXP') do |value, options|
+ options[:name] = /#{value}/i
+ end
+
+ add_option('-d', '--[no-]details',
+ 'Display detailed information of gem(s)') do |value, options|
+ options[:details] = value
+ end
+
+ add_option( '--[no-]versions',
+ 'Display only gem names') do |value, options|
+ options[:versions] = value
+ options[:details] = false unless value
+ end
+
+ add_local_remote_options
+ end
+
+ def defaults_str # :nodoc:
+ "--local --name-matches '.*' --no-details --versions"
+ end
+
+ def execute
+ name = options[:name]
+
+ if local? then
+ say
+ say "*** LOCAL GEMS ***"
+ say
+ output_query_results Gem.cache.search(name)
+ end
+
+ if remote? then
+ say
+ say "*** REMOTE GEMS ***"
+ say
+ output_query_results Gem::SourceInfoCache.search(name)
+ end
+ end
+
+ private
+
+ def output_query_results(gemspecs)
+ output = []
+ gem_list_with_version = {}
+
+ gemspecs.flatten.each do |gemspec|
+ gem_list_with_version[gemspec.name] ||= []
+ gem_list_with_version[gemspec.name] << gemspec
+ end
+
+ gem_list_with_version = gem_list_with_version.sort_by do |name, spec|
+ name.downcase
+ end
+
+ gem_list_with_version.each do |gem_name, list_of_matching|
+ list_of_matching = list_of_matching.sort_by { |x| x.version.to_ints }.reverse
+ seen_versions = {}
+
+ list_of_matching.delete_if do |item|
+ if seen_versions[item.version] then
+ true
+ else
+ seen_versions[item.version] = true
+ false
+ end
+ end
+
+ entry = gem_name.dup
+ if options[:versions] then
+ entry << " (#{list_of_matching.map{|gem| gem.version.to_s}.join(", ")})"
+ end
+
+ entry << "\n" << format_text(list_of_matching[0].summary, 68, 4) if
+ options[:details]
+ output << entry
+ end
+
+ say output.join(options[:details] ? "\n\n" : "\n")
+ end
+
+ ##
+ # Used for wrapping and indenting text
+ #
+ def format_text(text, wrap, indent=0)
+ result = []
+ work = text.dup
+
+ while work.length > wrap
+ if work =~ /^(.{0,#{wrap}})[ \n]/o then
+ result << $1
+ work.slice!(0, $&.length)
+ else
+ result << work.slice!(0, wrap)
+ end
+ end
+
+ result << work if work.length.nonzero?
+ result.join("\n").gsub(/^/, " " * indent)
+ end
+
+end
+