guard-rspec 3.1.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +8 -0
- data/.travis.yml +7 -0
- data/CONTRIBUTING.md +38 -0
- data/Gemfile +11 -0
- data/Guardfile +5 -0
- data/{LICENSE → LICENSE.txt} +2 -0
- data/README.md +23 -149
- data/Rakefile +5 -0
- data/guard-rspec.gemspec +26 -0
- data/lib/guard/rspec.rb +18 -99
- data/lib/guard/rspec/command.rb +61 -0
- data/lib/guard/rspec/deprecator.rb +51 -0
- data/lib/guard/rspec/formatters/focuser.rb +29 -0
- data/lib/guard/rspec/formatters/notifier.rb +47 -0
- data/lib/guard/rspec/inspector.rb +44 -40
- data/lib/guard/rspec/runner.rb +45 -246
- data/lib/guard/rspec/version.rb +1 -1
- data/spec/lib/guard/rspec/command_spec.rb +59 -0
- data/spec/lib/guard/rspec/deprecator_spec.rb +57 -0
- data/spec/lib/guard/rspec/formatter_spec.rb +0 -0
- data/spec/lib/guard/rspec/formatters/focuser_spec.rb +25 -0
- data/spec/lib/guard/rspec/formatters/notifier_spec.rb +34 -0
- data/spec/lib/guard/rspec/inspector_spec.rb +94 -0
- data/spec/lib/guard/rspec/runner_spec.rb +136 -0
- data/spec/lib/guard/rspec_spec.rb +82 -0
- data/spec/spec_helper.rb +18 -0
- metadata +90 -20
- data/lib/guard/rspec/formatter.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72a879771ebb51c3975137af34723ce17a908abe
|
4
|
+
data.tar.gz: e6f562c2149e0d7a7312831a706565be60bdc018
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea1fd12cd64193718d5be568ff09ede36a6dafadf4f30a3bfa3050842aa73b1e0ccdc036985a513c0a6898328d0fcf28b997ce84423efba52180cef5e5ddb095
|
7
|
+
data.tar.gz: ce1aa592392b715825347bbcc3c95c85eb3e795488c3aeb37f650583524a3784fd8a127e3a09bd31b100058a88d431f7c26c3d31d37fa8bd49c515defa7e1e38
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
Contribute to Guard::RSpec
|
2
|
+
==========================
|
3
|
+
|
4
|
+
File an issue
|
5
|
+
-------------
|
6
|
+
|
7
|
+
You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/guard-rspec/issues).
|
8
|
+
|
9
|
+
**Please don't ask question in the issue tracker**, instead ask them on at Stack Overflow and use the
|
10
|
+
[guard](http://stackoverflow.com/questions/tagged/guard) tag and/or [guard-rspec](http://stackoverflow.com/questions/tagged/guard-rspec).
|
11
|
+
|
12
|
+
Try to figure out where the issue belongs to: Is it an issue with Guard::RSpec itself or with Guard?
|
13
|
+
|
14
|
+
When you file a bug, please try to follow these simple rules if applicable:
|
15
|
+
|
16
|
+
* Make sure you've read the README carefully.
|
17
|
+
* Make sure you run Guard with `bundle exec` first.
|
18
|
+
* Add debug information to the issue by running Guard with the `--debug` option.
|
19
|
+
* Add your `Guardfile` and `Gemfile` to the issue.
|
20
|
+
* Make sure that the issue is reproducible with your description.
|
21
|
+
|
22
|
+
**It's most likely that your bug gets resolved faster if you provide as much information as possible!**
|
23
|
+
|
24
|
+
Development
|
25
|
+
-----------
|
26
|
+
|
27
|
+
* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/guard-rspec/master/frames).
|
28
|
+
* Source hosted at [GitHub](https://github.com/guard/guard-rspec).
|
29
|
+
|
30
|
+
Pull requests are very welcome! Please try to follow these simple rules if applicable:
|
31
|
+
|
32
|
+
* Please create a topic branch for every separate change you make.
|
33
|
+
* Make sure your patches are well tested. All specs run with `rake spec:portability` must pass.
|
34
|
+
* Update the [README](https://github.com/guard/guard-rspec/blob/master/README.md).
|
35
|
+
* Please **do not change** the version number.
|
36
|
+
|
37
|
+
For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
|
38
|
+
`#guard` (irc.freenode.net).
|
data/Gemfile
ADDED
data/Guardfile
ADDED
data/{LICENSE → LICENSE.txt}
RENAMED
@@ -1,5 +1,7 @@
|
|
1
1
|
Copyright (c) 2010-2013 Thibaud Guillaume-Gentil
|
2
2
|
|
3
|
+
MIT License
|
4
|
+
|
3
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
6
|
a copy of this software and associated documentation files (the
|
5
7
|
"Software"), to deal in the Software without restriction, including
|
data/README.md
CHANGED
@@ -1,27 +1,18 @@
|
|
1
1
|
# Guard::RSpec
|
2
|
+
|
2
3
|
[![Gem Version](https://badge.fury.io/rb/guard-rspec.png)](http://badge.fury.io/rb/guard-rspec) [![Build Status](https://secure.travis-ci.org/guard/guard-rspec.png?branch=master)](http://travis-ci.org/guard/guard-rspec) [![Dependency Status](https://gemnasium.com/guard/guard-rspec.png)](https://gemnasium.com/guard/guard-rspec) [![Code Climate](https://codeclimate.com/github/guard/guard-rspec.png)](https://codeclimate.com/github/guard/guard-rspec) [![Coverage Status](https://coveralls.io/repos/guard/guard-rspec/badge.png?branch=master)](https://coveralls.io/r/guard/guard-rspec)
|
3
4
|
|
4
|
-
RSpec
|
5
|
+
Guard::RSpec allows to automatically & intelligently launch specs when files are modified.
|
5
6
|
|
6
|
-
* Compatible with RSpec
|
7
|
-
* Tested against Ruby 1.
|
7
|
+
* Compatible with RSpec ~> 2.14
|
8
|
+
* Tested against Ruby 1.9.3, 2.0.0, JRuby and Rubinius.
|
8
9
|
|
9
10
|
## Install
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
Install the gem:
|
14
|
-
|
15
|
-
```
|
16
|
-
$ gem install guard-rspec
|
17
|
-
```
|
18
|
-
|
19
|
-
Add it to your Gemfile (inside development group):
|
12
|
+
Add the gem to your Gemfile (inside development group):
|
20
13
|
|
21
14
|
``` ruby
|
22
|
-
|
23
|
-
gem 'guard-rspec'
|
24
|
-
end
|
15
|
+
gem 'guard-rspec', require: false
|
25
16
|
```
|
26
17
|
|
27
18
|
Add guard definition to your Guardfile by running this command:
|
@@ -36,7 +27,7 @@ Please read [Guard usage doc](https://github.com/guard/guard#readme).
|
|
36
27
|
|
37
28
|
## Guardfile
|
38
29
|
|
39
|
-
RSpec
|
30
|
+
Guard::RSpec can be adapted to all kinds of projects, some examples:
|
40
31
|
|
41
32
|
### Standard RubyGem project
|
42
33
|
|
@@ -62,157 +53,44 @@ guard :rspec do
|
|
62
53
|
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
63
54
|
end
|
64
55
|
```
|
56
|
+
|
65
57
|
Please read [Guard doc](https://github.com/guard/guard#readme) for more information about the Guardfile DSL.
|
66
58
|
|
67
59
|
## Options
|
68
60
|
|
69
|
-
|
70
|
-
|
71
|
-
``` ruby
|
72
|
-
guard 'rspec', :cli => "--color --format nested --fail-fast --drb" do
|
73
|
-
# ...
|
74
|
-
end
|
75
|
-
```
|
76
|
-
|
77
|
-
By default, Guard::RSpec will only look for spec files within `spec` in your project root. You can configure Guard::RSpec to look in additional paths by using the `:spec_paths` option:
|
78
|
-
|
79
|
-
``` ruby
|
80
|
-
guard 'rspec', :spec_paths => ["spec", "vendor/engines/reset/spec"] do
|
81
|
-
# ...
|
82
|
-
end
|
83
|
-
```
|
84
|
-
If you have only one path to look in, you can configure the `:spec_paths` option with a string:
|
85
|
-
|
86
|
-
``` ruby
|
87
|
-
guard 'rspec', :spec_paths => "test" do
|
88
|
-
# ...
|
89
|
-
end
|
90
|
-
```
|
91
|
-
If you want to set an environment variable, you can configure the `:env` option with a hash:
|
61
|
+
Guard::RSpec 4.0 use now a more simple approach with the new `cmd` option that let you precisely define which rspec command will be launched on each run. As example if you want to support Spring with a custom formatter (progress by default) use:
|
92
62
|
|
93
63
|
``` ruby
|
94
|
-
guard
|
95
|
-
# ...
|
96
|
-
end
|
97
|
-
```
|
98
|
-
[Turnip](https://github.com/jnicklas/turnip) is supported (Ruby 1.9.X only), but you must enable it:
|
99
|
-
``` ruby
|
100
|
-
guard 'rspec', :turnip => true do
|
101
|
-
# ...
|
102
|
-
end
|
103
|
-
```
|
104
|
-
[Spring](https://github.com/jonleighton/spring) is supported (Ruby 1.9.X / Rails 3.2+ only), but you must enable it:
|
105
|
-
``` ruby
|
106
|
-
guard 'rspec', :spring => true do
|
107
|
-
# ...
|
108
|
-
end
|
109
|
-
```
|
110
|
-
[ParallelTests](https://github.com/grosser/parallel_tests) is supported, but you must enable it:
|
111
|
-
``` ruby
|
112
|
-
guard 'rspec', :parallel => true, :parallel_cli => '-n 2' do
|
64
|
+
guard :rspec, cdm: 'spring rspec -f doc' do
|
113
65
|
# ...
|
114
66
|
end
|
115
67
|
```
|
116
|
-
[Foreman](https://github.com/ddollar/foreman) is supported, but you must enable it:
|
117
|
-
``` ruby
|
118
|
-
guard 'rspec', :foreman => true do
|
119
|
-
# ...
|
120
|
-
end
|
121
|
-
```
|
122
|
-
|
123
|
-
Former `:color`, `:drb`, `:fail_fast` and `:formatter` options are deprecated and no longer have effect.
|
124
68
|
|
125
69
|
### List of available options:
|
126
70
|
|
127
71
|
``` ruby
|
128
|
-
:
|
129
|
-
:
|
130
|
-
:
|
131
|
-
:
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
136
|
-
:
|
137
|
-
:spec_paths => ["spec"] # specify an array of paths that contain spec files
|
138
|
-
:exclude => "spec/foo/**/*" # exclude files based on glob
|
139
|
-
:spring => true # enable spring support; default: false
|
140
|
-
:turnip => true # enable turnip support; default: false
|
141
|
-
:zeus => true # enable zeus support; default: false
|
142
|
-
:foreman => true # enable foreman support; default: false
|
143
|
-
:focus_on_failed => false # focus on the first 10 failed specs first, rerun till they pass
|
144
|
-
:parallel => true # run all specs in parallel using [ParallelTests](https://github.com/grosser/parallel_tests) gem, default: false
|
145
|
-
:parallel_cli => "-n 2" # pass arbitrary Parallel Tests arguments, default: ""
|
146
|
-
:launchy => nil # pass a path to an rspec results file, e.g. ./tmp/spec_results.html
|
72
|
+
cmd: 'zeus rspec' # specify a custom rpsec command to run, default: 'rspec'
|
73
|
+
spec_paths: ['spec'] # specify a custom array of paths that contain spec files
|
74
|
+
focus_on_failed: false # focus on the first 10 failed specs, rerun till they pass, default: true
|
75
|
+
keep_failed: true # keep failed specs until they pass (add them to new ones), default: false
|
76
|
+
all_after_pass: true # run all specs after changed specs pass, default: false
|
77
|
+
all_on_start: true # run all the specs at startup, default: false
|
78
|
+
launchy: nil # pass a path to an rspec results file, e.g. ./tmp/spec_results.html
|
79
|
+
notification: false # display notification after the specs are done running, default: true
|
80
|
+
run_all: { cmd: 'custom rspec command', message: 'custom message' } # Custom options to use when running all specs.
|
147
81
|
```
|
148
82
|
|
149
|
-
You can also use a custom binstubs directory using `:binstubs => 'some-dir'`.
|
150
|
-
|
151
83
|
### Using Launchy to view rspec results
|
152
|
-
guard-rspec can be configured to launch a results file in lieu of outputing rspec results to the terminal.
|
153
|
-
Configure your Guardfile with the launchy option
|
154
|
-
``` ruby
|
155
|
-
guard 'rspec', :cli=>'--color --format html --out ./tmp/spec_results.html' do
|
156
|
-
:launchy => "./tmp/spec_results.html"
|
157
|
-
# ...
|
158
|
-
end
|
159
|
-
```
|
160
|
-
|
161
|
-
### DRb mode
|
162
|
-
|
163
|
-
When you specify `--drb` within `:cli`, guard-rspec will circumvent the `rspec` command line tool by
|
164
|
-
directly communicating with the RSpec DRb server. This avoids the extra overhead incurred by your
|
165
|
-
shell, bundler and loading RSpec's environment just to send a DRb message. It shaves off a
|
166
|
-
second or two before the specs start to run; they should run almost immediately.
|
167
|
-
|
168
|
-
## Notification
|
169
|
-
|
170
|
-
The notification feature is only available for RSpec < 2, and RSpec >= 2.4 (due to the multiple-formatters feature that was present in RSpec 1, was removed in RSpec 2 and reintroduced in RSpec 2.4). So if you are using a version between 2 and 2.4, you should disable the notification with <tt>:notification => false</tt>. Otherwise, nothing will be displayed in the terminal when your specs will run.
|
171
84
|
|
172
|
-
|
173
|
-
|
174
|
-
The best solution is still to update RSpec to the latest version!
|
175
|
-
|
176
|
-
## Formatters
|
177
|
-
|
178
|
-
The `:formatter` option has been removed since CLI arguments can be passed through the `:cli` option. If you want to use the former Instafail formatter, you need to use the [rspec-instafail](http://rubygems.org/gems/rspec-instafail) gem instead:
|
85
|
+
guard-rspec can be configured to launch a results file in lieu of outputing rspec results to the terminal.
|
86
|
+
Configure your Guardfile with the launchy option:
|
179
87
|
|
180
88
|
``` ruby
|
181
|
-
|
182
|
-
gem 'rspec-instafail'
|
183
|
-
|
184
|
-
# in your Guardfile
|
185
|
-
guard 'rspec', :cli => '-r rspec/instafail -f RSpec::Instafail' do
|
89
|
+
guard :rspec, cmd: 'rspec -f html -o ./tmp/spec_results.html', launchy: './tmp/spec_results.html' do
|
186
90
|
# ...
|
187
91
|
end
|
188
92
|
```
|
189
93
|
|
190
|
-
Default formatter is the `progress` formatter (same as RSpec default).
|
191
|
-
|
192
|
-
## Running a subset of all specs
|
193
|
-
|
194
|
-
The `:all_on_start` and `:all_after_pass` options cause all specs located in the `spec` directory to be run. If there
|
195
|
-
are some specs you want to skip, you can tag them with RSpec metadata (such as `:slow => true`)
|
196
|
-
and skip them with the cli `--tag` option (i.e. `--tag ~slow`).
|
197
|
-
|
198
|
-
You can also use option :spec_paths to override paths used when running all specs.
|
199
|
-
You can use this feature to create multiple groups of guarded specs with distinct paths, and execute each in its own process:
|
200
|
-
|
201
|
-
``` ruby
|
202
|
-
# in your Guardfile
|
203
|
-
group 'acceptance-tests' do
|
204
|
-
guard 'rspec', :spec_paths => ['spec/acceptance'] do
|
205
|
-
# ...
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
group 'unit-tests' do
|
210
|
-
guard 'rspec', :spec_paths => ['spec/models', 'spec/controllers', 'spec/routing'] do
|
211
|
-
# ...
|
212
|
-
end
|
213
|
-
end
|
214
|
-
```
|
215
|
-
|
216
94
|
## Development
|
217
95
|
|
218
96
|
* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/guard-rspec/master/frames).
|
@@ -228,13 +106,9 @@ Pull requests are very welcome! Please try to follow these simple rules if appli
|
|
228
106
|
For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
|
229
107
|
`#guard` (irc.freenode.net).
|
230
108
|
|
231
|
-
### Testing
|
232
|
-
|
233
|
-
Please run `rake spec:prepare_fixtures` once before launching specs.
|
234
|
-
|
235
109
|
### Author
|
236
110
|
|
237
|
-
[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](
|
111
|
+
[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg))
|
238
112
|
|
239
113
|
### Contributors
|
240
114
|
|
data/Rakefile
ADDED
data/guard-rspec.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'guard/rspec/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'guard-rspec'
|
8
|
+
s.version = Guard::RSpecVersion::VERSION
|
9
|
+
s.author = 'Thibaud Guillaume-Gentil'
|
10
|
+
s.email = 'thibaud@thibaud.me'
|
11
|
+
s.summary = 'Guard gem for RSpec'
|
12
|
+
s.description = 'Guard::RSpec automatically run your specs (much like autotest).'
|
13
|
+
s.homepage = 'https://rubygems.org/gems/guard-rspec'
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split($/)
|
17
|
+
s.test_files = s.files.grep(%r{^spec/})
|
18
|
+
s.require_path = 'lib'
|
19
|
+
|
20
|
+
s.add_dependency 'guard', '~> 2.0'
|
21
|
+
s.add_dependency 'rspec', '~> 2.14'
|
22
|
+
s.add_development_dependency 'bundler', '>= 1.3.5'
|
23
|
+
s.add_development_dependency 'rake'
|
24
|
+
s.add_development_dependency 'rspec'
|
25
|
+
s.add_development_dependency 'launchy'
|
26
|
+
end
|
data/lib/guard/rspec.rb
CHANGED
@@ -1,126 +1,45 @@
|
|
1
1
|
require 'guard'
|
2
|
-
require 'guard/
|
2
|
+
require 'guard/plugin'
|
3
3
|
|
4
4
|
module Guard
|
5
|
-
class RSpec <
|
6
|
-
|
7
|
-
|
5
|
+
class RSpec < Plugin
|
6
|
+
require 'guard/rspec/deprecator'
|
7
|
+
require 'guard/rspec/runner'
|
8
8
|
|
9
|
-
attr_accessor :
|
9
|
+
attr_accessor :options, :runner
|
10
10
|
|
11
|
-
def initialize(
|
11
|
+
def initialize(options = {})
|
12
12
|
super
|
13
13
|
@options = {
|
14
|
-
:
|
15
|
-
:all_after_pass => false,
|
16
|
-
:all_on_start => false,
|
17
|
-
:keep_failed => false,
|
18
|
-
:spec_paths => ["spec"],
|
19
|
-
:run_all => {}
|
14
|
+
all_on_start: false
|
20
15
|
}.merge(options)
|
21
|
-
@last_failed = false
|
22
|
-
@failed_paths = []
|
23
16
|
|
24
|
-
|
25
|
-
@runner
|
17
|
+
Deprecator.warns_about_deprecated_options(@options)
|
18
|
+
@runner = Runner.new(@options)
|
26
19
|
end
|
27
20
|
|
28
|
-
# Call once when guard starts
|
29
21
|
def start
|
30
22
|
UI.info "Guard::RSpec is running"
|
31
|
-
run_all if
|
23
|
+
run_all if options[:all_on_start]
|
32
24
|
end
|
33
25
|
|
34
26
|
def run_all
|
35
|
-
|
36
|
-
|
37
|
-
unless @last_failed = !passed
|
38
|
-
@failed_paths = []
|
39
|
-
else
|
40
|
-
throw :task_has_failed
|
41
|
-
end
|
27
|
+
_throw_if_failed { runner.run_all }
|
42
28
|
end
|
43
29
|
|
44
30
|
def reload
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
def run_on_changes(paths)
|
49
|
-
|
50
|
-
original_paths = paths.dup
|
51
|
-
|
52
|
-
focused = false
|
53
|
-
if last_failed && @options[:focus_on_failed]
|
54
|
-
path = './tmp/rspec_guard_result'
|
55
|
-
if File.exist?(path)
|
56
|
-
single_spec = paths && paths.length == 1 && paths[0].include?("_spec") ? paths[0] : nil
|
57
|
-
failed_specs = File.open(path) { |file| file.read.split("\n") }
|
58
|
-
|
59
|
-
File.delete(path)
|
60
|
-
|
61
|
-
if single_spec && @inspector.clean([single_spec]).length == 1
|
62
|
-
failed_specs = failed_specs.select{|p| p.include? single_spec}
|
63
|
-
end
|
64
|
-
|
65
|
-
if failed_specs.any?
|
66
|
-
# some sane limit, stuff will explode if all tests fail
|
67
|
-
# ... cap at 10
|
68
|
-
|
69
|
-
paths = failed_specs[0..10]
|
70
|
-
focused = true
|
71
|
-
end
|
72
|
-
|
73
|
-
# switch focus to the single spec
|
74
|
-
if single_spec and failed_specs.length > 0
|
75
|
-
focused = true
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
if focused
|
81
|
-
add_failed(original_paths)
|
82
|
-
add_failed(paths.map{|p| p.split(":")[0]})
|
83
|
-
else
|
84
|
-
paths += failed_paths if @options[:keep_failed]
|
85
|
-
paths = @inspector.clean(paths).uniq
|
86
|
-
end
|
87
|
-
|
88
|
-
if passed = @runner.run(paths)
|
89
|
-
unless focused
|
90
|
-
remove_failed(paths)
|
91
|
-
end
|
92
|
-
|
93
|
-
if last_failed && focused
|
94
|
-
run_on_changes(failed_paths)
|
95
|
-
# run all the specs if the run before this one failed
|
96
|
-
elsif last_failed && @options[:all_after_pass]
|
97
|
-
@last_failed = false
|
98
|
-
run_all
|
99
|
-
end
|
100
|
-
else
|
101
|
-
@last_failed = true
|
102
|
-
unless focused
|
103
|
-
add_failed(paths)
|
104
|
-
end
|
105
|
-
|
106
|
-
throw :task_has_failed
|
107
|
-
end
|
31
|
+
runner.reload
|
108
32
|
end
|
109
33
|
|
110
|
-
|
111
|
-
|
112
|
-
|
34
|
+
def run_on_modifications(paths)
|
35
|
+
return false if paths.empty?
|
36
|
+
_throw_if_failed { runner.run(paths) }
|
113
37
|
end
|
114
38
|
|
115
|
-
|
116
|
-
@failed_paths -= paths if @options[:keep_failed]
|
117
|
-
end
|
39
|
+
private
|
118
40
|
|
119
|
-
def
|
120
|
-
|
121
|
-
@failed_paths += paths
|
122
|
-
@failed_paths.uniq!
|
123
|
-
end
|
41
|
+
def _throw_if_failed
|
42
|
+
throw :task_has_failed unless yield
|
124
43
|
end
|
125
44
|
|
126
45
|
end
|