basics/warn/messages.rb

tests/_examples/basics/warn/messages.rb in the metorex repository.

# Kernel#warn writes through $stderr, honoring $VERBOSE and its keywords.

class Recorder
  attr_reader :lines

  def initialize
    @lines = []
  end

  def write(text)
    @lines.push text
  end
end

recorder = Recorder.new
$stderr = recorder

$VERBOSE = nil
warn "silenced"

$VERBOSE = true
warn "plain"
warn "already ended\n"
warn "first", "second"
warn ["from", "an array"]
# A warning in a category that is switched off never prints.
Warning[:deprecated] = true
warn "categorized", category: :deprecated
Warning[:deprecated] = false
warn "silenced by its category", category: :deprecated

empty = {}
warn(**empty)
warn("with empty keywords", **empty)

def outer(message, level)
  inner message, level
end

def inner(message, level)
  warn message, uplevel: level
end

outer "too far", 100

begin
  warn "bad", category: Object.new
rescue TypeError
  recorder.write "TypeError for an unconvertible category\n"
end

begin
  warn "bad", uplevel: -1
rescue ArgumentError
  recorder.write "ArgumentError for a negative uplevel\n"
end

begin
  warn "bad", uplevel: "one"
rescue TypeError
  recorder.write "TypeError for a non-Integer uplevel\n"
end

$stderr = STDERR
print recorder.lines.join

Output:

plain
already ended
first
second
from
an array
categorized
with empty keywords
warning: too far
TypeError for an unconvertible category
ArgumentError for a negative uplevel
TypeError for a non-Integer uplevel