guard 2.6.1 → 2.7.0
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/README.md +73 -58
- data/bin/guard +2 -2
- data/lib/guard.rb +64 -59
- data/lib/guard/cli.rb +66 -60
- data/lib/guard/cli.rb.orig +215 -0
- data/lib/guard/commander.rb +45 -69
- data/lib/guard/commands/all.rb +21 -19
- data/lib/guard/commands/change.rb +17 -22
- data/lib/guard/commands/notification.rb +15 -16
- data/lib/guard/commands/pause.rb +14 -15
- data/lib/guard/commands/reload.rb +19 -20
- data/lib/guard/commands/scope.rb +23 -19
- data/lib/guard/commands/show.rb +13 -16
- data/lib/guard/deprecated_methods.rb +6 -10
- data/lib/guard/deprecator.rb +52 -37
- data/lib/guard/dsl.rb +55 -33
- data/lib/guard/dsl_describer.rb +83 -31
- data/lib/guard/dsl_describer.rb.orig +184 -0
- data/lib/guard/group.rb +7 -6
- data/lib/guard/guard.rb +4 -4
- data/lib/guard/guard.rb.orig +42 -0
- data/lib/guard/guardfile.rb +12 -13
- data/lib/guard/guardfile/evaluator.rb +77 -55
- data/lib/guard/guardfile/evaluator.rb.orig +275 -0
- data/lib/guard/guardfile/generator.rb +25 -20
- data/lib/guard/interactor.rb +52 -293
- data/lib/guard/interactor.rb.orig +85 -0
- data/lib/guard/jobs/base.rb +21 -0
- data/lib/guard/jobs/pry_wrapper.rb +290 -0
- data/lib/guard/jobs/pry_wrapper.rb.orig +293 -0
- data/lib/guard/jobs/sleep.rb +25 -0
- data/lib/guard/notifier.rb +42 -39
- data/lib/guard/notifiers/base.rb +25 -24
- data/lib/guard/notifiers/emacs.rb +30 -24
- data/lib/guard/notifiers/file_notifier.rb +3 -7
- data/lib/guard/notifiers/gntp.rb +22 -22
- data/lib/guard/notifiers/growl.rb +16 -15
- data/lib/guard/notifiers/libnotify.rb +7 -10
- data/lib/guard/notifiers/notifysend.rb +15 -14
- data/lib/guard/notifiers/rb_notifu.rb +8 -10
- data/lib/guard/notifiers/terminal_notifier.rb +15 -11
- data/lib/guard/notifiers/terminal_title.rb +4 -8
- data/lib/guard/notifiers/tmux.rb +104 -71
- data/lib/guard/options.rb +1 -5
- data/lib/guard/plugin.rb +1 -3
- data/lib/guard/plugin/base.rb +12 -9
- data/lib/guard/plugin/hooker.rb +1 -5
- data/lib/guard/plugin_util.rb +46 -25
- data/lib/guard/plugin_util.rb.orig +178 -0
- data/lib/guard/rake_task.rb +4 -7
- data/lib/guard/reevaluator.rb +13 -0
- data/lib/guard/runner.rb +50 -78
- data/lib/guard/runner.rb.orig +200 -0
- data/lib/guard/setuper.rb +199 -130
- data/lib/guard/setuper.rb.orig +348 -0
- data/lib/guard/sheller.rb +107 -0
- data/lib/guard/tags +367 -0
- data/lib/guard/ui.rb +50 -38
- data/lib/guard/ui.rb.orig +254 -0
- data/lib/guard/ui/colors.rb +17 -21
- data/lib/guard/version.rb +1 -1
- data/lib/guard/version.rb.orig +3 -0
- data/lib/guard/watcher.rb +49 -62
- metadata +21 -4
- data/lib/guard/notifiers/growl_notify.rb +0 -93
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "guard/notifiers/base"
|
2
2
|
|
3
3
|
module Guard
|
4
4
|
module Notifier
|
5
|
-
|
6
5
|
# Shows system notifications in the terminal title bar.
|
7
6
|
#
|
8
7
|
class TerminalTitle < Base
|
9
|
-
|
10
8
|
# Shows a system notification.
|
11
9
|
#
|
12
10
|
# @param [Hash] opts additional notification library options
|
@@ -18,18 +16,16 @@ module Guard
|
|
18
16
|
def notify(message, opts = {})
|
19
17
|
super
|
20
18
|
|
21
|
-
first_line = message.sub(/^\n/,
|
19
|
+
first_line = message.sub(/^\n/, "").sub(/\n.*/m, "")
|
22
20
|
|
23
|
-
puts "\e]2;[#{ opts[:title] }] #{ first_line }\a"
|
21
|
+
STDOUT.puts "\e]2;[#{ opts[:title] }] #{ first_line }\a"
|
24
22
|
end
|
25
23
|
|
26
24
|
# Clears the terminal title
|
27
25
|
#
|
28
26
|
def self.turn_off
|
29
|
-
puts "\e]2;\a"
|
27
|
+
STDOUT.puts "\e]2;\a"
|
30
28
|
end
|
31
|
-
|
32
29
|
end
|
33
|
-
|
34
30
|
end
|
35
31
|
end
|
data/lib/guard/notifiers/tmux.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "guard/notifiers/base"
|
2
2
|
|
3
3
|
module Guard
|
4
4
|
module Notifier
|
5
|
-
|
6
5
|
# Changes the color of the Tmux status bar and optionally
|
7
6
|
# shows messages in the status bar.
|
8
7
|
#
|
@@ -16,29 +15,31 @@ module Guard
|
|
16
15
|
# notification :tmux, color_location: 'status-right-bg'
|
17
16
|
#
|
18
17
|
class Tmux < Base
|
19
|
-
|
20
18
|
# Default options for the tmux notifications.
|
21
19
|
DEFAULTS = {
|
22
|
-
client:
|
23
|
-
tmux_environment:
|
24
|
-
success:
|
25
|
-
failed:
|
26
|
-
pending:
|
27
|
-
default:
|
20
|
+
client: "tmux",
|
21
|
+
tmux_environment: "TMUX",
|
22
|
+
success: "green",
|
23
|
+
failed: "red",
|
24
|
+
pending: "yellow",
|
25
|
+
default: "green",
|
28
26
|
timeout: 5,
|
29
27
|
display_message: false,
|
30
|
-
default_message_format:
|
31
|
-
default_message_color:
|
28
|
+
default_message_format: "%s - %s",
|
29
|
+
default_message_color: "white",
|
32
30
|
display_on_all_clients: false,
|
33
31
|
display_title: false,
|
34
|
-
default_title_format:
|
35
|
-
line_separator:
|
32
|
+
default_title_format: "%s - %s",
|
33
|
+
line_separator: " - ",
|
36
34
|
change_color: true,
|
37
|
-
color_location:
|
35
|
+
color_location: "status-left-bg"
|
38
36
|
}
|
39
37
|
|
38
|
+
ERROR_NOT_INSIDE_SESSION = "The :tmux notifier runs only on when Guard"\
|
39
|
+
" is executed inside of a tmux session."
|
40
|
+
|
40
41
|
def self.available?(opts = {})
|
41
|
-
super
|
42
|
+
super && _register!(opts)
|
42
43
|
end
|
43
44
|
|
44
45
|
# @private
|
@@ -57,11 +58,12 @@ module Guard
|
|
57
58
|
# @return [Boolean] whether or not a TMUX environment is available
|
58
59
|
#
|
59
60
|
def self._register!(opts)
|
61
|
+
@options_stored = false
|
60
62
|
if _tmux_environment_available?(opts)
|
61
63
|
true
|
62
64
|
else
|
63
65
|
unless opts[:silent]
|
64
|
-
::Guard::UI.error
|
66
|
+
::Guard::UI.error ERROR_NOT_INSIDE_SESSION
|
65
67
|
end
|
66
68
|
false
|
67
69
|
end
|
@@ -86,8 +88,8 @@ module Guard
|
|
86
88
|
# @option opts [String] image the path to the notification image
|
87
89
|
# @option opts [Boolean] change_color whether to show a color
|
88
90
|
# notification
|
89
|
-
# @option opts [String,Array] color_location the location where to draw
|
90
|
-
# color notification
|
91
|
+
# @option opts [String,Array] color_location the location where to draw
|
92
|
+
# the color notification
|
91
93
|
# @option opts [Boolean] display_message whether to display a message
|
92
94
|
# or not
|
93
95
|
# @option opts [Boolean] display_on_all_clients whether to display a
|
@@ -98,11 +100,13 @@ module Guard
|
|
98
100
|
opts.delete(:image)
|
99
101
|
|
100
102
|
if opts.fetch(:change_color, DEFAULTS[:change_color])
|
101
|
-
|
103
|
+
options = opts.fetch(:color_location, DEFAULTS[:color_location])
|
104
|
+
color_locations = Array(options)
|
102
105
|
color = tmux_color(opts[:type], opts)
|
103
106
|
|
104
107
|
color_locations.each do |color_location|
|
105
|
-
_run_client "set","#{_quiet_option}
|
108
|
+
_run_client "set", "#{self.class._quiet_option}"\
|
109
|
+
"#{color_location} #{color}"
|
106
110
|
end
|
107
111
|
end
|
108
112
|
|
@@ -113,9 +117,8 @@ module Guard
|
|
113
117
|
display_title(type, title, message, opts)
|
114
118
|
end
|
115
119
|
|
116
|
-
|
117
|
-
|
118
|
-
end
|
120
|
+
return unless opts.fetch(:display_message, DEFAULTS[:display_message])
|
121
|
+
display_message(type, title, message, opts)
|
119
122
|
end
|
120
123
|
|
121
124
|
# Displays a message in the title bar of the terminal.
|
@@ -133,11 +136,15 @@ module Guard
|
|
133
136
|
# formatter when no format per type is defined.
|
134
137
|
#
|
135
138
|
def display_title(type, title, message, opts = {})
|
136
|
-
|
139
|
+
format = "#{type}_title_format".to_sym
|
140
|
+
defaults = DEFAULTS[:default_title_format]
|
141
|
+
options = opts.fetch(:default_title_format, defaults)
|
142
|
+
title_format = opts.fetch(format, options)
|
137
143
|
teaser_message = message.split("\n").first
|
138
144
|
display_title = title_format % [title, teaser_message]
|
139
145
|
|
140
|
-
_run_client "set-option", "#{_quiet_option}
|
146
|
+
_run_client "set-option", "#{self.class._quiet_option}"\
|
147
|
+
"set-titles-string '#{display_title}'"
|
141
148
|
end
|
142
149
|
|
143
150
|
# Displays a message in the status bar of tmux.
|
@@ -169,8 +176,16 @@ module Guard
|
|
169
176
|
# line-break.
|
170
177
|
#
|
171
178
|
def display_message(type, title, message, opts = {})
|
172
|
-
|
173
|
-
|
179
|
+
default_format = DEFAULTS[:default_message_format]
|
180
|
+
default_format = opts.fetch(:default_message_format, default_format)
|
181
|
+
format = "#{type}_message_format".to_sym
|
182
|
+
message_format = opts.fetch(format, default_format)
|
183
|
+
|
184
|
+
default_color = DEFAULTS[:default_message_color]
|
185
|
+
default_color = opts.fetch(:default_message_color, default_color)
|
186
|
+
color = "#{type}_message_color".to_sym
|
187
|
+
message_color = opts.fetch(color, default_color)
|
188
|
+
|
174
189
|
display_time = opts.fetch(:timeout, DEFAULTS[:timeout])
|
175
190
|
separator = opts.fetch(:line_separator, DEFAULTS[:line_separator])
|
176
191
|
|
@@ -178,10 +193,15 @@ module Guard
|
|
178
193
|
formatted_message = message.split("\n").join(separator)
|
179
194
|
display_message = message_format % [title, formatted_message]
|
180
195
|
|
181
|
-
_run_client
|
182
|
-
|
183
|
-
|
184
|
-
|
196
|
+
_run_client(
|
197
|
+
"set",
|
198
|
+
"#{self.class._quiet_option}display-time #{display_time * 1000}")
|
199
|
+
|
200
|
+
_run_client "set", "#{self.class._quiet_option}"\
|
201
|
+
"message-fg #{message_color}"
|
202
|
+
_run_client "set", "#{self.class._quiet_option}"\
|
203
|
+
"message-bg #{color}"
|
204
|
+
_run_client "display-message", "'#{display_message}'"
|
185
205
|
end
|
186
206
|
|
187
207
|
# Get the Tmux color for the notification type.
|
@@ -192,9 +212,8 @@ module Guard
|
|
192
212
|
#
|
193
213
|
def tmux_color(type, opts = {})
|
194
214
|
type = type.to_sym
|
195
|
-
type = :default unless [:success, :failed, :pending].include?(type)
|
196
215
|
|
197
|
-
opts
|
216
|
+
opts[type] || DEFAULTS[type] || opts[:default] || DEFAULTS[:default]
|
198
217
|
end
|
199
218
|
|
200
219
|
# Notification starting, save the current Tmux settings
|
@@ -205,11 +224,7 @@ module Guard
|
|
205
224
|
_reset_options_store
|
206
225
|
|
207
226
|
_clients.each do |client|
|
208
|
-
options_store[client]
|
209
|
-
`#{ DEFAULTS[:client] } show -t #{ client }`.each_line do |line|
|
210
|
-
option, _, setting = line.chomp.partition(' ')
|
211
|
-
@options_store[client][option] = setting
|
212
|
-
end
|
227
|
+
@options_store[client].merge!(_options_for_client(client))
|
213
228
|
end
|
214
229
|
|
215
230
|
@options_stored = true
|
@@ -224,11 +239,14 @@ module Guard
|
|
224
239
|
if @options_stored
|
225
240
|
@options_store.each do |client, options|
|
226
241
|
options.each do |key, value|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
242
|
+
args = [
|
243
|
+
DEFAULTS[:client], "set", "-t",
|
244
|
+
client, _quiet_option.strip
|
245
|
+
]
|
246
|
+
args << "-u" unless value
|
247
|
+
args << key
|
248
|
+
args << value if value
|
249
|
+
Sheller.run(args.join(" "))
|
232
250
|
end
|
233
251
|
end
|
234
252
|
_reset_options_store
|
@@ -241,35 +259,52 @@ module Guard
|
|
241
259
|
|
242
260
|
private
|
243
261
|
|
244
|
-
def system(args)
|
245
|
-
args += " >#{ DEV_NULL } 2>&1" if ENV['GUARD_ENV'] == 'test'
|
246
|
-
super
|
247
|
-
end
|
248
|
-
|
249
262
|
def self._clients
|
250
|
-
|
251
|
-
ttys.
|
263
|
+
args = [DEFAULTS[:client], "list-clients", "-F", "'\#{client_tty}'"]
|
264
|
+
ttys = Sheller.stdout(args.join(" "))
|
265
|
+
ttys = ttys.split(/\n/)
|
266
|
+
|
267
|
+
# if user is running 'tmux -C' remove this client from list
|
268
|
+
ttys.delete("(null)")
|
269
|
+
|
252
270
|
ttys
|
253
271
|
end
|
254
272
|
|
273
|
+
def self._options_for_client(client)
|
274
|
+
options = {}
|
275
|
+
|
276
|
+
lines = Sheller.stdout("#{DEFAULTS[:client]} show -t #{client}")
|
277
|
+
|
278
|
+
lines.each_line do |line|
|
279
|
+
option, _, setting = line.chomp.partition(" ")
|
280
|
+
options[option] = setting
|
281
|
+
end
|
282
|
+
|
283
|
+
options
|
284
|
+
end
|
285
|
+
|
255
286
|
def _clients
|
256
287
|
self.class._clients
|
257
288
|
end
|
258
289
|
|
259
290
|
def _run_client(cmd, args)
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
291
|
+
default = DEFAULTS[:display_on_all_clients]
|
292
|
+
all_clients = @options.fetch(:display_on_all_clients, default)
|
293
|
+
clients = all_clients ? _clients : [nil]
|
294
|
+
clients.each do |client|
|
295
|
+
cmd_args = if client
|
296
|
+
"#{_client_cmd_flag(cmd)} #{client.strip} #{args}"
|
297
|
+
else
|
298
|
+
args
|
299
|
+
end
|
300
|
+
Sheller.run("#{DEFAULTS[:client]} #{cmd} #{cmd_args}")
|
266
301
|
end
|
267
302
|
end
|
268
303
|
|
269
304
|
def _client_cmd_flag(cmd)
|
270
305
|
case cmd
|
271
|
-
|
272
|
-
|
306
|
+
when "set", "set-option" then "-t"
|
307
|
+
when "display-message" then "-c"
|
273
308
|
end
|
274
309
|
end
|
275
310
|
|
@@ -281,26 +316,24 @@ module Guard
|
|
281
316
|
|
282
317
|
_clients.each do |client|
|
283
318
|
@options_store[client] = {
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
319
|
+
"status-left-bg" => nil,
|
320
|
+
"status-right-bg" => nil,
|
321
|
+
"status-left-fg" => nil,
|
322
|
+
"status-right-fg" => nil,
|
323
|
+
"message-bg" => nil,
|
324
|
+
"message-fg" => nil,
|
325
|
+
"display-time" => nil
|
291
326
|
}
|
292
327
|
end
|
293
328
|
end
|
294
329
|
|
295
|
-
def _tmux_version
|
296
|
-
|
330
|
+
def self._tmux_version
|
331
|
+
@@tmux_version ||= Float(Sheller.stdout("tmux -V")[/\d+\.\d+/])
|
297
332
|
end
|
298
333
|
|
299
|
-
def _quiet_option
|
300
|
-
|
334
|
+
def self._quiet_option
|
335
|
+
"-q " if _tmux_version >= 1.7
|
301
336
|
end
|
302
|
-
|
303
337
|
end
|
304
|
-
|
305
338
|
end
|
306
339
|
end
|
data/lib/guard/options.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "thor/core_ext/hash_with_indifferent_access"
|
2
2
|
|
3
3
|
module Guard
|
4
|
-
|
5
4
|
# A class that holds options. Can be instantiated with default options.
|
6
5
|
#
|
7
6
|
class Options < Thor::CoreExt::HashWithIndifferentAccess
|
8
|
-
|
9
7
|
# Initializes an Guard::Options object. `default_opts` is merged into
|
10
8
|
# `opts`.
|
11
9
|
#
|
@@ -15,7 +13,5 @@ module Guard
|
|
15
13
|
def initialize(opts = {}, default_opts = {})
|
16
14
|
super(default_opts.merge(opts || {}))
|
17
15
|
end
|
18
|
-
|
19
16
|
end
|
20
|
-
|
21
17
|
end
|
data/lib/guard/plugin.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "guard/plugin/base"
|
2
2
|
|
3
3
|
module Guard
|
4
|
-
|
5
4
|
# Base class from which every Guard plugin implementation must inherit.
|
6
5
|
#
|
7
6
|
# Guard will trigger the {#start}, {#stop}, {#reload}, {#run_all} and
|
@@ -62,5 +61,4 @@ module Guard
|
|
62
61
|
_register_callbacks
|
63
62
|
end
|
64
63
|
end
|
65
|
-
|
66
64
|
end
|
data/lib/guard/plugin/base.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Guard
|
2
|
-
|
3
2
|
class Plugin
|
4
|
-
|
5
3
|
# Colection of shared methods between `Guard::Guard` (deprecated)
|
6
4
|
# and `Guard::Plugin`.
|
7
5
|
#
|
8
6
|
module Base
|
9
|
-
|
10
|
-
|
7
|
+
TEMPLATE_FORMAT = "%s/lib/guard/%s/templates/Guardfile"
|
8
|
+
|
9
|
+
require "guard/ui"
|
10
|
+
require "guard/plugin/hooker"
|
11
11
|
|
12
12
|
include ::Guard::Plugin::Hooker
|
13
13
|
|
@@ -28,7 +28,7 @@ module Guard
|
|
28
28
|
# @return [String]
|
29
29
|
#
|
30
30
|
def non_namespaced_classname
|
31
|
-
|
31
|
+
to_s.sub("Guard::", "")
|
32
32
|
end
|
33
33
|
|
34
34
|
# Returns the non-namespaced name of the plugin
|
@@ -50,7 +50,7 @@ module Guard
|
|
50
50
|
# @param [String] plugin_location the plugin location
|
51
51
|
#
|
52
52
|
def template(plugin_location)
|
53
|
-
File.read
|
53
|
+
File.read TEMPLATE_FORMAT % [plugin_location, non_namespaced_name]
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -147,13 +147,17 @@ module Guard
|
|
147
147
|
# String representation of the plugin.
|
148
148
|
#
|
149
149
|
# @example String representation of an instance of the Guard::RSpec plugin
|
150
|
+
#
|
150
151
|
# Guard::RSpec.new.title
|
151
|
-
# #=> "#<Guard::RSpec @name=rspec @group=#<Guard::Group @name=default
|
152
|
+
# #=> "#<Guard::RSpec @name=rspec @group=#<Guard::Group @name=default
|
153
|
+
# @options={}> @watchers=[] @callbacks=[] @options={all_after_pass:
|
154
|
+
# true}>"
|
152
155
|
#
|
153
156
|
# @return [String] the string representation
|
154
157
|
#
|
155
158
|
def to_s
|
156
|
-
"#<#{self.class} @name=#{name} @group=#{group} @watchers=#{watchers}
|
159
|
+
"#<#{self.class} @name=#{name} @group=#{group} @watchers=#{watchers}"\
|
160
|
+
" @callbacks=#{callbacks} @options=#{options}>"
|
157
161
|
end
|
158
162
|
|
159
163
|
private
|
@@ -172,7 +176,6 @@ module Guard
|
|
172
176
|
@callbacks = options.delete(:callbacks) { [] }
|
173
177
|
@options = options
|
174
178
|
end
|
175
|
-
|
176
179
|
end
|
177
180
|
end
|
178
181
|
end
|
data/lib/guard/plugin/hooker.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module Guard
|
2
|
-
|
3
2
|
class Plugin
|
4
|
-
|
5
3
|
# Guard has a hook mechanism that allows you to insert callbacks for
|
6
4
|
# individual Guard plugins.
|
7
5
|
# By default, each of the Guard plugin instance methods has a "_begin" and
|
@@ -14,8 +12,7 @@ module Guard
|
|
14
12
|
# wiki](https://github.com/guard/guard/wiki/Hooks-and-callbacks).
|
15
13
|
#
|
16
14
|
module Hooker
|
17
|
-
|
18
|
-
require 'guard/ui'
|
15
|
+
require "guard/ui"
|
19
16
|
|
20
17
|
# Get all callbacks registered for all Guard plugins present in the
|
21
18
|
# Guardfile.
|
@@ -106,7 +103,6 @@ module Guard
|
|
106
103
|
Hooker.add_callback(callback[:listener], self, callback[:events])
|
107
104
|
end
|
108
105
|
end
|
109
|
-
|
110
106
|
end
|
111
107
|
end
|
112
108
|
end
|