Gem 到 capture/replay stdin 输入 ruby

Gem to capture/replay stdin input in ruby

是否有 ruby gem 自动记录来自 $stdin 的输入,同时保留程序的正常执行流程?

我在想:

def gets_with_logging
  input = gets_without_logging
  File.write('/path/to/file', input)
  return input
end
alias_method_chain :gets, :logging

然后您可以稍后使用该文件重播相同的输入。是否存在具有此功能的 gem?

我认为 gem 不存在用于此目的,但它实际上非常简单 - 您可以将 $stdin 重新分配给包装(并恢复)通常的 stdin 设备的东西!

这超出了我的考虑范围,您可能会想出更适合您的用例的东西,但它可以完成工作:

class LoggingInputStream
  def self.hook
    $stdin = new($stdin)
  end

  def self.unhook
    $stdin.finish if $stdin.is_a? LoggingInputStream
    $stdin = STDIN
  end

  def initialize(real_stdin)
    @real = real_stdin
    @log = File.open("log", "a")
  end

  def gets(*args)
    input = @real.gets(*args)
    log input
    input
  end

  def log(input)
    @log.puts input
    @log.flush
  end

  def finish
    @log.close
  end

  def method_missing(name, *args, &block)
    @real.send name, *args, &block
  end
end
LoggingInputStream.hook

这里我们只是创建了一个对象,该对象将所有内容都委托给底层 STDIN 流,并且在 #gets 的情况下,记录读取的输入。您可以调用 LoggingInputStream.unhook 将 $stdin 恢复为规范的 stdin 流并关闭日志文件。