Skip to content

Commit

Permalink
[Require] Ensure -I beats a default gem
Browse files Browse the repository at this point in the history
  • Loading branch information
segiddins authored and deivid-rodriguez committed May 18, 2019
1 parent a637592 commit 6fbda98
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
20 changes: 20 additions & 0 deletions lib/rubygems/core_ext/kernel_require.rb
Expand Up @@ -36,6 +36,26 @@ def require(path)

path = path.to_path if path.respond_to? :to_path

resolved_path = begin
rp = nil
$LOAD_PATH[0...Gem.load_path_insert_index].each do |lp|
Gem.suffixes.each do |s|
full_path = File.join(lp, "#{path}#{s}")
if File.file?(File.expand_path(full_path))
rp = full_path
break
end
end
break if rp
end
rp
end

if resolved_path
RUBYGEMS_ACTIVATION_MONITOR.exit
return gem_original_require(resolved_path)
end

if spec = Gem.find_unresolved_default_spec(path)
Gem.remove_unresolved_default_spec(spec)
begin
Expand Down
1 change: 1 addition & 0 deletions lib/rubygems/test_case.rb
Expand Up @@ -742,6 +742,7 @@ def new_default_spec(name, version, deps = nil, *files)
spec.files = files

lib_dir = File.join(@tempdir, "default_gems", "lib")
lib_dir.instance_variable_set(:@gem_prelude_index, lib_dir)
$LOAD_PATH.unshift(lib_dir)
files.each do |file|
rb_path = File.join(lib_dir, file)
Expand Down
33 changes: 33 additions & 0 deletions test/rubygems/test_require.rb
Expand Up @@ -83,6 +83,39 @@ def create_sync_thread
end
end

# Providing -I on the commandline should always beat gems
def test_dash_i_beats_default_gems
a1 = new_default_spec "a", "1", {"b" => "= 1"}, "test_gem_require_a.rb"
b1 = new_default_spec "b", "1", {"c" => "> 0"}, "b/c.rb"
c1 = new_default_spec "c", "1", nil, "c/c.rb"
c2 = new_default_spec "c", "2", nil, "c/c.rb"

install_default_specs c1, c2, b1, a1

dir = Dir.mktmpdir("test_require", @tempdir)
dash_i_arg = File.join dir, 'lib'

c_rb = File.join dash_i_arg, 'c', 'c.rb'

FileUtils.mkdir_p File.dirname c_rb
File.open(c_rb, 'w') { |f| f.write "class Object; HELLO = 'world' end" }

assert_require 'test_gem_require_a'

lp = $LOAD_PATH.dup

# Pretend to provide a commandline argument that overrides a file in gem b
$LOAD_PATH.unshift dash_i_arg

assert_require 'b/c'
assert_require 'c/c' # this should be required from -I
assert_equal "world", ::Object::HELLO
assert_equal %w(a-1 b-1), loaded_spec_names
ensure
$LOAD_PATH.replace lp
Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
end

def test_concurrent_require
Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
Expand Down

0 comments on commit 6fbda98

Please sign in to comment.