Simuler des tubes (pipe)

Source : http://redhanded.hobix.com/inspect/hoppingThroughPipesAndClosures.html (en)

Le but est de simuler les tubes (pipes), très souvent utilisés en shell. Par exemple :

#> ps aux | grep fcgi | wc -l

En ruby, on va d’abord rajouter la méthode « | » à la classe IO

class IO def | proc proc[self] end end

Ensuite, on crée les commandes, comme suit. Ici, une commande wc (word count) qui compte les lignes d’un flux d’ES.

wc = proc { |io| io.inject(0) { |i, line| i + 1 } }

Il suffit ensuite de chainer la commande comme en shell

nombre_de_lignes = open("/var/log/messages") | wc

Ensuite, on peux améliorer le tout pour pouvoir enchainer plusieurs commandes. Voir le source http://whytheluckystiff.net/ruby/ruby-pipe.rb

require 'stringio'
module Piping
    def | proc; proc.call self; end
end
class IO
    include Piping
    def self.[](obj)
        if obj.respond_to? :read
            return obj
        else
            StringIO.new(obj.to_s)
        end
    end
end
class StringIO
    include Piping
end

puis

wc = proc { |io| IO[io.inject(0) { |i, line| i + 1 }] }
grep = proc { |exp| proc { |io| IO[io.grep(exp)] } }
nombre_messages_ppp = open("/var/log/messages") | grep[/ppp/] | wc
p nombre_messages_ppp.read

Notons le .read à la fin, car nous enchainons des méthodes qui retournent un flux d’ES.