guard 2.9.0 → 2.9.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 +4 -4
- data/lib/guard.rb +43 -160
- data/lib/guard/cli.rb +49 -17
- data/lib/guard/commander.rb +18 -17
- data/lib/guard/commands/all.rb +1 -2
- data/lib/guard/commands/change.rb +1 -2
- data/lib/guard/commands/reload.rb +1 -2
- data/lib/guard/commands/scope.rb +1 -2
- data/lib/guard/deprecated/evaluator.rb +34 -0
- data/lib/guard/deprecated/guard.rb +15 -3
- data/lib/guard/deprecated/watcher.rb +27 -0
- data/lib/guard/dsl.rb +58 -17
- data/lib/guard/dsl_describer.rb +55 -73
- data/lib/guard/guardfile.rb +1 -1
- data/lib/guard/guardfile/evaluator.rb +96 -158
- data/lib/guard/guardfile/generator.rb +45 -41
- data/lib/guard/interactor.rb +4 -2
- data/lib/guard/internals/groups.rb +40 -0
- data/lib/guard/internals/plugins.rb +51 -0
- data/lib/guard/internals/queue.rb +50 -0
- data/lib/guard/internals/scope.rb +110 -0
- data/lib/guard/internals/session.rb +135 -0
- data/lib/guard/internals/state.rb +33 -0
- data/lib/guard/jobs/pry_wrapper.rb +33 -32
- data/lib/guard/jobs/sleep.rb +3 -4
- data/lib/guard/notifier.rb +2 -0
- data/lib/guard/notifier/detected.rb.orig +83 -0
- data/lib/guard/plugin.rb +242 -6
- data/lib/guard/plugin_util.rb +19 -18
- data/lib/guard/reevaluator.rb +50 -10
- data/lib/guard/runner.rb +30 -108
- data/lib/guard/ui.rb +6 -24
- data/lib/guard/version.rb +1 -1
- data/lib/guard/watcher.rb +4 -12
- metadata +11 -6
- data/lib/guard/metadata.rb +0 -190
- data/lib/guard/plugin/base.rb +0 -183
- data/lib/guard/plugin/hooker.rb +0 -108
- data/lib/guard/session.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5b1ccadd885e53f1a8063e6f6d78038874115e7
|
4
|
+
data.tar.gz: ed83d150185583201d3d6a76ebadc54172c94573
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30542f519409c98e17fe922651fb5d461ed771803b46833fd918ae74576bc0e2b5aefe23ec60686d55408fe1bcba687fa587a2f569ae29ede158d915dbbfd0d7
|
7
|
+
data.tar.gz: 8e352a2a2b4ec695b4ed2dd029bb5a1b46e38fcd308c2dddbcfcc007395b29498c7e0bbc28caec0c579482f1e3bd7326526f04a413f4a3ea972465cc7770383f
|
data/lib/guard.rb
CHANGED
@@ -8,11 +8,13 @@ require "guard/internals/debugging"
|
|
8
8
|
require "guard/internals/traps"
|
9
9
|
require "guard/internals/helpers"
|
10
10
|
|
11
|
-
require "guard/
|
12
|
-
require "guard/
|
11
|
+
require "guard/internals/queue"
|
12
|
+
require "guard/internals/state"
|
13
13
|
|
14
|
+
require "guard/options"
|
14
15
|
require "guard/commander"
|
15
16
|
require "guard/dsl"
|
17
|
+
require "guard/group"
|
16
18
|
require "guard/interactor"
|
17
19
|
require "guard/notifier"
|
18
20
|
require "guard/plugin_util"
|
@@ -20,6 +22,7 @@ require "guard/runner"
|
|
20
22
|
require "guard/sheller"
|
21
23
|
require "guard/ui"
|
22
24
|
require "guard/watcher"
|
25
|
+
require "guard/guardfile/evaluator"
|
23
26
|
|
24
27
|
# Guard is the main module for all Guard related modules and classes.
|
25
28
|
# Also Guard plugins should use this namespace.
|
@@ -30,6 +33,9 @@ module Guard
|
|
30
33
|
class << self
|
31
34
|
attr_reader :listener
|
32
35
|
|
36
|
+
# @private api
|
37
|
+
attr_reader :queue
|
38
|
+
|
33
39
|
include Internals::Helpers
|
34
40
|
|
35
41
|
# Initializes the Guard singleton:
|
@@ -46,103 +52,37 @@ module Guard
|
|
46
52
|
# @option options [String] guardfile the path to the Guardfile
|
47
53
|
#
|
48
54
|
# @return [Guard] the Guard singleton
|
49
|
-
|
50
|
-
|
51
|
-
# TODO: this method has too many instance variables
|
52
|
-
# and some are mock and leak between tests,
|
53
|
-
# so ideally there should be a guard "instance"
|
54
|
-
# object that can be created anew between tests
|
55
|
-
def setup(opts = {})
|
56
|
-
# NOTE: must be set before anything calls Guard.options
|
57
|
-
reset_options(opts)
|
58
|
-
|
59
|
-
# NOTE: must be set before anything calls Guard::UI.debug
|
60
|
-
::Guard::Internals::Debugging.start if options[:debug]
|
55
|
+
def setup(cmdline_options = {})
|
56
|
+
init(cmdline_options)
|
61
57
|
|
62
|
-
@queue = Queue.new
|
63
|
-
self.watchdirs = Array(options[:watchdir])
|
58
|
+
@queue = Internals::Queue.new(Guard)
|
64
59
|
|
65
|
-
|
60
|
+
UI.reset_and_clear
|
66
61
|
|
67
|
-
|
68
|
-
evaluate_guardfile
|
69
|
-
setup_scope
|
62
|
+
_evaluate(state.session.evaluator_options)
|
70
63
|
|
71
|
-
|
64
|
+
# NOTE: this should be *after* evaluate so :directories can work
|
65
|
+
@listener = Listen.send(*state.session.listener_args, &_listener_callback)
|
72
66
|
|
73
|
-
|
67
|
+
Notifier.connect(state.session.notify_options)
|
74
68
|
|
75
69
|
traps = Internals::Traps
|
76
70
|
traps.handle("USR1") { async_queue_add([:guard_pause, :paused]) }
|
77
71
|
traps.handle("USR2") { async_queue_add([:guard_pause, :unpaused]) }
|
78
72
|
|
79
|
-
@interactor =
|
73
|
+
@interactor = Interactor.new(state.session.interactor_name == :sleep)
|
80
74
|
traps.handle("INT") { @interactor.handle_interrupt }
|
81
75
|
|
82
76
|
self
|
83
77
|
end
|
84
78
|
|
85
|
-
|
86
|
-
|
87
|
-
# Used only by tests (for all I know...)
|
88
|
-
def clear_options
|
89
|
-
@options = nil
|
90
|
-
end
|
91
|
-
|
92
|
-
# Initializes the groups array with the default group(s).
|
93
|
-
#
|
94
|
-
# @see DEFAULT_GROUPS
|
95
|
-
#
|
96
|
-
def reset_groups
|
97
|
-
@groups = DEFAULT_GROUPS.map { |name| Group.new(name) }
|
98
|
-
end
|
99
|
-
|
100
|
-
# Initializes the plugins array to an empty array.
|
101
|
-
#
|
102
|
-
# @see Guard.plugins
|
103
|
-
#
|
104
|
-
def reset_plugins
|
105
|
-
@plugins = []
|
106
|
-
end
|
107
|
-
|
108
|
-
attr_reader :watchdirs
|
109
|
-
|
110
|
-
# Stores the scopes defined by the user via the `--group` / `-g` option (to
|
111
|
-
# run only a specific group) or the `--plugin` / `-P` option (to run only a
|
112
|
-
# specific plugin).
|
113
|
-
#
|
114
|
-
# @see CLI#start
|
115
|
-
# @see Dsl#scope
|
116
|
-
#
|
117
|
-
def setup_scope(scope = {})
|
118
|
-
# TODO: there should be a special Scope class instead
|
119
|
-
scope = _prepare_scope(scope)
|
120
|
-
|
121
|
-
::Guard.scope = {
|
122
|
-
groups: scope[:groups].map { |item| ::Guard.add_group(item) },
|
123
|
-
plugins: scope[:plugins].map { |item| ::Guard.plugin(item) },
|
124
|
-
}
|
79
|
+
def init(cmdline_options)
|
80
|
+
@state = Internals::State.new(cmdline_options)
|
125
81
|
end
|
126
82
|
|
127
|
-
|
128
|
-
# Guard plugins are instantiated after the Guardfile evaluation.
|
129
|
-
#
|
130
|
-
# @see Guard::Guardfile::Evaluator#evaluate_guardfile
|
131
|
-
#
|
132
|
-
def evaluate_guardfile
|
133
|
-
evaluator = Guard::Guardfile::Evaluator.new(options)
|
134
|
-
evaluator.evaluate_guardfile
|
83
|
+
attr_reader :state
|
135
84
|
|
136
|
-
|
137
|
-
options[:guardfile] = evaluator.guardfile_path
|
138
|
-
|
139
|
-
msg = "No plugins found in Guardfile, please add at least one."
|
140
|
-
::Guard::UI.error msg if _pluginless_guardfile?
|
141
|
-
end
|
142
|
-
|
143
|
-
# @private api
|
144
|
-
# used solely for match_guardfile?
|
145
|
-
attr_reader :guardfile_path
|
85
|
+
attr_reader :interactor
|
146
86
|
|
147
87
|
# Asynchronously trigger changes
|
148
88
|
#
|
@@ -160,60 +100,17 @@ module Guard
|
|
160
100
|
Thread.new { interactor.background }
|
161
101
|
end
|
162
102
|
|
163
|
-
def pending_changes?
|
164
|
-
! @queue.empty?
|
165
|
-
end
|
166
|
-
|
167
|
-
def watchdirs=(dirs)
|
168
|
-
dirs = [Dir.pwd] if dirs.empty?
|
169
|
-
@watchdirs = dirs.map { |dir| File.expand_path dir }
|
170
|
-
end
|
171
|
-
|
172
103
|
private
|
173
104
|
|
174
|
-
# Initializes the listener and registers a callback for changes.
|
175
|
-
#
|
176
|
-
def _setup_listener
|
177
|
-
if options[:listen_on]
|
178
|
-
Listen.on(options[:listen_on], &_listener_callback)
|
179
|
-
else
|
180
|
-
listener_options = {}
|
181
|
-
[:latency, :force_polling, :wait_for_delay].each do |option|
|
182
|
-
listener_options[option] = options[option] if options[option]
|
183
|
-
end
|
184
|
-
listen_args = watchdirs + [listener_options]
|
185
|
-
Listen.to(*listen_args, &_listener_callback)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
# Process the change queue, running tasks within the main Guard thread
|
190
|
-
def _process_queue
|
191
|
-
actions, changes = [], { modified: [], added: [], removed: [] }
|
192
|
-
|
193
|
-
while pending_changes?
|
194
|
-
if (item = @queue.pop).first.is_a?(Symbol)
|
195
|
-
actions << item
|
196
|
-
else
|
197
|
-
item.each { |key, value| changes[key] += value }
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
_run_actions(actions)
|
202
|
-
return if changes.values.all?(&:empty?)
|
203
|
-
Runner.new.run_on_changes(*changes.values)
|
204
|
-
end
|
205
|
-
|
206
|
-
# TODO: Guard::Watch or Guard::Scope should provide this
|
207
|
-
def _scoped_watchers
|
208
|
-
watchers = []
|
209
|
-
Runner.new.send(:_scoped_plugins) { |guard| watchers += guard.watchers }
|
210
|
-
watchers
|
211
|
-
end
|
212
|
-
|
213
105
|
# Check if any of the changes are actually watched for
|
106
|
+
# TODO: why iterate twice? reuse this info when running tasks
|
214
107
|
def _relevant_changes?(changes)
|
108
|
+
# TODO: no coverage!
|
215
109
|
files = changes.values.flatten(1)
|
216
|
-
|
110
|
+
scope = Guard.state.scope
|
111
|
+
watchers = scope.grouped_plugins.map do |_group, plugins|
|
112
|
+
plugins.map(&:watchers).flatten
|
113
|
+
end.flatten
|
217
114
|
watchers.any? { |watcher| files.any? { |file| watcher.match(file) } }
|
218
115
|
end
|
219
116
|
|
@@ -221,19 +118,6 @@ module Guard
|
|
221
118
|
paths.map { |path| _relative_pathname(path) }
|
222
119
|
end
|
223
120
|
|
224
|
-
def _run_actions(actions)
|
225
|
-
actions.each do |action_args|
|
226
|
-
args = action_args.dup
|
227
|
-
namespaced_action = args.shift
|
228
|
-
action = namespaced_action.to_s.sub(/^guard_/, "")
|
229
|
-
if ::Guard.respond_to?(action)
|
230
|
-
::Guard.send(action, *args)
|
231
|
-
else
|
232
|
-
fail "Unknown action: #{action.inspect}"
|
233
|
-
end
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
121
|
def _listener_callback
|
238
122
|
lambda do |modified, added, removed|
|
239
123
|
relative_paths = {
|
@@ -246,12 +130,7 @@ module Guard
|
|
246
130
|
end
|
247
131
|
end
|
248
132
|
|
249
|
-
|
250
|
-
reset_groups
|
251
|
-
reset_plugins
|
252
|
-
reset_scope
|
253
|
-
end
|
254
|
-
|
133
|
+
# TODO: obsoleted? (move to Dsl?)
|
255
134
|
def _pluginless_guardfile?
|
256
135
|
# no Reevaluator means there was no Guardfile configured that could be
|
257
136
|
# reevaluated, so we don't have a pluginless guardfile, because we don't
|
@@ -260,19 +139,23 @@ module Guard
|
|
260
139
|
# But, if we have a Guardfile, we'll at least have the built-in
|
261
140
|
# Reevaluator, so the following will work:
|
262
141
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
plugins.map(&:name) == ["reevaluator"]
|
142
|
+
plugins = state.session.plugins.all
|
143
|
+
plugins.empty? || plugins.map(&:name) == ["reevaluator"]
|
267
144
|
end
|
268
145
|
|
269
|
-
def
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
146
|
+
def _evaluate(options)
|
147
|
+
evaluator = Guardfile::Evaluator.new(options)
|
148
|
+
evaluator.evaluate
|
149
|
+
msg = "No plugins found in Guardfile, please add at least one."
|
150
|
+
UI.error msg if _pluginless_guardfile?
|
151
|
+
|
152
|
+
if evaluator.inline?
|
153
|
+
UI.info("Using inline Guardfile.")
|
154
|
+
elsif evaluator.custom?
|
155
|
+
UI.info("Using Guardfile at #{ evaluator.path }.")
|
156
|
+
end
|
157
|
+
rescue Guardfile::Evaluator::NoPluginsError => e
|
158
|
+
UI.error(e.message)
|
276
159
|
end
|
277
160
|
end
|
278
161
|
end
|
data/lib/guard/cli.rb
CHANGED
@@ -2,9 +2,8 @@ require "thor"
|
|
2
2
|
|
3
3
|
require "guard"
|
4
4
|
require "guard/version"
|
5
|
-
require "guard/dsl_describer"
|
6
|
-
require "guard/guardfile/evaluator"
|
7
5
|
require "guard/guardfile/generator"
|
6
|
+
require "guard/dsl_describer"
|
8
7
|
|
9
8
|
module Guard
|
10
9
|
# Facade for the Guard command line interface managed by
|
@@ -49,6 +48,7 @@ module Guard
|
|
49
48
|
aliases: "-P",
|
50
49
|
banner: "Run only the passed plugins"
|
51
50
|
|
51
|
+
# TODO: make it plural
|
52
52
|
method_option :watchdir,
|
53
53
|
type: :array,
|
54
54
|
aliases: "-w",
|
@@ -105,7 +105,7 @@ module Guard
|
|
105
105
|
#
|
106
106
|
def start
|
107
107
|
_verify_bundler_presence unless options[:no_bundler_warning]
|
108
|
-
|
108
|
+
_start(options)
|
109
109
|
end
|
110
110
|
|
111
111
|
desc "list", "Lists Guard plugins that can be used with init"
|
@@ -116,7 +116,8 @@ module Guard
|
|
116
116
|
# @see Guard::DslDescriber.list
|
117
117
|
#
|
118
118
|
def list
|
119
|
-
|
119
|
+
_require_guardfile(options) # just to show which plugins are actually used
|
120
|
+
DslDescriber.new.list
|
120
121
|
end
|
121
122
|
|
122
123
|
desc "notifiers", "Lists notifiers and its options"
|
@@ -126,8 +127,8 @@ module Guard
|
|
126
127
|
# @see Guard::DslDescriber.notifiers
|
127
128
|
#
|
128
129
|
def notifiers
|
129
|
-
|
130
|
-
|
130
|
+
_require_guardfile(options)
|
131
|
+
DslDescriber.new.notifiers
|
131
132
|
end
|
132
133
|
|
133
134
|
desc "version", "Show the Guard version"
|
@@ -138,7 +139,7 @@ module Guard
|
|
138
139
|
# @see Guard::VERSION
|
139
140
|
#
|
140
141
|
def version
|
141
|
-
$stdout.puts "Guard version #{
|
142
|
+
$stdout.puts "Guard version #{ VERSION }"
|
142
143
|
end
|
143
144
|
|
144
145
|
desc "init [GUARDS]", "Generates a Guardfile at the current directory"\
|
@@ -164,19 +165,23 @@ module Guard
|
|
164
165
|
#
|
165
166
|
def init(*plugin_names)
|
166
167
|
_verify_bundler_presence unless options[:no_bundler_warning]
|
168
|
+
bare = options[:bare]
|
167
169
|
|
168
|
-
|
170
|
+
generator = Guardfile::Generator.new
|
171
|
+
Guard.init(options)
|
172
|
+
session = Guard.state.session
|
169
173
|
|
170
|
-
|
171
|
-
|
174
|
+
begin
|
175
|
+
Guardfile::Evaluator.new(session.evaluator_options).evaluate
|
176
|
+
rescue Guardfile::Evaluator::NoGuardfileError
|
177
|
+
generator.create_guardfile
|
178
|
+
end
|
172
179
|
|
173
|
-
|
174
|
-
::Guard.reset_plugins
|
180
|
+
return if bare
|
175
181
|
|
176
182
|
# Evaluate because it might have existed and creating was skipped
|
177
|
-
|
178
|
-
|
179
|
-
return if options[:bare]
|
183
|
+
# FIXME: still, I don't know why this is needed
|
184
|
+
Guardfile::Evaluator.new(session.evaluator_options).evaluate
|
180
185
|
|
181
186
|
if plugin_names.empty?
|
182
187
|
generator.initialize_all_templates
|
@@ -196,7 +201,9 @@ module Guard
|
|
196
201
|
# @see Guard::DslDescriber.show
|
197
202
|
#
|
198
203
|
def show
|
199
|
-
|
204
|
+
_require_guardfile(options)
|
205
|
+
# TODO: use Metadata class
|
206
|
+
DslDescriber.new.show
|
200
207
|
end
|
201
208
|
|
202
209
|
private
|
@@ -204,11 +211,12 @@ module Guard
|
|
204
211
|
# Verifies if Guard is run with `bundle exec` and
|
205
212
|
# shows a hint to do so if not.
|
206
213
|
#
|
214
|
+
# TODO: move this elsewhere!!! (because of complex specs)
|
207
215
|
def _verify_bundler_presence
|
208
216
|
return unless File.exist?("Gemfile")
|
209
217
|
return if ENV["BUNDLE_GEMFILE"] || ENV["RUBYGEMS_GEMDEPS"]
|
210
218
|
|
211
|
-
|
219
|
+
UI.info <<EOF
|
212
220
|
|
213
221
|
Guard here! It looks like your project has a Gemfile, yet you are running
|
214
222
|
`guard` outside of Bundler. If this is your intent, feel free to ignore this
|
@@ -217,5 +225,29 @@ dependencies are loaded correctly.
|
|
217
225
|
(You can run `guard` with --no-bundler-warning to get rid of this message.)
|
218
226
|
EOF
|
219
227
|
end
|
228
|
+
|
229
|
+
def _require_guardfile(options)
|
230
|
+
Guard.init(options) # to setup metadata
|
231
|
+
session = Guard.state.session
|
232
|
+
Guardfile::Evaluator.new(session.evaluator_options).evaluate
|
233
|
+
rescue Dsl::Error,
|
234
|
+
Guardfile::Evaluator::NoPluginsError,
|
235
|
+
Guardfile::Evaluator::NoGuardfileError,
|
236
|
+
Guardfile::Evaluator::NoCustomGuardfile => e
|
237
|
+
# catch to throw message instead of call stack
|
238
|
+
UI.error(e.message)
|
239
|
+
abort
|
240
|
+
end
|
241
|
+
|
242
|
+
def _start(options)
|
243
|
+
Guard.start(options)
|
244
|
+
rescue Dsl::Error,
|
245
|
+
Guardfile::Evaluator::NoPluginsError,
|
246
|
+
Guardfile::Evaluator::NoGuardfileError,
|
247
|
+
Guardfile::Evaluator::NoCustomGuardfile => e
|
248
|
+
# catch to throw message instead of call stack
|
249
|
+
UI.error(e.message)
|
250
|
+
abort
|
251
|
+
end
|
220
252
|
end
|
221
253
|
end
|
data/lib/guard/commander.rb
CHANGED
@@ -3,6 +3,8 @@ require "listen"
|
|
3
3
|
require "guard/notifier"
|
4
4
|
require "guard/interactor"
|
5
5
|
require "guard/runner"
|
6
|
+
require "guard/reevaluator"
|
7
|
+
require "guard/dsl_describer"
|
6
8
|
require "guard"
|
7
9
|
|
8
10
|
module Guard
|
@@ -28,16 +30,16 @@ module Guard
|
|
28
30
|
#
|
29
31
|
def start(options = {})
|
30
32
|
setup(options)
|
31
|
-
|
32
|
-
|
33
|
+
UI.debug "Guard starts all plugins"
|
34
|
+
Runner.new.run(:start)
|
33
35
|
listener.start
|
34
36
|
|
35
|
-
watched =
|
36
|
-
|
37
|
+
watched = Guard.state.session.watchdirs.join("', '")
|
38
|
+
UI.info "Guard is now watching at '#{ watched }'"
|
37
39
|
|
38
40
|
begin
|
39
41
|
while interactor.foreground != :exit
|
40
|
-
|
42
|
+
Guard.queue.process while Guard.queue.pending?
|
41
43
|
end
|
42
44
|
rescue Interrupt
|
43
45
|
end
|
@@ -45,14 +47,13 @@ module Guard
|
|
45
47
|
stop
|
46
48
|
end
|
47
49
|
|
48
|
-
# TODO: refactor (left to avoid breaking too many specs)
|
49
50
|
def stop
|
50
51
|
listener.stop
|
51
52
|
interactor.background
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
UI.debug "Guard stops all plugins"
|
54
|
+
Runner.new.run(:stop)
|
55
|
+
Notifier.disconnect
|
56
|
+
UI.info "Bye bye...", reset: true
|
56
57
|
end
|
57
58
|
|
58
59
|
# Reload Guardfile and all Guard plugins currently enabled.
|
@@ -63,13 +64,13 @@ module Guard
|
|
63
64
|
#
|
64
65
|
def reload(scopes = {})
|
65
66
|
# TODO: guard reevaluator should probably handle all this
|
66
|
-
|
67
|
-
|
67
|
+
UI.clear(force: true)
|
68
|
+
UI.action_with_scopes("Reload", scopes)
|
68
69
|
|
69
70
|
if scopes.empty?
|
70
|
-
|
71
|
+
Reevaluator.new.reevaluate
|
71
72
|
else
|
72
|
-
|
73
|
+
Runner.new.run(:reload, scopes)
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
@@ -78,8 +79,8 @@ module Guard
|
|
78
79
|
# @param [Hash] scopes hash with a Guard plugin or a group scope
|
79
80
|
#
|
80
81
|
def run_all(scopes = {})
|
81
|
-
|
82
|
-
|
82
|
+
UI.clear(force: true)
|
83
|
+
UI.action_with_scopes("Run", scopes)
|
83
84
|
Guard::Runner.new.run(:run_all, scopes)
|
84
85
|
end
|
85
86
|
|
@@ -97,7 +98,7 @@ module Guard
|
|
97
98
|
end
|
98
99
|
|
99
100
|
def show
|
100
|
-
|
101
|
+
DslDescriber.new.show
|
101
102
|
end
|
102
103
|
end
|
103
104
|
extend Commander
|