Gem捕获/重放ruby中的stdin输入

时间:2015-02-25 23:33:05

标签: ruby stdin

是否有一个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

然后您可以稍后使用该文件重播相同的输入。这个功能是否存在宝石?

1 个答案:

答案 0 :(得分:1)

我认为没有宝石存在,但它实际上非常简单 - 你可以将$ 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流并关闭日志文件。