Another interaction library for Ruby, with an interesting twist: the user can go back in time to re-answer questions.
Copyright 2011, Alex Suraci. Licensed under the MIT license, please see the LICENSE file. All rights reserved.
require "rubygems" require "interact" class MyInteractiveClass include def run first = ask "Some question?" second = ask "Boolean default?", :default => true third = ask "Stringy default?", :default => "foo" fourth = ask "Multiple choice?", :choices => ["foo", "bar", "fizz"] some_mutation =  fifth = ask "Multiple choice, indexed list?", :choices => ["foo", "bar", "fizz"], :indexed => true some_mutation << fifth finalize sixth = ask "Password", :echo => "*", :forget => true p [first, second, third, fourth, fifth, sixth] end end MyInteractiveClass.new.run
After running this, the user will be prompted with each question one-by-one. Interact supports basic editing features such as going to the start/end, editing in the middle of the text, backspace, forward delete, and backwards-kill-word.
In addition, the user can hit the up arrow to go "back in time" and re-answer questins.
Make sure you call
finalize after doing any mutation performed based on user
input; this will prevent them from rewinding to before this took place. Or you
can just disable rewinding if it's too complicated (see below).
Anyway, here's an example session:
Some question?: hello<enter> Boolean default? [Yn]: <up> Some question? ["hello"]: trying again<enter> Boolean default? [Yn]: n<enter> Stringy default? ["foo"]: <up> Boolean default? [yN]: y<enter> Stringy default? ["foo"]: <enter> Multiple choice? ("foo", "bar", "fizz"): f<enter> Please disambiguate: foo or fizz? Multiple choice? ("foo", "bar", "fizz"): fo<enter> 1: foo 2: bar 3: fizz Multiple choice, indexed list?: 2<enter> Password: ******<enter> ["trying again", true, "foo", "foo", "bar", "secret"]
Note that the user's previous answers become the new defaults for the question if they rewind.
Interact provides a nifty user-friendly "rewinding" feature, which allows the
user to go back in time and re-answer a question. If you don't want this
feature, simply call
disable_rewind in your class. You can re-enable it with
enable_rewind in subclasses.
class NoRewind include disable_rewind def run res = ask "Is there no return?", :default => true if res == rewind_enabled? puts "You're right!" else puts "Nope! It's disabled." end end end NoRewind.new.run