是否有一个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
然后您可以稍后使用该文件重播相同的输入。这个功能是否存在宝石?
答案 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流并关闭日志文件。