rerun 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -59,7 +59,7 @@ Rackup can also be used to launch a Rack server, so let's try that:
59
59
  --dir directory to watch (default = ".")
60
60
 
61
61
  --pattern glob to match inside directory. This uses the Ruby Dir glob style -- see <http://www.ruby-doc.org/core/classes/Dir.html#M002322> for details.
62
- By default it watches .rb, .erb, .js, .css, and .ru files.
62
+ By default it watches these files: `rb,js,css,scss,sass,erb,html,haml,ru`.
63
63
 
64
64
  Also --version and --help.
65
65
 
data/Rakefile CHANGED
@@ -1,15 +1,15 @@
1
1
  require 'rake'
2
2
  require 'rake/clean'
3
3
  require 'rake/testtask'
4
- require 'spec/rake/spectask'
4
+ require 'rspec/core/rake_task'
5
5
 
6
6
  task :default => [:spec]
7
7
  task :test => :spec
8
8
 
9
9
  desc "Run all specs"
10
- Spec::Rake::SpecTask.new('spec') do |t|
10
+ RSpec::Core::RakeTask.new('spec') do |t|
11
11
  ENV['ENV'] = "test"
12
- t.spec_files = FileList['spec/**/*_spec.rb']
12
+ t.pattern = 'spec/**/*_spec.rb'
13
13
  t.ruby_opts = ['-rubygems'] if defined? Gem
14
14
  end
15
15
 
Binary file
Binary file
data/lib/rerun.rb CHANGED
@@ -1,144 +1,16 @@
1
- require "system"
2
- require "watcher"
3
- require "osxwatcher"
4
- require "fswatcher"
1
+ here = File.expand_path(File.dirname(__FILE__))
2
+ $: << here unless $:.include?(here)
3
+
4
+ require "rerun/system"
5
+ require "rerun/runner"
6
+ require "rerun/watcher"
7
+ require "rerun/osxwatcher"
8
+ require "rerun/fswatcher"
5
9
 
6
10
  # todo: make sure this works in non-Mac environments (also Macs without growlnotify)
7
11
  module Rerun
8
12
 
9
- DEFAULT_PATTERN = "**/*.{rb,js,css,erb,ru}"
10
-
11
- class Runner
12
-
13
- include System
14
-
15
- def initialize(run_command, options = {})
16
- @run_command, @options = run_command, options
17
- @run_command = "ruby #{@run_command}" if @run_command.split(' ').first =~ /\.rb$/
18
- end
19
-
20
- def restart
21
- @restarting = true
22
- stop
23
- start
24
- @restarting = false
25
- end
26
-
27
- def dir
28
- @options[:dir] || "."
29
- end
30
-
31
- def pattern
32
- @options[:pattern] || DEFAULT_PATTERN
33
- end
34
-
35
- def start
36
- if windows?
37
- raise "Sorry, Rerun does not work on Windows."
38
- end
39
-
40
- if (!@already_running)
41
- taglines = [
42
- "To infinity... and beyond!",
43
- "Charge!",
44
- ]
45
- notify "Launched", taglines[rand(taglines.size)]
46
- @already_running = true
47
- else
48
- taglines = [
49
- "Here we go again!",
50
- "Once more unto the breach, dear friends, once more!",
51
- ]
52
- notify "Restarted", taglines[rand(taglines.size)]
53
- end
54
-
55
- @pid = Kernel.fork do
56
- begin
57
- # Signal.trap("INT") { exit }
58
- exec(@run_command)
59
- rescue => e
60
- puts e
61
- exit
62
- end
63
- end
64
- Process.detach(@pid) # so if the child exits, it dies
65
-
66
- Signal.trap("INT") do # INT = control-C
67
- stop # first stop the child
68
- exit
69
- end
70
-
71
- begin
72
- sleep 2
73
- rescue Interrupt => e
74
- # in case someone hits control-C immediately
75
- stop
76
- exit
77
- end
78
-
79
- unless running?
80
- notify "Launch Failed", "See console for error output"
81
- @already_running = false
82
- end
83
-
84
- unless @watcher
85
- watcher_class = mac? ? OSXWatcher : FSWatcher
86
- # watcher_class = FSWatcher
87
-
88
- watcher = watcher_class.new do
89
- restart unless @restarting
90
- end
91
- puts "Watching #{dir}/#{pattern}"
92
- watcher.add_directory(dir, pattern)
93
- watcher.sleep_time = 1
94
- watcher.start
95
- @watcher = watcher
96
- end
97
-
98
- end
99
-
100
- def join
101
- @watcher.join
102
- end
103
-
104
- def running?
105
- signal(0)
106
- end
107
-
108
- def signal(signal)
109
- Process.kill(signal, @pid)
110
- true
111
- rescue
112
- false
113
- end
114
-
115
- def stop
116
- if @pid && (@pid != 0)
117
- notify "Stopped", "All good things must come to an end." unless @restarting
118
- signal("KILL") && Process.wait(@pid)
119
- end
120
- rescue => e
121
- false
122
- end
123
-
124
- def git_head_changed?
125
- old_git_head = @git_head
126
- read_git_head
127
- @git_head and old_git_head and @git_head != old_git_head
128
- end
129
-
130
- def read_git_head
131
- git_head_file = File.join(dir, '.git', 'HEAD')
132
- @git_head = File.exists?(git_head_file) && File.read(git_head_file)
133
- end
134
-
135
- def notify(title, body)
136
- growl title, body
137
- puts
138
- puts "#{Time.now.strftime("%T")} - #{app_name} #{title}"
139
- end
140
-
141
- end
13
+ DEFAULT_PATTERN = "**/*.{rb,js,css,scss,sass,erb,html,haml,ru}"
142
14
 
