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 |
Constant Summary
::Gem::Command
- Inherited
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
#command | The name of the command. |
#defaults | The default options for the command. |
#options | The options for the command. |
#program_name | The name of the command for command-line invocation. |
#summary | A short description of 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
- #defaults_str Internal use only
- #description Internal use only
::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 |
#add_parser_description, #add_parser_options, #add_parser_summary |
::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 |
#truncate_text, #min3 |
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
#defaults_str
# File 'lib/rubygems/commands/query_command.rb', line 67
def defaults_str # :nodoc: "--local --name-matches // --no-details --versions --no-installed" end
#description
# File 'lib/rubygems/commands/query_command.rb', line 71
def description # :nodoc: <<-EOF The query command is the basis for the list and search commands. You should really use the list and search commands instead. This command is too hard to use. EOF end
#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? 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] name_tuples.map { |n| n.version }.uniq else platforms.sort.reverse.map do |version, pls| out = version.to_s if [:domain] == :local default = specs.any? do |s| !s.is_a?(Gem::Source) && s.version == version && s.default_gem? end out = "default: #{out}" if default end if pls != [Gem::Platform::RUBY] platform_list = [pls.delete(Gem::Platform::RUBY), *pls.sort].compact out = platform_list.unshift(out).join(' ') end out 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? if no_name 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 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 279
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] 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? if prerelease and not both? 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? 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 294
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 300
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 306
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 314
def spec_loaded_from(entry, spec, specs) return unless spec.loaded_from if specs.length == 1 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 331
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 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 354
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