Canais bidirecionais para comandos externos em Ruby

Ruby tem vários métodos e classes de biblioteca padrão para implementar canais de e para comandos externos ( Open3e spawnpor exemplo). No entanto, eles são de baixo nível, e você acaba implementando muita lógica por conta própria se quiser fazer algo complicado.

Recentemente, lancei uma gema chamada Magritte para facilitar o gerenciamento de um subprocesso com tubos bidirecionais. Espera-se que a entrada seja um IO, enquanto a saída pode ser um IOou um bloco Ruby. Existe uma LineBufferclasse para facilitar o manuseio da saída linha por linha. Aqui está um exemplo de código:

Magritte::Pipe.from_input_file('some.txt')
.separated_by("rn")
.line_by_line
.out_to { |data| puts data }
.filtering_with('grep "relistan"')

Usar o Magritte é tão fácil quanto adicioná-lo ao seu Gemfilecomputador ou executar gem install magritte.