143
15
  end
144
16
 
@@ -1,4 +1,4 @@
1
- require 'watcher'
1
+ require 'rerun/watcher'
2
2
 
3
3
  module Rerun
4
4
  class FSWatcher < Watcher
@@ -1,9 +1,8 @@
1
- require "system"
2
- require "watcher"
1
+ require "rerun/system"
2
+ require "rerun/watcher"
3
3
 
4
4
  #TODO: make it notice deleted files natively, rather than passing to 'examine'
5
5
  #TODO: use http://github.com/spicycode/fsevent
6
- require "watcher"
7
6
  module Rerun
8
7
  class OSXWatcher < Rerun::Watcher
9
8
  attr_reader :last_check, :valid_extensions
@@ -0,0 +1,133 @@
1
+ module Rerun
2
+ class Runner
3
+
4
+ include System
5
+
6
+ def initialize(run_command, options = {})
7
+ @run_command, @options = run_command, options
8
+ @run_command = "ruby #{@run_command}" if @run_command.split(' ').first =~ /\.rb$/
9
+ end
10
+
11
+ def restart
12
+ @restarting = true
13
+ stop
14
+ start
15
+ @restarting = false
16
+ end
17
+
18
+ def dir
19
+ @options[:dir] || "."
20
+ end
21
+
22
+ def pattern
23
+ @options[:pattern] || DEFAULT_PATTERN
24
+ end
25
+
26
+ def start
27
+ if windows?
28
+ raise "Sorry, Rerun does not work on Windows."
29
+ end
30
+
31
+ if (!@already_running)
32
+ taglines = [
33
+ "To infinity... and beyond!",
34
+ "Charge!",
35
+ ]
36
+ notify "Launched", taglines[rand(taglines.size)]
37
+ @already_running = true
38
+ else
39
+ taglines = [
40
+ "Here we go again!",
41
+ "Once more unto the breach, dear friends, once more!",
42
+ ]
43
+ notify "Restarted", taglines[rand(taglines.size)]
44
+ end
45
+
46
+ @pid = Kernel.fork do
47
+ begin
48
+ # Signal.trap("INT") { exit }
49
+ exec(@run_command)
50
+ rescue => e
51
+ puts e
52
+ exit
53
+ end
54
+ end
55
+ Process.detach(@pid) # so if the child exits, it dies
56
+
57
+ Signal.trap("INT") do # INT = control-C
58
+ stop # first stop the child
59
+ exit
60
+ end
61
+
62
+ begin
63
+ sleep 2
64
+ rescue Interrupt => e
65
+ # in case someone hits control-C immediately
66
+ stop
67
+ exit
68
+ end
69
+
70
+ unless running?
71
+ notify "Launch Failed", "See console for error output"
72
+ @already_running = false
73
+ end
74
+
75
+ unless @watcher
76
+ watcher_class = osx_foundation? ? OSXWatcher : FSWatcher
77
+ # watcher_class = FSWatcher
78
+
79
+ watcher = watcher_class.new do
80
+ restart unless @restarting
81
+ end
82
+ puts "Watching #{dir}/#{pattern}"
83
+ watcher.add_directory(dir, pattern)
84
+ watcher.sleep_time = 1
85
+ watcher.start
86
+ @watcher = watcher
87
+ end
88
+
89
+ end
90
+
91
+ def join
92
+ @watcher.join
93
+ end
94
+
95
+ def running?
96
+ signal(0)
97
+ end
98
+
99
+ def signal(signal)
100
+ Process.kill(signal, @pid)
101
+ true
102
+ rescue
103
+ false
104
+ end
105
+
106
+ def stop
107
+ if @pid && (@pid != 0)
108
+ notify "Stopped", "All good things must come to an end." unless @restarting
109
+ signal("KILL") && Process.wait(@pid)
110
+ end
111
+ rescue => e
112
+ false
113
+ end
114
+
115
+ def git_head_changed?
116
+ old_git_head = @git_head
117
+ read_git_head
118
+ @git_head and old_git_head and @git_head != old_git_head
119
+ end
120
+
121
+ def read_git_head
122
+ git_head_file = File.join(dir, '.git', 'HEAD')
123
+ @git_head = File.exists?(git_head_file) && File.read(git_head_file)
124
+ end
125
+
126
+ def notify(title, body)
127
+ growl title, body
128
+ puts
129
+ puts "#{Time.now.strftime("%T")} - #{app_name} #{title}"
130
+ end
131
+
132
+ end
133
+ end
@@ -0,0 +1,63 @@
1
+ module Rerun
2
+ module System
3
+
4
+ def mac?
5
+ # puts "RUBY_PLATFORM=#{RUBY_PLATFORM}"
6
+ RUBY_PLATFORM =~ /darwin/i
7
+ end
8
+
9
+ def osx_foundation?
10
+ mac? and begin
11
+ if $osx_foundation.nil?
12
+ require 'osx/foundation'
13
+ OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
14
+ $osx_foundation = true
15
+ end
16
+ $osx_foundation
17
+ rescue LoadError
18
+ $osx_foundation = false
19
+ end
20
+ end
21
+
22
+ def windows?
23
+ RUBY_PLATFORM =~ /mswin/i
24
+ end
25
+
26
+ def linux?
27
+ RUBY_PLATFORM =~ /linux/i
28
+ end
29
+
30
+ # do we have growl or not?
31
+ def growl?
32
+ mac? && (growlcmd != "")
33
+ end
34
+
35
+ def growlcmd
36
+ `which growlnotify`.chomp
37
+ end
38
+
39
+ def app_name
40
+ # todo: make sure this works in non-Mac and non-Unix environments
41
+ File.expand_path(".").gsub(/^.*\//, '').capitalize
42
+ end
43
+
44
+ def icon
45
+ libdir = "#{File.expand_path(File.dirname(File.dirname(__FILE__)))}/lib"
46
+ $LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
47
+
48
+ rails_sig_file = File.expand_path(".")+"/config/boot.rb"
49
+ return "#{libdir}/../icons/rails_red_sml.png" if File.exists? rails_sig_file
50
+ return nil
51
+ end
52
+
53
+ def growl(title, body, background = true)
54
+ if growl?
55
+ icon_str = ("--image \"#{icon}\"" if icon)
56
+ s = "#{growlcmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
57
+ s += " &" if background
58
+ `#{s}`
59
+ end
60
+ end
61
+
62
+ end
63
+ end
File without changes
data/rerun.gemspec CHANGED
@@ -3,8 +3,8 @@ $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.5.4'
7
- s.date = '2010-11-20'
6
+ s.version = '0.5.5'
7
+ s.date = '2011-05-14'
8
8
 
9
9
  s.description = "Restarts your app when a file changes"
10
10
  s.summary = "Launches an app, and restarts it whenever the filesystem changes."
@@ -18,11 +18,14 @@ $spec = Gem::Specification.new do |s|
18
18
  Rakefile
19
19
  rerun.gemspec
20
20
  bin/rerun
21
+ icons/rails_grn_sml.png
22
+ icons/rails_red_sml.png
21
23
  lib/rerun.rb
22
- lib/fswatcher.rb
23
- lib/osxwatcher.rb
24
- lib/system.rb
25
- lib/watcher.rb
24
+ lib/rerun/fswatcher.rb
25
+ lib/rerun/osxwatcher.rb
26
+ lib/rerun/runner.rb
27
+ lib/rerun/system.rb
28
+ lib/rerun/watcher.rb
26
29
  ]
