filesystem/io_writing_edges_no_parens.rb

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

require "tmpdir"

Dir.mktmpdir do |directory|
  path = File.join directory, "log.txt"

  # `newline: :crlf` converts every newline written, by `write` and `puts`.
  File.open path, "w", newline: :crlf do |file|
    file.write "start\n"
    file.puts "a", "b"
  end
  p File.binread path

  # `pread` past the end clears the buffer it was handed.
  File.write path, "abc"
  buffer = +"kept"
  File.open path do |file|
    begin
      file.pread 1, 10, buffer
    rescue EOFError
      p buffer
    end
  end

  # A negative offset is reported before a negative length.
  begin
    IO.read path, -1, -1
  rescue ArgumentError => problem
    p problem.message
  end

  # `copy_stream` reads its length through `to_int`, and copies nothing for
  # a length of zero.
  length = Object.new
  def length.to_int = 2
  target = File.join directory, "copy.txt"
  p IO.copy_stream path, target, length
  p File.read target
  p IO.copy_stream path, target, 0
  bad = Object.new
  def bad.to_int = "2"
  begin
    IO.copy_stream path, target, bad
  rescue TypeError => problem
    p problem.message
  end

  # An IO::Buffer writes from an offset to the end when the length is zero.
  buffer = IO::Buffer.new 5
  buffer.set_string "Hello"
  File.open path, "wb+" do |file|
    p buffer.write file, 0, 1
    file.rewind
    p file.read
  end
  buffer.free
end

Output:

"start\r\na\r\nb\r\n"
""
"negative offset -1 given"
2
"ab"
0
"can't convert Object to Integer (Object#to_int gives String)"
4
"ello"