113: def Annoy.challenge?(msg="Please confirm.", factor=:medium, flavor=:rand, writer=STDOUT, period=nil)
114: return true unless STDIN.tty?
115: return true if Annoy.skip?
116: begin
117: success = Timeout::timeout(period || @@period) do
118: flavor = Annoy.get_flavor(flavor)
119: question, answer = Annoy.question(factor, flavor)
120: msg = "#{msg} To continue, #{Annoy.verb(flavor)} #{question}: "
121:
122:
123:
124:
125:
126:
127:
128: highline = HighLine.new
129: response = highline.ask(msg) { |q|
130: q.echo = '*'
131: q.overwrite = true
132: q.whitespace = :strip
133: q.answer_type = Integer if flavor == :numeric
134: }
135:
136: ret = (response == answer)
137: writer.puts "Incorrect" unless ret
138: ret
139: end
140: rescue Interrupt
141: writer.puts $/, "Giving up!"
142: false
143: rescue Annoy::GiveUp => ex
144: writer.puts $/, "Giving up!"
145: false
146: rescue Timeout::Error => ex
147: writer.puts $/, "Times up!"
148: false
149: end
150: end