27
30
  s.executables = ['rerun']
28
31
  s.test_files = s.files.select {|path| path =~ /^spec\/.*_spec.rb/}
metadata CHANGED
@@ -1,73 +1,59 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rerun
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 5
8
- - 4
9
- version: 0.5.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.5
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Alex Chaffee
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-11-20 00:00:00 -08:00
18
- default_executable:
12
+ date: 2011-05-14 00:00:00.000000000Z
19
13
  dependencies: []
20
-
21
14
  description: Restarts your app when a file changes
22
15
  email: alex@stinky.com
23
- executables:
16
+ executables:
24
17
  - rerun
25
18
  extensions: []
26
-
27
- extra_rdoc_files:
19
+ extra_rdoc_files:
28
20
  - README.md
29
- files:
21
+ files:
30
22
  - README.md
31
23
  - LICENSE
32
24
  - Rakefile
33
25
  - rerun.gemspec
34
26
  - bin/rerun
27
+ - icons/rails_grn_sml.png
28
+ - icons/rails_red_sml.png
35
29
  - lib/rerun.rb
36
- - lib/fswatcher.rb
37
- - lib/osxwatcher.rb
38
- - lib/system.rb
39
- - lib/watcher.rb
40
- has_rdoc: true
30
+ - lib/rerun/fswatcher.rb
31
+ - lib/rerun/osxwatcher.rb
32
+ - lib/rerun/runner.rb
33
+ - lib/rerun/system.rb
34
+ - lib/rerun/watcher.rb
41
35
  homepage: http://github.com/alexch/rerun/
