c_extensions/c_iteration_no_parens.rb

tests/_examples/c_extensions/c_iteration_no_parens.rb in the metorex repository.

# A C extension handing a block to the method its walk calls, calling the
# method it overrides with keywords, and reaching the module, encoding and
# IO functions Ruby's C API has for them.
require "tmpdir"
require "stringio"
require_relative "build_helper"

directory = Dir.mktmpdir
built = build_extension "c_iteration.c", "c_iteration", directory
require built

p CIteration.each_of([3, 5, 8])
p CIteration.pairs({ "rate" => 2 })

class Ledger
  def total *amounts, scale: 1
    amounts.sum * scale
  end
end

class Account < Ledger
end
CIteration.define_super Account, "total"
p Account.new.total(2, 3, { scale: 10 })
options = Object.new
def options.to_hash
  { scale: 100 }
end
p Account.new.total(1, options)

module Audited
  def total *amounts, **options
    [:audited, super]
  end
end
CIteration.prepend Ledger, Audited
p Ledger.new.total(4)
p Ledger.ancestors.first(2)

module Rates
  OLD_RATE = 1
end
CIteration.deprecate Rates, "OLD_RATE"
$stderr = StringIO.new
Warning[:deprecated] = true
Rates::OLD_RATE
p $stderr.string.include?("constant Rates::OLD_RATE is deprecated")
$stderr = STDERR

p CIteration.dummy?(Encoding::UTF_7)
p CIteration.dummy?(Encoding::UTF_8)
p CIteration.get_io($stdout) == $stdout
p CIteration.positive_pow(3, 40)
p CIteration.timeout_error

# With nothing above it, the call reaches `method_missing`, and the C
# method's block is passed on.
class Fallback
  def method_missing name, *arguments, **options
    [name, arguments, options]
  end
end
class Statement < Fallback
end
CIteration.define_super Statement, "lookup"
p Statement.new.lookup(1, { rate: 2 })
class Runner
  def run(*, **)
    yield
  end
end
class Job < Runner
end
CIteration.define_super Job, "run"
finished = Job.new.run({}) { :given }
p finished
begin
  Job.new.run(nil) { :given }
rescue TypeError => problem
  p problem.message
end

name = File.join directory, "rates.txt"
File.open(name, "w") { |io| p CIteration.opening(io) }
File.open(name, "a") { |io| p CIteration.opening(io) }
File.open(name, "r") { |io| p CIteration.opening(io) }

FileUtils.rm_rf directory

Output:

[3, 5, 8]
[["rate", 2]]
50
100
[:audited, 4]
[Audited, Ledger]
true
true
false
true
12157665459056928801
IO::TimeoutError
[:lookup, [1], {rate: 2}]
:given
[:create, :trunc]
[:append, :create]
[]