PVC

Pipe between processes as easily as in the shell

Check it out

# run the specs
bundle exec rspec spec

Install it as a RubyGem

This code is packaged as a Gem. If you like, you can build and install it by running:

gem build pvc.gemspec
gem install pvc-*.gem

Synopsis - implemented

# Run a single process
PVC.new("echo hello").run

# Or pipe from one process to another
PVC.new("echo hello").to("tr h H").run

# Get individual or several outputs from the final result
PVC.new("echo hello && ls doesnotexist").run.stdout   # => "hello\n"
PVC.new("echo hello && ls doesnotexist").run.stderr   # => "ls: doesnotexist: No such file or directory\n"
PVC.new("echo hello && ls doesnotexist").run.stdboth  # => "hello\nls: doesnotexist: No such file or directory\n"
PVC.new("echo hello && ls doesnotexist").run.code     # => 1
stderr, code = PVC.new("echo hello && ls doesnotexist").run.get(:stderr, :code)  # => ["ls: doesnotexist: No such file or directory\n", 1]

# Input a string into stdin
PVC.new.input("one\ntwo\nthree\n").to("sort -r").run.stdout  # => "two\nthree\none\n"

# Process intermediate results with Ruby
PVC.new("cat some.log").to { |i,o| i.each_line { |line| o.puts line if line.match(/ERROR/) } }.to("tail -n10").run

# Mix stderr and stdin at some point in a pipeline
PVC.new("echo hello && ls doesnotexist").with_err.to("wc -l").run.stdout  # => "       2\n"

# Pass on only stderr at some point in a pipeline
PVC.new("echo hello && ls doesnotexist").only_err.to("wc -l").run.stdout  # => "       1\n"

# Insert one pipeline into another
upcase_unique_pipeline = PVC.new("tr a-z A-Z").to("uniq")
PVC.new.input("hello\nHeLlO\nworld\nWoRlD\n").to(upcase_unique_pipeline).to("sort -r").run.stdout # => "WORLD\nHELLO"

Synopsis - unimplemented

# Kill run if it does not finish in time (miliseconds)
PVC.new("sleep 2").run(:timeout => 1000)

Compatibility

Written and tested with Ruby 1.9.3.

Contact

Chris Berkhout