42
36
  licenses: []
43
-
44
37
  post_install_message:
45
38
  rdoc_options: []
46
-
47
- require_paths:
39
+ require_paths:
48
40
  - lib
49
- required_ruby_version: !ruby/object:Gem::Requirement
41
+ required_ruby_version: !ruby/object:Gem::Requirement
50
42
  none: false
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- version: "0"
57
- required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
48
  none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- segments:
63
- - 0
64
- version: "0"
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
65
53
  requirements: []
66
-
67
54
  rubyforge_project: pivotalrb
68
- rubygems_version: 1.3.7
55
+ rubygems_version: 1.8.1
69
56
  signing_key:
70
57
  specification_version: 2
71
58
  summary: Launches an app, and restarts it whenever the filesystem changes.
72
59
  test_files: []
73
-
data/lib/system.rb DELETED
@@ -1,48 +0,0 @@
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
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 LoadError
18
- $osx_foundation_failed_to_load = true
19
- end
20
- end
21
-
22
- module Rerun
23
- module System
24
-
25
- # do we have growl or not?
26
- def growl?
27
- mac? && (growlcmd != "")
28
- end
29
-
30
- def growlcmd
31
- `which growlnotify`.chomp
32
- end
33
-
34
- def app_name
35
- # todo: make sure this works in non-Mac and non-Unix environments
36
- File.expand_path(".").gsub(/^.*\//, '').capitalize
37
- end
38
-
39
- def growl(title, body, background = true)
40
- if growl?
41
- s = "#{growlcmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\""
42
- s += " &" if background
43
- `#{s}`
44
- end
45
- end
46
-
47
- end
48
- end