aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2020-02-06 21:54:23 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2020-02-06 21:57:18 +0900
commitbd0a02d1433b6d9a9dcde38eb9fb2dbc3b1071e9 (patch)
tree6aad8ab42a15c62490a26cf24c362ffc76ad9764
parentd767da428c28b7b9fec56b383bb32f6f76c6ad26 (diff)
downloadruby-bd0a02d1433b6d9a9dcde38eb9fb2dbc3b1071e9.tar.gz
Revert to remove the query command of rubygems.
The original commit was https://github.com/rubygems/rubygems/pull/3119
-rw-r--r--lib/rubygems/commands/query_command.rb359
-rw-r--r--test/rubygems/test_gem_commands_query_command.rb861
-rw-r--r--test/rubygems/test_gem_gem_runner.rb10
3 files changed, 878 insertions, 352 deletions
diff --git a/lib/rubygems/commands/query_command.rb b/lib/rubygems/commands/query_command.rb
index 4fb23bc6c1..9d7f1b287f 100644
--- a/lib/rubygems/commands/query_command.rb
+++ b/lib/rubygems/commands/query_command.rb
@@ -1,15 +1,14 @@
# frozen_string_literal: true
require 'rubygems/command'
-require 'rubygems/local_remote_options'
-require 'rubygems/spec_fetcher'
-require 'rubygems/version_option'
-require 'rubygems/text'
+require 'rubygems/query_utils'
+require 'rubygems/deprecate'
class Gem::Commands::QueryCommand < Gem::Command
- include Gem::Text
- include Gem::LocalRemoteOptions
- include Gem::VersionOption
+ extend Gem::Deprecate
+ deprecate_command(2020, 12)
+
+ include Gem::QueryUtils
def initialize(name = 'query',
summary = 'Query gem information in local or remote repositories')
@@ -17,357 +16,13 @@ class Gem::Commands::QueryCommand < Gem::Command
:name => //, :domain => :local, :details => false, :versions => true,
:installed => nil, :version => Gem::Requirement.default
- add_option('-i', '--[no-]installed',
- 'Check for installed gem') do |value, options|
- options[:installed] = value
- end
-
- add_option('-I', 'Equivalent to --no-installed') do |value, options|
- options[: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, 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_option('-a', '--all',
- 'Display all gem versions') do |value, options|
- options[:all] = value
- end
-
- add_option('-e', '--exact',
- 'Name of gem(s) to query on matches the',
- 'provided STRING') do |value, options|
- options[:exact] = value
- end
-
- add_option('--[no-]prerelease',
- 'Display prerelease versions') do |value, options|
- options[:prerelease] = value
- end
-
- add_local_remote_options
- end
-
- def defaults_str # :nodoc:
- "--local --name-matches // --no-details --versions --no-installed"
- end
-
- 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
-
- def execute
- gem_names = Array(options[:name])
-
- if !args.empty?
- gem_names = options[: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
-
- private
-
- 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, options[:version])
- installed = !installed unless options[:installed]
-
- say(installed)
- exit_code = 1 if !installed
- end
-
- exit_code
- end
-
- def check_installed_gems?
- !options[:installed].nil?
- end
-
- def gem_name?
- !options[:name].source.empty?
- end
-
- def prerelease
- options[:prerelease]
- end
-
- def show_prereleases?
- prerelease.nil? || prerelease
- end
-
- def args
- options[:args].to_a
- end
-
- def display_header(type)
- if (ui.outs.tty? and Gem.configuration.verbose) or both?
- say
- say "*** #{type} GEMS ***"
- say
- end
- end
-
- #Guts of original execute
- def show_gems(name)
- show_local_gems(name) if local?
- show_remote_gems(name) if remote?
- end
-
- 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
-
- 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
-
- def specs_type
- if options[:all]
- if options[:prerelease]
- :complete
- else
- :released
- end
- elsif options[:prerelease]
- :prerelease
- else
- :latest
- end
- end
-
- ##
- # Check if gem +name+ version +version+ is installed.
-
- def installed?(name, req = Gem::Requirement.default)
- Gem::Specification.any? { |s| s.name =~ name and req =~ s.version }
- end
-
- 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(options[:details] ? "\n\n" : "\n")
- end
-
- 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
-
- def entry_details(entry, detail_tuple, specs, platforms)
- return unless options[:details]
-
- name_tuple, spec = detail_tuple
-
- spec = spec.fetch_spec(name_tuple)if spec.respond_to?(:fetch_spec)
-
- entry << "\n"
-
- spec_platforms entry, platforms
- spec_authors entry, spec
- spec_homepage entry, spec
- spec_license entry, spec
- spec_loaded_from entry, spec, specs
- spec_summary entry, spec
- end
-
- def entry_versions(entry, name_tuples, platforms, specs)
- return unless options[:versions]
-
- list =
- if platforms.empty? or options[:details]
- name_tuples.map { |n| n.version }.uniq
- else
- platforms.sort.reverse.map do |version, pls|
- out = version.to_s
-
- if options[: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
-
- 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
-
- def spec_authors(entry, spec)
- authors = "Author#{spec.authors.length > 1 ? 's' : ''}: ".dup
- authors << spec.authors.join(', ')
- entry << format_text(authors, 68, 4)
- end
-
- def spec_homepage(entry, spec)
- return if spec.homepage.nil? or spec.homepage.empty?
-
- entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4)
- end
-
- 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
-
- 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
-
- 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
-
- def spec_summary(entry, spec)
- summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
- entry << "\n\n" << format_text(summary, 68, 4)
+ add_query_options
end
end
diff --git a/test/rubygems/test_gem_commands_query_command.rb b/test/rubygems/test_gem_commands_query_command.rb
new file mode 100644
index 0000000000..a25effb548
--- /dev/null
+++ b/test/rubygems/test_gem_commands_query_command.rb
@@ -0,0 +1,861 @@
+# frozen_string_literal: true
+require 'rubygems/test_case'
+require 'rubygems/commands/query_command'
+
+module TestGemCommandsQueryCommandSetup
+ def setup
+ super
+
+ @cmd = Gem::Commands::QueryCommand.new
+
+ @specs = add_gems_to_fetcher
+ @stub_ui = Gem::MockGemUi.new
+ @stub_fetcher = Gem::FakeFetcher.new
+
+ @stub_fetcher.data["#{@gem_repo}Marshal.#{Gem.marshal_version}"] = proc do
+ raise Gem::RemoteFetcher::FetchError
+ end
+ end
+end
+
+class TestGemCommandsQueryCommandWithInstalledGems < Gem::TestCase
+
+ include TestGemCommandsQueryCommandSetup
+
+ def test_execute
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_all
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r --all]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_all_prerelease
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r --all --prerelease]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (3.a, 2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_details
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 2 do |s|
+ s.summary = 'This is a lot of text. ' * 4
+ s.authors = ['Abraham Lincoln', 'Hirohito']
+ s.homepage = 'http://a.example.com/'
+ end
+
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r -d]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2)
+ Authors: Abraham Lincoln, Hirohito
+ Homepage: http://a.example.com/
+
+ This is a lot of text. This is a lot of text. This is a lot of text.
+ This is a lot of text.
+
+pl (1)
+ Platform: i386-linux
+ Author: A User
+ Homepage: http://example.com
+
+ this is a summary
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_details_cleans_text
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 2 do |s|
+ s.summary = 'This is a lot of text. ' * 4
+ s.authors = ["Abraham Lincoln \x01", "\x02 Hirohito"]
+ s.homepage = "http://a.example.com/\x03"
+ end
+
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r -d]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2)
+ Authors: Abraham Lincoln ., . Hirohito
+ Homepage: http://a.example.com/.
+
+ This is a lot of text. This is a lot of text. This is a lot of text.
+ This is a lot of text.
+
+pl (1)
+ Platform: i386-linux
+ Author: A User
+ Homepage: http://example.com
+
+ this is a summary
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_details_truncates_summary
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 2 do |s|
+ s.summary = 'This is a lot of text. ' * 10_000
+ s.authors = ["Abraham Lincoln \x01", "\x02 Hirohito"]
+ s.homepage = "http://a.example.com/\x03"
+ end
+
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r -d]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2)
+ Authors: Abraham Lincoln ., . Hirohito
+ Homepage: http://a.example.com/.
+
+ Truncating the summary for a-2 to 100,000 characters:
+#{" This is a lot of text. This is a lot of text. This is a lot of text.\n" * 1449} This is a lot of te
+
+pl (1)
+ Platform: i386-linux
+ Author: A User
+ Homepage: http://example.com
+
+ this is a summary
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_installed
+ @cmd.handle_options %w[-n a --installed]
+
+ assert_raises Gem::MockGemUi::SystemExitException do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal "true\n", @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_installed_inverse
+ @cmd.handle_options %w[-n a --no-installed]
+
+ e = assert_raises Gem::MockGemUi::TermError do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal "false\n", @stub_ui.output
+ assert_equal '', @stub_ui.error
+
+ assert_equal 1, e.exit_code
+ end
+
+ def test_execute_installed_inverse_not_installed
+ @cmd.handle_options %w[-n not_installed --no-installed]
+
+ assert_raises Gem::MockGemUi::SystemExitException do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal "true\n", @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_installed_no_name
+ @cmd.handle_options %w[--installed]
+
+ e = assert_raises Gem::MockGemUi::TermError do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal '', @stub_ui.output
+ assert_equal "ERROR: You must specify a gem name\n", @stub_ui.error
+
+ assert_equal 4, e.exit_code
+ end
+
+ def test_execute_installed_not_installed
+ @cmd.handle_options %w[-n not_installed --installed]
+
+ e = assert_raises Gem::MockGemUi::TermError do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal "false\n", @stub_ui.output
+ assert_equal '', @stub_ui.error
+
+ assert_equal 1, e.exit_code
+ end
+
+ def test_execute_installed_version
+ @cmd.handle_options %w[-n a --installed --version 2]
+
+ assert_raises Gem::MockGemUi::SystemExitException do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal "true\n", @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_installed_version_not_installed
+ @cmd.handle_options %w[-n c --installed --version 2]
+
+ e = assert_raises Gem::MockGemUi::TermError do
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+ end
+
+ assert_equal "false\n", @stub_ui.output
+ assert_equal '', @stub_ui.error
+
+ assert_equal 1, e.exit_code
+ end
+
+ def test_execute_local
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.options[:domain] = :local
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (3.a, 2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_local_notty
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[]
+
+ @stub_ui.outs.tty = false
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+a (3.a, 2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_local_quiet
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.options[:domain] = :local
+ Gem.configuration.verbose = false
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+a (3.a, 2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_no_versions
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r --no-versions]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a
+pl
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_notty
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-r]
+
+ @stub_ui.outs.tty = false
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+a (2)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_prerelease
+ @cmd.handle_options %w[-r --prerelease]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (3.a)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_prerelease_local
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-l --prerelease]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (3.a, 2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_no_prerelease_local
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-l --no-prerelease]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_remote
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.options[:domain] = :remote
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_remote_notty
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[]
+
+ @stub_ui.outs.tty = false
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+a (3.a, 2, 1)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_remote_quiet
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.options[:domain] = :remote
+ Gem.configuration.verbose = false
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+a (2)
+pl (1 i386-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_make_entry
+ a_2_name = @specs['a-2'].original_name
+
+ @stub_fetcher.data.delete \
+ "#{@gem_repo}quick/Marshal.#{Gem.marshal_version}/#{a_2_name}.gemspec.rz"
+
+ a2 = @specs['a-2']
+ entry_tuples = [
+ [Gem::NameTuple.new(a2.name, a2.version, a2.platform),
+ Gem.sources.first],
+ ]
+
+ platforms = { a2.version => [a2.platform] }
+
+ entry = @cmd.send :make_entry, entry_tuples, platforms
+
+ assert_equal 'a (2)', entry
+ end
+
+ # Test for multiple args handling!
+ def test_execute_multiple_args
+ spec_fetcher do |fetcher|
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[a pl]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ assert_match %r%^a %, @stub_ui.output
+ assert_match %r%^pl %, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_show_gems
+ @cmd.options[:name] = //
+ @cmd.options[:domain] = :remote
+
+ use_ui @stub_ui do
+ @cmd.send :show_gems, /a/i
+ end
+
+ assert_match %r%^a %, @stub_ui.output
+ refute_match %r%^pl %, @stub_ui.output
+ assert_empty @stub_ui.error
+ end
+
+ private
+
+ def add_gems_to_fetcher
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 1
+ fetcher.spec 'a', 2
+ fetcher.spec 'a', '3.a'
+ end
+ end
+
+end
+
+class TestGemCommandsQueryCommandWithoutInstalledGems < Gem::TestCase
+
+ include TestGemCommandsQueryCommandSetup
+
+ def test_execute_platform
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 1
+ fetcher.spec 'a', 1 do |s|
+ s.platform = 'x86-linux'
+ end
+
+ fetcher.spec 'a', 2 do |s|
+ s.platform = 'universal-darwin'
+ end
+ end
+
+ @cmd.handle_options %w[-r -a]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+a (2 universal-darwin, 1 ruby x86-linux)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ assert_equal '', @stub_ui.error
+ end
+
+ def test_execute_show_default_gems
+ spec_fetcher { |fetcher| fetcher.spec 'a', 2 }
+
+ a1 = new_default_spec 'a', 1
+ install_default_specs a1
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (2, default: 1)
+EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_show_default_gems_with_platform
+ a1 = new_default_spec 'a', 1
+ a1.platform = 'java'
+ install_default_specs a1
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (default: 1 java)
+EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_default_details
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 2
+ end
+
+ a1 = new_default_spec 'a', 1
+ install_default_specs a1
+
+ @cmd.handle_options %w[-l -d]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (2, 1)
+ Author: A User
+ Homepage: http://example.com
+ Installed at (2): #{@gemhome}
+ (1, default): #{a1.base_dir}
+
+ this is a summary
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_local_details
+ spec_fetcher do |fetcher|
+ fetcher.spec 'a', 1 do |s|
+ s.platform = 'x86-linux'
+ end
+
+ fetcher.spec 'a', 2 do |s|
+ s.summary = 'This is a lot of text. ' * 4
+ s.authors = ['Abraham Lincoln', 'Hirohito']
+ s.homepage = 'http://a.example.com/'
+ s.platform = 'universal-darwin'
+ end
+
+ fetcher.legacy_platform
+ end
+
+ @cmd.handle_options %w[-l -d]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ str = @stub_ui.output
+
+ str.gsub!(/\(\d\): [^\n]*/, "-")
+ str.gsub!(/at: [^\n]*/, "at: -")
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (2, 1)
+ Platforms:
+ 1: x86-linux
+ 2: universal-darwin
+ Authors: Abraham Lincoln, Hirohito
+ Homepage: http://a.example.com/
+ Installed at -
+ -
+
+ This is a lot of text. This is a lot of text. This is a lot of text.
+ This is a lot of text.
+
+pl (1)
+ Platform: i386-linux
+ Author: A User
+ Homepage: http://example.com
+ Installed at: -
+
+ this is a summary
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_exact_remote
+ spec_fetcher do |fetcher|
+ fetcher.spec 'coolgem-omg', 3
+ fetcher.spec 'coolgem', '4.2.1'
+ fetcher.spec 'wow_coolgem', 1
+ end
+
+ @cmd.handle_options %w[--remote --exact coolgem]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** REMOTE GEMS ***
+
+coolgem (4.2.1)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_exact_local
+ spec_fetcher do |fetcher|
+ fetcher.spec 'coolgem-omg', 3
+ fetcher.spec 'coolgem', '4.2.1'
+ fetcher.spec 'wow_coolgem', 1
+ end
+
+ @cmd.handle_options %w[--exact coolgem]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+coolgem (4.2.1)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_execute_exact_multiple
+ spec_fetcher do |fetcher|
+ fetcher.spec 'coolgem-omg', 3
+ fetcher.spec 'coolgem', '4.2.1'
+ fetcher.spec 'wow_coolgem', 1
+
+ fetcher.spec 'othergem-omg', 3
+ fetcher.spec 'othergem', '1.2.3'
+ fetcher.spec 'wow_othergem', 1
+ end
+
+ @cmd.handle_options %w[--exact coolgem othergem]
+
+ use_ui @stub_ui do
+ @cmd.execute
+ end
+
+ expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+coolgem (4.2.1)
+
+*** LOCAL GEMS ***
+
+othergem (1.2.3)
+ EOF
+
+ assert_equal expected, @stub_ui.output
+ end
+
+ def test_depprecated
+ assert @cmd.deprecated?
+ end
+
+ private
+
+ def add_gems_to_fetcher
+ spec_fetcher do |fetcher|
+ fetcher.download 'a', 1
+ fetcher.download 'a', 2
+ fetcher.download 'a', '3.a'
+ end
+ end
+
+end
diff --git a/test/rubygems/test_gem_gem_runner.rb b/test/rubygems/test_gem_gem_runner.rb
index 71b792c957..b700a333f4 100644
--- a/test/rubygems/test_gem_gem_runner.rb
+++ b/test/rubygems/test_gem_gem_runner.rb
@@ -67,6 +67,16 @@ class TestGemGemRunner < Gem::TestCase
assert_equal %w[--foo], args
end
+ def test_query_is_deprecated
+ args = %w[query]
+
+ use_ui @ui do
+ assert_nil @runner.run(args)
+ end
+
+ assert_equal "WARNING: query command is deprecated. It will be removed on or after 2020-12-01.\n", @ui.error
+ end
+
def test_info_succeeds
args = %w[info]