* lib/rubygems: Import RubyGems from master as of commit b165260

* test/rubygems:  ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42124 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
drbrain 2013-07-22 22:46:50 +00:00
Родитель 66cc0fa4ab
Коммит 4c2304f000
34 изменённых файлов: 1169 добавлений и 597 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Tue Jul 23 07:44:59 2013 Eric Hodel <drbrain@segment7.net>
* lib/rubygems: Import RubyGems from master as of commit b165260
* test/rubygems: ditto.
Tue Jul 23 07:14:31 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (bary_mulsub_1xN): New function.

Просмотреть файл

@ -446,16 +446,12 @@ module Gem
# $LOAD_PATH for files as well as gems.
#
# Note that find_files will return all files even if they are from different
# versions of the same gem.
# versions of the same gem. See also find_latest_files
def self.find_files(glob, check_load_path=true)
files = []
if check_load_path
files = $LOAD_PATH.map { |load_path|
Dir["#{File.expand_path glob, load_path}#{Gem.suffix_pattern}"]
}.flatten.select { |file| File.file? file.untaint }
end
files = find_files_from_load_path glob if check_load_path
files.concat Gem::Specification.map { |spec|
spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
@ -468,6 +464,40 @@ module Gem
return files
end
def self.find_files_from_load_path glob # :nodoc:
$LOAD_PATH.map { |load_path|
Dir["#{File.expand_path glob, load_path}#{Gem.suffix_pattern}"]
}.flatten.select { |file| File.file? file.untaint }
end
##
# Returns a list of paths matching +glob+ from the latest gems that can be
# used by a gem to pick up features from other gems. For example:
#
# Gem.find_latest_files('rdoc/discover').each do |path| load path end
#
# if +check_load_path+ is true (the default), then find_latest_files also
# searches $LOAD_PATH for files as well as gems.
#
# Unlike find_files, find_latest_files will return only files from the
# latest version of a gem.
def self.find_latest_files(glob, check_load_path=true)
files = []
files = find_files_from_load_path glob if check_load_path
files.concat Gem::Specification.latest_specs(true).map { |spec|
spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
}.flatten
# $LOAD_PATH might contain duplicate entries or reference
# the spec dirs directly, so we prune.
files.uniq! if check_load_path
return files
end
##
# Finds the user's home directory.
#--
@ -947,7 +977,7 @@ module Gem
##
# Load +plugins+ as Ruby files
def self.load_plugin_files(plugins)
def self.load_plugin_files plugins # :nodoc:
plugins.each do |plugin|
# Skip older versions of the GemCutter plugin: Its commands are in
@ -965,10 +995,16 @@ module Gem
end
##
# Find all 'rubygems_plugin' files in installed gems and load them
# Find the 'rubygems_plugin' files in the latest installed gems and load
# them
def self.load_plugins
load_plugin_files find_files('rubygems_plugin', false)
# Remove this env var by at least 3.0
if ENV['RUBYGEMS_LOAD_ALL_PLUGINS']
load_plugin_files find_files('rubygems_plugin', false)
else
load_plugin_files find_latest_files('rubygems_plugin', false)
end
end
##

Просмотреть файл

@ -33,6 +33,39 @@ class Gem::CommandManager
include Gem::UserInteraction
BUILTIN_COMMANDS = [ # :nodoc:
:build,
:cert,
:check,
:cleanup,
:contents,
:dependency,
:environment,
:fetch,
:generate_index,
:help,
:install,
:list,
:lock,
:mirror,
:outdated,
:owner,
:pristine,
:push,
:query,
:rdoc,
:search,
:server,
:sources,
:specification,
:stale,
:uninstall,
:unpack,
:update,
:which,
:yank,
]
##
# Return the authoritative instance of the command manager.
@ -61,36 +94,10 @@ class Gem::CommandManager
def initialize
require 'timeout'
@commands = {}
register_command :build
register_command :cert
register_command :check
register_command :cleanup
register_command :contents
register_command :dependency
register_command :environment
register_command :fetch
register_command :generate_index
register_command :help
register_command :install
register_command :list
register_command :lock
register_command :mirror
register_command :outdated
register_command :owner
register_command :pristine
register_command :push
register_command :query
register_command :rdoc
register_command :search
register_command :server
register_command :sources
register_command :specification
register_command :stale
register_command :uninstall
register_command :unpack
register_command :update
register_command :which
register_command :yank
BUILTIN_COMMANDS.each do |name|
register_command name
end
end
##
@ -132,14 +139,6 @@ class Gem::CommandManager
alert_error "While executing gem ... (#{ex.class})\n #{ex.to_s}"
ui.backtrace ex
if Gem.configuration.really_verbose and \
ex.kind_of?(Gem::Exception) and ex.source_exception
e = ex.source_exception
ui.errs.puts "Because of: (#{e.class})\n #{e.to_s}"
ui.backtrace e
end
terminate_interaction(1)
rescue Interrupt
alert_error "Interrupted"
@ -147,8 +146,6 @@ class Gem::CommandManager
end
def process_args(args, build_args=nil)
args = args.to_str.split(/\s+/) if args.respond_to?(:to_str)
if args.empty? then
say Gem::Command::HELP
terminate_interaction 1

Просмотреть файл

@ -85,44 +85,52 @@ class Gem::Commands::CertCommand < Gem::Command
end
end
def add_certificate certificate # :nodoc:
Gem::Security.trust_dir.trust_cert certificate
say "Added '#{certificate.subject}'"
end
def execute
options[:add].each do |certificate|
Gem::Security.trust_dir.trust_cert certificate
say "Added '#{certificate.subject}'"
add_certificate certificate
end
options[:remove].each do |filter|
certificates_matching filter do |certificate, path|
FileUtils.rm path
say "Removed '#{certificate.subject}'"
end
remove_certificates_matching filter
end
options[:list].each do |filter|
certificates_matching filter do |certificate, _|
# this could probably be formatted more gracefully
say certificate.subject.to_s
end
list_certificates_matching filter
end
options[:build].each do |name|
build name
end
unless options[:sign].empty? then
load_default_cert unless options[:issuer_cert]
load_default_key unless options[:key]
end
options[:sign].each do |cert_file|
sign cert_file
end
sign_certificates unless options[:sign].empty?
end
def build name
if options[:key]
key = options[:key]
key, key_path = build_key
cert_path = build_cert name, key
say "Certificate: #{cert_path}"
if key_path
say "Private Key: #{key_path}"
say "Don't forget to move the key file to somewhere private!"
end
end
def build_cert name, key # :nodoc:
cert = Gem::Security.create_cert_email name, key
Gem::Security.write cert, "gem-public_cert.pem"
end
def build_key # :nodoc:
if options[:key] then
options[:key]
else
passphrase = ask_for_password 'Passphrase for your Private Key:'
say "\n"
@ -135,16 +143,8 @@ class Gem::Commands::CertCommand < Gem::Command
key = Gem::Security.create_key
key_path = Gem::Security.write key, "gem-private_key.pem", 0600, passphrase
end
cert = Gem::Security.create_cert_email name, key
cert_path = Gem::Security.write cert, "gem-public_cert.pem"
say "Certificate: #{cert_path}"
if key_path
say "Private Key: #{key_path}"
say "Don't forget to move the key file to somewhere private!"
return key, key_path
end
end
@ -200,6 +200,13 @@ For further reading on signing gems see `ri Gem::Security`.
EOF
end
def list_certificates_matching filter # :nodoc:
certificates_matching filter do |certificate, _|
# this could probably be formatted more gracefully
say certificate.subject.to_s
end
end
def load_default_cert
cert_file = File.join Gem.default_cert_path
cert = File.read cert_file
@ -233,6 +240,18 @@ For further reading on signing gems see `ri Gem::Security`.
terminate_interaction 1
end
def load_defaults # :nodoc:
load_default_cert unless options[:issuer_cert]
load_default_key unless options[:key]
end
def remove_certificates_matching filter # :nodoc:
certificates_matching filter do |certificate, path|
FileUtils.rm path
say "Removed '#{certificate.subject}'"
end
end
def sign cert_file
cert = File.read cert_file
cert = OpenSSL::X509::Certificate.new cert
@ -247,5 +266,13 @@ For further reading on signing gems see `ri Gem::Security`.
Gem::Security.write cert, cert_file, permissions
end
def sign_certificates # :nodoc:
load_defaults unless options[:sign].empty?
options[:sign].each do |cert_file|
sign cert_file
end
end
end if defined?(OpenSSL::SSL)

Просмотреть файл

@ -31,6 +31,10 @@ class Gem::Commands::ContentsCommand < Gem::Command
"Don't include installed path prefix") do |prefix, options|
options[:prefix] = prefix
end
@path_kind = nil
@spec_dirs = nil
@version = nil
end
def arguments # :nodoc:
@ -46,74 +50,113 @@ class Gem::Commands::ContentsCommand < Gem::Command
end
def execute
version = options[:version] || Gem::Requirement.default
@version = options[:version] || Gem::Requirement.default
@spec_dirs = specification_directories
@path_kind = path_description @spec_dirs
spec_dirs = options[:specdirs].map do |i|
[i, File.join(i, "specifications")]
end.flatten
names = gem_names
path_kind = if spec_dirs.empty? then
spec_dirs = Gem::Specification.dirs
"default gem paths"
else
"specified path"
end
names.each do |name|
found = gem_contents name
gem_names = if options[:all] then
Gem::Specification.map(&:name)
else
get_all_gem_names
end
terminate_interaction 1 unless found or names.length > 1
end
end
gem_names.each do |name|
# HACK: find_by_name fails for some reason... ARGH
# How many places must we embed our resolve logic?
spec = Gem::Specification.find_all_by_name(name, version).last
def files_in spec
if spec.default_gem? then
files_in_default_gem spec
else
files_in_gem spec
end
end
unless spec then
say "Unable to find gem '#{name}' in #{path_kind}"
def files_in_gem spec
gem_path = spec.full_gem_path
extra = "/{#{spec.require_paths.join ','}}" if options[:lib_only]
glob = "#{gem_path}#{extra}/**/*"
prefix_re = /#{Regexp.escape(gem_path)}\//
if Gem.configuration.verbose then
say "\nDirectories searched:"
spec_dirs.sort.each { |dir| say dir }
end
Dir[glob].map do |file|
[gem_path, file.sub(prefix_re, "")]
end
end
terminate_interaction 1 if gem_names.length == 1
end
if spec.default_gem?
files = spec.files.sort.map do |file|
case file
when /\A#{spec.bindir}\//
[Gem::ConfigMap[:bindir], $POSTMATCH]
when /\.so\z/
[Gem::ConfigMap[:archdir], file]
else
[Gem::ConfigMap[:rubylibdir], file]
end
end
def files_in_default_gem spec
spec.files.sort.map do |file|
case file
when /\A#{spec.bindir}\//
[Gem::ConfigMap[:bindir], $POSTMATCH]
when /\.so\z/
[Gem::ConfigMap[:archdir], file]
else
gem_path = spec.full_gem_path
extra = "/{#{spec.require_paths.join ','}}" if options[:lib_only]
glob = "#{gem_path}#{extra}/**/*"
prefix_re = /#{Regexp.escape(gem_path)}\//
files = Dir[glob].map do |file|
[gem_path, file.sub(prefix_re, "")]
end
end
files.sort.each do |prefix, basename|
absolute_path = File.join(prefix, basename)
next if File.directory? absolute_path
if options[:prefix]
say absolute_path
else
say basename
end
[Gem::ConfigMap[:rubylibdir], file]
end
end
end
def gem_contents name
spec = spec_for name
return false unless spec
files = files_in spec
show_files files
true
end
def gem_names # :nodoc:
if options[:all] then
Gem::Specification.map(&:name)
else
get_all_gem_names
end
end
def path_description spec_dirs # :nodoc:
if spec_dirs.empty? then
spec_dirs = Gem::Specification.dirs
"default gem paths"
else
"specified path"
end
end
def show_files files
files.sort.each do |prefix, basename|
absolute_path = File.join(prefix, basename)
next if File.directory? absolute_path
if options[:prefix] then
say absolute_path
else
say basename
end
end
end
def spec_for name
spec = Gem::Specification.find_all_by_name(name, @version).last
return spec if spec
say "Unable to find gem '#{name}' in #{@path_kind}"
if Gem.configuration.verbose then
say "\nDirectories searched:"
@spec_dirs.sort.each { |dir| say dir }
end
return nil
end
def specification_directories # :nodoc:
options[:specdirs].map do |i|
[i, File.join(i, "specifications")]
end.flatten
end
end

