Peer::Commander
Provides an interfacing for executing mutliple system commands with a configurable level of parallelism.
The result objects will have access to the output of the command as well as the return status.
The overall result of executing the commands will be successful if all of the commands executed completed with
a successful return code.
Internally commands are executed with Open3.capture2e, env, opts, and stdin_data used to init the commands are
sent directly to Open3.capture2e, see the documentation for that class to understand the behaviour and options
available.
Installation
Add this line to your application's Gemfile:
gem "peer_commander"
And then execute:
$ bundle
Or install it yourself as:
$ gem install peer_commander
Usage
This is a convoluted example to demonstrate all the features
require "peer_commander"
commands = [
PeerCommander::Command.new("sleep 2"),
PeerCommander::Command.new("wibble"),
PeerCommander::Command.new("sleep 1"),
PeerCommander::Command.new("exit 1"),
PeerCommander::Command.new("echo $TEST_ENV", env: { "TEST_ENV" => "output from env var"}),
PeerCommander::Command.new("cat", stdin_data: "data passed to standard in"),
PeerCommander::Command.new("sleep 4", opts: { chdir: "/tmp" }),
]
commander = PeerCommander::CommandRunner.new(commands)
results = commander.execute(parallelism: 4)
puts "SUCCESS" if commander.success?
puts "FAILED" if commander.failed?
commander.all_commands.each { |command| puts "Executed #{command.command}" }
commander.successful_commands.each do |command|
puts "Command [#{command.command}] succeeded in #{command.duration} seconds with output:"
puts command.output
puts "================================================="
end
commander.failed_commands.each do |command|
print "Command [#{command.command}] failed in #{command.duration} seconds "
if command.exception
puts "with exception #{command.exception}"
else
puts "with exit code #{command.exit_code} and output\n"
puts command.output
end
puts "================================================="
end
puts "Total operation took #{commander.duration} seconds"
Version numbering
This project will follow strict semantic versioning (https://semver.org/spec/v2.0.0.html) once we reach version 0.1.
Until then any version change can break anything.
Development
You can run bin/rspec
or bin/rake
to run all the tests, you can also run bin/console
for an interactive prompt
that will allow you to experiment.
Contributing
Bug reports and pull requests are welcome on Bitbucket at https://bitbucket.org/eviljonny/peer_commander/
License
This project is released under the MIT license which can be found in the LICENSE file