Class: Gem::Commands::QueryCommand
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
::Gem::Command
|
|
Instance Chain:
|
|
Inherits: |
Gem::Command
|
Defined in: | lib/rubygems/commands/query_command.rb |
Class Attribute Summary
::Gem::Command - Inherited
.build_args | Arguments used when building gems. |
.build_args=, .extra_args, .extra_args= |
Class Method Summary
- .new(name = 'query', summary = 'Query gem information in local or remote repositories') ⇒ QueryCommand constructor
::Gem::Command - Inherited
.add_common_option, | |
.add_specific_extra_args | Add a list of extra arguments for the given command. |
.common_options, | |
.new | Initializes a generic gem command named |
.specific_extra_args | Return an array of extra arguments for the command. |
.specific_extra_args_hash | Accessor for the specific extra args hash (self initializing). |
Instance Attribute Summary
::Gem::LocalRemoteOptions - Included
#both? | Is fetching of local and remote information enabled? |
#local? | Is local fetching enabled? |
#remote? | Is remote fetching enabled? |
::Gem::Command - Inherited
#defaults | The default options for the command. |
#program_name | The name of the command for command-line invocation. |
#summary | A short description of the command. |
#command | The name of the command. |
#options | The options for the command. |
::Gem::DefaultUserInteraction - Included
Instance Method Summary
- #execute
- #display_header(type) private
- #entry_details(entry, detail_tuple, specs, platforms) private
- #entry_versions(entry, name_tuples, platforms, specs) private
-
#installed?(name, req = Gem::Requirement.default) ⇒ Boolean
private
Check if gem
name
versionversion
is installed. - #make_entry(entry_tuples, platforms) private
- #output_query_results(spec_tuples) private
- #output_versions(output, versions) private
-
#show_gems(name, prerelease)
private
Guts of original execute.
- #spec_authors(entry, spec) private
- #spec_homepage(entry, spec) private
- #spec_license(entry, spec) private
- #spec_loaded_from(entry, spec, specs) private
- #spec_platforms(entry, platforms) private
- #spec_summary(entry, spec) private
::Gem::VersionOption - Included
#add_platform_option | Add the –platform option to the option parser. |
#add_prerelease_option | Add the –prerelease option to the option parser. |
#add_version_option | Add the –version option to the option parser. |
::Gem::LocalRemoteOptions - Included
#accept_uri_http | Allows OptionParser to handle HTTP URIs. |
#add_bulk_threshold_option | Add the –bulk-threshold option. |
#add_clear_sources_option | Add the –clear-sources option. |
#add_local_remote_options | Add local/remote options to the command line parser. |
#add_proxy_option | Add the –http-proxy option. |
#add_source_option | Add the –source option. |
#add_update_sources_option | Add the –update-sources option. |
::Gem::Command - Inherited
#add_extra_args | Adds extra args from ~/.gemrc. |
#add_option | Add a command-line option and handler to the command. |
#arguments | Override to provide details of the arguments a command takes. |
#begins? | True if |
#defaults_str | Override to display the default values of the command options. |
#description | Override to display a longer description of what this command does. |
#execute | Override to provide command handling. |
#get_all_gem_names | Get all gem names from the command line. |
#get_all_gem_names_and_versions | Get all [gem, version] from the command line. |
#get_one_gem_name | Get a single gem name from the command line. |
#get_one_optional_argument | Get a single optional argument from the command line. |
#handle_options | Handle the given list of arguments by parsing them and recording the results. |
#handles? | True if the command handles the given argument list. |
#invoke | Invoke the command with the given list of arguments. |
#invoke_with_build_args | Invoke the command with the given list of normal arguments and additional build arguments. |
#merge_options | Merge a set of command options with the set of default options (without modifying the default option hash). |
#remove_option | Remove previously defined command-line argument |
#show_help | Display the help message for the command. |
#show_lookup_failure | Display to the user that a gem couldn't be found and reasons why. |
#usage | Override to display the usage for an individual gem command. |
#when_invoked | Call the given block when invoked. |
#add_parser_run_info | Adds a section with |
#configure_options, | |
#create_option_parser | Creates an option parser and fills it in with the help info for the command. |
#parser | Create on demand parser. |
#wrap | Wraps |
::Gem::UserInteraction - Included
#alert | Displays an alert |
#alert_error | Displays an error |
#alert_warning | Displays a warning |
#ask | Asks a |
#ask_for_password | Asks for a password with a |
#ask_yes_no | Asks a yes or no |
#choose_from_list | Asks the user to answer |
#say | Displays the given |
#terminate_interaction | Terminates the RubyGems process with the given |
#verbose | Calls |
::Gem::DefaultUserInteraction - Included
::Gem::Text - Included
#clean_text | Remove any non-printable characters and make the text suitable for printing. |
#format_text | Wraps |
#levenshtein_distance | This code is based directly on the ::Gem::Text gem implementation Returns a value representing the “cost” of transforming str1 into str2. |
#truncate_text |
Constructor Details
.new(name = 'query', summary = 'Query gem information in local or remote repositories') ⇒ QueryCommand
# File 'lib/rubygems/commands/query_command.rb', line 14
def initialize(name = 'query', summary = 'Query gem information in local or remote repositories') super name, summary, :name => //, :domain => :local, :details => false, :versions => true, :installed => nil, :version => Gem::Requirement.default add_option('-i', '--[no-]installed', 'Check for installed gem') do |value, | [:installed] = value end add_option('-I', 'Equivalent to --no-installed') do |value, | [:installed] = false end add_version_option command, "for use with --installed" add_option('-n', '--name-matches REGEXP', 'Name of gem(s) to query on matches the', 'provided REGEXP') do |value, | [:name] = /#{value}/i end add_option('-d', '--[no-]details', 'Display detailed information of gem(s)') do |value, | [:details] = value end add_option( '--[no-]versions', 'Display only gem names') do |value, | [:versions] = value [:details] = false unless value end add_option('-a', '--all', 'Display all gem versions') do |value, | [:all] = value end add_option('-e', '--exact', 'Name of gem(s) to query on matches the', 'provided STRING') do |value, | [:exact] = value end add_option( '--[no-]prerelease', 'Display prerelease versions') do |value, | [:prerelease] = value end end
Instance Method Details
#display_header(type) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 122
def display_header type if (ui.outs.tty? and Gem.configuration.verbose) or both? then say say "*** #{type} GEMS ***" say end end
#entry_details(entry, detail_tuple, specs, platforms) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 233
def entry_details entry, detail_tuple, specs, platforms return unless [:details] name_tuple, spec = detail_tuple spec = spec.fetch_spec name_tuple if spec.respond_to? :fetch_spec entry << "\n" spec_platforms entry, platforms entry, spec spec_homepage entry, spec spec_license entry, spec spec_loaded_from entry, spec, specs spec_summary entry, spec end
#entry_versions(entry, name_tuples, platforms, specs) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 250
def entry_versions entry, name_tuples, platforms, specs return unless [:versions] list = if platforms.empty? or [:details] then name_tuples.map { |n| n.version }.uniq else platforms.sort.reverse.map do |version, pls| if pls == [Gem::Platform::RUBY] then if [:domain] == :remote || specs.all? { |spec| spec.is_a? Gem::Source } version else spec = specs.select { |s| s.version == version } if spec.first.default_gem? "default: #{version}" else version end end else ruby = pls.delete Gem::Platform::RUBY platform_list = [ruby, *pls.sort].compact "#{version} #{platform_list.join ' '}" end end end entry << " (#{list.join ', '})" end
#execute
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 80
def execute exit_code = 0 if [:args].to_a.empty? and [:name].source.empty? name = [:name] no_name = true elsif ! [:name].source.empty? name = Array( [:name]) else args = [:args].to_a name = [:exact] ? args.map{|arg| /\A#{Regexp.escape(arg)}\Z/ } : args.map{|arg| /#{arg}/i } end prerelease = [:prerelease] unless [:installed].nil? then if no_name then alert_error "You must specify a gem name" exit_code |= 4 elsif name.count > 1 alert_error "You must specify only ONE gem!" exit_code |= 4 else installed = installed? name.first, [:version] installed = !installed unless [:installed] if installed then say "true" else say "false" exit_code |= 1 end end terminate_interaction exit_code end names = Array(name) names.each { |n| show_gems n, prerelease } end
#installed?(name, req = Gem::Requirement.default) ⇒ Boolean
(private)
Check if gem name
version version
is installed.
# File 'lib/rubygems/commands/query_command.rb', line 187
def installed?(name, req = Gem::Requirement.default) Gem::Specification.any? { |s| s.name =~ name and req =~ s.version } end
#make_entry(entry_tuples, platforms) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 280
def make_entry entry_tuples, platforms detail_tuple = entry_tuples.first name_tuples, specs = entry_tuples.flatten.partition do |item| Gem::NameTuple === item end entry = [name_tuples.first.name] entry_versions entry, name_tuples, platforms, specs entry_details entry, detail_tuple, specs, platforms entry.join end
#output_query_results(spec_tuples) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 191
def output_query_results(spec_tuples) output = [] versions = Hash.new { |h,name| h[name] = [] } spec_tuples.each do |spec_tuple, source| versions[spec_tuple.name] << [spec_tuple, source] end versions = versions.sort_by do |(n,_),_| n.downcase end output_versions output, versions say output.join( [:details] ? "\n\n" : "\n") end
#output_versions(output, versions) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 208
def output_versions output, versions versions.each do |gem_name, matching_tuples| matching_tuples = matching_tuples.sort_by { |n,_| n.version }.reverse platforms = Hash.new { |h,version| h[version] = [] } matching_tuples.each do |n, _| platforms[n.version] << n.platform if n.platform end seen = {} matching_tuples.delete_if do |n,_| if seen[n.version] then true else seen[n.version] = true false end end output << clean_text(make_entry(matching_tuples, platforms)) end end
#show_gems(name, prerelease) (private)
Guts of original execute
# File 'lib/rubygems/commands/query_command.rb', line 131
def show_gems name, prerelease req = Gem::Requirement.default # TODO: deprecate for real dep = Gem::Deprecate.skip_during { Gem::Dependency.new name, req } dep.prerelease = prerelease if local? then if prerelease and not both? then alert_warning "prereleases are always shown locally" end display_header 'LOCAL' specs = Gem::Specification.find_all { |s| s.name =~ name and req =~ s.version } spec_tuples = specs.map do |spec| [spec.name_tuple, spec] end output_query_results spec_tuples end if remote? then display_header 'REMOTE' fetcher = Gem::SpecFetcher.fetcher type = if [:all] if [:prerelease] :complete else :released end elsif [:prerelease] :prerelease else :latest end if name.respond_to?(:source) && name.source.empty? spec_tuples = fetcher.detect(type) { true } else spec_tuples = fetcher.detect(type) do |name_tuple| name === name_tuple.name end end output_query_results spec_tuples end end
#spec_authors(entry, spec) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 295
def entry, spec = "Author#{spec. .length > 1 ? 's' : ''}: ".dup << spec. .join(', ') entry << format_text(, 68, 4) end
#spec_homepage(entry, spec) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 301
def spec_homepage entry, spec return if spec.homepage.nil? or spec.homepage.empty? entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4) end
#spec_license(entry, spec) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 307
def spec_license entry, spec return if spec.license.nil? or spec.license.empty? licenses = "License#{spec.licenses.length > 1 ? 's' : ''}: ".dup licenses << spec.licenses.join(', ') entry << "\n" << format_text(licenses, 68, 4) end
#spec_loaded_from(entry, spec, specs) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 315
def spec_loaded_from entry, spec, specs return unless spec.loaded_from if specs.length == 1 then default = spec.default_gem? ? ' (default)' : nil entry << "\n" << " Installed at#{default}: #{spec.base_dir}" else label = 'Installed at' specs.each do |s| version = s.version.to_s version << ', default' if s.default_gem? entry << "\n" << " #{label} (#{version}): #{s.base_dir}" label = ' ' * label.length end end end
#spec_platforms(entry, platforms) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 332
def spec_platforms entry, platforms non_ruby = platforms.any? do |_, pls| pls.any? { |pl| pl != Gem::Platform::RUBY } end return unless non_ruby if platforms.length == 1 then title = platforms.values.length == 1 ? 'Platform' : 'Platforms' entry << " #{title}: #{platforms.values.sort.join ', '}\n" else entry << " Platforms:\n" platforms.sort_by do |version,| version end.each do |version, pls| label = " #{version}: " data = format_text pls.sort.join(', '), 68, label.length data[0, label.length] = label entry << data << "\n" end end end
#spec_summary(entry, spec) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 355
def spec_summary entry, spec summary = truncate_text(spec.summary, "the summary for #{spec.full_name}") entry << "\n\n" << format_text(summary, 68, 4) end