file_loader/required_as_ruby.rb

tests/_examples/file_loader/required_as_ruby.rb in the metorex repository.

# `require_relative` reads the path it is handed the way Ruby does: it names a
# `.rb` file, it takes anything that says how to read itself as a path, and it
# answers whether the file was loaded by this call.

here = __dir__

# A path written without `.rb` names the `.rb` file beside it.
p(require_relative("required_as_ruby_target"))
p(require_relative("required_as_ruby_target.rb"))

# The feature list holds the expanded path, with no dot components left in it.
p($LOADED_FEATURES.include?(File.join(here, "required_as_ruby_target.rb")))

# A path may be named by anything that says how to read itself as one.
class NamesAPath
  def initialize(named)
    @named = named
  end

  def to_path
    @named
  end
end

p(require_relative(NamesAPath.new("required_as_ruby_other")))

begin
  require_relative(42)
rescue TypeError => refused
  p(refused.message)
end

begin
  require_relative("no_such_file_here")
rescue LoadError => refused
  p(refused.path == File.join(here, "no_such_file_here"))
end

# A file that fails part-way through was never loaded.
begin
  require_relative("required_as_ruby_refuses")
rescue RuntimeError
  p($LOADED_FEATURES.include?(File.join(here, "required_as_ruby_refuses.rb")))
end

Output:

true
false
true
true
"no implicit conversion of Integer into String"
true
false