filesystem/working_directory_parens.rb

tests/_examples/filesystem/working_directory_parens.rb in the metorex repository.

# `Dir.chdir` names the directory the program works from, taking the name
# through `to_path`, and a `Dir` handle changes to the directory it names.
require "tmpdir"

Dir.mktmpdir do |scratch|
  Dir.mkdir(File.join(scratch, "inner"))

  named = Object.new
  named.define_singleton_method(:to_path) do
    File.join(scratch, "inner")
  end

  outside = Dir.pwd
  Dir.chdir(scratch) do
    p(Dir.pwd == File.realpath(scratch))
  end
  p(Dir.pwd == outside)

  p(Dir.chdir(named))
  p(File.basename(Dir.pwd))
  Dir.chdir(outside)

  handle = Dir.new(File.join(scratch, "inner"))
  p(handle.chdir { File.basename(Dir.pwd) })
  handle.close

  begin
    Dir.chdir(File.join(scratch, "missing"))
  rescue Errno::ENOENT => problem
    puts(problem.class)
  end
end

Output:

true
true
0
"inner"
"inner"
Errno::ENOENT