Did you ever use Expect to automate a complex command-line procedure, like an FTP upload? Expect is handy – and very powerful – but for Ruby projects it sure would be nice to be able to automate console apps directly from Ruby.
You may not have known it, but Ruby actually ships with a tiny Expect clone called expect.rb. Unfortunately it’s more of a proof of concept than a fully functional automation tool.
Enter Greenletters. Greenletters begins to bring some of the power of Expect to Ruby, with a simple, straightforward API. For example, here’s a scripted interaction with the classic Colossal Cave Adventure:
require 'greenletters' adv = Greenletters::Process.new("adventure", :transcript => $stdout) # Install a handler which may be triggered at any time adv.on(:output, /welcome to adventure/i) do |process, match_data| adv < < "non" end puts "Starting adventure..." adv.start! # Wait for the specified pattern before proceeding adv.wait_for(:output, /you are standing at the end of a road/i) adv << "eastn" adv.wait_for(:output, /inside a building/i) adv << "quitn" adv.wait_for(:output, /really want to quit/i) adv << "yesn" adv.wait_for(:exit) puts "Adventure has exited."
Greenletters also ships with some simple Cucumber steps, so you can immediately start using it to specify the behavior of your command-line apps:
Given process activity is logged to "greenletters.log" Given a process "adventure" from command "adventure" Given I reply "no" to output "Would you like instructions?" from process "adventure" Given I reply "yes" to output "Do you really want to quit" from process "adventure" When I execute the process "adventure" Then I should see the following output from process "adventure": """ You are standing at the end of a road before a small brick building. Around you is a forest. A small stream flows out of the building and down a gully. """ When I enter "east" into process "adventure" Then I should see the following output from process "adventure": """ You are inside a building, a well house for a large spring. """
Want to give it a try? Then:
gem install greenletters
And check out the examples/ directory for inspiration. Let me know what you think!