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 流并关闭日志文件。
是否有 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 流并关闭日志文件。