Просмотреть файл

@ -42,85 +42,106 @@ class Gem::Commands::DependencyCommand < Gem::Command
"#{program_name} GEMNAME"
end
def fetch_remote_specs dependency # :nodoc:
fetcher = Gem::SpecFetcher.fetcher
ss, = fetcher.spec_for_dependency dependency
ss.map { |spec, _| spec }
end
def fetch_specs dependency # :nodoc:
specs = []
specs.concat dependency.matching_specs if local?
specs.concat fetch_remote_specs dependency if remote?
ensure_specs specs
specs.uniq.sort
end
def gem_dependency args, version, prerelease # :nodoc:
args << '' if args.empty?
pattern = if args.length == 1 and args.first =~ /\A\/(.*)\/(i)?\z/m then
flags = $2 ? Regexp::IGNORECASE : nil
Regexp.new $1, flags
else
/\A#{Regexp.union(*args)}/
end
dependency = Gem::Deprecate.skip_during {
Gem::Dependency.new pattern, version
}
dependency.prerelease = prerelease
dependency
end
def display_pipe specs # :nodoc:
specs.each do |spec|
unless spec.dependencies.empty? then
spec.dependencies.sort_by { |dep| dep.name }.each do |dep|
say "#{dep.name} --version '#{dep.requirement}'"
end
end
end
end
def display_readable specs, reverse # :nodoc:
response = ''
specs.each do |spec|
response << print_dependencies(spec)
unless reverse[spec.full_name].empty? then
response << " Used by\n"
reverse[spec.full_name].each do |sp, dep|
response << " #{sp} (#{dep})\n"
end
end
response << "\n"
end
say response
end
def execute
ensure_local_only_reverse_dependencies
dependency =
gem_dependency options[:args], options[:version], options[:prerelease]
specs = fetch_specs dependency
reverse = reverse_dependencies specs
if options[:pipe_format] then
display_pipe specs
else
display_readable specs, reverse
end
end
def ensure_local_only_reverse_dependencies # :nodoc:
if options[:reverse_dependencies] and remote? and not local? then
alert_error 'Only reverse dependencies for local gems are supported.'
terminate_interaction 1
end
options[:args] << '' if options[:args].empty?
pattern = if options[:args].length == 1 and
options[:args].first =~ /\A\/(.*)\/(i)?\z/m then
flags = $2 ? Regexp::IGNORECASE : nil
Regexp.new $1, flags
else
/\A#{Regexp.union(*options[:args])}/
end
# TODO: deprecate for real damnit
dependency = Gem::Deprecate.skip_during {
Gem::Dependency.new pattern, options[:version]
}
dependency.prerelease = options[:prerelease]
specs = []
specs.concat dependency.matching_specs if local?
if remote? and not options[:reverse_dependencies] then
fetcher = Gem::SpecFetcher.fetcher
ss, _ = fetcher.spec_for_dependency dependency
ss.each { |s,o| specs << s }
end
if specs.empty? then
patterns = options[:args].join ','
say "No gems found matching #{patterns} (#{options[:version]})" if
Gem.configuration.verbose
terminate_interaction 1
end
specs = specs.uniq.sort
reverse = Hash.new { |h, k| h[k] = [] }
if options[:reverse_dependencies] then
specs.each do |spec|
reverse[spec.full_name] = find_reverse_dependencies spec
end
end
if options[:pipe_format] then
specs.each do |spec|
unless spec.dependencies.empty?
spec.dependencies.sort_by { |dep| dep.name }.each do |dep|
say "#{dep.name} --version '#{dep.requirement}'"
end
end
end
else
response = ''
specs.each do |spec|
response << print_dependencies(spec)
unless reverse[spec.full_name].empty? then
response << " Used by\n"
reverse[spec.full_name].each do |sp, dep|
response << " #{sp} (#{dep})\n"
end
end
response << "\n"
end
say response
end
end
def print_dependencies(spec, level = 0)
def ensure_specs specs # :nodoc:
return unless specs.empty?
patterns = options[:args].join ','
say "No gems found matching #{patterns} (#{options[:version]})" if
Gem.configuration.verbose
terminate_interaction 1
end
def print_dependencies(spec, level = 0) # :nodoc:
response = ''
response << ' ' * level + "Gem #{spec.full_name}\n"
unless spec.dependencies.empty? then
@ -131,10 +152,30 @@ class Gem::Commands::DependencyCommand < Gem::Command
response
end
def remote_specs dependency # :nodoc:
fetcher = Gem::SpecFetcher.fetcher
ss, _ = fetcher.spec_for_dependency dependency
ss.map { |s,o| s }
end
def reverse_dependencies specs # :nodoc:
reverse = Hash.new { |h, k| h[k] = [] }
return reverse unless options[:reverse_dependencies]
specs.each do |spec|
reverse[spec.full_name] = find_reverse_dependencies spec
end
reverse
end
##
# Returns an Array of [specification, dep] that are satisfied by +spec+.
def find_reverse_dependencies(spec)
def find_reverse_dependencies spec # :nodoc:
result = []
Gem::Specification.each do |sp|

