filesystem/io_encoding_rules_no_parens.rb

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

require "tmpdir"

Dir.mktmpdir do |directory|
  path = File.join directory, "readings.txt"
  File.write path, "1\n"

  # A stream reading BINARY carries its bytes into no other encoding.
  File.open path, "r:binary:ibm437" do |file|
    p file.external_encoding
    p file.internal_encoding
  end

  File.open path, "r" do |file|
    # Naming only an internal encoding is refused.
    begin
      file.set_encoding nil, Encoding::UTF_8
    rescue TypeError => problem
      p problem.message
    end
    # So are names that are not ASCII or that hold a NUL byte.
    wide = "utf-8".encode Encoding::UTF_16BE
    begin
      file.set_encoding wide
    rescue ArgumentError => problem
      p problem.message
    end
    begin
      file.set_encoding Encoding::UTF_8, "null\0byte"
    rescue ArgumentError => problem
      p problem.message
    end
    # A stream that reads needs binmode for an encoding that is not a
    # superset of ASCII.
    begin
      file.set_encoding Encoding::UTF_16BE
    rescue ArgumentError => problem
      p problem.message
    end
    begin
      file.set_encoding "utf-8", newline: :sideways
    rescue ArgumentError => problem
      p problem.message
    end
    file.binmode
    begin
      file.set_encoding "utf-8", newline: :lf
    rescue ArgumentError => problem
      p problem.message
    end
  end

  # A stream naming only its internal encoding reads as the external one
  # the program had when it was opened.
  File.open path, mode: "r", internal_encoding: "utf-8" do |file|
    held = Encoding.default_external
    Encoding.default_external = Encoding::IBM437
    p file.external_encoding == held
    Encoding.default_external = held
  end

  # A closed File names its path, and a closed pipe shows only that it is
  # closed.
  file = File.open path
  file.close
  p file.inspect.end_with? "readings.txt (closed)>"
  reader, writer = IO.pipe
  reader.close
  p reader.inspect
  writer.close
end

Output:

#<Encoding:BINARY (ASCII-8BIT)>
nil
"no implicit conversion of nil into String"
"invalid encoding name (non ASCII)"
"invalid encoding name (NUL byte)"
"ASCII incompatible encoding needs binmode"
"unexpected value for newline option: sideways"
"newline decorator with binary mode"
true
true
"#<IO:(closed)>"