alexch-rerun 0.2.1 → 0.3
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/README.md +36 -7
- data/bin/rerun +4 -0
- data/lib/osxwatcher.rb +0 -10
- data/lib/rerun.rb +25 -10
- data/lib/system.rb +26 -16
- data/rerun.gemspec +1 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -5,14 +5,22 @@
|
|
5
5
|
Launches your app, then watches the filesystem. If a relevant file
|
6
6
|
changes, then it restarts your app.
|
7
7
|
|
8
|
-
Currently only *.rb files are watched
|
9
|
-
|
8
|
+
Currently only *.rb files are watched. This is pretty lame so it will
|
9
|
+
change soon.
|
10
10
|
|
11
11
|
If you're on Mac OS X, it uses the built-in facilities for monitoring
|
12
|
-
the filesystem, so CPU use is very light.
|
12
|
+
the filesystem, so CPU use is very light. And if you have "growlnotify"
|
13
|
+
available on the PATH, it sends notifications to growl in addition to
|
14
|
+
the console. Here's how to install
|
15
|
+
[growlnotify](http://growl.info/documentation/growlnotify.php):
|
13
16
|
|
14
|
-
|
15
|
-
|
17
|
+
> In your shell, cd to the directory on the Growl disk image
|
18
|
+
> containing growlnotify, and type ./install.sh. That script
|
19
|
+
> will install growlnotify to /usr/local/bin and the manpage
|
20
|
+
> to /usr/local/man.
|
21
|
+
|
22
|
+
Rerun does not work on Windows. Sorry, but you can't do much relaunching
|
23
|
+
without "fork".
|
16
24
|
|
17
25
|
# Installation:
|
18
26
|
|
@@ -42,14 +50,18 @@ but you want it on port 4000 and in debug mode:
|
|
42
50
|
|
43
51
|
# Options:
|
44
52
|
|
45
|
-
|
53
|
+
--dir directory to watch (default = ".")
|
54
|
+
|
55
|
+
Also --version and --help.
|
46
56
|
|
47
57
|
# To Do:
|
48
58
|
|
49
59
|
* If the cmd is, or starts with, a ".rb" file, then run it with ruby
|
60
|
+
* Watch arbitrary file types via globbing
|
50
61
|
* Allow arbitrary sets of directories and file types, possibly with "include" and "exclude" sets
|
51
62
|
* ".rerun" file to specify options per project or in $HOME.
|
52
|
-
* Test on
|
63
|
+
* Test on Linux.
|
64
|
+
* Test on Mac without Growlnotify.
|
53
65
|
|
54
66
|
# Other projects that do similar things
|
55
67
|
|
@@ -59,6 +71,8 @@ Shotgun: <http://github.com/rtomayko/shotgun>
|
|
59
71
|
|
60
72
|
Rack::Reloader middleware: <http://github.com/rack/rack/blob/5ca8f82fb59f0bf0e8fd438e8e91c5acf3d98e44/lib/rack/reloader.rb>
|
61
73
|
|
74
|
+
and the Sinatra FAQ has a discussion at <http://www.sinatrarb.com/faq.html#reloading>
|
75
|
+
|
62
76
|
# Why would I use this instead of Shotgun?
|
63
77
|
|
64
78
|
Shotgun does a "fork" after the web framework has loaded but before
|
@@ -81,6 +95,20 @@ server so this doesn't affect them too much.
|
|
81
95
|
|
82
96
|
YMMV!
|
83
97
|
|
98
|
+
# Why would I use this instead of Rack::Reloader?
|
99
|
+
|
100
|
+
Rack::Reloader is certifiably beautiful code, and is a very elegant use
|
101
|
+
of Rack's middleware architecture. But because it relies on the
|
102
|
+
LOADED_FEATURES variable, it only reloads .rb files that were 'require'd,
|
103
|
+
not 'load'ed. That leaves out (non-Erector) template files, and also,
|
104
|
+
the way I was doing it, sub-actions (see
|
105
|
+
[this thread](http://groups.google.com/group/sinatrarb/browse_thread/thread/7329727a9296e96a#
|
106
|
+
)).
|
107
|
+
|
108
|
+
Rack::Reloader also doesn't reload configuration changes or redo other
|
109
|
+
things that happen during app startup. Rerun takes the attitude that if
|
110
|
+
you want to restart an app, you should just restart the whole app. You know?
|
111
|
+
|
84
112
|
# Why did you write this?
|
85
113
|
|
86
114
|
I've been using [Sinatra](http://sinatrarb.com) and loving it. In order
|
@@ -101,6 +129,7 @@ Based upon and/or inspired by:
|
|
101
129
|
Shotgun: <http://github.com/rtomayko/shotgun>
|
102
130
|
|
103
131
|
Rspactor: <http://github.com/mislav/rspactor>
|
132
|
+
(In turn based on http://rails.aizatto.com/2007/11/28/taming-the-autotest-beast-with-fsevents/ )
|
104
133
|
|
105
134
|
FileSystemWatcher: <http://paulhorman.com/filesystemwatcher/>
|
106
135
|
|
data/bin/rerun
CHANGED
@@ -20,6 +20,10 @@ opts = OptionParser.new("", 24, ' ') { |opts|
|
|
20
20
|
opts.separator ""
|
21
21
|
opts.separator "Options:"
|
22
22
|
|
23
|
+
opts.on("-d dir", "--dir dir", "directory to watch") do |dir|
|
24
|
+
options[:dir] = dir
|
25
|
+
end
|
26
|
+
|
23
27
|
opts.on_tail("-h", "--help", "--usage", "show this message") do
|
24
28
|
puts opts
|
25
29
|
exit
|
data/lib/osxwatcher.rb
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
require "system"
|
2
2
|
require "watcher"
|
3
3
|
|
4
|
-
begin
|
5
|
-
require 'osx/foundation'
|
6
|
-
OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
|
7
|
-
rescue MissingSourceFile
|
8
|
-
# this is to not fail when running on a non-Mac
|
9
|
-
end
|
10
|
-
|
11
|
-
# stolen from RSpactor, http://github.com/mislav/rspactor
|
12
|
-
# based on http://rails.aizatto.com/2007/11/28/taming-the-autotest-beast-with-fsevents/
|
13
|
-
|
14
4
|
#TODO: make it notice deleted files
|
15
5
|
require "watcher"
|
16
6
|
module Rerun
|
data/lib/rerun.rb
CHANGED
@@ -3,7 +3,7 @@ require "watcher"
|
|
3
3
|
require "osxwatcher"
|
4
4
|
require "fswatcher"
|
5
5
|
|
6
|
-
# todo: make this
|
6
|
+
# todo: make sure this works in non-Mac environments (also Macs without growlnotify)
|
7
7
|
module Rerun
|
8
8
|
class Runner
|
9
9
|
|
@@ -20,7 +20,15 @@ module Rerun
|
|
20
20
|
@restarting = false
|
21
21
|
end
|
22
22
|
|
23
|
+
def dir
|
24
|
+
@options[:dir] || "."
|
25
|
+
end
|
26
|
+
|
23
27
|
def start
|
28
|
+
if windows?
|
29
|
+
raise "Sorry, Rerun does not work on Windows."
|
30
|
+
end
|
31
|
+
|
24
32
|
if (!@already_running)
|
25
33
|
taglines = [
|
26
34
|
"To infinity... and beyond!",
|
@@ -37,13 +45,20 @@ module Rerun
|
|
37
45
|
end
|
38
46
|
|
39
47
|
@pid = Kernel.fork do
|
40
|
-
|
41
|
-
|
48
|
+
begin
|
49
|
+
# Signal.trap("INT") { exit }
|
50
|
+
exec(@run_command)
|
51
|
+
rescue => e
|
52
|
+
puts e
|
53
|
+
exit
|
54
|
+
end
|
42
55
|
end
|
56
|
+
Process.detach(@pid) # so if the child exits, it dies
|
43
57
|
|
44
|
-
Signal.trap("INT")
|
45
|
-
|
46
|
-
|
58
|
+
Signal.trap("INT") do # INT = control-C
|
59
|
+
stop # first stop the child
|
60
|
+
exit
|
61
|
+
end
|
47
62
|
|
48
63
|
begin
|
49
64
|
sleep 2
|
@@ -59,16 +74,16 @@ module Rerun
|
|
59
74
|
end
|
60
75
|
|
61
76
|
unless @watcher
|
62
|
-
watcher_class =
|
77
|
+
watcher_class = mac? ? OSXWatcher : FSWatcher
|
63
78
|
# watcher_class = FSWatcher
|
64
79
|
|
65
80
|
watcher = watcher_class.new do
|
66
81
|
restart unless @restarting
|
67
82
|
end
|
68
|
-
|
83
|
+
puts "Watching #{dir}"
|
84
|
+
watcher.add_directory(dir, "**/*.rb")
|
69
85
|
watcher.sleep_time = 1
|
70
86
|
watcher.start
|
71
|
-
|
72
87
|
@watcher = watcher
|
73
88
|
end
|
74
89
|
|
@@ -110,7 +125,7 @@ module Rerun
|
|
110
125
|
end
|
111
126
|
|
112
127
|
def notify(title, body)
|
113
|
-
growl title, body
|
128
|
+
growl title, body
|
114
129
|
puts
|
115
130
|
puts "#{Time.now.strftime("%T")} - #{app_name} #{title}"
|
116
131
|
end
|
data/lib/system.rb
CHANGED
@@ -1,22 +1,30 @@
|
|
1
|
+
def mac?
|
2
|
+
RUBY_PLATFORM =~ /darwin/i && !$osx_foundation_failed_to_load
|
3
|
+
end
|
4
|
+
|
5
|
+
def windows?
|
6
|
+
RUBY_PLATFORM =~ /mswin/i
|
7
|
+
end
|
1
8
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
+
def linux?
|
10
|
+
RUBY_PLATFORM =~ /linux/i
|
11
|
+
end
|
12
|
+
|
13
|
+
if mac?
|
14
|
+
begin
|
15
|
+
require 'osx/foundation'
|
16
|
+
OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
|
17
|
+
rescue
|
18
|
+
$osx_foundation_failed_to_load = true
|
19
|
+
end
|
9
20
|
end
|
10
21
|
|
11
22
|
module Rerun
|
12
23
|
module System
|
13
|
-
|
14
|
-
$osx
|
15
|
-
end
|
16
|
-
|
24
|
+
|
17
25
|
# do we have growl or not?
|
18
|
-
def
|
19
|
-
growlcmd != ""
|
26
|
+
def growl?
|
27
|
+
mac? && (growlcmd != "")
|
20
28
|
end
|
21
29
|
|
22
30
|
def growlcmd
|
@@ -29,9 +37,11 @@ module Rerun
|
|
29
37
|
end
|
30
38
|
|
31
39
|
def growl(title, body, background = true)
|
32
|
-
|
33
|
-
|
34
|
-
|
40
|
+
if growl?
|
41
|
+
s = "#{growlcmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\""
|
42
|
+
s += " &" if background
|
43
|
+
`#{s}`
|
44
|
+
end
|
35
45
|
end
|
36
46
|
|
37
47
|
end
|
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.
|
6
|
+
s.version = '0.3'
|
7
7
|
s.date = '2009-06-16'
|
8
8
|
|
9
9
|
s.description = "Restarts your app when a file changes"
|