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
- #check_installed_gems? ⇒ Boolean readonly private
- #gem_name? ⇒ Boolean readonly private
- #show_prereleases? ⇒ Boolean readonly private
::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
- #args private
- #check_installed_gems(gem_names) readonly private
- #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
- #prerelease private
-
#show_gems(name)
private
Guts of original execute.
- #show_local_gems(name, req = Gem::Requirement.default) private
- #show_remote_gems(name) private
- #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
- #specs_type 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 |
#check_deprecated_options, | |
#defaults_str | Override to display the default values of the command options. |
#deprecate_option | Mark a command-line option as deprecated, and optionally specify a deprecation horizon. |
#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. |
#option_is_deprecated?, | |
#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 Attribute Details
#check_installed_gems? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/rubygems/commands/query_command.rb', line 114
def check_installed_gems? ! [:installed].nil? end
#gem_name? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/rubygems/commands/query_command.rb', line 118
def gem_name? ! [:name].source.empty? end
#show_prereleases? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/rubygems/commands/query_command.rb', line 126
def show_prereleases? prerelease.nil? || prerelease end
Instance Method Details
#args (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 130
def args [:args].to_a end
#check_installed_gems(gem_names) (readonly, private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 94
def check_installed_gems(gem_names) exit_code = 0 if args.empty? && !gem_name? alert_error "You must specify a gem name" exit_code = 4 elsif gem_names.count > 1 alert_error "You must specify only ONE gem!" exit_code = 4 else installed = installed?(gem_names.first, [:version]) installed = !installed unless [:installed] say(installed) exit_code = 1 if !installed end exit_code end
#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 134
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 246
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 263
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 gem_names = Array( [:name]) if !args.empty? gem_names = [:exact] ? args.map{|arg| /\A#{Regexp.escape(arg)}\Z/ } : args.map{|arg| /#{arg}/i } end terminate_interaction(check_installed_gems(gem_names)) if check_installed_gems? gem_names.each { |n| show_gems(n) } 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 200
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 292
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 204
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 221
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
#prerelease (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 122
def prerelease [:prerelease] end
#show_gems(name) (private)
Guts of original execute
# File 'lib/rubygems/commands/query_command.rb', line 143
def show_gems(name) show_local_gems(name) if local? show_remote_gems(name) if remote? end
#show_local_gems(name, req = Gem::Requirement.default) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 148
def show_local_gems(name, req = Gem::Requirement.default) display_header("LOCAL") specs = Gem::Specification.find_all do |s| s.name =~ name and req =~ s.version end dep = Gem::Deprecate.skip_during { Gem::Dependency.new name, req } specs.select! do |s| dep.match?(s.name, s.version, show_prereleases?) end spec_tuples = specs.map do |spec| [spec.name_tuple, spec] end output_query_results(spec_tuples) end
#show_remote_gems(name) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 167
def show_remote_gems(name) display_header("REMOTE") fetcher = Gem::SpecFetcher.fetcher spec_tuples = if name.respond_to?(:source) && name.source.empty? fetcher.detect(specs_type) { true } else fetcher.detect(specs_type) do |name_tuple| name === name_tuple.name end end output_query_results(spec_tuples) end
#spec_authors(entry, spec) (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 307
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 313
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 319
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 327
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 344
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" sorted_platforms = platforms.sort_by { |version,| version } sorted_platforms.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 368
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
#specs_type (private)
[ GitHub ]# File 'lib/rubygems/commands/query_command.rb', line 183
def specs_type if [:all] if [:prerelease] :complete else :released end elsif [:prerelease] :prerelease else :latest end end