add support for Windows using rb-fchange. Specs fail because of k32WaitForMultipleObjects blocks all threads

This commit is contained in:
slavic 2011-04-30 13:38:57 +03:00
parent 6ecb72c9cb
commit 94e04ec7e0
6 changed files with 129 additions and 3 deletions

View File

@ -14,4 +14,5 @@ if Config::CONFIG['target_os'] =~ /linux/i
end
if Config::CONFIG['target_os'] =~ /mswin|mingw/i
gem 'win32console'
gem 'rb-fchange', :git => 'git://github.com/stereobooster/rb-fchange.git'
end

View File

@ -4,6 +4,7 @@ module Guard
autoload :Darwin, 'guard/listeners/darwin'
autoload :Linux, 'guard/listeners/linux'
autoload :Windows, 'guard/listeners/windows'
autoload :Polling, 'guard/listeners/polling'
class Listener
@ -14,6 +15,8 @@ module Guard
Darwin.new
elsif linux? && Linux.usable?
Linux.new
elsif windows? && Windows.usable?
Windows.new
else
UI.info "Using polling (Please help us to support your system better than that.)"
Polling.new
@ -54,6 +57,10 @@ module Guard
Config::CONFIG['target_os'] =~ /linux/i
end
def self.windows?
Config::CONFIG['target_os'] =~ /mswin|mingw/i
end
end
end

View File

@ -0,0 +1,35 @@
module Guard
class Windows < Listener
attr_reader :fchange
def initialize
super
@fchange = FChange::Notifier.new
end
def on_change(&callback)
@fchange.watch Dir.pwd, :all_events do |event|
files = modified_files([event.watcher.path])
update_last_event
callback.call(files)
end
end
def start
@fchange.run
end
def stop
@fchange.stop
end
def self.usable?
require 'rb-fchange'
true
rescue LoadError
UI.info "Please install rb-fchange gem for Windows file events support"
false
end
end
end

View File

@ -14,10 +14,10 @@ describe Guard::Listener do
subject.select_and_init
end
it "uses polling listener on Windows" do
it "uses windows listener on Windows" do
Config::CONFIG['target_os'] = 'win32'
Guard::Polling.stub(:usable?).and_return(true)
Guard::Polling.should_receive(:new)
Guard::Windows.stub(:usable?).and_return(true)
Guard::Windows.should_receive(:new)
subject.select_and_init
end

View File

@ -0,0 +1,79 @@
require 'spec_helper'
require 'guard/listeners/windows'
describe Guard::Windows do
subject { Guard::Windows }
if linux?
it "isn't usable on linux" do
subject.should_not be_usable
end
end
if mac?
it "isn't usable on Mac" do
subject.should_not be_usable
end
end
if windows?
it "is usable on Windows 2000 and later" do
subject.should be_usable
end
describe "#on_change" do
before(:each) do
@results = []
@listener = Guard::Windows.new
@listener.on_change do |files|
@results += files
end
end
it "catches new file" do
file = @fixture_path.join("newfile.rb")
File.exists?(file).should be_false
start
FileUtils.touch file
stop
File.delete file
@results.should == ['spec/fixtures/newfile.rb']
end
it "catches file update" do
file = @fixture_path.join("folder1/file1.txt")
File.exists?(file).should be_true
start
FileUtils.touch file
stop
@results.should == ['spec/fixtures/folder1/file1.txt']
end
it "catches files update" do
file1 = @fixture_path.join("folder1/file1.txt")
file2 = @fixture_path.join("folder1/folder2/file2.txt")
File.exists?(file1).should be_true
File.exists?(file2).should be_true
start
FileUtils.touch file1
FileUtils.touch file2
stop
@results.should == ['spec/fixtures/folder1/file1.txt', 'spec/fixtures/folder1/folder2/file2.txt']
end
end
end
private
def start
sleep 0.6
Thread.new { @listener.start }
sleep 0.6
end
def stop
sleep 0.6
@listener.stop
end
end

View File

@ -4,4 +4,8 @@ end
def linux?
Config::CONFIG['target_os'] =~ /linux/i
end
def windows?
Config::CONFIG['target_os'] =~ /mswin|mingw/i
end