Просмотреть файл

@ -69,69 +69,25 @@ lib/rubygems/defaults/operating_system.rb
def execute
out = ''
arg = options[:args][0]
case arg
when /^packageversion/ then
out << Gem::RubyGemsPackageVersion
when /^version/ then
out << Gem::VERSION
when /^gemdir/, /^gemhome/, /^home/, /^GEM_HOME/ then
out << Gem.dir
when /^gempath/, /^path/, /^GEM_PATH/ then
out << Gem.path.join(File::PATH_SEPARATOR)
when /^remotesources/ then
out << Gem.sources.to_a.join("\n")
when /^platform/ then
out << Gem.platforms.join(File::PATH_SEPARATOR)
when nil then
out = "RubyGems Environment:\n"
out << " - RUBYGEMS VERSION: #{Gem::VERSION}\n"
out << " - RUBY VERSION: #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}"
out << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
out << ") [#{RUBY_PLATFORM}]\n"
out << " - INSTALLATION DIRECTORY: #{Gem.dir}\n"
out << " - RUBYGEMS PREFIX: #{Gem.prefix}\n" unless Gem.prefix.nil?
out << " - RUBY EXECUTABLE: #{Gem.ruby}\n"
out << " - EXECUTABLE DIRECTORY: #{Gem.bindir}\n"
out << " - SPEC CACHE DIRECTORY: #{Gem.spec_cache_dir}\n"
out << " - RUBYGEMS PLATFORMS:\n"
Gem.platforms.each do |platform|
out << " - #{platform}\n"
out <<
case arg
when /^packageversion/ then
Gem::RubyGemsPackageVersion
when /^version/ then
Gem::VERSION
when /^gemdir/, /^gemhome/, /^home/, /^GEM_HOME/ then
Gem.dir
when /^gempath/, /^path/, /^GEM_PATH/ then
Gem.path.join(File::PATH_SEPARATOR)
when /^remotesources/ then
Gem.sources.to_a.join("\n")
when /^platform/ then
Gem.platforms.join(File::PATH_SEPARATOR)
when nil then
show_environment
else
raise Gem::CommandLineError, "Unknown environment option [#{arg}]"
end
out << " - GEM PATHS:\n"
out << " - #{Gem.dir}\n"
gem_path = Gem.path.dup
gem_path.delete Gem.dir
add_path out, gem_path
out << " - GEM CONFIGURATION:\n"
Gem.configuration.each do |name, value|
value = value.gsub(/./, '*') if name == 'gemcutter_key'
out << " - #{name.inspect} => #{value.inspect}\n"
end
out << " - REMOTE SOURCES:\n"
Gem.sources.each do |s|
out << " - #{s}\n"
end
out << " - SHELL PATH:\n"
shell_path = ENV['PATH'].split(File::PATH_SEPARATOR)
add_path out, shell_path
else
raise Gem::CommandLineError, "Unknown environment option [#{arg}]"
end
say out
true
end
@ -142,5 +98,55 @@ lib/rubygems/defaults/operating_system.rb
end
end
def show_environment # :nodoc:
out = "RubyGems Environment:\n"
out << " - RUBYGEMS VERSION: #{Gem::VERSION}\n"
out << " - RUBY VERSION: #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}"
out << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
out << ") [#{RUBY_PLATFORM}]\n"
out << " - INSTALLATION DIRECTORY: #{Gem.dir}\n"
out << " - RUBYGEMS PREFIX: #{Gem.prefix}\n" unless Gem.prefix.nil?
out << " - RUBY EXECUTABLE: #{Gem.ruby}\n"
out << " - EXECUTABLE DIRECTORY: #{Gem.bindir}\n"
out << " - SPEC CACHE DIRECTORY: #{Gem.spec_cache_dir}\n"
out << " - RUBYGEMS PLATFORMS:\n"
Gem.platforms.each do |platform|
out << " - #{platform}\n"
end
out << " - GEM PATHS:\n"
out << " - #{Gem.dir}\n"
gem_path = Gem.path.dup
gem_path.delete Gem.dir
add_path out, gem_path
out << " - GEM CONFIGURATION:\n"
Gem.configuration.each do |name, value|
value = value.gsub(/./, '*') if name == 'gemcutter_key'
out << " - #{name.inspect} => #{value.inspect}\n"
end
out << " - REMOTE SOURCES:\n"
Gem.sources.each do |s|
out << " - #{s}\n"
end
out << " - SHELL PATH:\n"
shell_path = ENV['PATH'].split(File::PATH_SEPARATOR)
add_path out, shell_path
out
end
end

Просмотреть файл

