rerun 0.13.0 → 0.13.1
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 +5 -5
- data/README.md +27 -14
- data/Rakefile +82 -83
- data/bin/rerun +18 -18
- data/lib/goo.rb +3 -3
- data/lib/rerun.rb +15 -15
- data/lib/rerun/notification.rb +82 -82
- data/lib/rerun/options.rb +146 -145
- data/lib/rerun/runner.rb +374 -376
- data/lib/rerun/system.rb +22 -22
- data/lib/rerun/watcher.rb +134 -131
- data/rerun.gemspec +34 -34
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 12916c529d417f7435294064c61ab8bc9b3e4811e61ab162725b84dc42730212
|
4
|
+
data.tar.gz: 2d32573a380ae73f845564580eced58064271d3347a09da7c5e13ad72882a8c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3d9ed3d68053c23b3c9665abc33cde89d4fd5893fa1d9930fbcb93113459450810ced0d3d0cd7e83c2bc4dc9da27446228f1104dc2a46cdb01ef53dc8bc5f48
|
7
|
+
data.tar.gz: 1df642c255cd253271015b111f2b0fa4b9023c0fd697b1bd03405b2fccb9d716658f840a82884dfa7b042395c07664205f6427c08a9b432f8742ce58413792cd
|
data/README.md
CHANGED
@@ -20,9 +20,9 @@ Use the `--pattern` option if you want to change this.
|
|
20
20
|
As of version 0.7.0, we use the Listen gem, which tries to use your OS's
|
21
21
|
built-in facilities for monitoring the filesystem, so CPU use is very light.
|
22
22
|
|
23
|
-
**UPDATE**: Now Rerun *does* work on Windows
|
23
|
+
**UPDATE**: Now Rerun *does* work on Windows! Caveats:
|
24
24
|
* not well-tested
|
25
|
-
*
|
25
|
+
* you need to press Enter after keypress input
|
26
26
|
* you may need to install the `wdm` gem manually: `gem install wdm`
|
27
27
|
* You may see this persistent `INFO` error message; to remove it, use`--no-notify`:
|
28
28
|
* `INFO: Could not find files for the given pattern(s)`
|
@@ -57,6 +57,26 @@ On *BSD, use
|
|
57
57
|
|
58
58
|
gem install rb-kqueue
|
59
59
|
|
60
|
+
## Installation via Gemfile / Bundler
|
61
|
+
|
62
|
+
If you are using rerun inside an existing Ruby application (like a Rails or Sinatra app), you can add it to your Gemfile:
|
63
|
+
|
64
|
+
``` ruby
|
65
|
+
group :development, :test do
|
66
|
+
gem "rerun"
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
Using a Gemfile is also an easy way to use the pre-release branch, which may have bugfixes or features you want:
|
71
|
+
|
72
|
+
``` ruby
|
73
|
+
group :development, :test do
|
74
|
+
gem "rerun", git: "https://github.com/alexch/rerun.git"
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
When using a Gemfile, install with `bundle install` or `bundle update`, and run using `bundle exec rerun`, to guarantee you are using the rerun version specified in the Gemfile, and not a different version in a system-wide gemset.
|
79
|
+
|
60
80
|
# Usage:
|
61
81
|
|
62
82
|
rerun [options] [--] cmd
|
@@ -138,7 +158,7 @@ Run `rerun --help` to see the actual list.
|
|
138
158
|
`--ignore pattern` file glob to ignore (can be set many times). To ignore a directory, you must append `'/*'` e.g.
|
139
159
|
`--ignore 'coverage/*'`.
|
140
160
|
|
141
|
-
|
161
|
+
`--[no-]ignore-dotfiles` By default, on top of --pattern and --ignore, we ignore any changes to files and dirs starting with a dot. Setting `--no-ignore-dotfiles` allows you to monitor a relevant file like .env, but you may also have to explicitly --ignore more dotfiles and dotdirs.
|
142
162
|
|
143
163
|
`--signal` (or `-s`) use specified signal(s) (instead of the default `TERM,INT,KILL`) to terminate the previous process. You can use a comma-delimited list if you want to try a signal, wait up to 5 seconds for the process to die, then try again with a different signal, and so on.
|
144
164
|
This may be useful for forcing the respective process to terminate as quickly as possible.
|
@@ -242,14 +262,6 @@ If running inside a shared directory using Vagrant and VirtualBox, you must pass
|
|
242
262
|
|
243
263
|
# Troubleshooting
|
244
264
|
|
245
|
-
## Vagrant ##
|
246
|
-
|
247
|
-
Rerun will not pick up changes made to shared folders. This means that the common
|
248
|
-
method of using Vagrant for an execution environment and using the `/vagrant`
|
249
|
-
shared folder for source code will not work.
|
250
|
-
|
251
|
-
Instead, use [shotgun](https://rubygems.org/gems/shotgun).
|
252
|
-
|
253
265
|
## zsh ##
|
254
266
|
|
255
267
|
If you are using `zsh` as your shell, and you are specifying your `--pattern` as `**/*.rb`, you may face this error
|
@@ -288,13 +300,13 @@ rerun -p "**/*.rb" rake test
|
|
288
300
|
|
289
301
|
# Other projects that do similar things
|
290
302
|
|
303
|
+
* Guard: <http://github.com/guard/guard>
|
291
304
|
* Restartomatic: <http://github.com/adammck/restartomatic>
|
292
305
|
* Shotgun: <http://github.com/rtomayko/shotgun>
|
293
306
|
* Rack::Reloader middleware: <http://github.com/rack/rack/blob/5ca8f82fb59f0bf0e8fd438e8e91c5acf3d98e44/lib/rack/reloader.rb>
|
294
307
|
* The Sinatra FAQ has a discussion at <http://www.sinatrarb.com/faq.html#reloading>
|
295
308
|
* Kicker: <http://github.com/alloy/kicker/>
|
296
309
|
* Watchr: <https://github.com/mynyml/watchr>
|
297
|
-
* Guard: <http://github.com/guard/guard>
|
298
310
|
* Autotest: <https://github.com/grosser/autotest>
|
299
311
|
|
300
312
|
# Why would I use this instead of Shotgun?
|
@@ -387,6 +399,9 @@ Based upon and/or inspired by:
|
|
387
399
|
|
388
400
|
# Version History
|
389
401
|
|
402
|
+
*
|
403
|
+
* --no-ignore-dotfiles option
|
404
|
+
|
390
405
|
* v0.13.0 26 January 2018
|
391
406
|
* bugfix: pause/unpause works again (thanks Barry!)
|
392
407
|
* `.rerun` config file
|
@@ -399,8 +414,6 @@ Based upon and/or inspired by:
|
|
399
414
|
* support for Windows
|
400
415
|
* use `Kernel.spawn` instead of `fork`
|
401
416
|
* use `wdm` gem for Windows Directory Monitor
|
402
|
-
* TODO: fix `INFO` error message
|
403
|
-
* TODO: fix console input contention bug
|
404
417
|
* support for notifications on GNU/Linux using [notify-send](http://www.linuxjournal.com/content/tech-tip-get-notifications-your-scripts-notify-send) (thanks terceiro)
|
405
418
|
* fix `Gem::LoadError - terminal-notifier is not part of the bundle` [bug](https://github.com/alexch/rerun/issues/108) (thanks mattheworiordan)
|
406
419
|
|
data/Rakefile
CHANGED
@@ -1,83 +1,82 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/clean'
|
3
|
-
require 'rake/testtask'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
|
6
|
-
task :default => [:spec]
|
7
|
-
task :test => :spec
|
8
|
-
|
9
|
-
desc "Run all specs"
|
10
|
-
RSpec::Core::RakeTask.new('spec') do |t|
|
11
|
-
ENV['ENV'] = "test"
|
12
|
-
t.pattern = 'spec/**/*_spec.rb'
|
13
|
-
t.rspec_opts = ['--color']
|
14
|
-
end
|
15
|
-
|
16
|
-
$rubyforge_project = 'pivotalrb'
|
17
|
-
|
18
|
-
$spec =
|
19
|
-
begin
|
20
|
-
require 'rubygems/specification'
|
21
|
-
data = File.read('rerun.gemspec')
|
22
|
-
spec = nil
|
23
|
-
#Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
|
24
|
-
spec = eval data
|
25
|
-
spec
|
26
|
-
end
|
27
|
-
|
28
|
-
def package(ext='')
|
29
|
-
"pkg/#{$spec.name}-#{$spec.version}" + ext
|
30
|
-
end
|
31
|
-
|
32
|
-
desc 'Exit if git is dirty'
|
33
|
-
task :check_git do
|
34
|
-
state = `git status 2> /dev/null | tail -n1`
|
35
|
-
clean = (state =~ /working (directory|tree) clean/)
|
36
|
-
unless clean
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
--
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
sh "git
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
task :default => [:spec]
|
7
|
+
task :test => :spec
|
8
|
+
|
9
|
+
desc "Run all specs"
|
10
|
+
RSpec::Core::RakeTask.new('spec') do |t|
|
11
|
+
ENV['ENV'] = "test"
|
12
|
+
t.pattern = 'spec/**/*_spec.rb'
|
13
|
+
t.rspec_opts = ['--color']
|
14
|
+
end
|
15
|
+
|
16
|
+
$rubyforge_project = 'pivotalrb'
|
17
|
+
|
18
|
+
$spec =
|
19
|
+
begin
|
20
|
+
require 'rubygems/specification'
|
21
|
+
data = File.read('rerun.gemspec')
|
22
|
+
spec = nil
|
23
|
+
#Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
|
24
|
+
spec = eval data
|
25
|
+
spec
|
26
|
+
end
|
27
|
+
|
28
|
+
def package(ext='')
|
29
|
+
"pkg/#{$spec.name}-#{$spec.version}" + ext
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Exit if git is dirty'
|
33
|
+
task :check_git do
|
34
|
+
state = `git status 2> /dev/null | tail -n1`
|
35
|
+
clean = (state =~ /working (directory|tree) clean/)
|
36
|
+
unless clean
|
37
|
+
warn "can't do that on an unclean git dir"
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'Build packages'
|
43
|
+
task :package => %w[.gem .tar.gz].map { |e| package(e) }
|
44
|
+
|
45
|
+
desc 'Build and install as local gem'
|
46
|
+
task :install => package('.gem') do
|
47
|
+
sh "gem install #{package('.gem')}"
|
48
|
+
end
|
49
|
+
|
50
|
+
directory 'pkg/'
|
51
|
+
CLOBBER.include('pkg')
|
52
|
+
|
53
|
+
file package('.gem') => %W[pkg/ #{$spec.name}.gemspec] + $spec.files do |f|
|
54
|
+
sh "gem build #{$spec.name}.gemspec"
|
55
|
+
mv File.basename(f.name), f.name
|
56
|
+
end
|
57
|
+
|
58
|
+
file package('.tar.gz') => %w[pkg/] + $spec.files do |f|
|
59
|
+
cmd = <<-SH
|
60
|
+
git archive \
|
61
|
+
--prefix=#{$spec.name}-#{$spec.version}/ \
|
62
|
+
--format=tar \
|
63
|
+
HEAD | gzip > #{f.name}
|
64
|
+
SH
|
65
|
+
sh cmd.gsub(/ +/, ' ')
|
66
|
+
end
|
67
|
+
|
68
|
+
desc 'Publish gem and tarball to rubyforge'
|
69
|
+
task 'release' => [:check_git, package('.gem'), package('.tar.gz')] do |t|
|
70
|
+
puts "Releasing #{$spec.version}"
|
71
|
+
sh "gem push #{package('.gem')}"
|
72
|
+
puts "Tagging and pushing"
|
73
|
+
sh "git tag v#{$spec.version}"
|
74
|
+
sh "git push && git push --tags"
|
75
|
+
end
|
76
|
+
|
77
|
+
desc 'download github issues and pull requests'
|
78
|
+
task 'github' do
|
79
|
+
%w(issues pulls).each do |type|
|
80
|
+
sh "curl -o #{type}.json https://api.github.com/repos/alexch/rerun/#{type}"
|
81
|
+
end
|
82
|
+
end
|
data/bin/rerun
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
libdir = "#{File.expand_path(File.dirname(File.dirname(__FILE__)))}/lib"
|
5
|
-
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
|
6
|
-
|
7
|
-
require 'rerun'
|
8
|
-
require 'optparse'
|
9
|
-
|
10
|
-
options = Rerun::Options.parse config_file: ".rerun"
|
11
|
-
|
12
|
-
if options and options[:verbose]
|
13
|
-
puts "\nrerun options:\n\t#{options}"
|
14
|
-
end
|
15
|
-
|
16
|
-
exit if options.nil? or options[:cmd].nil? or options[:cmd].empty?
|
17
|
-
|
18
|
-
Rerun::Runner.keep_running(options[:cmd], options)
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
libdir = "#{File.expand_path(File.dirname(File.dirname(__FILE__)))}/lib"
|
5
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
|
6
|
+
|
7
|
+
require 'rerun'
|
8
|
+
require 'optparse'
|
9
|
+
|
10
|
+
options = Rerun::Options.parse config_file: ".rerun"
|
11
|
+
|
12
|
+
if options and options[:verbose]
|
13
|
+
puts "\nrerun options:\n\t#{options}"
|
14
|
+
end
|
15
|
+
|
16
|
+
exit if options.nil? or options[:cmd].nil? or options[:cmd].empty?
|
17
|
+
|
18
|
+
Rerun::Runner.keep_running(options[:cmd], options)
|
data/lib/goo.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
goooo
|
2
|
-
goooo
|
3
|
-
goooo
|
1
|
+
goooo
|
2
|
+
goooo
|
3
|
+
goooo
|
data/lib/rerun.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
here = File.expand_path(File.dirname(__FILE__))
|
2
|
-
$: << here unless $:.include?(here)
|
3
|
-
|
4
|
-
require "listen" # pull in the Listen gem
|
5
|
-
require "rerun/options"
|
6
|
-
require "rerun/system"
|
7
|
-
require "rerun/notification"
|
8
|
-
require "rerun/runner"
|
9
|
-
require "rerun/watcher"
|
10
|
-
require "rerun/glob"
|
11
|
-
|
12
|
-
module Rerun
|
13
|
-
|
14
|
-
end
|
15
|
-
|
1
|
+
here = File.expand_path(File.dirname(__FILE__))
|
2
|
+
$: << here unless $:.include?(here)
|
3
|
+
|
4
|
+
require "listen" # pull in the Listen gem
|
5
|
+
require "rerun/options"
|
6
|
+
require "rerun/system"
|
7
|
+
require "rerun/notification"
|
8
|
+
require "rerun/runner"
|
9
|
+
require "rerun/watcher"
|
10
|
+
require "rerun/glob"
|
11
|
+
|
12
|
+
module Rerun
|
13
|
+
|
14
|
+
end
|
15
|
+
|
data/lib/rerun/notification.rb
CHANGED
@@ -1,82 +1,82 @@
|
|
1
|
-
# todo: unit tests
|
2
|
-
|
3
|
-
module Rerun
|
4
|
-
class Notification
|
5
|
-
include System
|
6
|
-
|
7
|
-
attr_reader :title, :body, :options
|
8
|
-
|
9
|
-
def initialize(title, body, options = Options::DEFAULTS.dup)
|
10
|
-
@title = title
|
11
|
-
@body = body
|
12
|
-
@options = options
|
13
|
-
end
|
14
|
-
|
15
|
-
def command
|
16
|
-
# todo: strategy or subclass
|
17
|
-
|
18
|
-
s = nil
|
19
|
-
|
20
|
-
if options[:notify] == true or options[:notify] == "growl"
|
21
|
-
if (cmd = command_named("growlnotify"))
|
22
|
-
# todo: check version of growlnotify and warn if it's too old
|
23
|
-
icon_str = ("--image \"#{icon}\"" if icon)
|
24
|
-
s = "#{cmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
if s.nil? and options[:notify] == true or options[:notify] == "osx"
|
29
|
-
if (cmd = command_named("terminal-notifier"))
|
30
|
-
icon_str = ("-appIcon \"#{icon}\"" if icon)
|
31
|
-
s = "#{cmd} -title \"#{app_name}\" -message \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
if s.nil? and options[:notify] == true or options[:notify] == "notify-send"
|
36
|
-
if (cmd = command_named('notify-send'))
|
37
|
-
icon_str = "--icon #{icon}" if icon
|
38
|
-
s = "#{cmd} -t 500 --hint=int:transient:1 #{icon_str} \"#{app_name}: #{title}\" \"#{body}\""
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
s
|
43
|
-
end
|
44
|
-
|
45
|
-
def command_named(name)
|
46
|
-
which_command = windows? ? 'where.exe' : 'which'
|
47
|
-
# TODO: remove 'INFO' error message
|
48
|
-
path = `#{which_command
|
49
|
-
path.empty? ? nil : path
|
50
|
-
end
|
51
|
-
|
52
|
-
def send(background = true)
|
53
|
-
return unless command
|
54
|
-
with_clean_env do
|
55
|
-
`#{command}#{" &" if background}`
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def app_name
|
60
|
-
options[:name]
|
61
|
-
end
|
62
|
-
|
63
|
-
def icon
|
64
|
-
"#{icon_dir}/rails_red_sml.png" if rails?
|
65
|
-
end
|
66
|
-
|
67
|
-
def icon_dir
|
68
|
-
here = File.expand_path(File.dirname(__FILE__))
|
69
|
-
File.expand_path("#{here}/../../icons")
|
70
|
-
end
|
71
|
-
|
72
|
-
def with_clean_env
|
73
|
-
if defined?(Bundler)
|
74
|
-
Bundler.with_clean_env do
|
75
|
-
yield
|
76
|
-
end
|
77
|
-
else
|
78
|
-
yield
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
1
|
+
# todo: unit tests
|
2
|
+
|
3
|
+
module Rerun
|
4
|
+
class Notification
|
5
|
+
include System
|
6
|
+
|
7
|
+
attr_reader :title, :body, :options
|
8
|
+
|
9
|
+
def initialize(title, body, options = Options::DEFAULTS.dup)
|
10
|
+
@title = title
|
11
|
+
@body = body
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
def command
|
16
|
+
# todo: strategy or subclass
|
17
|
+
|
18
|
+
s = nil
|
19
|
+
|
20
|
+
if options[:notify] == true or options[:notify] == "growl"
|
21
|
+
if (cmd = command_named("growlnotify"))
|
22
|
+
# todo: check version of growlnotify and warn if it's too old
|
23
|
+
icon_str = ("--image \"#{icon}\"" if icon)
|
24
|
+
s = "#{cmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if s.nil? and options[:notify] == true or options[:notify] == "osx"
|
29
|
+
if (cmd = command_named("terminal-notifier"))
|
30
|
+
icon_str = ("-appIcon \"#{icon}\"" if icon)
|
31
|
+
s = "#{cmd} -title \"#{app_name}\" -message \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if s.nil? and options[:notify] == true or options[:notify] == "notify-send"
|
36
|
+
if (cmd = command_named('notify-send'))
|
37
|
+
icon_str = "--icon #{icon}" if icon
|
38
|
+
s = "#{cmd} -t 500 --hint=int:transient:1 #{icon_str} \"#{app_name}: #{title}\" \"#{body}\""
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
s
|
43
|
+
end
|
44
|
+
|
45
|
+
def command_named(name)
|
46
|
+
which_command = windows? ? 'where.exe %{cmd}' : 'which %{cmd} 2> /dev/null'
|
47
|
+
# TODO: remove 'INFO' error message
|
48
|
+
path = `#{which_command % {cmd: name}}`.chomp
|
49
|
+
path.empty? ? nil : path
|
50
|
+
end
|
51
|
+
|
52
|
+
def send(background = true)
|
53
|
+
return unless command
|
54
|
+
with_clean_env do
|
55
|
+
`#{command}#{" &" if background}`
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def app_name
|
60
|
+
options[:name]
|
61
|
+
end
|
62
|
+
|
63
|
+
def icon
|
64
|
+
"#{icon_dir}/rails_red_sml.png" if rails?
|
65
|
+
end
|
66
|
+
|
67
|
+
def icon_dir
|
68
|
+
here = File.expand_path(File.dirname(__FILE__))
|
69
|
+
File.expand_path("#{here}/../../icons")
|
70
|
+
end
|
71
|
+
|
72
|
+
def with_clean_env
|
73
|
+
if defined?(Bundler)
|
74
|
+
Bundler.with_clean_env do
|
75
|
+
yield
|
76
|
+
end
|
77
|
+
else
|
78
|
+
yield
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|