diff options
author | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-22 00:27:02 +0000 |
---|---|---|
committer | hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-22 00:27:02 +0000 |
commit | 615ac3593499f54fde4b1eb0fba66b6bd944821b (patch) | |
tree | 1f0b0e97ee3dd51798658d53cee7eec976a83a97 | |
parent | ff31b35f6a66f3c1548e3356d506ff65a574be7f (diff) | |
download | ruby-615ac3593499f54fde4b1eb0fba66b6bd944821b.tar.gz |
Merge rubygems master branch from github.com/rubygems/rubygems.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
62 files changed, 386 insertions, 410 deletions
diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 9716464718..6557256469 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -9,7 +9,7 @@ require 'rbconfig' module Gem - VERSION = "3.0.0.beta1" + VERSION = "3.0.0.beta1".freeze end # Must be first since it unloads the prelude from 1.9.2 @@ -126,14 +126,14 @@ module Gem /mingw/i, /mswin/i, /wince/i, - ] + ].freeze GEM_DEP_FILES = %w[ gem.deps.rb gems.rb Gemfile Isolate - ] + ].freeze ## # Subdirectories in a gem repository @@ -145,7 +145,7 @@ module Gem extensions gems specifications - ] + ].freeze ## # Subdirectories in a gem repository for default gems @@ -153,7 +153,7 @@ module Gem REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES = %w[ gems specifications/default - ] + ].freeze ## # Exception classes used in a Gem.read_binary +rescue+ statement. Not all of @@ -1342,7 +1342,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]} ## # Location of Marshal quick gemspecs on remote repositories - MARSHAL_SPEC_DIR = "quick/Marshal.#{Gem.marshal_version}/" + MARSHAL_SPEC_DIR = "quick/Marshal.#{Gem.marshal_version}/".freeze autoload :BundlerVersionFinder, 'rubygems/bundler_version_finder' autoload :ConfigFile, 'rubygems/config_file' diff --git a/lib/rubygems/bundler_version_finder.rb b/lib/rubygems/bundler_version_finder.rb index 2f448c9562..7babeaa848 100644 --- a/lib/rubygems/bundler_version_finder.rb +++ b/lib/rubygems/bundler_version_finder.rb @@ -104,9 +104,9 @@ To install the missing version, run `gem install bundler:#{vr.first}` return unless gemfile lockfile = case gemfile - when "gems.rb" then "gems.locked" - else "#{gemfile}.lock" - end.dup.untaint + when "gems.rb" then "gems.locked" + else "#{gemfile}.lock" + end.dup.untaint return unless File.file?(lockfile) diff --git a/lib/rubygems/command.rb b/lib/rubygems/command.rb index 71199c59b4..3fc8a70a3e 100644 --- a/lib/rubygems/command.rb +++ b/lib/rubygems/command.rb @@ -570,7 +570,7 @@ class Gem::Command # :stopdoc: - HELP = <<-HELP + HELP = <<-HELP.freeze RubyGems is a sophisticated package manager for Ruby. This is a basic help message containing pointers to more information. diff --git a/lib/rubygems/command_manager.rb b/lib/rubygems/command_manager.rb index 3dc5779c91..40ae6191c5 100644 --- a/lib/rubygems/command_manager.rb +++ b/lib/rubygems/command_manager.rb @@ -69,11 +69,11 @@ class Gem::CommandManager :update, :which, :yank, - ] + ].freeze ALIAS_COMMANDS = { 'i' => 'install' - } + }.freeze ## # Return the authoritative instance of the command manager. diff --git a/lib/rubygems/commands/build_command.rb b/lib/rubygems/commands/build_command.rb index f1d700349f..3c778cf705 100644 --- a/lib/rubygems/commands/build_command.rb +++ b/lib/rubygems/commands/build_command.rb @@ -55,7 +55,11 @@ with gem spec: spec = Gem::Specification.load File.basename(gemspec) if spec then - Gem::Package.build spec, options[:force], options[:strict] + Gem::Package.build( + spec, + options[:force], + options[:strict] + ) else alert_error "Error loading gemspec. Aborting." terminate_interaction 1 diff --git a/lib/rubygems/commands/cert_command.rb b/lib/rubygems/commands/cert_command.rb index 3f74508074..e93c39747c 100644 --- a/lib/rubygems/commands/cert_command.rb +++ b/lib/rubygems/commands/cert_command.rb @@ -149,15 +149,15 @@ class Gem::Commands::CertCommand < Gem::Command end def build_cert email, key # :nodoc: - expiration_length_days = options[:expiration_length_days] - age = - if expiration_length_days.nil? || expiration_length_days == 0 - Gem::Security::ONE_YEAR - else - Gem::Security::ONE_DAY * expiration_length_days - end + expiration_length_days = options[:expiration_length_days] || + Gem.configuration.cert_expiration_length_days + + cert = Gem::Security.create_cert_email( + email, + key, + (Gem::Security::ONE_DAY * expiration_length_days) + ) - cert = Gem::Security.create_cert_email email, key, age Gem::Security.write cert, "gem-public_cert.pem" end diff --git a/lib/rubygems/commands/help_command.rb b/lib/rubygems/commands/help_command.rb index 7d02022369..0c96963fac 100644 --- a/lib/rubygems/commands/help_command.rb +++ b/lib/rubygems/commands/help_command.rb @@ -4,7 +4,7 @@ require 'rubygems/command' class Gem::Commands::HelpCommand < Gem::Command # :stopdoc: - EXAMPLES = <<-EOF + EXAMPLES = <<-EOF.freeze Some examples of 'gem' usage. * Install 'rake', either from local directory or remote server: @@ -53,7 +53,7 @@ Some examples of 'gem' usage. gem update --system EOF - GEM_DEPENDENCIES = <<-EOF + GEM_DEPENDENCIES = <<-EOF.freeze A gem dependencies file allows installation of a consistent set of gems across multiple environments. The RubyGems implementation is designed to be compatible with Bundler's Gemfile format. You can see additional @@ -230,7 +230,7 @@ default. This may be overridden with the :development_group option: EOF - PLATFORMS = <<-'EOF' + PLATFORMS = <<-'EOF'.freeze RubyGems platforms are composed of three parts, a CPU, an OS, and a version. These values are taken from values in rbconfig.rb. You can view your current platform by running `gem environment`. @@ -277,7 +277,7 @@ platform. ["examples", EXAMPLES], ["gem_dependencies", GEM_DEPENDENCIES], ["platforms", PLATFORMS], - ] + ].freeze # :startdoc: def initialize diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb index 281108ea1f..37abe3b2ec 100644 --- a/lib/rubygems/commands/setup_command.rb +++ b/lib/rubygems/commands/setup_command.rb @@ -9,7 +9,7 @@ class Gem::Commands::SetupCommand < Gem::Command HISTORY_HEADER = /^===\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/ VERSION_MATCHER = /^===\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/ - ENV_PATHS = %w[/usr/bin/env /bin/env] + ENV_PATHS = %w[/usr/bin/env /bin/env].freeze def initialize require 'tmpdir' @@ -84,8 +84,8 @@ class Gem::Commands::SetupCommand < Gem::Command add_option '--[no-]regenerate-binstubs', 'Regenerate gem binstubs' do |value, options| - options[:regenerate_binstubs] = value - end + options[:regenerate_binstubs] = value + end add_option('-E', '--[no-]env-shebang', 'Rewrite executables with a shebang', diff --git a/lib/rubygems/commands/uninstall_command.rb b/lib/rubygems/commands/uninstall_command.rb index 1ddc12c737..d1ffe675fe 100644 --- a/lib/rubygems/commands/uninstall_command.rb +++ b/lib/rubygems/commands/uninstall_command.rb @@ -20,7 +20,7 @@ class Gem::Commands::UninstallCommand < Gem::Command add_option('-a', '--[no-]all', 'Uninstall all matching versions' - ) do |value, options| + ) do |value, options| options[:all] = value end diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb index 1c86ba6753..dc924265b0 100644 --- a/lib/rubygems/commands/update_command.rb +++ b/lib/rubygems/commands/update_command.rb @@ -168,12 +168,8 @@ command to remove old versions. 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 + installed = system Gem.ruby, '--disable-gems', 'setup.rb', *args say "RubyGems system software updated" if installed - ENV["RUBYOPT"] = old if old end end diff --git a/lib/rubygems/compatibility.rb b/lib/rubygems/compatibility.rb index 24c741e99b..b4332eb9f1 100644 --- a/lib/rubygems/compatibility.rb +++ b/lib/rubygems/compatibility.rb @@ -22,7 +22,7 @@ module Gem EXEEXT RUBY_SO_NAME arch bindir datadir libdir ruby_install_name ruby_version rubylibprefix sitedir sitelibdir vendordir vendorlibdir rubylibdir - ] + ].freeze unless defined?(ConfigMap) ## diff --git a/lib/rubygems/config_file.rb b/lib/rubygems/config_file.rb index 9ef1236204..f8782015a1 100644 --- a/lib/rubygems/config_file.rb +++ b/lib/rubygems/config_file.rb @@ -45,6 +45,7 @@ class Gem::ConfigFile DEFAULT_VERBOSITY = true DEFAULT_UPDATE_SOURCES = true DEFAULT_CONCURRENT_DOWNLOADS = 8 + DEFAULT_CERT_EXPIRATION_LENGTH_DAYS = 365 ## # For Ruby packagers to set configuration defaults. Set in @@ -136,6 +137,11 @@ class Gem::ConfigFile attr_accessor :sources ## + # Expiration length to sign a certificate + + attr_accessor :cert_expiration_length_days + + ## # Path name of directory or file of openssl client certificate, used for remote https connection with client authentication attr_reader :ssl_client_cert @@ -185,6 +191,7 @@ class Gem::ConfigFile @verbose = DEFAULT_VERBOSITY @update_sources = DEFAULT_UPDATE_SOURCES @concurrent_downloads = DEFAULT_CONCURRENT_DOWNLOADS + @cert_expiration_length_days = DEFAULT_CERT_EXPIRATION_LENGTH_DAYS operating_system_config = Marshal.load Marshal.dump(OPERATING_SYSTEM_DEFAULTS) platform_config = Marshal.load Marshal.dump(PLATFORM_DEFAULTS) @@ -202,15 +209,15 @@ class Gem::ConfigFile end # HACK these override command-line args, which is bad - @backtrace = @hash[:backtrace] if @hash.key? :backtrace - @bulk_threshold = @hash[:bulk_threshold] if @hash.key? :bulk_threshold - @home = @hash[:gemhome] if @hash.key? :gemhome - @path = @hash[:gempath] if @hash.key? :gempath - @update_sources = @hash[:update_sources] if @hash.key? :update_sources - @verbose = @hash[:verbose] if @hash.key? :verbose - @concurrent_downloads = @hash[:concurrent_downloads] if @hash.key? :concurrent_downloads - @disable_default_gem_server = @hash[:disable_default_gem_server] if @hash.key? :disable_default_gem_server - @sources = @hash[:sources] if @hash.key? :sources + @backtrace = @hash[:backtrace] if @hash.key? :backtrace + @bulk_threshold = @hash[:bulk_threshold] if @hash.key? :bulk_threshold + @home = @hash[:gemhome] if @hash.key? :gemhome + @path = @hash[:gempath] if @hash.key? :gempath + @update_sources = @hash[:update_sources] if @hash.key? :update_sources + @verbose = @hash[:verbose] if @hash.key? :verbose + @disable_default_gem_server = @hash[:disable_default_gem_server] if @hash.key? :disable_default_gem_server + @sources = @hash[:sources] if @hash.key? :sources + @cert_expiration_length_days = @hash[:cert_expiration_length_days] if @hash.key? :cert_expiration_length_days @ssl_verify_mode = @hash[:ssl_verify_mode] if @hash.key? :ssl_verify_mode @ssl_ca_cert = @hash[:ssl_ca_cert] if @hash.key? :ssl_ca_cert diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb index b8222877ae..334ef4d4c1 100644 --- a/lib/rubygems/defaults.rb +++ b/lib/rubygems/defaults.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true module Gem - DEFAULT_HOST = "https://rubygems.org" + DEFAULT_HOST = "https://rubygems.org".freeze @post_install_hooks ||= [] @done_installing_hooks ||= [] @@ -36,9 +36,9 @@ module Gem ] elsif RbConfig::CONFIG['rubylibprefix'] then [ - RbConfig::CONFIG['rubylibprefix'], - 'gems', - RbConfig::CONFIG['ruby_version'] + RbConfig::CONFIG['rubylibprefix'], + 'gems', + RbConfig::CONFIG['ruby_version'] ] else [ diff --git a/lib/rubygems/dependency.rb b/lib/rubygems/dependency.rb index 3465666790..c06df0fa35 100644 --- a/lib/rubygems/dependency.rb +++ b/lib/rubygems/dependency.rb @@ -19,7 +19,7 @@ class Gem::Dependency TYPES = [ :development, :runtime, - ] + ].freeze ## # Dependency name or regular expression. diff --git a/lib/rubygems/doctor.rb b/lib/rubygems/doctor.rb index ec4a16c3f8..e5d8c43de8 100644 --- a/lib/rubygems/doctor.rb +++ b/lib/rubygems/doctor.rb @@ -26,7 +26,7 @@ class Gem::Doctor ['doc', ''], ['extensions', ''], ['gems', ''], - ] + ].freeze missing = Gem::REPOSITORY_SUBDIRECTORIES.sort - diff --git a/lib/rubygems/ext/builder.rb b/lib/rubygems/ext/builder.rb index 6382a8f5c7..b3b9033962 100644 --- a/lib/rubygems/ext/builder.rb +++ b/lib/rubygems/ext/builder.rb @@ -148,9 +148,21 @@ EOF def build_extension extension, dest_path # :nodoc: results = [] + # FIXME: Determine if this line is necessary and, if so, why. + # Notes: + # 1. As far as I can tell, this method is only called by +build_extensions+. + # 2. The existence of this line implies +extension+ is, or previously was, + # sometimes +false+ or +nil+. + # 3. #1 and #2 combined suggests, but does not confirm, that + # +@specs.extensions+ sometimes contained +false+ or +nil+ values. + # 4. Nothing seems to explicitly handle +extension+ being empty, + # which makes me wonder both what it should do and what it does. + # + # - @duckinator extension ||= '' # I wish I knew why this line existed + extension_dir = - File.expand_path File.join @gem_dir, File.dirname(extension) + File.expand_path File.join(@gem_dir, File.dirname(extension)) lib_dir = File.join @spec.full_gem_path, @spec.raw_require_paths.first builder = builder_for extension @@ -200,6 +212,7 @@ EOF FileUtils.rm_f @spec.gem_build_complete_path + # FIXME: action at a distance: @ran_rake modified deep in build_extension(). - @duckinator @ran_rake = false # only run rake once @spec.extensions.each do |extension| diff --git a/lib/rubygems/ext/ext_conf_builder.rb b/lib/rubygems/ext/ext_conf_builder.rb index a17881a890..18e300d8c2 100644 --- a/lib/rubygems/ext/ext_conf_builder.rb +++ b/lib/rubygems/ext/ext_conf_builder.rb @@ -38,7 +38,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder destdir = ENV["DESTDIR"] begin - cmd = [Gem.ruby, "-r", get_relative_path(siteconf.path), File.basename(extension), *args].join ' ' + cmd = [Gem.ruby, "-I", File.expand_path("../../..", __FILE__), "-r", get_relative_path(siteconf.path), File.basename(extension), *args].join ' ' begin run cmd, results diff --git a/lib/rubygems/ext/rake_builder.rb b/lib/rubygems/ext/rake_builder.rb index 7a5a48c6cc..890803aaef 100644 --- a/lib/rubygems/ext/rake_builder.rb +++ b/lib/rubygems/ext/rake_builder.rb @@ -5,6 +5,8 @@ # See LICENSE.txt for permissions. #++ +require "shellwords" + class Gem::Ext::RakeBuilder < Gem::Ext::Builder def self.build(extension, dest_path, results, args=[], lib_dir=nil) @@ -14,9 +16,6 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder run cmd, results end - # Deal with possible spaces in the path, e.g. C:/Program Files - dest_path = '"' + dest_path.to_s + '"' if dest_path.to_s.include?(' ') - rake = ENV['rake'] rake ||= begin @@ -26,9 +25,8 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder rake ||= Gem.default_exec_format % 'rake' - cmd = "#{rake} RUBYARCHDIR=#{dest_path} RUBYLIBDIR=#{dest_path}" # ENV is frozen - - run cmd, results + rake_args = ["RUBYARCHDIR=#{dest_path}", "RUBYLIBDIR=#{dest_path}", *args] + run "#{rake} #{rake_args.shelljoin}", results results end diff --git a/lib/rubygems/install_update_options.rb b/lib/rubygems/install_update_options.rb index 75968605f1..824682f9ad 100644 --- a/lib/rubygems/install_update_options.rb +++ b/lib/rubygems/install_update_options.rb @@ -63,30 +63,6 @@ module Gem::InstallUpdateOptions options[:document] = [] end - add_option(:Deprecated, '--[no-]rdoc', - 'Generate RDoc for installed gems', - 'Use --document instead') do |value, options| - if value then - options[:document] << 'rdoc' - else - options[:document].delete 'rdoc' - end - - options[:document].uniq! - end - - add_option(:Deprecated, '--[no-]ri', - 'Generate ri data for installed gems.', - 'Use --document instead') do |value, options| - if value then - options[:document] << 'ri' - else - options[:document].delete 'ri' - end - - options[:document].uniq! - end - add_option(:"Install/Update", '-E', '--[no-]env-shebang', "Rewrite the shebang line on installed", "scripts to use /usr/bin/env") do |value, options| diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index a3bb9b821e..298a7053c7 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -34,7 +34,7 @@ class Gem::Installer # Paths where env(1) might live. Some systems are broken and have it in # /bin - ENV_PATHS = %w[/usr/bin/env /bin/env] + ENV_PATHS = %w[/usr/bin/env /bin/env].freeze ## # Deprecated in favor of Gem::Ext::BuildError diff --git a/lib/rubygems/package.rb b/lib/rubygems/package.rb index ec9541d19b..a71c41afc7 100644 --- a/lib/rubygems/package.rb +++ b/lib/rubygems/package.rb @@ -119,7 +119,7 @@ class Gem::Package # Permission for other files attr_accessor :data_mode - def self.build spec, skip_validation=false, strict_validation=false + def self.build spec, skip_validation = false, strict_validation = false gem_file = spec.file_name package = new gem_file @@ -263,7 +263,11 @@ class Gem::Package @spec.mark_version @spec.validate true, strict_validation unless skip_validation - setup_signer + setup_signer( + signer_options: { + expiration_length_days: Gem.configuration.cert_expiration_length_days + } + ) @gem.with_write_io do |gem_io| Gem::Package::TarWriter.new gem_io do |gem| @@ -521,10 +525,17 @@ EOM # Prepares the gem for signing and checksum generation. If a signing # certificate and key are not present only checksum generation is set up. - def setup_signer + def setup_signer(signer_options: {}) passphrase = ENV['GEM_PRIVATE_KEY_PASSPHRASE'] if @spec.signing_key then - @signer = Gem::Security::Signer.new @spec.signing_key, @spec.cert_chain, passphrase + @signer = + Gem::Security::Signer.new( + @spec.signing_key, + @spec.cert_chain, + passphrase, + signer_options + ) + @spec.signing_key = nil @spec.cert_chain = @signer.cert_chain.map { |cert| cert.to_s } else diff --git a/lib/rubygems/package/tar_header.rb b/lib/rubygems/package/tar_header.rb index fa1f5b6e46..d3c242f815 100644 --- a/lib/rubygems/package/tar_header.rb +++ b/lib/rubygems/package/tar_header.rb @@ -50,7 +50,7 @@ class Gem::Package::TarHeader :uid, :uname, :version, - ] + ].freeze ## # Pack format for a tar header diff --git a/lib/rubygems/platform.rb b/lib/rubygems/platform.rb index 2dd9ed5782..1019fc22b9 100644 --- a/lib/rubygems/platform.rb +++ b/lib/rubygems/platform.rb @@ -195,12 +195,12 @@ class Gem::Platform # A pure-Ruby gem that may use Gem::Specification#extensions to build # binary files. - RUBY = 'ruby' + RUBY = 'ruby'.freeze ## # A platform-specific gem that is built for the packaging Ruby's platform. # This will be replaced with Gem::Platform::local. - CURRENT = 'current' + CURRENT = 'current'.freeze end diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index 940523f246..7c4f3f9a6f 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -71,13 +71,10 @@ class Gem::RemoteFetcher # HTTP_PROXY_PASS) # * <tt>:no_proxy</tt>: ignore environment variables and _don't_ use a proxy # - # +dns+: An object to use for DNS resolution of the API endpoint. - # By default, use Resolv::DNS. - # # +headers+: A set of additional HTTP headers to be sent to the server when # fetching the gem. - def initialize(proxy=nil, dns=Resolv::DNS.new, headers={}) + def initialize(proxy=nil, dns=nil, headers={}) require 'net/http' require 'stringio' require 'time' @@ -90,35 +87,10 @@ class Gem::RemoteFetcher @pool_lock = Mutex.new @cert_files = Gem::Request.get_cert_files - @dns = dns @headers = headers end ## - # Given a source at +uri+, calculate what hostname to actually - # connect to query the data for it. - - def api_endpoint(uri) - host = uri.host - - begin - res = @dns.getresource "_rubygems._tcp.#{host}", - Resolv::DNS::Resource::IN::SRV - rescue Resolv::ResolvError => e - verbose "Getting SRV record failed: #{e}" - uri - else - target = res.target.to_s.strip - - if URI("http://" + target).host.end_with?(".#{host}") - return URI.parse "#{uri.scheme}://#{target}#{uri.path}" - end - - uri - end - end - - ## # Given a name and requirement, downloads this gem into cache and returns the # filename. Returns nil if the gem cannot be located. #-- diff --git a/lib/rubygems/request_set/gem_dependency_api.rb b/lib/rubygems/request_set/gem_dependency_api.rb index a26e8b90a3..177079da03 100644 --- a/lib/rubygems/request_set/gem_dependency_api.rb +++ b/lib/rubygems/request_set/gem_dependency_api.rb @@ -48,7 +48,7 @@ class Gem::RequestSet::GemDependencyAPI :ruby_19 => %w[ruby rbx maglev], :ruby_20 => %w[ruby rbx maglev], :ruby_21 => %w[ruby rbx maglev], - } + }.freeze mswin = Gem::Platform.new 'x86-mswin32' mswin64 = Gem::Platform.new 'x64-mswin64' @@ -88,7 +88,7 @@ class Gem::RequestSet::GemDependencyAPI :x64_mingw => x64_mingw, :x64_mingw_20 => x64_mingw, :x64_mingw_21 => x64_mingw - } + }.freeze gt_eq_0 = Gem::Requirement.new '>= 0' tilde_gt_1_8_0 = Gem::Requirement.new '~> 1.8.0' @@ -129,7 +129,7 @@ class Gem::RequestSet::GemDependencyAPI :x64_mingw => gt_eq_0, :x64_mingw_20 => tilde_gt_2_0_0, :x64_mingw_21 => tilde_gt_2_1_0, - } + }.freeze WINDOWS = { # :nodoc: :mingw => :only, @@ -160,7 +160,7 @@ class Gem::RequestSet::GemDependencyAPI :x64_mingw => :only, :x64_mingw_20 => :only, :x64_mingw_21 => :only, - } + }.freeze ## # The gems required by #gem statements in the gem.deps.rb file diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb index 0717739dc0..93bfe7d022 100644 --- a/lib/rubygems/requirement.rb +++ b/lib/rubygems/requirement.rb @@ -22,12 +22,12 @@ class Gem::Requirement ">=" => lambda { |v, r| v >= r }, "<=" => lambda { |v, r| v <= r }, "~>" => lambda { |v, r| v >= r && v.release < r.bump } - } + }.freeze SOURCE_SET_REQUIREMENT = Struct.new(:for_lockfile).new "!" # :nodoc: quoted = OPS.keys.map { |k| Regexp.quote k }.join "|" - PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*" # :nodoc: + PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*".freeze # :nodoc: ## # A regular expression that matches a requirement @@ -37,7 +37,7 @@ class Gem::Requirement ## # The default requirement matches any version - DefaultRequirement = [">=", Gem::Version.new(0)] + DefaultRequirement = [">=", Gem::Version.new(0)].freeze ## # Raised when a bad requirement is encountered diff --git a/lib/rubygems/resolver/source_set.rb b/lib/rubygems/resolver/source_set.rb index 66f5963e54..696d963732 100644 --- a/lib/rubygems/resolver/source_set.rb +++ b/lib/rubygems/resolver/source_set.rb @@ -37,7 +37,7 @@ class Gem::Resolver::SourceSet < Gem::Resolver::Set @links[name] = source end -private + private def get_set(name) link = @links[name] diff --git a/lib/rubygems/resolver/stats.rb b/lib/rubygems/resolver/stats.rb index 3b95efebf7..64b458f504 100644 --- a/lib/rubygems/resolver/stats.rb +++ b/lib/rubygems/resolver/stats.rb @@ -32,7 +32,7 @@ class Gem::Resolver::Stats @iterations += 1 end - PATTERN = "%20s: %d\n" + PATTERN = "%20s: %d\n".freeze def display $stdout.puts "=== Resolver Statistics ===" diff --git a/lib/rubygems/safe_yaml.rb b/lib/rubygems/safe_yaml.rb index 949c7b4754..d610889995 100644 --- a/lib/rubygems/safe_yaml.rb +++ b/lib/rubygems/safe_yaml.rb @@ -19,12 +19,12 @@ module Gem Gem::Version::Requirement YAML::Syck::DefaultKey Syck::DefaultKey - ) + ).freeze WHITELISTED_SYMBOLS = %w( development runtime - ) + ).freeze if ::YAML.respond_to? :safe_load def self.safe_load input diff --git a/lib/rubygems/security.rb b/lib/rubygems/security.rb index dc5e91a6f4..f896039fa4 100644 --- a/lib/rubygems/security.rb +++ b/lib/rubygems/security.rb @@ -401,7 +401,7 @@ module Gem::Security 'keyUsage' => 'keyEncipherment,dataEncipherment,digitalSignature', 'subjectKeyIdentifier' => 'hash', - } + }.freeze def self.alt_name_or_x509_entry certificate, x509_entry alt_name = certificate.extensions.find do |extension| diff --git a/lib/rubygems/security/policies.rb b/lib/rubygems/security/policies.rb index f16c46306a..49ca8d860d 100644 --- a/lib/rubygems/security/policies.rb +++ b/lib/rubygems/security/policies.rb @@ -110,7 +110,7 @@ module Gem::Security 'MediumSecurity' => MediumSecurity, 'HighSecurity' => HighSecurity, # SigningPolicy is not intended for use by `gem -P` so do not list it - } + }.freeze end diff --git a/lib/rubygems/security/policy.rb b/lib/rubygems/security/policy.rb index f43e6c8c96..2e9159797c 100644 --- a/lib/rubygems/security/policy.rb +++ b/lib/rubygems/security/policy.rb @@ -196,9 +196,9 @@ class Gem::Security::Policy def inspect # :nodoc: ("[Policy: %s - data: %p signer: %p chain: %p root: %p " + "signed-only: %p trusted-only: %p]") % [ - @name, @verify_chain, @verify_data, @verify_root, @verify_signer, - @only_signed, @only_trusted, - ] + @name, @verify_chain, @verify_data, @verify_root, @verify_signer, + @only_signed, @only_trusted, + ] end ## diff --git a/lib/rubygems/security/signer.rb b/lib/rubygems/security/signer.rb index fc98f951bc..32dab9fa81 100644 --- a/lib/rubygems/security/signer.rb +++ b/lib/rubygems/security/signer.rb @@ -30,6 +30,15 @@ class Gem::Security::Signer attr_reader :digest_name # :nodoc: ## + # Gem::Security::Signer options + + attr_reader :options + + DEFAULT_OPTIONS = { + expiration_length_days: 365 + }.freeze + + ## # Attemps to re-sign an expired cert with a given private key def self.re_sign_cert(expired_cert, expired_cert_path, private_key) return unless expired_cert.not_after < Time.now @@ -40,7 +49,11 @@ class Gem::Security::Signer Gem::Security.write(expired_cert, new_expired_cert_path) - re_signed_cert = Gem::Security.re_sign(expired_cert, private_key) + re_signed_cert = Gem::Security.re_sign( + expired_cert, + private_key, + (Gem::Security::ONE_DAY * Gem.configuration.cert_expiration_length_days) + ) Gem::Security.write(re_signed_cert, expired_cert_path) @@ -52,10 +65,11 @@ class Gem::Security::Signer # +chain+ containing X509 certificates, encoding certificates or paths to # certificates. - def initialize key, cert_chain, passphrase = nil + def initialize key, cert_chain, passphrase = nil, options = {} @cert_chain = cert_chain @key = key @passphrase = passphrase + @options = DEFAULT_OPTIONS.merge(options) unless @key then default_key = File.join Gem.default_key_path @@ -130,7 +144,9 @@ class Gem::Security::Signer raise Gem::Security::Exception, 'no certs provided' if @cert_chain.empty? if @cert_chain.length == 1 and @cert_chain.last.not_after < Time.now then - re_sign_key + re_sign_key( + expiration_length: (Gem::Security::ONE_DAY * options[:expiration_length_days]) + ) end full_name = extract_name @cert_chain.last @@ -154,7 +170,7 @@ class Gem::Security::Signer # be saved as ~/.gem/gem-public_cert.pem.expired.%Y%m%d%H%M%S where the # expiry time (not after) is used for the timestamp. - def re_sign_key # :nodoc: + def re_sign_key(expiration_length: Gem::Security::ONE_YEAR) # :nodoc: old_cert = @cert_chain.last disk_cert_path = File.join(Gem.default_cert_path) @@ -174,7 +190,7 @@ class Gem::Security::Signer unless File.exist?(old_cert_path) Gem::Security.write(old_cert, old_cert_path) - cert = Gem::Security.re_sign(old_cert, @key) + cert = Gem::Security.re_sign(old_cert, @key, expiration_length) Gem::Security.write(cert, disk_cert_path) diff --git a/lib/rubygems/security/trust_dir.rb b/lib/rubygems/security/trust_dir.rb index 62dbe29e4e..6d837affa1 100644 --- a/lib/rubygems/security/trust_dir.rb +++ b/lib/rubygems/security/trust_dir.rb @@ -11,7 +11,7 @@ class Gem::Security::TrustDir DEFAULT_PERMISSIONS = { :trust_dir => 0700, :trusted_cert => 0600, - } + }.freeze ## # The directory where trusted certificates will be stored. diff --git a/lib/rubygems/server.rb b/lib/rubygems/server.rb index 9ebd2f5e44..5c65f74aa3 100644 --- a/lib/rubygems/server.rb +++ b/lib/rubygems/server.rb @@ -35,7 +35,7 @@ class Gem::Server include ERB::Util include Gem::UserInteraction - SEARCH = <<-ERB + SEARCH = <<-ERB.freeze <form class="headerSearch" name="headerSearchForm" method="get" action="/rdoc"> <div id="search" style="float:right"> <label for="q">Filter/Search</label> @@ -45,7 +45,7 @@ class Gem::Server </form> ERB - DOC_TEMPLATE = <<-'ERB' + DOC_TEMPLATE = <<-'ERB'.freeze <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" @@ -129,7 +129,7 @@ class Gem::Server ERB # CSS is copy & paste from rdoc-style.css, RDoc V1.0.1 - 20041108 - RDOC_CSS = <<-CSS + RDOC_CSS = <<-CSS.freeze body { font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 90%; @@ -339,7 +339,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; } .ruby-value { color: #7fffd4; background: transparent; } CSS - RDOC_NO_DOCUMENTATION = <<-'ERB' + RDOC_NO_DOCUMENTATION = <<-'ERB'.freeze <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @@ -373,7 +373,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; } </html> ERB - RDOC_SEARCH_TEMPLATE = <<-'ERB' + RDOC_SEARCH_TEMPLATE = <<-'ERB'.freeze <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb index 7f38b6325f..5530c2ce32 100644 --- a/lib/rubygems/source.rb +++ b/lib/rubygems/source.rb @@ -16,7 +16,7 @@ class Gem::Source :released => 'specs', :latest => 'latest_specs', :prerelease => 'prerelease_specs', - } + }.freeze ## # The URI this source will fetch gems from. @@ -36,15 +36,6 @@ class Gem::Source end @uri = uri - @api_uri = nil - end - - ## - # Use an SRV record on the host to look up the true endpoint for the index. - - def api_uri # :nodoc: - require 'rubygems/remote_fetcher' - @api_uri ||= Gem::RemoteFetcher.fetcher.api_endpoint uri end ## @@ -87,9 +78,9 @@ class Gem::Source # Returns a Set that can fetch specifications from this source. def dependency_resolver_set # :nodoc: - return Gem::Resolver::IndexSet.new self if 'file' == api_uri.scheme + return Gem::Resolver::IndexSet.new self if 'file' == uri.scheme - bundler_api_uri = api_uri + './api/v1/dependencies' + bundler_api_uri = uri + './api/v1/dependencies' begin fetcher = Gem::RemoteFetcher.fetcher @@ -140,9 +131,9 @@ class Gem::Source spec_file_name = name_tuple.spec_name - uri = api_uri + "#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}" + source_uri = uri + "#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}" - cache_dir = cache_dir uri + cache_dir = cache_dir source_uri local_spec = File.join cache_dir, spec_file_name @@ -152,9 +143,9 @@ class Gem::Source return spec if spec end - uri.path << '.rz' + source_uri.path << '.rz' - spec = fetcher.fetch_path uri + spec = fetcher.fetch_path source_uri spec = Gem::Util.inflate spec if update_cache? then @@ -184,7 +175,7 @@ class Gem::Source file = FILES[type] fetcher = Gem::RemoteFetcher.fetcher file_name = "#{file}.#{Gem.marshal_version}" - spec_path = api_uri + "#{file_name}.gz" + spec_path = uri + "#{file_name}.gz" cache_dir = cache_dir spec_path local_file = File.join(cache_dir, file_name) retried = false @@ -212,7 +203,7 @@ class Gem::Source def download(spec, dir=Dir.pwd) fetcher = Gem::RemoteFetcher.fetcher - fetcher.download spec, api_uri.to_s, dir + fetcher.download spec, uri.to_s, dir end def pretty_print q # :nodoc: @@ -220,7 +211,7 @@ class Gem::Source q.breakable q.text @uri.to_s - if api = api_uri + if api = uri q.breakable q.text 'API URI: ' q.text api.to_s diff --git a/lib/rubygems/spec_fetcher.rb b/lib/rubygems/spec_fetcher.rb index 4d224ca173..7c77eeffdb 100644 --- a/lib/rubygems/spec_fetcher.rb +++ b/lib/rubygems/spec_fetcher.rb @@ -203,9 +203,9 @@ class Gem::SpecFetcher matches = if matches.empty? && type != :prerelease suggest_gems_from_name gem_name, :prerelease - else - matches.uniq.sort_by { |name, dist| dist } - end + else + matches.uniq.sort_by { |name, dist| dist } + end matches.first(5).map { |name, dist| name } end diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 1ec4ed9227..7b2f031d27 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- # frozen_string_literal: true +# -*- coding: utf-8 -*- #-- # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. # All rights reserved. @@ -89,13 +89,13 @@ class Gem::Specification < Gem::BasicSpecification 'Added "required_rubygems_version"', 'Now forward-compatible with future versions', ], - 3 => [ - 'Added Fixnum validation to the specification_version' + 3 => [ + 'Added Fixnum validation to the specification_version' ], - 4 => [ + 4 => [ 'Added sandboxed freeform metadata to the specification version.' ] - } + }.freeze MARSHAL_FIELDS = { # :nodoc: -1 => 16, @@ -103,12 +103,14 @@ class Gem::Specification < Gem::BasicSpecification 2 => 16, 3 => 17, 4 => 18, - } + }.freeze today = Time.now.utc TODAY = Time.utc(today.year, today.month, today.day) # :nodoc: + # rubocop:disable Style/MutableConstant LOAD_CACHE = {} # :nodoc: + # rubocop:enable Style/MutableConstant private_constant :LOAD_CACHE if defined? private_constant @@ -163,19 +165,21 @@ class Gem::Specification < Gem::BasicSpecification :version => nil, }.freeze + # rubocop:disable Style/MutableConstant INITIALIZE_CODE_FOR_DEFAULTS = { } # :nodoc: + # rubocop:enable Style/MutableConstant @@default_value.each do |k,v| INITIALIZE_CODE_FOR_DEFAULTS[k] = case v - when [], {}, true, false, nil, Numeric, Symbol - v.inspect - when String - v.dump - when Numeric - "default_value(:#{k})" - else - "default_value(:#{k}).dup" - end + when [], {}, true, false, nil, Numeric, Symbol + v.inspect + when String + v.dump + when Numeric + "default_value(:#{k})" + else + "default_value(:#{k}).dup" + end end @@attributes = @@default_value.keys.sort_by { |s| s.to_s } @@ -260,22 +264,11 @@ class Gem::Specification < Gem::BasicSpecification ].flatten.compact.uniq.sort end - ###################################################################### - # :section: Recommended gemspec attributes - ## - # Singular writer for #authors + # A list of authors for this gem. # - # Usage: - # - # spec.author = 'John Jones' - - def author= o - self.authors = [o] - end - - ## - # Sets the list of authors, ensuring it is an array. + # Alternatively, a single author can be specified by assigning a string to + # `spec.author` # # Usage: # @@ -285,6 +278,9 @@ class Gem::Specification < Gem::BasicSpecification @authors = Array(value).flatten.grep(String) end + ###################################################################### + # :section: Recommended gemspec attributes + ## # A long description of this gem # @@ -404,6 +400,17 @@ class Gem::Specification < Gem::BasicSpecification # :section: Optional gemspec attributes ## + # Singular (alternative) writer for #authors + # + # Usage: + # + # spec.author = 'John Jones' + + def author= o + self.authors = [o] + end + + ## # The path in the gem for executable scripts. Usually 'bin' # # Usage: diff --git a/lib/rubygems/specification_policy.rb b/lib/rubygems/specification_policy.rb index d117120e9a..e28408a5a5 100644 --- a/lib/rubygems/specification_policy.rb +++ b/lib/rubygems/specification_policy.rb @@ -4,6 +4,8 @@ require 'uri' class Gem::SpecificationPolicy < SimpleDelegator VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc: + SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]+/ # :nodoc: + VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z} # :nodoc: METADATA_LINK_KEYS = %w[ @@ -14,7 +16,7 @@ class Gem::SpecificationPolicy < SimpleDelegator mailing_list_uri source_code_uri wiki_uri - ] # :nodoc: + ].freeze # :nodoc: def initialize(specification) @warnings = 0 @@ -219,12 +221,14 @@ open-ended dependency on #{dep} is not recommended end def validate_name - if !name.is_a?(String) then + if !name.is_a?(String) error "invalid value for attribute name: \"#{name.inspect}\" must be a string" - elsif name !~ /[a-zA-Z]/ then + elsif name !~ /[a-zA-Z]/ error "invalid value for attribute name: #{name.dump} must include at least one letter" - elsif name !~ VALID_NAME_PATTERN then + elsif name !~ VALID_NAME_PATTERN error "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores" + elsif name =~ SPECIAL_CHARACTERS + error "invalid value for attribute name: #{name.dump} can not begin with a period, dash, or underscore" end end @@ -257,9 +261,9 @@ open-ended dependency on #{dep} is not recommended def validate_platform case platform - when Gem::Platform, Gem::Platform::RUBY then # ok - else - error "invalid platform #{platform.inspect}, see Gem::Platform" + when Gem::Platform, Gem::Platform::RUBY then # ok + else + error "invalid platform #{platform.inspect}, see Gem::Platform" end end @@ -272,10 +276,10 @@ open-ended dependency on #{dep} is not recommended def validate_array_attribute(field) val = self.send(field) klass = case field - when :dependencies then - Gem::Dependency - else - String + when :dependencies then + Gem::Dependency + else + String end unless Array === val and val.all? {|x| x.kind_of?(klass)} then diff --git a/lib/rubygems/stub_specification.rb b/lib/rubygems/stub_specification.rb index 62689c21f9..8dd6df17e3 100644 --- a/lib/rubygems/stub_specification.rb +++ b/lib/rubygems/stub_specification.rb @@ -6,10 +6,10 @@ class Gem::StubSpecification < Gem::BasicSpecification # :nodoc: - PREFIX = "# stub: " + PREFIX = "# stub: ".freeze # :nodoc: - OPEN_MODE = 'r:UTF-8:-' + OPEN_MODE = 'r:UTF-8:-'.freeze class StubLine # :nodoc: all attr_reader :name, :version, :platform, :require_paths, :extensions, @@ -22,7 +22,7 @@ class Gem::StubSpecification < Gem::BasicSpecification 'lib' => 'lib'.freeze, 'test' => 'test'.freeze, 'ext' => 'ext'.freeze, - } + }.freeze # These are common require path lists. This hash is used to optimize # and consolidate require_path objects. Most specs just specify "lib" @@ -30,7 +30,7 @@ class Gem::StubSpecification < Gem::BasicSpecification # a require path list for that case. REQUIRE_PATH_LIST = { # :nodoc: 'lib' => ['lib'].freeze - } + }.freeze def initialize data, extensions parts = data[PREFIX.length..-1].split(" ".freeze, 4) diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index ced33c4d11..718571ea57 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -1540,7 +1540,7 @@ Also, a list: # :stopdoc: # only available in RubyGems tests - PRIVATE_KEY_PASSPHRASE = 'Foo bar' + PRIVATE_KEY_PASSPHRASE = 'Foo bar'.freeze begin PRIVATE_KEY = load_key 'private' diff --git a/lib/rubygems/test_utilities.rb b/lib/rubygems/test_utilities.rb index 3e17973dd4..1ec142937a 100644 --- a/lib/rubygems/test_utilities.rb +++ b/lib/rubygems/test_utilities.rb @@ -25,17 +25,11 @@ class Gem::FakeFetcher attr_reader :data attr_reader :last_request - attr_reader :api_endpoints attr_accessor :paths def initialize @data = {} @paths = [] - @api_endpoints = {} - end - - def api_endpoint(uri) - @api_endpoints[uri] || uri end def find_data(path) @@ -111,14 +105,6 @@ class Gem::FakeFetcher q.breakable q.pp @data.keys - - unless @api_endpoints.empty? then - q.breakable - q.text 'API endpoints:' - - q.breakable - q.pp @api_endpoints.keys - end end end diff --git a/lib/rubygems/text.rb b/lib/rubygems/text.rb index b944b62c27..52580e780c 100644 --- a/lib/rubygems/text.rb +++ b/lib/rubygems/text.rb @@ -73,7 +73,7 @@ module Gem::Text d[j+1] + 1, # insertion e + 1, # deletion d[j] + cost # substitution - ) + ) d[j] = e e = x end diff --git a/lib/rubygems/uninstaller.rb b/lib/rubygems/uninstaller.rb index 3059099373..ee0467c7bf 100644 --- a/lib/rubygems/uninstaller.rb +++ b/lib/rubygems/uninstaller.rb @@ -315,8 +315,8 @@ class Gem::Uninstaller msg << '' siblings = Gem::Specification.select do |s| - s.name == spec.name && s.full_name != spec.full_name - end + s.name == spec.name && s.full_name != spec.full_name + end spec.dependent_gems.each do |dep_spec, dep, satlist| unless siblings.any? { |s| s.satisfies_requirement? dep } diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb index 08f0d1e7a5..d700aebd5d 100644 --- a/lib/rubygems/version.rb +++ b/lib/rubygems/version.rb @@ -154,7 +154,7 @@ class Gem::Version include Comparable - VERSION_PATTERN = '[0-9]+(?>\.[0-9a-zA-Z]+)*(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?' # :nodoc: + VERSION_PATTERN = '[0-9]+(?>\.[0-9a-zA-Z]+)*(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?'.freeze # :nodoc: ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/ # :nodoc: ## diff --git a/test/rubygems/simple_gem.rb b/test/rubygems/simple_gem.rb index 1650910aaf..0f2ea48198 100644 --- a/test/rubygems/simple_gem.rb +++ b/test/rubygems/simple_gem.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -SIMPLE_GEM = <<-GEMDATA +SIMPLE_GEM = <<-GEMDATA.freeze MD5SUM = "989bf34a1cbecd52e0ea66b662b3a405" if $0 == __FILE__ require 'optparse' diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index ddf0f7e04c..ae271d8c99 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -14,7 +14,7 @@ end class TestGem < Gem::TestCase - PLUGINS_LOADED = [] + PLUGINS_LOADED = [] # rubocop:disable Style/MutableConstant def setup super @@ -1494,7 +1494,7 @@ class TestGem < Gem::TestCase if Gem::USE_BUNDLER_FOR_GEMDEPS BUNDLER_LIB_PATH = File.expand_path $LOAD_PATH.find {|lp| File.file?(File.join(lp, "bundler.rb")) }.dup.untaint - BUNDLER_FULL_NAME = "bundler-#{Bundler::VERSION}" + BUNDLER_FULL_NAME = "bundler-#{Bundler::VERSION}".freeze end def add_bundler_full_name(names) @@ -1757,19 +1757,20 @@ class TestGem < Gem::TestCase else platform = " #{platform}" end - expected = if Gem::USE_BUNDLER_FOR_GEMDEPS - <<-EXPECTED + expected = + if Gem::USE_BUNDLER_FOR_GEMDEPS + <<-EXPECTED Could not find gem 'a#{platform}' in any of the gem sources listed in your Gemfile. You may need to `gem install -g` to install missing gems - EXPECTED - else - <<-EXPECTED + EXPECTED + else + <<-EXPECTED Unable to resolve dependency: user requested 'a (>= 0)' You may need to `gem install -g` to install missing gems - EXPECTED - end + EXPECTED + end assert_output nil, expected do Gem.use_gemdeps diff --git a/test/rubygems/test_gem_command_manager.rb b/test/rubygems/test_gem_command_manager.rb index 51a14184ff..bb379427de 100644 --- a/test/rubygems/test_gem_command_manager.rb +++ b/test/rubygems/test_gem_command_manager.rb @@ -126,7 +126,7 @@ class TestGemCommandManager < Gem::TestCase #check settings check_options = nil @command_manager.process_args %w[ - install --force --local --rdoc --install-dir . + install --force --local --document=ri,rdoc --install-dir . --version 3.0 --no-wrapper --bindir . ] assert_equal %w[rdoc ri], check_options[:document].sort @@ -260,7 +260,7 @@ class TestGemCommandManager < Gem::TestCase #check settings check_options = nil - @command_manager.process_args %w[update --force --rdoc --install-dir .] + @command_manager.process_args %w[update --force --document=ri --install-dir .] assert_includes check_options[:document], 'ri' assert_equal true, check_options[:force] assert_equal Dir.pwd, check_options[:install_dir] diff --git a/test/rubygems/test_gem_commands_build_command.rb b/test/rubygems/test_gem_commands_build_command.rb index 8048f3e8f5..f7c92ebd7e 100644 --- a/test/rubygems/test_gem_commands_build_command.rb +++ b/test/rubygems/test_gem_commands_build_command.rb @@ -6,6 +6,12 @@ require 'rubygems/package' class TestGemCommandsBuildCommand < Gem::TestCase + CERT_FILE = cert_path 'public3072' + SIGNING_KEY = key_path 'private3072' + + EXPIRED_CERT_FILE = cert_path 'expired' + PRIVATE_KEY_FILE = key_path 'private' + def setup super @@ -50,6 +56,32 @@ class TestGemCommandsBuildCommand < Gem::TestCase util_test_build_gem @gem end + def test_execute_bad_name + [".", "-", "_"].each do |special_char| + gem = util_spec 'some_gem_with_bad_name' do |s| + s.name = "#{special_char}bad_gem_name" + s.license = 'AGPL-3.0' + s.files = ['README.md'] + end + + gemspec_file = File.join(@tempdir, gem.spec_name) + + File.open gemspec_file, 'w' do |gs| + gs.write gem.to_ruby + end + + @cmd.options[:args] = [gemspec_file] + + use_ui @ui do + Dir.chdir @tempdir do + assert_raises Gem::InvalidSpecificationException do + @cmd.execute + end + end + end + end + end + def test_execute_strict_without_warnings gemspec_file = File.join(@tempdir, @gem.spec_name) @@ -221,9 +253,6 @@ class TestGemCommandsBuildCommand < Gem::TestCase util_test_build_gem @gem end - CERT_FILE = cert_path 'public3072' - SIGNING_KEY = key_path 'private3072' - def test_build_signed_gem skip 'openssl is missing' unless defined?(OpenSSL::SSL) @@ -251,4 +280,48 @@ class TestGemCommandsBuildCommand < Gem::TestCase assert gem.verify end + def test_build_signed_gem_with_cert_expiration_length_days + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + + gem_path = File.join Gem.user_home, ".gem" + Dir.mkdir gem_path + + trust_dir = Gem::Security.trust_dir + + tmp_expired_cert_file = File.join gem_path, "gem-public_cert.pem" + File.write(tmp_expired_cert_file, File.read(EXPIRED_CERT_FILE)) + + tmp_private_key_file = File.join gem_path, "gem-private_key.pem" + File.write(tmp_private_key_file, File.read(PRIVATE_KEY_FILE)) + + spec = util_spec 'some_gem' do |s| + s.signing_key = tmp_private_key_file + s.cert_chain = [tmp_expired_cert_file] + end + + gemspec_file = File.join(@tempdir, spec.spec_name) + + File.open gemspec_file, 'w' do |gs| + gs.write spec.to_ruby + end + + @cmd.options[:args] = [gemspec_file] + + Gem.configuration.cert_expiration_length_days = 28 + + use_ui @ui do + Dir.chdir @tempdir do + @cmd.execute + end + end + + re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file)) + cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60) + + gem_file = File.join @tempdir, File.basename(spec.cache_file) + + assert File.exist?(gem_file) + assert_equal(28, cert_days_to_expire) + end + end diff --git a/test/rubygems/test_gem_commands_cert_command.rb b/test/rubygems/test_gem_commands_cert_command.rb index 3d9bbeb1df..97c081e110 100644 --- a/test/rubygems/test_gem_commands_cert_command.rb +++ b/test/rubygems/test_gem_commands_cert_command.rb @@ -159,7 +159,7 @@ Added '/CN=alternate/DC=example' @cmd.handle_options %W[ --build nobody@example.com --days 26 - ] + ] @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}" @@ -615,6 +615,37 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis assert_equal '', @ui.error end + def test_execute_re_sign_with_cert_expiration_length_days + gem_path = File.join Gem.user_home, ".gem" + Dir.mkdir gem_path + + path = File.join @tempdir, 'cert.pem' + Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0600 + + assert_equal '/CN=nobody/DC=example', EXPIRED_PUBLIC_CERT.issuer.to_s + + tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE)) + File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE)) + + @cmd.handle_options %W[ + --private-key #{PRIVATE_KEY_FILE} + --certificate #{tmp_expired_cert_file} + --re-sign + ] + + Gem.configuration.cert_expiration_length_days = 28 + + use_ui @ui do + @cmd.execute + end + + re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file)) + cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60) + + assert_equal(28, cert_days_to_expire) + assert_equal '', @ui.error + end + def test_handle_options @cmd.handle_options %W[ --add #{PUBLIC_CERT_FILE} diff --git a/test/rubygems/test_gem_commands_install_command.rb b/test/rubygems/test_gem_commands_install_command.rb index bd7dcfc24e..b024c77c70 100644 --- a/test/rubygems/test_gem_commands_install_command.rb +++ b/test/rubygems/test_gem_commands_install_command.rb @@ -55,7 +55,7 @@ class TestGemCommandsInstallCommand < Gem::TestCase a2_pre = specs['a-2.a'] @cmd.handle_options [a2_pre.name, '--version', a2_pre.version.to_s, - "--no-ri", "--no-rdoc"] + "--no-document"] assert @cmd.options[:prerelease] assert @cmd.options[:version].satisfied_by?(a2_pre.version) diff --git a/test/rubygems/test_gem_commands_pristine_command.rb b/test/rubygems/test_gem_commands_pristine_command.rb index 4586159af6..5d7a267974 100644 --- a/test/rubygems/test_gem_commands_pristine_command.rb +++ b/test/rubygems/test_gem_commands_pristine_command.rb @@ -495,11 +495,13 @@ class TestGemCommandsPristineCommand < Gem::TestCase @cmd.execute end - assert_equal([ - "Restoring gems to pristine condition...", - "Skipped default-2.0.0.0, it is a default gem", - ], - @ui.output.split("\n")) + assert_equal( + [ + "Restoring gems to pristine condition...", + "Skipped default-2.0.0.0, it is a default gem", + ], + @ui.output.split("\n") + ) assert_empty(@ui.error) end diff --git a/test/rubygems/test_gem_commands_setup_command.rb b/test/rubygems/test_gem_commands_setup_command.rb index c243121efa..eabd023d96 100644 --- a/test/rubygems/test_gem_commands_setup_command.rb +++ b/test/rubygems/test_gem_commands_setup_command.rb @@ -10,7 +10,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase if File.exist?(bundler_gemspec) BUNDLER_VERS = File.read(bundler_gemspec).match(/VERSION = "(#{Gem::Version::VERSION_PATTERN})"/)[1] else - BUNDLER_VERS = "1.16.2" + BUNDLER_VERS = "1.16.2".freeze end def setup diff --git a/test/rubygems/test_gem_config_file.rb b/test/rubygems/test_gem_config_file.rb index e09a76ef98..5749905b5a 100644 --- a/test/rubygems/test_gem_config_file.rb +++ b/test/rubygems/test_gem_config_file.rb @@ -44,6 +44,7 @@ class TestGemConfigFile < Gem::TestCase assert_equal Gem::ConfigFile::DEFAULT_BULK_THRESHOLD, @cfg.bulk_threshold assert_equal true, @cfg.verbose assert_equal [@gem_repo], Gem.sources + assert_equal 365, @cfg.cert_expiration_length_days File.open @temp_conf, 'w' do |fp| fp.puts ":backtrace: true" @@ -58,6 +59,7 @@ class TestGemConfigFile < Gem::TestCase fp.puts "- /var/ruby/1.8/gem_home" fp.puts ":ssl_verify_mode: 0" fp.puts ":ssl_ca_cert: /etc/ssl/certs" + fp.puts ":cert_expiration_length_days: 28" end util_config_file @@ -71,6 +73,7 @@ class TestGemConfigFile < Gem::TestCase @cfg.path) assert_equal 0, @cfg.ssl_verify_mode assert_equal '/etc/ssl/certs', @cfg.ssl_ca_cert + assert_equal 28, @cfg.cert_expiration_length_days end def test_initialize_handle_arguments_config_file diff --git a/test/rubygems/test_gem_dependency_list.rb b/test/rubygems/test_gem_dependency_list.rb index 0533a5f342..7ba91be95f 100644 --- a/test/rubygems/test_gem_dependency_list.rb +++ b/test/rubygems/test_gem_dependency_list.rb @@ -136,8 +136,8 @@ class TestGemDependencyList < Gem::TestCase exp = { "b" => [ - Gem::Dependency.new("a", ">= 1") - ] + Gem::Dependency.new("a", ">= 1") + ] } assert_equal exp, @deplist.why_not_ok? diff --git a/test/rubygems/test_gem_ext_rake_builder.rb b/test/rubygems/test_gem_ext_rake_builder.rb index 6141f9bc59..6b647293a8 100644 --- a/test/rubygems/test_gem_ext_rake_builder.rb +++ b/test/rubygems/test_gem_ext_rake_builder.rb @@ -26,7 +26,7 @@ class TestGemExtRakeBuilder < Gem::TestCase refute_match %r%^rake failed:%, output assert_match %r%^#{Regexp.escape @@ruby} mkrf_conf\.rb%, output - assert_match %r%^#{Regexp.escape rake} RUBYARCHDIR=#{Regexp.escape @dest_path} RUBYLIBDIR=#{Regexp.escape @dest_path}%, output + assert_match %r%^#{Regexp.escape rake} RUBYARCHDIR\\=#{Regexp.escape @dest_path} RUBYLIBDIR\\=#{Regexp.escape @dest_path}%, output end end @@ -47,7 +47,22 @@ class TestGemExtRakeBuilder < Gem::TestCase refute_match %r%^rake failed:%, output assert_match %r%^#{Regexp.escape @@ruby} mkrf_conf\.rb%, output - assert_match %r%^#{Regexp.escape rake} RUBYARCHDIR=#{Regexp.escape @dest_path} RUBYLIBDIR=#{Regexp.escape @dest_path}%, output + assert_match %r%^#{Regexp.escape rake} RUBYARCHDIR\\=#{Regexp.escape @dest_path} RUBYLIBDIR\\=#{Regexp.escape @dest_path}%, output + end + end + + def test_class_build_no_mkrf_passes_args + output = [] + + build_rake_in do |rake| + Dir.chdir @ext do + Gem::Ext::RakeBuilder.build "ext/Rakefile", @dest_path, output, ["test1", "test2"] + end + + output = output.join "\n" + + refute_match %r%^rake failed:%, output + assert_match %r%^#{Regexp.escape rake} RUBYARCHDIR\\=#{Regexp.escape @dest_path} RUBYLIBDIR\\=#{Regexp.escape @dest_path} test1 test2%, output end end diff --git a/test/rubygems/test_gem_install_update_options.rb b/test/rubygems/test_gem_install_update_options.rb index 2a85a279a4..65eaf7275f 100644 --- a/test/rubygems/test_gem_install_update_options.rb +++ b/test/rubygems/test_gem_install_update_options.rb @@ -21,8 +21,7 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase --build-root build_root --format-exec --ignore-dependencies - --rdoc - --ri + --document -E -f -i /install_to @@ -92,24 +91,6 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase assert_equal %w[ri], @cmd.options[:document] end - def test_rdoc - @cmd.handle_options %w[--rdoc] - - assert_equal %w[rdoc ri], @cmd.options[:document].sort - end - - def test_rdoc_no - @cmd.handle_options %w[--no-rdoc] - - assert_equal %w[ri], @cmd.options[:document] - end - - def test_ri - @cmd.handle_options %w[--no-ri] - - assert_equal %w[], @cmd.options[:document] - end - def test_security_policy skip 'openssl is missing' unless defined?(OpenSSL::SSL) diff --git a/test/rubygems/test_gem_path_support.rb b/test/rubygems/test_gem_path_support.rb index 90d50a269f..551ec28781 100644 --- a/test/rubygems/test_gem_path_support.rb +++ b/test/rubygems/test_gem_path_support.rb @@ -44,10 +44,10 @@ class TestGemPathSupport < Gem::TestCase assert_equal ENV["GEM_HOME"], ps.home expected = [ - File.join(@tempdir, 'foo'), - File.join(@tempdir, 'bar'), - ENV["GEM_HOME"], - ] + File.join(@tempdir, 'foo'), + File.join(@tempdir, 'bar'), + ENV["GEM_HOME"], + ] assert_equal expected, ps.path end @@ -63,9 +63,9 @@ class TestGemPathSupport < Gem::TestCase assert_equal ENV["GEM_HOME"], ps.home expected = [ - File.join(@tempdir, 'foo'), - File.join(@tempdir, 'bar'), - ] + Gem.default_path << ENV["GEM_HOME"] + File.join(@tempdir, 'foo'), + File.join(@tempdir, 'bar'), + ] + Gem.default_path << ENV["GEM_HOME"] assert_equal expected, ps.path end @@ -81,9 +81,9 @@ class TestGemPathSupport < Gem::TestCase assert_equal ENV["GEM_HOME"], ps.home expected = [ - File.join(@tempdir, 'foo'), - File.join(@tempdir, 'bar'), - ] + Gem.default_path << ENV["GEM_HOME"] + File.join(@tempdir, 'foo'), + File.join(@tempdir, 'bar'), + ] + Gem.default_path << ENV["GEM_HOME"] assert_equal expected, ps.path end diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index dfef55c7ca..0c4367d417 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -35,7 +35,7 @@ class TestGemRemoteFetcher < Gem::TestCase include Gem::DefaultUserInteraction - SERVER_DATA = <<-EOY + SERVER_DATA = <<-EOY.freeze --- !ruby/object:Gem::Cache gems: rake-0.4.11: !ruby/object:Gem::Specification @@ -185,106 +185,6 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== end end - def test_api_endpoint - uri = URI.parse "http://example.com/foo" - target = MiniTest::Mock.new - target.expect :target, "gems.example.com" - - dns = MiniTest::Mock.new - dns.expect :getresource, target, [String, Object] - - fetch = Gem::RemoteFetcher.new nil, dns - assert_equal URI.parse("http://gems.example.com/foo"), fetch.api_endpoint(uri) - - target.verify - dns.verify - end - - def test_api_endpoint_ignores_trans_domain_values - uri = URI.parse "http://gems.example.com/foo" - target = MiniTest::Mock.new - target.expect :target, "blah.com" - - dns = MiniTest::Mock.new - dns.expect :getresource, target, [String, Object] - - fetch = Gem::RemoteFetcher.new nil, dns - assert_equal URI.parse("http://gems.example.com/foo"), fetch.api_endpoint(uri) - - target.verify - dns.verify - end - - def test_api_endpoint_ignores_trans_domain_values_that_starts_with_original - uri = URI.parse "http://example.com/foo" - target = MiniTest::Mock.new - target.expect :target, "example.combadguy.com" - - dns = MiniTest::Mock.new - dns.expect :getresource, target, [String, Object] - - fetch = Gem::RemoteFetcher.new nil, dns - assert_equal URI.parse("http://example.com/foo"), fetch.api_endpoint(uri) - - target.verify - dns.verify - end - - def test_api_endpoint_ignores_trans_domain_values_that_end_with_original - uri = URI.parse "http://example.com/foo" - target = MiniTest::Mock.new - target.expect :target, "badexample.com" - - dns = MiniTest::Mock.new - dns.expect :getresource, target, [String, Object] - - fetch = Gem::RemoteFetcher.new nil, dns - assert_equal URI.parse("http://example.com/foo"), fetch.api_endpoint(uri) - - target.verify - dns.verify - end - - def test_api_endpoint_ignores_trans_domain_values_that_end_with_original_in_path - uri = URI.parse "http://example.com/foo" - target = MiniTest::Mock.new - target.expect :target, "evil.com/a.example.com" - - dns = MiniTest::Mock.new - dns.expect :getresource, target, [String, Object] - - fetch = Gem::RemoteFetcher.new nil, dns - assert_equal URI.parse("http://example.com/foo"), fetch.api_endpoint(uri) - - target.verify - dns.verify - end - - def test_api_endpoint_timeout_warning - uri = URI.parse "http://gems.example.com/foo" - - dns = MiniTest::Mock.new - def dns.getresource arg, *rest - raise Resolv::ResolvError.new('timeout!') - end - - fetch = Gem::RemoteFetcher.new nil, dns - begin - old_verbose, Gem.configuration.verbose = Gem.configuration.verbose, 1 - endpoint = use_ui @stub_ui do - fetch.api_endpoint(uri) - end - ensure - Gem.configuration.verbose = old_verbose - end - - assert_equal uri, endpoint - - assert_equal "Getting SRV record failed: timeout!\n", @stub_ui.output - - dns.verify - end - def test_cache_update_path uri = URI 'http://example/file' path = File.join @tempdir, 'file' @@ -1064,7 +964,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== :DocumentRoot => nil, :Logger => null_logger, :AccessLog => null_logger - ) + ) s.mount_proc("/kill") { |req, res| s.shutdown } s.mount_proc("/yaml") { |req, res| if req["X-Captain"] diff --git a/test/rubygems/test_gem_source.rb b/test/rubygems/test_gem_source.rb index 8805a9b404..a969aae9ed 100644 --- a/test/rubygems/test_gem_source.rb +++ b/test/rubygems/test_gem_source.rb @@ -36,18 +36,6 @@ class TestGemSource < Gem::TestCase assert_equal repository, source.uri end - def test_api_uri - assert_equal @source.api_uri, @source.uri - end - - def test_api_uri_resolved_from_remote_fetcher - uri = URI.parse "http://gem.example/foo" - @fetcher.api_endpoints[uri] = URI.parse "http://api.blah" - - src = Gem::Source.new uri - assert_equal URI.parse("http://api.blah"), src.api_uri - end - def test_cache_dir_escapes_windows_paths uri = URI.parse("file:///C:/WINDOWS/Temp/gem_repo") root = Gem.spec_cache_dir diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index f8bb30d635..0a7531af53 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -9,7 +9,7 @@ require 'rubygems/installer' class TestGemSpecification < Gem::TestCase - LEGACY_YAML_SPEC = <<-EOF + LEGACY_YAML_SPEC = <<-EOF.freeze --- !ruby/object:Gem::Specification rubygems_version: "1.0" name: keyedlist @@ -28,7 +28,7 @@ email: flgr@ccan.de has_rdoc: true EOF - LEGACY_RUBY_SPEC = <<-EOF + LEGACY_RUBY_SPEC = <<-EOF.freeze Gem::Specification.new do |s| s.name = %q{keyedlist} s.version = %q{0.4.0} @@ -3428,10 +3428,10 @@ Did you mean 'Ruby'? end expected = %W[ - a-2 - a-2-x86-my_platform-1 - a-3-x86-other_platform-1 - ] + a-2 + a-2-x86-my_platform-1 + a-3-x86-other_platform-1 + ] latest_specs = Gem::Specification.latest_specs.map(&:full_name).sort diff --git a/test/rubygems/test_gem_util.rb b/test/rubygems/test_gem_util.rb index d17fc77fd9..59f042c8f2 100644 --- a/test/rubygems/test_gem_util.rb +++ b/test/rubygems/test_gem_util.rb @@ -5,7 +5,8 @@ require 'rubygems/util' class TestGemUtil < Gem::TestCase def test_class_popen - assert_equal "0\n", Gem::Util.popen(Gem.ruby, '-e', 'p 0') + skip "MJIT executes process and it's caught by Process.wait(-1)" if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? + assert_equal "0\n", Gem::Util.popen(Gem.ruby, '-I', File.expand_path('../../../lib', __FILE__), '-e', 'p 0') assert_raises Errno::ECHILD do Process.wait(-1) @@ -14,7 +15,7 @@ class TestGemUtil < Gem::TestCase def test_silent_system assert_silent do - Gem::Util.silent_system Gem.ruby, '-e', 'puts "hello"; warn "hello"' + Gem::Util.silent_system Gem.ruby, '-I', File.expand_path('../../../lib', __FILE__), '-e', 'puts "hello"; warn "hello"' end end |