@ -94,6 +94,8 @@ platform.
def initialize
super 'help', "Provide help on the 'gem' command"
@command_manager = Gem::CommandManager.instance
end
def arguments # :nodoc:
@ -110,46 +112,10 @@ platform.
end
def execute
command_manager = Gem::CommandManager.instance
arg = options[:args][0]
if begins? "commands", arg then
out = []
out << "GEM commands are:"
out << nil
margin_width = 4
desc_width = command_manager.command_names.map { |n| n.size }.max + 4
summary_width = 80 - margin_width - desc_width
wrap_indent = ' ' * (margin_width + desc_width)
format = "#{' ' * margin_width}%-#{desc_width}s%s"
command_manager.command_names.each do |cmd_name|
command = command_manager[cmd_name]
summary =
if command then
command.summary
else
"[No command found for #{cmd_name}]"
end
summary = wrap(summary, summary_width).split "\n"
out << sprintf(format, cmd_name, summary.shift)
until summary.empty? do
out << "#{wrap_indent}#{summary.shift}"
end
end
out << nil
out << "For help on a particular command, use 'gem help COMMAND'."
out << nil
out << "Commands may be abbreviated, so long as they are unambiguous."
out << "e.g. 'gem i rake' is short for 'gem install rake'."
say out.join("\n")
show_commands
elsif begins? "options", arg then
say Gem::Command::HELP
@ -161,29 +127,79 @@ platform.
say PLATFORMS
elsif options[:help] then
command = command_manager[options[:help]]
if command
# help with provided command
command.invoke("--help")
else
alert_error "Unknown command #{options[:help]}. Try 'gem help commands'"
end
show_help
elsif arg then
possibilities = command_manager.find_command_possibilities(arg.downcase)
if possibilities.size == 1
command = command_manager[possibilities.first]
command.invoke("--help")
elsif possibilities.size > 1
alert_warning "Ambiguous command #{arg} (#{possibilities.join(', ')})"
else
alert_warning "Unknown command #{arg}. Try gem help commands"
end
show_command_help arg
else
say Gem::Command::HELP
end
end
def show_commands # :nodoc:
out = []
out << "GEM commands are:"
out << nil
margin_width = 4
desc_width = @command_manager.command_names.map { |n| n.size }.max + 4
summary_width = 80 - margin_width - desc_width
wrap_indent = ' ' * (margin_width + desc_width)
format = "#{' ' * margin_width}%-#{desc_width}s%s"
@command_manager.command_names.each do |cmd_name|
command = @command_manager[cmd_name]
summary =
if command then
command.summary
else
"[No command found for #{cmd_name}]"
end
summary = wrap(summary, summary_width).split "\n"
out << sprintf(format, cmd_name, summary.shift)
until summary.empty? do
out << "#{wrap_indent}#{summary.shift}"
end
end
out << nil
out << "For help on a particular command, use 'gem help COMMAND'."
out << nil
out << "Commands may be abbreviated, so long as they are unambiguous."
out << "e.g. 'gem i rake' is short for 'gem install rake'."
say out.join("\n")
end
def show_command_help command_name # :nodoc:
command_name = command_name.downcase
possibilities = @command_manager.find_command_possibilities command_name
if possibilities.size == 1 then
command = @command_manager[possibilities.first]
command.invoke("--help")
elsif possibilities.size > 1 then
alert_warning "Ambiguous command #{command_name} (#{possibilities.join(', ')})"
else
alert_warning "Unknown command #{command_name}. Try: gem help commands"
end
end
def show_help # :nodoc:
command = @command_manager[options[:help]]
if command then
# help with provided command
command.invoke("--help")
else
alert_error "Unknown command #{options[:help]}. Try 'gem help commands'"
end
end
end

Просмотреть файл

@ -113,7 +113,44 @@ to write the specification by hand. For example:
"#{program_name} GEMNAME [GEMNAME ...] [options] -- --build-flags"
end
def install_from_gemdeps(gf)
def check_install_dir # :nodoc:
if options[:install_dir] and options[:user_install] then
alert_error "Use --install-dir or --user-install but not both"
terminate_interaction 1
end
end
def check_version # :nodoc:
if options[:version] != Gem::Requirement.default and
get_all_gem_names.size > 1 then
alert_error "Can't use --version w/ multiple gems. Use name:ver instead."
terminate_interaction 1
end
end
def execute
if gf = options[:gemdeps] then
install_from_gemdeps gf
return
end
@installed_specs = []
ENV.delete 'GEM_PATH' if options[:install_dir].nil? and RUBY_VERSION > '1.9'
check_install_dir
check_version
load_hooks
exit_code = install_gems
show_installed
raise Gem::SystemExitException, exit_code
end
def install_from_gemdeps gf # :nodoc:
require 'rubygems/request_set'
rs = Gem::RequestSet.new
rs.load_gemdeps gf
@ -135,58 +172,26 @@ to write the specification by hand. For example:
raise Gem::SystemExitException, 0
end
def execute
if gf = options[:gemdeps] then
install_from_gemdeps gf
return
end
def install_gem name, version # :nodoc:
return if options[:conservative] and
not Gem::Dependency.new(name, version).matching_specs.empty?
@installed_specs = []
inst = Gem::DependencyInstaller.new options
inst.install name, Gem::Requirement.create(version)
ENV.delete 'GEM_PATH' if options[:install_dir].nil? and RUBY_VERSION > '1.9'
@installed_specs.push(*inst.installed_gems)
if options[:install_dir] and options[:user_install]
alert_error "Use --install-dir or --user-install but not both"
terminate_interaction 1
end
show_install_errors inst.errors
end
def install_gems # :nodoc:
exit_code = 0
if options[:version] != Gem::Requirement.default &&
get_all_gem_names.size > 1 then
alert_error "Can't use --version w/ multiple gems. Use name:ver instead."
terminate_interaction 1
end
# load post-install hooks appropriate to options
if options[:install_as_default]
require 'rubygems/install_default_message'
else
require 'rubygems/install_message'
end
require 'rubygems/rdoc'
get_all_gem_names_and_versions.each do |gem_name, gem_version|
gem_version ||= options[:version]
begin
next if options[:conservative] and
not Gem::Dependency.new(gem_name, gem_version).matching_specs.empty?
inst = Gem::DependencyInstaller.new options
inst.install gem_name, Gem::Requirement.create(gem_version)
@installed_specs.push(*inst.installed_gems)
next unless errs = inst.errors
errs.each do |x|
next unless Gem::SourceFetchProblem === x
msg = "Unable to pull data from '#{x.source.uri}': #{x.error.message}"
alert_warning msg
end
install_gem gem_name, gem_version
rescue Gem::InstallError => e
alert_error "Error installing #{gem_name}:\n\t#{e.message}"
exit_code |= 1
@ -197,12 +202,38 @@ to write the specification by hand. For example:
end
end
unless @installed_specs.empty? then
gems = @installed_specs.length == 1 ? 'gem' : 'gems'
say "#{@installed_specs.length} #{gems} installed"
end
exit_code
end
raise Gem::SystemExitException, exit_code
##
# Loads post-install hooks
def load_hooks # :nodoc:
if options[:install_as_default]
require 'rubygems/install_default_message'
else
require 'rubygems/install_message'
end
require 'rubygems/rdoc'
end
def show_install_errors errors # :nodoc:
return unless errors
errors.each do |x|
return unless Gem::SourceFetchProblem === x
msg = "Unable to pull data from '#{x.source.uri}': #{x.error.message}"
alert_warning msg
end
end
def show_installed # :nodoc:
return if @installed_specs.empty?
gems = @installed_specs.length == 1 ? 'gem' : 'gems'
say "#{@installed_specs.length} #{gems} installed"
end
end

Просмотреть файл

@ -14,7 +14,7 @@ class Gem::Commands::QueryCommand < Gem::Command
summary = 'Query gem information in local or remote repositories')
super name, summary,
:name => //, :domain => :local, :details => false, :versions => true,
:installed => false, :version => Gem::Requirement.default
:installed => nil, :version => Gem::Requirement.default
add_option('-i', '--[no-]installed',
'Check for installed gem') do |value, options|
@ -67,15 +67,20 @@ class Gem::Commands::QueryCommand < Gem::Command
name = options[:name]
prerelease = options[:prerelease]
if options[:installed] then
unless options[:installed].nil? then
if name.source.empty? then
alert_error "You must specify a gem name"
exit_code |= 4
elsif installed? name, options[:version] then
say "true"
else
say "false"
exit_code |= 1
installed = installed? name, options[:version]
installed = !installed unless options[:installed]
if installed then
say "true"
else
say "false"
exit_code |= 1
end
end
terminate_interaction exit_code

Просмотреть файл

@ -7,6 +7,8 @@ class Gem::Commands::SearchCommand < Gem::Commands::QueryCommand
super 'search', 'Display all gems whose name contains STRING'
remove_option '--name-matches'
defaults[:domain] = :remote
end
def arguments # :nodoc:

Просмотреть файл

