rerun 0.7.0.pre2 → 0.7.0.pre3
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.
- data/Rakefile +1 -1
- data/lib/rerun/glob.rb +20 -0
- data/lib/rerun/runner.rb +4 -5
- data/lib/rerun/watcher.rb +34 -51
- data/rerun.gemspec +1 -1
- metadata +3 -3
data/Rakefile
CHANGED
data/lib/rerun/glob.rb
CHANGED
@@ -12,6 +12,9 @@ module Rerun
|
|
12
12
|
|
13
13
|
def to_regexp_string
|
14
14
|
chars = @glob_string.split('')
|
15
|
+
|
16
|
+
chars = smoosh(chars)
|
17
|
+
|
15
18
|
curlies = 0;
|
16
19
|
escaping = false;
|
17
20
|
chars.map do |char|
|
@@ -20,6 +23,8 @@ module Rerun
|
|
20
23
|
char
|
21
24
|
else
|
22
25
|
case char
|
26
|
+
when '**'
|
27
|
+
"([^/]+/)*"
|
23
28
|
when '*'
|
24
29
|
".*"
|
25
30
|
when "?"
|
@@ -58,5 +63,20 @@ module Rerun
|
|
58
63
|
def to_regexp
|
59
64
|
Regexp.new(to_regexp_string)
|
60
65
|
end
|
66
|
+
|
67
|
+
def smoosh chars
|
68
|
+
out = []
|
69
|
+
until chars.empty?
|
70
|
+
char = chars.shift
|
71
|
+
if char == "*" and chars.first == "*"
|
72
|
+
chars.shift
|
73
|
+
chars.shift if chars.first == "/"
|
74
|
+
out.push("**")
|
75
|
+
else
|
76
|
+
out.push(char)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
out
|
80
|
+
end
|
61
81
|
end
|
62
82
|
end
|
data/lib/rerun/runner.rb
CHANGED
@@ -144,14 +144,12 @@ module Rerun
|
|
144
144
|
|
145
145
|
unless @watcher
|
146
146
|
|
147
|
-
watcher = Watcher.new do
|
147
|
+
watcher = Watcher.new(:directory => dir, :pattern => pattern) do
|
148
148
|
restart unless @restarting
|
149
149
|
end
|
150
|
-
say "Watching #{dir}/#{pattern}"
|
151
|
-
watcher.add_directory(dir, pattern)
|
152
|
-
watcher.sleep_time = 1
|
153
150
|
watcher.start
|
154
151
|
@watcher = watcher
|
152
|
+
say "Watching #{dir}/#{pattern} using #{watcher.adapter.class.name.split('::').last} adapter"
|
155
153
|
end
|
156
154
|
end
|
157
155
|
|
@@ -169,13 +167,14 @@ module Rerun
|
|
169
167
|
end
|
170
168
|
|
171
169
|
def signal(signal)
|
172
|
-
say "Sending #{signal} to #{@pid}" unless signal == 0
|
170
|
+
say "Sending signal #{signal} to #{@pid}" unless signal == 0
|
173
171
|
Process.kill(signal, @pid)
|
174
172
|
true
|
175
173
|
rescue
|
176
174
|
false
|
177
175
|
end
|
178
176
|
|
177
|
+
# todo: test escalation
|
179
178
|
def stop
|
180
179
|
if @pid && (@pid != 0)
|
181
180
|
notify "stopping", "All good things must come to an end." unless @restarting
|
data/lib/rerun/watcher.rb
CHANGED
@@ -2,7 +2,7 @@ require 'listen'
|
|
2
2
|
|
3
3
|
Thread.abort_on_exception = true
|
4
4
|
|
5
|
-
# This class will watch a directory
|
5
|
+
# This class will watch a directory and alert you of
|
6
6
|
# new files, modified files, deleted files.
|
7
7
|
#
|
8
8
|
# Author: Paul Horman, http://paulhorman.com/filesystemwatcher/
|
@@ -13,56 +13,40 @@ module Rerun
|
|
13
13
|
MODIFIED = 1
|
14
14
|
DELETED = 2
|
15
15
|
|
16
|
-
|
17
|
-
attr_reader :directories
|
16
|
+
attr_reader :directory, :pattern, :priority
|
18
17
|
|
19
|
-
|
18
|
+
# Create a file system watcher. Start it by calling #start.
|
19
|
+
#
|
20
|
+
# @param options[:directory] the directory to watch (default ".")
|
21
|
+
# @param options[:pattern] the glob pattern to search under the watched directory (default "**/*")
|
22
|
+
# @param options[:priority] the priority of the watcher thread (default 0)
|
23
|
+
#
|
24
|
+
def initialize(options = {}, &client_callback)
|
20
25
|
@client_callback = client_callback
|
21
26
|
|
22
|
-
|
23
|
-
|
27
|
+
options = {
|
28
|
+
:directory => ".",
|
29
|
+
:pattern => "**/*",
|
30
|
+
:priority => 0,
|
31
|
+
}.merge(options)
|
24
32
|
|
25
|
-
@
|
26
|
-
@
|
33
|
+
@pattern = options[:pattern]
|
34
|
+
@directory = options[:directory]
|
35
|
+
if FileTest.exists?(directory) && FileTest.readable?(directory) then
|
36
|
+
@directory = Directory.new(directory, @pattern)
|
37
|
+
else
|
38
|
+
raise InvalidDirectoryError, "Dir '#{directory}' either doesnt exist or isnt readable"
|
39
|
+
end
|
40
|
+
@priority = options[:priority]
|
27
41
|
|
28
42
|
@found = nil
|
29
43
|
@first_time = true
|
30
44
|
@thread = nil
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
# add a directory to be watched
|
35
|
-
# @param dir the directory to watch
|
36
|
-
# @param expression the glob pattern to search under the watched directory
|
37
|
-
def add_directory(dir, expression="**/*")
|
38
|
-
if FileTest.exists?(dir) && FileTest.readable?(dir) then
|
39
|
-
@directories << Directory.new(dir, expression)
|
40
|
-
else
|
41
|
-
raise InvalidDirectoryError, "Dir '#{dir}' either doesnt exist or isnt readable"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def remove_directory(dir)
|
46
|
-
@directories.delete(dir)
|
47
|
-
end
|
48
|
-
|
49
|
-
# add a specific file to the watch list
|
50
|
-
# @param file the file to watch
|
51
|
-
def add_file(file)
|
52
|
-
if FileTest.exists?(file) && FileTest.readable?(file) then
|
53
|
-
@files << file
|
54
|
-
else
|
55
|
-
raise InvalidFileError, "File '#{file}' either doesnt exist or isnt readable"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def remove_file(file)
|
60
|
-
@files.delete(file)
|
61
45
|
end
|
62
46
|
|
63
47
|
def prime
|
64
48
|
@first_time = true
|
65
|
-
@found =
|
49
|
+
@found = {}
|
66
50
|
examine
|
67
51
|
@first_time = false
|
68
52
|
end
|
@@ -76,24 +60,27 @@ module Rerun
|
|
76
60
|
|
77
61
|
@thread = Thread.new do
|
78
62
|
# todo: multiple dirs
|
79
|
-
|
80
|
-
|
63
|
+
|
64
|
+
regexp = Glob.new(@pattern).to_regexp
|
65
|
+
@listener = Listen::Listener.new(@directory.dir, :filter => regexp) do |modified, added, removed|
|
81
66
|
#d { modified }
|
82
67
|
#d { added }
|
83
68
|
#d { removed }
|
84
69
|
examine
|
85
|
-
sleep(@sleep_time)
|
86
70
|
end
|
87
71
|
@listener.start
|
88
72
|
end
|
89
73
|
|
90
74
|
@thread.priority = @priority
|
91
75
|
|
92
|
-
at_exit { stop }
|
93
|
-
|
94
|
-
sleep 1 until @listener.instance_variable_get(:@adapter)
|
95
|
-
puts "Using adapter #{@listener.instance_variable_get(:@adapter)}"
|
76
|
+
at_exit { stop } # try really hard to clean up after ourselves
|
77
|
+
end
|
96
78
|
|
79
|
+
def adapter
|
80
|
+
timeout(4) do
|
81
|
+
sleep 1 until adapter = @listener.instance_variable_get(:@adapter)
|
82
|
+
adapter
|
83
|
+
end
|
97
84
|
end
|
98
85
|
|
99
86
|
# kill the filewatcher thread
|
@@ -123,11 +110,7 @@ module Rerun
|
|
123
110
|
|
124
111
|
already_examined = Hash.new()
|
125
112
|
|
126
|
-
@
|
127
|
-
examine_files(directory.files(), already_examined)
|
128
|
-
end
|
129
|
-
|
130
|
-
examine_files(@files, already_examined) if not @files.empty?
|
113
|
+
examine_files(@directory.files, already_examined)
|
131
114
|
|
132
115
|
# now diff the found files and the examined files to see if
|
133
116
|
# something has been deleted
|
data/rerun.gemspec
CHANGED
@@ -3,7 +3,7 @@ $spec = Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'rerun'
|
6
|
-
s.version = '0.7.0.
|
6
|
+
s.version = '0.7.0.pre3'
|
7
7
|
|
8
8
|
s.description = "Restarts your app when a file changes"
|
9
9
|
s.summary = "Launches an app, and restarts it whenever the filesystem changes."
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rerun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.0.
|
4
|
+
version: 0.7.0.pre3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: listen
|
@@ -61,7 +61,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
61
|
version: '0'
|
62
62
|
segments:
|
63
63
|
- 0
|
64
|
-
hash:
|
64
|
+
hash: 3232457078342945302
|
65
65
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
66
|
none: false
|
67
67
|
requirements:
|