filewatcher 0.3.5 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +30 -8
- data/Rakefile +0 -21
- data/bin/filewatcher +3 -11
- data/lib/filewatcher.rb +13 -12
- data/test/test_filewatcher.rb +58 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 822dcac9d604c0ba52d968e3bf92df44da1e1512
|
4
|
+
data.tar.gz: 6851bd0744d58eb1a9150c35fb27ace77f261793
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 173d5fc6f40ef6180110bf21169ab6b59f6f40a78cecad86bef0a21541e218febca5f13ed57247f4b0eb84ac08f1cbd2bbac89f6a4a25e61e9378e4f5ac70d21
|
7
|
+
data.tar.gz: 32a2ac8c557f68880771eb6423be097fca08b8eff914812361de881a3fe7f19342f2afc9e81f1051fe7d60c00825279405f81d9494ca2854c804654f860008f7
|
data/README.md
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
Filewatcher
|
2
2
|
===========
|
3
3
|
|
4
|
-
[](http://badge.fury.io/rb/filewatcher)
|
5
|
+
[](http://travis-ci.org/thomasfl/filewatcher)
|
6
|
+
[](https://gemnasium.com/thomasfl/filewatcher)
|
7
|
+
[](https://codeclimate.com/github/thomasfl/filewatcher)
|
5
8
|
|
6
9
|
Lightweight filewatcher weighing less than 200 LoC. No dependencies or platform specific code.
|
7
10
|
Works everywhere. Monitors changes in the filesystem by polling. No config files needed to run.
|
@@ -84,7 +87,6 @@ Command line options
|
|
84
87
|
|
85
88
|
--interval, -i <f>: Interval in seconds to scan filesystem. Defaults to 0.5 seconds.
|
86
89
|
--exec, -e: Execute file as a script when file is updated.
|
87
|
-
--recurse, -r <s>: Recurse into the directory, watching everything matching 'expression'
|
88
90
|
--include, -n <s>: Include files (default: *)
|
89
91
|
--exclude, -x <s>: Exclude file(s) matching (default: "")
|
90
92
|
--list, -l: Print name of files being watched
|
@@ -102,6 +104,30 @@ Watch a list of files and directories:
|
|
102
104
|
puts "Updated " + filename
|
103
105
|
end
|
104
106
|
|
107
|
+
Watch a single directory, for changes in all files and subdirectories:
|
108
|
+
|
109
|
+
FileWatcher.new("lib/").watch do |filename|
|
110
|
+
...
|
111
|
+
end
|
112
|
+
|
113
|
+
Notice that the previous is equivalent to the following:
|
114
|
+
|
115
|
+
FileWatcher.new("lib/**/*").watch do |filename|
|
116
|
+
...
|
117
|
+
end
|
118
|
+
|
119
|
+
Watch files and dirs in the given directory - and not in subdirectories:
|
120
|
+
|
121
|
+
FileWatcher.new("lib/*").watch do |filename|
|
122
|
+
...
|
123
|
+
end
|
124
|
+
|
125
|
+
Watch an absolute directory:
|
126
|
+
|
127
|
+
FileWatcher.new("/tmp/foo").watch do |filename|
|
128
|
+
...
|
129
|
+
end
|
130
|
+
|
105
131
|
To detect if a file is updated, added or deleted:
|
106
132
|
|
107
133
|
FileWatcher.new(["README.rdoc"]).watch() do |filename, event|
|
@@ -143,16 +169,12 @@ for syntax.
|
|
143
169
|
The filewatcher library is just a single file with 96 LOC (including comments)
|
144
170
|
with no dependencies.
|
145
171
|
|
146
|
-
TODO
|
147
|
-
----
|
148
|
-
|
149
|
-
Use thor in the command line utility.
|
150
|
-
The Ruby API is fairly well tested but the command line program has been
|
151
|
-
buggy.
|
152
172
|
|
153
173
|
Credits
|
154
174
|
-------
|
155
175
|
|
176
|
+
Support for absolute and globbed paths by flbulgarelli: https://github.com/flbulgarelli
|
177
|
+
|
156
178
|
Code inspired by Tom Lieber's blogg posting: http://alltom.com/pages/detecting-file-changes-with-ruby
|
157
179
|
|
158
180
|
Find method by c00lrguy: http://snippets.dzone.com/posts/show/5457
|
data/Rakefile
CHANGED
@@ -6,24 +6,3 @@ task :default => :test
|
|
6
6
|
task :test do
|
7
7
|
sh "bacon -Ilib -Itest --automatic --quiet"
|
8
8
|
end
|
9
|
-
|
10
|
-
# begin
|
11
|
-
# require 'jeweler'
|
12
|
-
# Jeweler::Tasks.new do |gem|
|
13
|
-
# gem.name = "filewatcher"
|
14
|
-
# gem.summary = %Q{Simple filewatcher.}
|
15
|
-
# gem.description = %Q{Detect changes in filesystem.}
|
16
|
-
# gem.email = "thomas.flemming@gmail.com"
|
17
|
-
# gem.homepage = "http://github.com/thomasfl/filewatcher"
|
18
|
-
# gem.executables = ["filewatcher"]
|
19
|
-
# gem.authors = ["Thomas Flemming"]
|
20
|
-
# gem.add_dependency 'trollop', '~> 2.0'
|
21
|
-
# gem.licenses = ["MIT"]
|
22
|
-
# end
|
23
|
-
# rescue LoadError
|
24
|
-
# puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
25
|
-
# end
|
26
|
-
|
27
|
-
# task :test => :check_dependencies
|
28
|
-
|
29
|
-
# task :default => :test
|
data/bin/filewatcher
CHANGED
@@ -7,7 +7,7 @@ require 'pathname'
|
|
7
7
|
options = Trollop::options do
|
8
8
|
version "filewatcher, version #{FileWatcher.VERSION} by Thomas Flemming 2014"
|
9
9
|
banner <<-EOS
|
10
|
-
Filewatcher scans filesystem and
|
10
|
+
Filewatcher scans the filesystem and executes shell commands when files changes.
|
11
11
|
|
12
12
|
Usage:
|
13
13
|
filewatcher [-i interval] "<filenames>" "<shell commands>"
|
@@ -18,13 +18,12 @@ Where
|
|
18
18
|
Examples:
|
19
19
|
filewatcher "myfile" "echo 'myfile has changed'"
|
20
20
|
filewatcher '*.rb' 'ruby $FILENAME'
|
21
|
-
|
21
|
+
filewatcher '**/*.rb' 'ruby $FILENAME' # Watch subdirectories
|
22
22
|
Options:
|
23
23
|
EOS
|
24
24
|
|
25
25
|
opt :interval, "Interval to scan filesystem. Defaults to 0.5 seconds.", :short => 'i', :type => :float, :default => 0.5
|
26
26
|
opt :exec, "Execute file as a script when file is updated.", :short => 'e', :type => :boolean, :default => false
|
27
|
-
opt :recurse, "Recurse into the directory, watching everything matching 'expression'", :short => 'r', :type => :string
|
28
27
|
opt :include, "Include files", :type => :string, :default => "*"
|
29
28
|
opt :exclude, "Exclude file(s) matching", :type => :string, :default => ""
|
30
29
|
opt :list, "Print name of files being watched"
|
@@ -41,13 +40,6 @@ if(ARGV.length == 1)
|
|
41
40
|
files << ARGV[0]
|
42
41
|
end
|
43
42
|
|
44
|
-
if(options[:recurse])
|
45
|
-
base = File.join(options[:recurse], "**")
|
46
|
-
inc = Dir.glob(File.join(base, options[:include]))
|
47
|
-
exc = Dir.glob(File.join(base, options[:exclude]))
|
48
|
-
files = inc - exc
|
49
|
-
end
|
50
|
-
|
51
43
|
def split_files_void_escaped_whitespace(files)
|
52
44
|
splitted_filenames = []
|
53
45
|
files.each do |name|
|
@@ -106,7 +98,7 @@ FileWatcher.new(files, options[:list]).watch(options[:interval]) do |filename, e
|
|
106
98
|
when :changed
|
107
99
|
print "file updated"
|
108
100
|
when :delete
|
109
|
-
print "file
|
101
|
+
print "file deleted"
|
110
102
|
when :new
|
111
103
|
print "new file"
|
112
104
|
else
|
data/lib/filewatcher.rb
CHANGED
@@ -3,8 +3,10 @@
|
|
3
3
|
# Issues: Currently doesn't monitor changes in directorynames
|
4
4
|
class FileWatcher
|
5
5
|
|
6
|
+
attr_accessor :filenames
|
7
|
+
|
6
8
|
def self.VERSION
|
7
|
-
return '0.3.
|
9
|
+
return '0.3.6'
|
8
10
|
end
|
9
11
|
|
10
12
|
def initialize(unexpanded_filenames, print_filelist=false)
|
@@ -78,20 +80,19 @@ class FileWatcher
|
|
78
80
|
if(!patterns.kind_of?Array)
|
79
81
|
patterns = [patterns]
|
80
82
|
end
|
81
|
-
filenames = []
|
82
|
-
patterns.each do |filename|
|
83
|
-
if(File.directory?(filename))
|
84
|
-
filenames = filenames + find(filename)
|
85
|
-
else
|
86
|
-
filenames = filenames + find('.', filename, true)
|
87
|
-
end
|
88
|
-
end
|
89
83
|
|
90
|
-
|
84
|
+
patterns.map { |it| Dir[fulldepth(it)] }.flatten.uniq
|
91
85
|
end
|
92
86
|
|
93
|
-
|
94
|
-
|
87
|
+
private
|
88
|
+
|
89
|
+
def fulldepth(pattern)
|
90
|
+
if File.directory? pattern
|
91
|
+
"#{pattern}/**/*"
|
92
|
+
else
|
93
|
+
pattern
|
94
|
+
end
|
95
95
|
end
|
96
96
|
|
97
|
+
|
97
98
|
end
|
data/test/test_filewatcher.rb
CHANGED
@@ -3,8 +3,55 @@ require 'bacon'
|
|
3
3
|
require 'fileutils'
|
4
4
|
require File.expand_path("../lib/filewatcher.rb",File.dirname(__FILE__))
|
5
5
|
|
6
|
+
|
7
|
+
|
6
8
|
describe FileWatcher do
|
7
9
|
|
10
|
+
fixtures =
|
11
|
+
%w(test/fixtures/file4.rb
|
12
|
+
test/fixtures/subdir/file6.rb
|
13
|
+
test/fixtures/subdir/file5.rb
|
14
|
+
test/fixtures/file2.txt
|
15
|
+
test/fixtures/file1.txt
|
16
|
+
test/fixtures/file3.rb)
|
17
|
+
|
18
|
+
explicit_relative_fixtures = fixtures.map { |it| "./#{it}" }
|
19
|
+
|
20
|
+
subfolder = 'test/fixtures/new_sub_folder'
|
21
|
+
|
22
|
+
after do
|
23
|
+
FileUtils.rm_rf subfolder
|
24
|
+
end
|
25
|
+
|
26
|
+
def includes_all(elements)
|
27
|
+
lambda { |it| elements.all? { |element| it.include? element }}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should handle absolute paths with globs" do
|
31
|
+
filewatcher = FileWatcher.new(File.expand_path('test/fixtures/**/*'))
|
32
|
+
|
33
|
+
filewatcher.filenames.should.satisfy &includes_all(fixtures.map { |it| File.expand_path(it) })
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should handle globs" do
|
37
|
+
filewatcher = FileWatcher.new('test/fixtures/**/*')
|
38
|
+
|
39
|
+
filewatcher.filenames.should.satisfy &includes_all(fixtures)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
it "should handle explicit relative paths with globs" do
|
44
|
+
filewatcher = FileWatcher.new('./test/fixtures/**/*')
|
45
|
+
|
46
|
+
filewatcher.filenames.should.satisfy &includes_all(explicit_relative_fixtures)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should handle explicit relative paths" do
|
50
|
+
filewatcher = FileWatcher.new('./test/fixtures')
|
51
|
+
|
52
|
+
filewatcher.filenames.should.satisfy &includes_all(explicit_relative_fixtures)
|
53
|
+
end
|
54
|
+
|
8
55
|
it "should detect file deletions" do
|
9
56
|
filename = "test/fixtures/file1.txt"
|
10
57
|
open(filename,"w") { |f| f.puts "content1" }
|
@@ -34,14 +81,21 @@ describe FileWatcher do
|
|
34
81
|
end
|
35
82
|
|
36
83
|
it "should detect new files in subfolders" do
|
37
|
-
subfolder = 'test/fixtures/new_sub_folder'
|
38
|
-
filewatcher = FileWatcher.new(["test/fixtures"])
|
39
|
-
filewatcher.filesystem_updated?.should.be.false
|
40
84
|
FileUtils::mkdir_p subfolder
|
85
|
+
|
86
|
+
filewatcher = FileWatcher.new(["./test/fixtures"])
|
41
87
|
filewatcher.filesystem_updated?.should.be.false
|
88
|
+
|
42
89
|
open(subfolder + "/file.txt","w") { |f| f.puts "xyz" }
|
43
90
|
filewatcher.filesystem_updated?.should.be.true
|
44
|
-
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should detect new subfolders" do
|
94
|
+
filewatcher = FileWatcher.new(["test/fixtures"])
|
95
|
+
filewatcher.filesystem_updated?.should.be.false
|
96
|
+
|
97
|
+
FileUtils::mkdir_p subfolder
|
98
|
+
filewatcher.filesystem_updated?.should.be.true
|
45
99
|
end
|
46
100
|
|
47
101
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filewatcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Flemming
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trollop
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.2'
|
55
|
-
description: Detect changes in filesystem.
|
55
|
+
description: Detect changes in filesystem. Works anywhere.
|
56
56
|
email:
|
57
57
|
- thomas.flemming@gmail.com
|
58
58
|
executables:
|