@ -37,103 +37,118 @@ class Gem::Commands::SourcesCommand < Gem::Command
add_proxy_option
end
def defaults_str
'--list'
def add_source source_uri # :nodoc:
check_rubygems_https source_uri
source = Gem::Source.new source_uri
begin
if Gem.sources.include? source_uri then
say "source #{source_uri} already present in the cache"
else
source.load_specs :released
Gem.sources << source
Gem.configuration.write
say "#{source_uri} added to sources"
end
rescue URI::Error, ArgumentError
say "#{source_uri} is not a URI"
terminate_interaction 1
rescue Gem::RemoteFetcher::FetchError => e
say "Error fetching #{source_uri}:\n\t#{e.message}"
terminate_interaction 1
end
end
def execute
options[:list] = !(options[:add] ||
options[:clear_all] ||
options[:remove] ||
options[:update])
def check_rubygems_https source_uri # :nodoc:
uri = URI source_uri
if options[:clear_all] then
path = Gem.spec_cache_dir
FileUtils.rm_rf path
unless File.exist? path then
say "*** Removed specs cache ***"
else
unless File.writable? path then
say "*** Unable to remove source cache (write protected) ***"
else
say "*** Unable to remove source cache ***"
end
terminate_interaction 1
end
end
if source_uri = options[:add] then
uri = URI source_uri
if uri.scheme and uri.scheme.downcase == 'http' and
uri.host.downcase == 'rubygems.org' then
question = <<-QUESTION.chomp
if uri.scheme and uri.scheme.downcase == 'http' and
uri.host.downcase == 'rubygems.org' then
question = <<-QUESTION.chomp
https://rubygems.org is recommended for security over #{uri}
Do you want to add this insecure source?
QUESTION
QUESTION
terminate_interaction 1 unless ask_yes_no question
end
source = Gem::Source.new source_uri
begin
if Gem.sources.include? source_uri then
say "source #{source_uri} already present in the cache"
else
source.load_specs :released
Gem.sources << source
Gem.configuration.write
say "#{source_uri} added to sources"
end
rescue URI::Error, ArgumentError
say "#{source_uri} is not a URI"
terminate_interaction 1
rescue Gem::RemoteFetcher::FetchError => e
say "Error fetching #{source_uri}:\n\t#{e.message}"
terminate_interaction 1
end
end
if options[:remove] then
source_uri = options[:remove]
unless Gem.sources.include? source_uri then
say "source #{source_uri} not present in cache"
else
Gem.sources.delete source_uri
Gem.configuration.write
say "#{source_uri} removed from sources"
end
end
if options[:update] then
Gem.sources.each_source do |src|
src.load_specs :released
src.load_specs :latest
end
say "source cache successfully updated"
end
if options[:list] then
say "*** CURRENT SOURCES ***"
say
Gem.sources.each do |src|
say src
end
terminate_interaction 1 unless ask_yes_no question
end
end
private
def clear_all # :nodoc:
path = Gem.spec_cache_dir
FileUtils.rm_rf path
def remove_cache_file(desc, path)
unless File.exist? path then
say "*** Removed specs cache ***"
else
unless File.writable? path then
say "*** Unable to remove source cache (write protected) ***"
else
say "*** Unable to remove source cache ***"
end
terminate_interaction 1
end
end
def defaults_str # :nodoc:
'--list'
end
def list # :nodoc:
say "*** CURRENT SOURCES ***"
say
Gem.sources.each do |src|
say src
end
end
def list? # :nodoc:
!(options[:list] ||
options[:add] ||
options[:clear_all] ||
options[:remove] ||
options[:update])
end
def execute
clear_all if options[:clear_all]
source_uri = options[:add]
add_source source_uri if source_uri
source_uri = options[:remove]
remove_source source_uri if source_uri
update if options[:update]
list if list?
end
def remove_source source_uri # :nodoc:
unless Gem.sources.include? source_uri then
say "source #{source_uri} not present in cache"
else
Gem.sources.delete source_uri
Gem.configuration.write
say "#{source_uri} removed from sources"
end
end
def update # :nodoc:
Gem.sources.each_source do |src|
src.load_specs :released
src.load_specs :latest
end
say "source cache successfully updated"
end
def remove_cache_file desc, path # :nodoc:
FileUtils.rm_rf path
if not File.exist?(path) then

Просмотреть файл

