commit
d7b0876178
3
Gemfile
3
Gemfile
@ -13,5 +13,6 @@ if Config::CONFIG['target_os'] =~ /linux/i
|
||||
gem 'libnotify', '~> 0.1.3', :require => false
|
||||
end
|
||||
if Config::CONFIG['target_os'] =~ /mswin|mingw/i
|
||||
gem 'win32console'
|
||||
gem 'win32console', :require => false
|
||||
gem 'rb-fchange', '>= 0.0.2', :require => false
|
||||
end
|
||||
|
@ -10,6 +10,7 @@ Features
|
||||
|
||||
* [FSEvent](http://en.wikipedia.org/wiki/FSEvents) support on Mac OS X 10.5+ (without RubyCocoa!, [rb-fsevent gem, >= 0.3.5](https://rubygems.org/gems/rb-fsevent) required).
|
||||
* [Inotify](http://en.wikipedia.org/wiki/Inotify) support on Linux ([rb-inotify gem, >= 0.5.1](https://rubygems.org/gems/rb-inotify) required).
|
||||
* [Directory Change Notification](http://msdn.microsoft.com/en-us/library/aa365261\(VS.85\).aspx) suuport on Windows ([rb-fchange, >= 0.0.2](https://rubygems.org/gems/rb-fchange) required)
|
||||
* Polling on the other operating systems (help us to support more OS).
|
||||
* Automatic & Super fast (when polling is not used) files modifications detection (even new files are detected).
|
||||
* Growl notifications ([growlnotify](http://growl.info/documentation/growlnotify.php) & [growl gem](https://rubygems.org/gems/growl) required).
|
||||
@ -67,6 +68,13 @@ And add it to you Gemfile:
|
||||
gem 'libnotify'
|
||||
```
|
||||
|
||||
### On Windows
|
||||
|
||||
Install the rb-fchange gem for [Directory Change Notification](http://msdn.microsoft.com/en-us/library/aa365261\(VS.85\).aspx) support:
|
||||
|
||||
$ gem install rb-fchange
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
36
lib/guard/listeners/windows.rb
Normal file
36
lib/guard/listeners/windows.rb
Normal file
@ -0,0 +1,36 @@
|
||||
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, :recursive) do |event|
|
||||
paths = [File.expand_path(event.watcher.path) + '/']
|
||||
files = modified_files(paths, {:all => true})
|
||||
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
|
@ -14,10 +14,10 @@ describe Guard::Listener do
|
||||
subject.select_and_init
|
||||
end
|
||||
|
||||
it "uses polling listener on Windows" do
|
||||
Config::CONFIG['target_os'] = 'win32'
|
||||
Guard::Polling.stub(:usable?).and_return(true)
|
||||
Guard::Polling.should_receive(:new)
|
||||
it "uses windows listener on Windows" do
|
||||
Config::CONFIG['target_os'] = 'mingw'
|
||||
Guard::Windows.stub(:usable?).and_return(true)
|
||||
Guard::Windows.should_receive(:new)
|
||||
subject.select_and_init
|
||||
end
|
||||
|
||||
|
88
spec/guard/listeners/windows_spec.rb
Normal file
88
spec/guard/listeners/windows_spec.rb
Normal file
@ -0,0 +1,88 @@
|
||||
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")
|
||||
if File.exists?(file)
|
||||
begin
|
||||
File.delete file
|
||||
rescue
|
||||
end
|
||||
end
|
||||
File.exists?(file).should be_false
|
||||
start
|
||||
FileUtils.touch file
|
||||
stop
|
||||
begin
|
||||
File.delete file
|
||||
rescue
|
||||
end
|
||||
@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
|
@ -4,4 +4,8 @@ end
|
||||
|
||||
def linux?
|
||||
Config::CONFIG['target_os'] =~ /linux/i
|
||||
end
|
||||
|
||||
def windows?
|
||||
Config::CONFIG['target_os'] =~ /mswin|mingw/i
|
||||
end
|
Loading…
Reference in New Issue
Block a user