diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-07-11 18:08:16 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2023-07-28 14:57:10 +0900 |
commit | 989f3add62f45d6bf0250810c3c14e2bf22ddb78 (patch) | |
tree | 0ae442a9b2bb1e40f5e41789b96ce709a067cdb7 | |
parent | b9c2f4a42417572a5edf5a21bf606456facd3731 (diff) | |
download | ruby-989f3add62f45d6bf0250810c3c14e2bf22ddb78.tar.gz |
Warn default gems which will be gemified in future
-rw-r--r-- | gem_prelude.rb | 2 | ||||
-rw-r--r-- | lib/bundled_gems.rb | 84 | ||||
-rw-r--r-- | lib/rubygems/core_ext/kernel_require.rb | 1 |
3 files changed, 85 insertions, 2 deletions
diff --git a/gem_prelude.rb b/gem_prelude.rb index f382021ca3..bcd2560fab 100644 --- a/gem_prelude.rb +++ b/gem_prelude.rb @@ -4,6 +4,8 @@ rescue LoadError => e raise unless e.path == 'rubygems' warn "`RubyGems' were not loaded." +else + require 'bundled_gems' end if defined?(Gem) begin diff --git a/lib/bundled_gems.rb b/lib/bundled_gems.rb index 82f35a745e..b756e6f66c 100644 --- a/lib/bundled_gems.rb +++ b/lib/bundled_gems.rb @@ -1,5 +1,5 @@ -module Gem - BUNDLED_GEMS = { +module Gem::BUNDLED_GEMS + SINCE = { "rexml" => "3.0.0", "rss" => "3.0.0", "webrick" => "3.0.0", @@ -20,4 +20,84 @@ module Gem "csv" => "3.4.0", "base64" => "3.4.0" }.freeze + + EXACT = { + "abbrev"=>true, + "base64"=>true, + "csv"=>true, + "drb"=>true, + "getoptlong"=>true, + "mutex_m"=>true, + "nkf"=>true, "kconv"=>"nkf", + "observer"=>true, + "resolv-replace"=>true, + "rinda"=>true, + "syslog"=>true, + }.freeze + + PREFIXED = { + "csv" => true, + "drb" => true, + "rinda" => true, + "syslog" => true, + }.freeze + + WARNED = {} # unfrozen + + def self.[](name) + SINCE[name] + end + + def self.keys + SINCE.keys + end + + conf = ::RbConfig::CONFIG + LIBDIR = (conf["rubylibdir"] + "/").freeze + ARCHDIR = (conf["rubyarchdir"] + "/").freeze + DLEXT = /\.#{Regexp.union([conf["DLEXT"], "so"].uniq)}\z/ + + def self.find_gem(path) + if !path + return + elsif path.start_with?(ARCHDIR) + n = path.delete_prefix(ARCHDIR).sub(DLEXT, "") + elsif path.start_with?(LIBDIR) + n = path.delete_prefix(LIBDIR).chomp(".rb") + else + return + end + EXACT[n] or PREFIXED[n[%r[\A[^/]+(?=/)]]] + end + + def self.warning?(name) + _t, path = $:.resolve_feature_path(name) + return unless gem = find_gem(path) + caller, = caller_locations(3, 1) + return if find_gem(caller&.absolute_path) + return if WARNED[name] + WARNED[name] = true + if gem == true + gem = name + elsif gem + return if WARNED[gem] + WARNED[gem] = true + "#{name} is found in #{gem}" + else + return + end + " which is not part of the default gems since Ruby #{SINCE[gem]}" + end + + bundled_gems = self + + define_method(:find_unresolved_default_spec) do |name| + if msg = bundled_gems.warning?(name) + warn msg, uplevel: 1 + end + super(name) + end + + freeze end + +Gem.singleton_class.prepend Gem::BUNDLED_GEMS diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb index c41ef70669..0f01d22c29 100644 --- a/lib/rubygems/core_ext/kernel_require.rb +++ b/lib/rubygems/core_ext/kernel_require.rb @@ -38,6 +38,7 @@ module Kernel RUBYGEMS_ACTIVATION_MONITOR.synchronize do path = path.to_path if path.respond_to? :to_path + path = String.try_convert(path) || path if spec = Gem.find_unresolved_default_spec(path) # Ensure -I beats a default gem |