@ -1,6 +1,7 @@
require 'rubygems/command'
require 'rubygems/version_option'
require 'rubygems/uninstaller'
require 'fileutils'
##
# Gem uninstaller command line tool
@ -14,7 +15,7 @@ class Gem::Commands::UninstallCommand < Gem::Command
def initialize
super 'uninstall', 'Uninstall gems from the local repository',
:version => Gem::Requirement.default, :user_install => true,
:check_dev => false
:install_dir => Gem.dir, :check_dev => false
add_option('-a', '--[no-]all',
'Uninstall all matching versions'
@ -92,8 +93,31 @@ class Gem::Commands::UninstallCommand < Gem::Command
end
def execute
# REFACTOR: stolen from cleanup_command
if options[:all] and not options[:args].empty? then
alert_error 'Gem names and --all may not be used together'
terminate_interaction 1
elsif options[:all] then
uninstall_all
else
uninstall_specific
end
end
def uninstall_all
install_dir = options[:install_dir]
dirs_to_be_emptied = Dir[File.join(install_dir, '*')]
dirs_to_be_emptied.delete_if { |dir| dir.end_with? 'build_info' }
dirs_to_be_emptied.each do |dir|
FileUtils.rm_rf Dir[File.join(dir, '*')]
end
alert("Successfully uninstalled all gems in #{install_dir}")
end
def uninstall_specific
deplist = Gem::DependencyList.new
get_all_gem_names.uniq.each do |name|
Gem::Specification.find_all_by_name(name).each do |spec|
deplist.add spec

Просмотреть файл

@ -56,24 +56,34 @@ class Gem::Commands::UpdateCommand < Gem::Command
"#{program_name} GEMNAME [GEMNAME ...]"
end
def check_latest_rubygems version # :nodoc:
if Gem.rubygems_version == version then
say "Latest version currently installed. Aborting."
terminate_interaction
end
options[:user_install] = false
end
def check_update_arguments # :nodoc:
unless options[:args].empty? then
alert_error "Gem names are not allowed with the --system option"
terminate_interaction 1
end
end
def execute
hig = {}
if options[:system] then
update_rubygems
return
else
say "Updating installed gems"
hig = {} # highest installed gems
Gem::Specification.each do |spec|
if hig[spec.name].nil? or hig[spec.name].version < spec.version then
hig[spec.name] = spec
end
end
end
say "Updating installed gems"
hig = highest_installed_gems
gems_to_update = which_to_update hig, options[:args].uniq
updated = update_gems gems_to_update
@ -85,6 +95,92 @@ class Gem::Commands::UpdateCommand < Gem::Command
end
end
def fetch_remote_gems spec # :nodoc:
dependency = Gem::Dependency.new spec.name, "> #{spec.version}"
dependency.prerelease = options[:prerelease]
fetcher = Gem::SpecFetcher.fetcher
spec_tuples, _ = fetcher.search_for_dependency dependency
spec_tuples
end
def highest_installed_gems # :nodoc:
hig = {} # highest installed gems
Gem::Specification.each do |spec|
if hig[spec.name].nil? or hig[spec.name].version < spec.version then
hig[spec.name] = spec
end
end
hig
end
def highest_remote_version spec # :nodoc:
spec_tuples = fetch_remote_gems spec
matching_gems = spec_tuples.select do |g,_|
g.name == spec.name and g.match_platform?
end
highest_remote_gem = matching_gems.sort_by { |g,_| g.version }.last
highest_remote_gem ||= [Gem::NameTuple.null]
highest_remote_gem.first.version
end
def install_rubygems version # :nodoc:
args = update_rubygems_arguments
update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
Dir.chdir update_dir do
say "Installing RubyGems #{version}"
# Make sure old rubygems isn't loaded
old = ENV["RUBYOPT"]
ENV.delete("RUBYOPT") if old
installed = system Gem.ruby, 'setup.rb', *args
say "RubyGems system software updated" if installed
ENV["RUBYOPT"] = old if old
end
end
def rubygems_target_version
version = options[:system]
update_latest = version == true
if update_latest then
version = Gem::Version.new Gem::VERSION
requirement = Gem::Requirement.new ">= #{Gem::VERSION}"
else
version = Gem::Version.new version
requirement = Gem::Requirement.new version
end
rubygems_update = Gem::Specification.new
rubygems_update.name = 'rubygems-update'
rubygems_update.version = version
hig = {
'rubygems-update' => rubygems_update
}
gems_to_update = which_to_update hig, options[:args], :system
_, up_ver = gems_to_update.first
target = if update_latest then
up_ver
else
version
end
return target, requirement
end
def update_gem name, version = Gem::Requirement.default
return if @updated.any? { |spec| spec.name == name }
@ -118,74 +214,28 @@ class Gem::Commands::UpdateCommand < Gem::Command
# Update RubyGems software to the latest version.
def update_rubygems
unless options[:args].empty? then
alert_error "Gem names are not allowed with the --system option"
terminate_interaction 1
end
check_update_arguments
options[:user_install] = false
version, requirement = rubygems_target_version
# TODO: rename version and other variable name conflicts
# TODO: get rid of all this indirection on name and other BS
check_latest_rubygems version
version = options[:system]
if version == true then
version = Gem::Version.new Gem::VERSION
requirement = Gem::Requirement.new ">= #{Gem::VERSION}"
else
version = Gem::Version.new version
requirement = Gem::Requirement.new version
end
rubygems_update = Gem::Specification.new
rubygems_update.name = 'rubygems-update'
rubygems_update.version = version
hig = {
'rubygems-update' => rubygems_update
}
gems_to_update = which_to_update hig, options[:args], :system
name, up_ver = gems_to_update.first
current_ver = Gem.rubygems_version
target = if options[:system] == true then
up_ver
else
version
end
if current_ver == target then
# if options[:system] != true and version == current_ver then
say "Latest version currently installed. Aborting."
terminate_interaction
end
update_gem name, target
update_gem 'rubygems-update', version
installed_gems = Gem::Specification.find_all_by_name 'rubygems-update', requirement
version = installed_gems.last.version
install_rubygems version
end
def update_rubygems_arguments # :nodoc:
args = []
args << '--prefix' << Gem.prefix if Gem.prefix
# TODO use --document for >= 1.9 , --no-rdoc --no-ri < 1.9
args << '--no-rdoc' unless options[:document].include? 'rdoc'
args << '--no-ri' unless options[:document].include? 'ri'
args << '--no-format-executable' if options[:no_format_executable]
update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
Dir.chdir update_dir do
say "Installing RubyGems #{version}"
setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
# Make sure old rubygems isn't loaded
old = ENV["RUBYOPT"]
ENV.delete("RUBYOPT") if old
installed = system setup_cmd
say "RubyGems system software updated" if installed
ENV["RUBYOPT"] = old if old
end
args
end
def which_to_update highest_installed_gems, gem_names, system = false
@ -195,21 +245,7 @@ class Gem::Commands::UpdateCommand < Gem::Command
next if not gem_names.empty? and
gem_names.all? { |name| /#{name}/ !~ l_spec.name }
dependency = Gem::Dependency.new l_spec.name, "> #{l_spec.version}"
dependency.prerelease = options[:prerelease]
fetcher = Gem::SpecFetcher.fetcher
spec_tuples, _ = fetcher.search_for_dependency dependency
matching_gems = spec_tuples.select do |g,_|
g.name == l_name and g.match_platform?
end
highest_remote_gem = matching_gems.sort_by { |g,_| g.version }.last
highest_remote_gem ||= [Gem::NameTuple.null]
highest_remote_ver = highest_remote_gem.first.version
highest_remote_ver = highest_remote_version l_spec
if system or (l_spec.version < highest_remote_ver) then
result << [l_spec.name, [l_spec.version, highest_remote_ver].max]

Просмотреть файл

@ -7,7 +7,13 @@
# Base exception class for RubyGems. All exception raised by RubyGems are a
# subclass of this one.
class Gem::Exception < RuntimeError
attr_accessor :source_exception
##
#--
# TODO: remove in RubyGems 3, nobody sets this
attr_accessor :source_exception # :nodoc:
end
class Gem::CommandLineError < Gem::Exception; end

Просмотреть файл

@ -23,11 +23,13 @@ class Gem::Ext::Builder
make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
end
destdir = '"DESTDIR=%s"' % ENV['DESTDIR'] if RUBY_VERSION > '2.0'
['', 'install'].each do |target|
# Pass DESTDIR via command line to override what's in MAKEFLAGS
cmd = [
make_program,
'"DESTDIR=%s"' % ENV['DESTDIR'],
destdir,
target
].join(' ').rstrip
run(cmd, results, "make #{target}".rstrip)

Просмотреть файл

@ -39,6 +39,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
run cmd, results
ENV["DESTDIR"] = nil
ENV["RUBYOPT"] = rubyopt
siteconf.unlink
make dest_path, results
@ -49,14 +50,14 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
destent.exist? or File.rename(ent.path, destent.path)
end
end
results
ensure
ENV["RUBYOPT"] = rubyopt
ENV["DESTDIR"] = destdir
end
end
t.unlink if t
t.unlink if t and t.path
results
ensure
FileUtils.rm_rf tmp_dest if tmp_dest
end

Просмотреть файл

@ -36,6 +36,8 @@ class Gem::PathSupport
@spec_cache_dir =
env["GEM_SPEC_CACHE"] || ENV["GEM_SPEC_CACHE"] ||
Gem.default_spec_cache_dir
@spec_cache_dir = @spec_cache_dir.dup.untaint
end
private

Просмотреть файл

@ -324,7 +324,11 @@ class Gem::RemoteFetcher
# connections to reduce connect overhead.
def request(uri, request_class, last_modified = nil)
Gem::Request.new(uri, request_class, last_modified, @proxy).fetch
request = Gem::Request.new uri, request_class, last_modified, @proxy
request.fetch do |req|
yield req if block_given?
end
end
def https?(uri)

Просмотреть файл

@ -1,4 +1,5 @@
require 'net/http'
require 'thread'
require 'time'
require 'rubygems/user_interaction'
@ -14,6 +15,7 @@ class Gem::Request
@last_modified = last_modified
@requests = Hash.new 0
@connections = {}
@connections_mutex = Mutex.new
@user_agent = user_agent
@proxy_uri =
@ -82,8 +84,11 @@ class Gem::Request
end
connection_id = [Thread.current.object_id, *net_http_args].join ':'
@connections[connection_id] ||= Net::HTTP.new(*net_http_args)
connection = @connections[connection_id]
connection = @connections_mutex.synchronize do
@connections[connection_id] ||= Net::HTTP.new(*net_http_args)
@connections[connection_id]
end
if https?(uri) and not connection.started? then
configure_connection_for_https(connection)

Просмотреть файл

@ -74,6 +74,12 @@ class Gem::SpecFetcher
list, errors = available_specs(type)
list.each do |source, specs|
if dependency.name.is_a?(String) && specs.respond_to?(:bsearch)
start_index = (0 ... specs.length).bsearch{ |i| specs[i].name >= dependency.name }
end_index = (0 ... specs.length).bsearch{ |i| specs[i].name > dependency.name }
specs = specs[start_index ... end_index] if start_index && end_index
end
found[source] = specs.select do |tup|
if dependency.match?(tup)
if matching_platform and !Gem::Platform.match(tup.platform)
@ -214,15 +220,15 @@ class Gem::SpecFetcher
def tuples_for(source, type, gracefully_ignore=false)
cache = @caches[type]
if gracefully_ignore
tuples =
begin
cache[source.uri] ||= source.load_specs(type)
rescue Gem::RemoteFetcher::FetchError
raise unless gracefully_ignore
[]
end
else
cache[source.uri] ||= source.load_specs(type)
end
tuples.sort_by { |tup| tup.name }
end
end

Просмотреть файл

@ -954,7 +954,7 @@ class Gem::Specification < Gem::BasicSpecification
result.map(&:last).map(&:values).flatten.reject { |spec|
minimum = native[spec.name]
minimum && spec.version < minimum
}
}.sort_by{ |tup| tup.name }
end
##
@ -1853,11 +1853,6 @@ class Gem::Specification < Gem::BasicSpecification
end
end
# Prevent ruby hitting spec.method_missing when [[spec]].flatten is called
def to_ary # :nodoc:
nil
end
##
# Normalize the list of files so that:
# * All file lists have redundancies removed.
@ -2008,6 +2003,10 @@ class Gem::Specification < Gem::BasicSpecification
@requirements = Array req
end
def respond_to_missing? m, include_private = false # :nodoc:
false
end
##
# Returns the full path to this spec's ri directory.

Просмотреть файл

@ -6,6 +6,13 @@ module Gem
# :nodoc:
PREFIX = "# stub: "
OPEN_MODE = # :nodoc:
if Object.const_defined? :Encoding then
'r:UTF-8:-'
else
'r'
end
# :nodoc:
class StubLine
attr_reader :parts
@ -96,7 +103,7 @@ module Gem
def data
unless @data
File.open(filename, "r:UTF-8:-") do |file|
open filename, OPEN_MODE do |file|
begin
file.readline # discard encoding line
stubline = file.readline.chomp

Просмотреть файл

@ -13,8 +13,13 @@ end
class TestGem < Gem::TestCase
PLUGINS_LOADED = []
def setup
super
PLUGINS_LOADED.clear
common_installer_setup
ENV.delete 'RUBYGEMS_GEMDEPS'
@ -345,9 +350,7 @@ class TestGem < Gem::TestCase
spec
}
# HACK should be Gem.refresh
Gem.searcher = nil
Gem::Specification.reset
Gem.refresh
expected = [
File.expand_path('test/rubygems/sff/discover.rb', @@project_dir),
@ -361,6 +364,37 @@ class TestGem < Gem::TestCase
assert_equal cwd, $LOAD_PATH.shift
end
def test_self_find_latest_files
cwd = File.expand_path("test/rubygems", @@project_dir)
$LOAD_PATH.unshift cwd
discover_path = File.join 'lib', 'sff', 'discover.rb'
_, foo2 = %w(1 2).map { |version|
spec = quick_gem 'sff', version do |s|
s.files << discover_path
end
write_file(File.join 'gems', spec.full_name, discover_path) do |fp|
fp.puts "# #{spec.full_name}"
end
spec
}
Gem.refresh
expected = [
File.expand_path('test/rubygems/sff/discover.rb', @@project_dir),
File.join(foo2.full_gem_path, discover_path),
]
assert_equal expected, Gem.find_latest_files('sff/discover')
assert_equal expected, Gem.find_latest_files('sff/**.rb'), '[ruby-core:31730]'
ensure
assert_equal cwd, $LOAD_PATH.shift
end
def test_self_latest_spec_for
a1 = quick_spec 'a', 1
a2 = quick_spec 'a', 2
@ -883,14 +917,20 @@ class TestGem < Gem::TestCase
Dir.chdir @tempdir do
FileUtils.mkdir_p 'lib'
File.open plugin_path, "w" do |fp|
fp.puts "class TestGem; TEST_SPEC_PLUGIN_LOAD = :loaded; end"
fp.puts "class TestGem; PLUGINS_LOADED << 'plugin'; end"
end
foo = quick_spec 'foo', '1' do |s|
foo1 = quick_spec 'foo', '1' do |s|
s.files << plugin_path
end
install_gem foo
install_gem foo1
foo2 = quick_spec 'foo', '2' do |s|
s.files << plugin_path
end
install_gem foo2
end
Gem.searcher = nil
@ -900,7 +940,7 @@ class TestGem < Gem::TestCase
Gem.load_plugins
assert_equal :loaded, TEST_SPEC_PLUGIN_LOAD
assert_equal %w[plugin], PLUGINS_LOADED
end
def test_load_env_plugins

Просмотреть файл

@ -58,7 +58,7 @@ class TestGemCommandManager < Gem::TestCase
use_ui @ui do
assert_raises Gem::MockGemUi::TermError do
@command_manager.run 'interrupt'
@command_manager.run %w[interrupt]
end
assert_equal '', ui.output
assert_equal "ERROR: Interrupted\n", ui.error
@ -75,7 +75,7 @@ class TestGemCommandManager < Gem::TestCase
@command_manager.register_command :crash
use_ui @ui do
assert_raises Gem::MockGemUi::TermError do
@command_manager.run 'crash'
@command_manager.run %w[crash]
end
assert_equal '', ui.output
err = ui.error.split("\n").first
@ -89,7 +89,7 @@ class TestGemCommandManager < Gem::TestCase
def test_process_args_bad_arg
use_ui @ui do
assert_raises Gem::MockGemUi::TermError do
@command_manager.process_args("--bad-arg")
@command_manager.process_args %w[--bad-arg]
end
end
@ -107,7 +107,7 @@ class TestGemCommandManager < Gem::TestCase
end
#check defaults
@command_manager.process_args("install")
@command_manager.process_args %w[install]
assert_equal %w[ri], check_options[:document].sort
assert_equal false, check_options[:force]
assert_equal :both, check_options[:domain]
@ -118,8 +118,10 @@ class TestGemCommandManager < Gem::TestCase
#check settings
check_options = nil
@command_manager.process_args(
"install --force --local --rdoc --install-dir . --version 3.0 --no-wrapper --bindir . ")
@command_manager.process_args %w[
install --force --local --rdoc --install-dir .
--version 3.0 --no-wrapper --bindir .
]
assert_equal %w[rdoc ri], check_options[:document].sort
assert_equal true, check_options[:force]
assert_equal :local, check_options[:domain]
@ -130,17 +132,17 @@ class TestGemCommandManager < Gem::TestCase
#check remote domain
check_options = nil
@command_manager.process_args("install --remote")
@command_manager.process_args %w[install --remote]
assert_equal :remote, check_options[:domain]
#check both domain
check_options = nil
@command_manager.process_args("install --both")
@command_manager.process_args %w[install --both]
assert_equal :both, check_options[:domain]
#check both domain
check_options = nil
@command_manager.process_args("install --both")
@command_manager.process_args %w[install --both]
assert_equal :both, check_options[:domain]
end
end
@ -155,12 +157,12 @@ class TestGemCommandManager < Gem::TestCase
end
#check defaults
@command_manager.process_args("uninstall")
@command_manager.process_args %w[uninstall]
assert_equal Gem::Requirement.default, check_options[:version]
#check settings
check_options = nil
@command_manager.process_args("uninstall foobar --version 3.0")
@command_manager.process_args %w[uninstall foobar --version 3.0]
assert_equal "foobar", check_options[:args].first
assert_equal Gem::Requirement.new('3.0'), check_options[:version]
end
@ -175,12 +177,12 @@ class TestGemCommandManager < Gem::TestCase
end
#check defaults
@command_manager.process_args("check")
@command_manager.process_args %w[check]
assert_equal true, check_options[:alien]
#check settings
check_options = nil
@command_manager.process_args("check foobar --alien")
@command_manager.process_args %w[check foobar --alien]
assert_equal true, check_options[:alien]
end
@ -194,12 +196,12 @@ class TestGemCommandManager < Gem::TestCase
end
#check defaults
@command_manager.process_args("build")
@command_manager.process_args %w[build]
#NOTE: Currently no defaults
#check settings
check_options = nil
@command_manager.process_args("build foobar.rb")
@command_manager.process_args %w[build foobar.rb]
assert_equal 'foobar.rb', check_options[:args].first
end
@ -213,26 +215,26 @@ class TestGemCommandManager < Gem::TestCase
end
#check defaults
@command_manager.process_args("query")
@command_manager.process_args %w[query]
assert_equal(//, check_options[:name])
assert_equal :local, check_options[:domain]
assert_equal false, check_options[:details]
#check settings
check_options = nil
@command_manager.process_args("query --name foobar --local --details")
@command_manager.process_args %w[query --name foobar --local --details]
assert_equal(/foobar/i, check_options[:name])
assert_equal :local, check_options[:domain]
assert_equal true, check_options[:details]
#remote domain
check_options = nil
@command_manager.process_args("query --remote")
@command_manager.process_args %w[query --remote]
assert_equal :remote, check_options[:domain]
#both (local/remote) domains
check_options = nil
@command_manager.process_args("query --both")
@command_manager.process_args %w[query --both]
assert_equal :both, check_options[:domain]
end
@ -246,12 +248,12 @@ class TestGemCommandManager < Gem::TestCase
end
#check defaults
@command_manager.process_args("update")
@command_manager.process_args %w[update]
assert_includes check_options[:document], 'rdoc'
#check settings
check_options = nil
@command_manager.process_args("update --force --rdoc --install-dir .")
@command_manager.process_args %w[update --force --rdoc --install-dir .]
assert_includes check_options[:document], 'ri'
assert_equal true, check_options[:force]
assert_equal Dir.pwd, check_options[:install_dir]

Просмотреть файл

@ -91,6 +91,34 @@ class TestGemCommandsContentsCommand < Gem::TestCase
assert_equal "", @ui.error
end
def test_execute_missing_single
@cmd.options[:args] = %w[foo]
assert_raises Gem::MockGemUi::TermError do
use_ui @ui do
@cmd.execute
end
end
assert_match "Unable to find gem 'foo'", @ui.output
assert_empty @ui.error
end
def test_execute_missing_multiple
@cmd.options[:args] = %w[foo bar]
gem 'foo'
use_ui @ui do
@cmd.execute
end
assert_match "lib/foo.rb", @ui.output
assert_match "Unable to find gem 'bar'", @ui.output
assert_empty @ui.error
end
def test_execute_multiple
@cmd.options[:args] = %w[foo bar]

Просмотреть файл

@ -18,7 +18,7 @@ class TestGemCommandsHelpCommand < Gem::TestCase
def test_gem_help_bad
util_gem 'bad' do |out, err|
assert_equal('', out)
assert_match(/Unknown command bad. Try gem help commands\n/, err)
assert_match "Unknown command bad", err
end
end

Просмотреть файл

@ -104,9 +104,9 @@ class TestGemCommandsPristineCommand < Gem::TestCase
assert_path_exists gem_exec
if win_platform?
assert_match /\A#!\s*ruby/, File.read(gem_exec)
assert_match %r%\A#!\s*ruby%, File.read(gem_exec)
else
assert_match /\A#!\s*\/usr\/bin\/env ruby/, File.read(gem_exec)
assert_match %r%\A#!\s*/usr/bin/env ruby%, File.read(gem_exec)
end
end

Просмотреть файл

@ -195,6 +195,34 @@ pl (1)
assert_equal '', @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 @ui do
@cmd.execute
end
end
assert_equal "false\n", @ui.output
assert_equal '', @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 @ui do
@cmd.execute
end
end
assert_equal "true\n", @ui.output
assert_equal '', @ui.error
end
def test_execute_installed_no_name
@cmd.handle_options %w[--installed]

Просмотреть файл

@ -0,0 +1,17 @@
require 'rubygems/test_case'
require 'rubygems/commands/search_command'
class TestGemCommandsSearchCommand < Gem::TestCase
def setup
super
@cmd = Gem::Commands::SearchCommand.new
end
def test_initialize
assert_equal :remote, @cmd.defaults[:domain]
end
end

Просмотреть файл

@ -16,6 +16,20 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
@executable = File.join(@gemhome, 'bin', 'executable')
end
def test_execute_all_gem_names
@cmd.options[:args] = %w[a b]
@cmd.options[:all] = true
assert_raises Gem::MockGemUi::TermError do
use_ui @ui do
@cmd.execute
end
end
assert_equal "ERROR: Gem names and --all may not be used together\n",
@ui.error
end
def test_execute_dependency_order
c = quick_gem 'c' do |spec|
spec.add_dependency 'a'
@ -43,6 +57,7 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
def test_execute_removes_executable
ui = Gem::MockGemUi.new
util_setup_gem ui
build_rake_in do
@ -175,5 +190,23 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
assert Gem::Specification.find_all_by_name('x').length == 0
end
def test_execute_all
ui = Gem::MockGemUi.new "y\n"
util_make_gems
util_setup_gem ui
assert Gem::Specification.find_all_by_name('a').length > 1
@cmd.options[:all] = true
@cmd.options[:args] = []
use_ui ui do
@cmd.execute
end
refute_includes Gem::Specification.all_names, 'a'
end
end

Просмотреть файл

@ -0,0 +1,58 @@
require 'rubygems/test_case'
require 'rubygems/ext'
class TestGemExtBuilder < Gem::TestCase
def setup
super
@ext = File.join @tempdir, 'ext'
@dest_path = File.join @tempdir, 'prefix'
FileUtils.mkdir_p @ext
FileUtils.mkdir_p @dest_path
@orig_DESTDIR = ENV['DESTDIR']
end
def teardown
ENV['DESTDIR'] = @orig_DESTDIR
super
end
def test_class_make
ENV['DESTDIR'] = 'destination'
results = []
Dir.chdir @ext do
open 'Makefile', 'w' do |io|
io.puts <<-MAKEFILE
all:
\t@#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}"
install:
\t@#{Gem.ruby} -e "puts %Q{install: \#{ENV['DESTDIR']}}"
MAKEFILE
end
Gem::Ext::Builder.make @dest_path, results
end
results = results.join "\n"
if RUBY_VERSION > '2.0' then
assert_match %r%"DESTDIR=#{ENV['DESTDIR']}"$%, results
assert_match %r%"DESTDIR=#{ENV['DESTDIR']}" install$%, results
else
refute_match %r%"DESTDIR=#{ENV['DESTDIR']}"$%, results
refute_match %r%"DESTDIR=#{ENV['DESTDIR']}" install$%, results
end
assert_match %r%^all: destination$%, results
assert_match %r%^install: destination$%, results
end
end

Просмотреть файл

@ -27,7 +27,10 @@ class TestGemExtExtConfBuilder < Gem::TestCase
output = []
Dir.chdir @ext do
Gem::Ext::ExtConfBuilder.build 'extconf.rb', nil, @dest_path, output
result =
Gem::Ext::ExtConfBuilder.build 'extconf.rb', nil, @dest_path, output
assert_same result, output
end
assert_match(/^#{Gem.ruby} extconf.rb/, output[0])
@ -108,6 +111,42 @@ checking for main\(\) in .*?nonexistent/m, error.message)
assert_equal("#{Gem.ruby} extconf.rb", output[0])
end
def test_class_build_unconventional
if vc_windows? && !nmake_found?
skip("test_class_build skipped - nmake not found")
end
File.open File.join(@ext, 'extconf.rb'), 'w' do |extconf|
extconf.puts <<-'EXTCONF'
include RbConfig
ruby_exe = "#{CONFIG['RUBY_INSTALL_NAME']}#{CONFIG['EXEEXT']}"
ruby = File.join CONFIG['bindir'], ruby_exe
open 'Makefile', 'w' do |io|
io.write <<-Makefile
all: ruby
install: ruby
ruby:
\t#{ruby} -e0
Makefile
end
EXTCONF
end
output = []
Dir.chdir @ext do
Gem::Ext::ExtConfBuilder.build 'extconf.rb', nil, @dest_path, output
end
assert_contains_make_command '', output[2]
assert_contains_make_command 'install', output[4]
assert_empty Dir.glob(File.join(@ext, 'siteconf*.rb'))
end
def test_class_make
if vc_windows? && !nmake_found?
skip("test_class_make skipped - nmake not found")

Просмотреть файл

@ -580,6 +580,17 @@ gems:
end
end
def test_request_block
fetcher = Gem::RemoteFetcher.new nil
assert_throws :block_called do
fetcher.request URI('http://example'), Net::HTTP::Get do |req|
assert_kind_of Net::HTTPGenericRequest, req
throw :block_called
end
end
end
def test_yaml_error_on_size
use_ui @ui do
self.class.enable_yaml = false