master/lib/guard/interactor.rb

80 lines
1.7 KiB
Ruby
Raw Normal View History

2010-10-03 21:00:33 +00:00
module Guard
2011-09-20 11:10:16 +00:00
# The interactor reads user input and triggers
# specific action upon them unless its locked.
#
# Currently the following actions are implemented:
#
2011-09-20 11:10:16 +00:00
# - stop, quit, exit, s, q, e => Exit Guard
# - reload, r, z => Reload Guard
# - pause, p => Pause Guard
# - Everything else => Run all
#
class Interactor
class LockException < Exception; end
class UnlockException < Exception; end
2011-09-01 21:24:45 +00:00
attr_reader :locked
2011-09-20 11:10:16 +00:00
# Initialize the interactor in unlocked state.
#
def initialize
@locked = false
end
2011-08-17 08:07:30 +00:00
# Start the interactor in its own thread.
2011-09-20 11:10:16 +00:00
#
def start
return if ENV["GUARD_ENV"] == 'test'
2011-09-20 11:10:16 +00:00
@thread = Thread.new do
loop do
begin
if !@locked && (entry = $stdin.gets)
entry.gsub! /\n/, ''
case entry
when 'stop', 'quit', 'exit', 's', 'q', 'e'
::Guard.stop
when 'reload', 'r', 'z'
::Guard::Dsl.reevaluate_guardfile
::Guard.reload
when 'pause', 'p'
::Guard.pause
else
::Guard.run_all
end
2011-08-17 08:07:30 +00:00
end
sleep 0.1
rescue LockException
lock
rescue UnlockException
unlock
end
2010-10-03 21:00:33 +00:00
end
end
end
2011-09-20 11:10:16 +00:00
# Lock the interactor.
#
def lock
if !@thread || @thread == Thread.current
@locked = true
else
@thread.raise(LockException)
end
end
2011-09-20 11:10:16 +00:00
# Unlock the interactor.
#
def unlock
if !@thread || @thread == Thread.current
@locked = false
else
@thread.raise(UnlockException)
end
2011-08-17 08:07:30 +00:00
end
2010-10-03 21:00:33 +00:00
end
end