guard 2.10.5 → 2.11.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/guard.rb +0 -3
  3. data/lib/guard/aruba_adapter.rb +6 -6
  4. data/lib/guard/cli.rb +5 -0
  5. data/lib/guard/commander.rb +1 -1
  6. data/lib/guard/commands/all.rb +2 -2
  7. data/lib/guard/commands/notification.rb +1 -1
  8. data/lib/guard/commands/reload.rb +2 -2
  9. data/lib/guard/commands/show.rb +1 -1
  10. data/lib/guard/deprecated/evaluator.rb +3 -1
  11. data/lib/guard/deprecated/guard.rb +57 -2
  12. data/lib/guard/dsl.rb +2 -3
  13. data/lib/guard/dsl_describer.rb +8 -20
  14. data/lib/guard/guardfile/evaluator.rb +5 -5
  15. data/lib/guard/guardfile/generator.rb +3 -3
  16. data/lib/guard/internals/debugging.rb +5 -5
  17. data/lib/guard/internals/session.rb +19 -8
  18. data/lib/guard/internals/state.rb +0 -13
  19. data/lib/guard/jobs/pry_wrapper.rb +5 -5
  20. data/lib/guard/notifier.rb +43 -219
  21. data/lib/guard/plugin_util.rb +1 -1
  22. data/lib/guard/terminal.rb +3 -2
  23. data/lib/guard/ui.rb +7 -2
  24. data/lib/guard/version.rb +1 -1
  25. data/lib/guard/watcher.rb +3 -3
  26. metadata +30 -15
  27. data/lib/guard/notifier/detected.rb +0 -87
  28. data/lib/guard/notifiers/base.rb +0 -221
  29. data/lib/guard/notifiers/emacs.rb +0 -99
  30. data/lib/guard/notifiers/file_notifier.rb +0 -54
  31. data/lib/guard/notifiers/gntp.rb +0 -111
  32. data/lib/guard/notifiers/growl.rb +0 -104
  33. data/lib/guard/notifiers/libnotify.rb +0 -86
  34. data/lib/guard/notifiers/notifysend.rb +0 -110
  35. data/lib/guard/notifiers/rb_notifu.rb +0 -100
  36. data/lib/guard/notifiers/terminal_notifier.rb +0 -90
  37. data/lib/guard/notifiers/terminal_title.rb +0 -31
  38. data/lib/guard/notifiers/tmux.rb +0 -335
  39. data/lib/guard/sheller.rb +0 -143
@@ -1,90 +0,0 @@
1
- require "guard/notifiers/base"
2
-
3
- module Guard
4
- module Notifier
5
- # System notifications using the
6
- #
7
- # [terminal-notifier](https://github.com/Springest/terminal-notifier-guard)
8
- #
9
- # gem.
10
- #
11
- # This gem is available for OS X 10.8 Mountain Lion and sends notifications
12
- # to the OS X notification center.
13
- #
14
- # @example Add the `terminal-notifier-guard` gem to your `Gemfile`
15
- # group :development
16
- # gem 'terminal-notifier-guard'
17
- # end
18
- #
19
- # @example Add the `:terminal_notifier` notifier to your `Guardfile`
20
- # notification :terminal_notifier
21
- #
22
- # @example Display application name as subtitle
23
- # notification :terminal_notifier, subtitle: “MyApp"
24
- #
25
- # @example Use iTerm2 for notifications
26
- # notification :terminal_notifier, activate: "com.googlecode.iterm2"
27
- #
28
- class TerminalNotifier < Base
29
- ERROR_TERMINAL_NOTIFIER_ONLY_OSX10 = "The :terminal_notifier only runs"\
30
- " on Mac OS X 10.8 and later."
31
-
32
- def self.supported_hosts
33
- %w(darwin)
34
- end
35
-
36
- def self.gem_name
37
- "terminal-notifier-guard"
38
- end
39
-
40
- def self.available?(opts = {})
41
- super && require_gem_safely(opts) && _register!(opts)
42
- end
43
-
44
- # Shows a system notification.
45
- #
46
- # @param [String] message the notification message body
47
- # @param [Hash] opts additional notification library options
48
- # @option opts [String] type the notification type. Either 'success',
49
- # 'pending', 'failed' or 'notify'
50
- # @option opts [String] title the notification title
51
- # @option opts [String] image the path to the notification image (ignored)
52
- # @option opts [String] app_name name of your app
53
- # @option opts [String] execute a command
54
- # @option opts [String] activate an app bundle
55
- # @option opts [String] open some url or file
56
- #
57
- def notify(message, opts = {})
58
- title = opts[:title] || options[:title]
59
- super
60
- self.class.require_gem_safely
61
-
62
- opts.delete(:image)
63
- opts[:title] = title || [
64
- opts.delete(:app_name) { "Guard" }, opts[:type].downcase.capitalize
65
- ].join(" ")
66
-
67
- ::TerminalNotifier::Guard.execute(false, opts.merge(message: message))
68
- end
69
-
70
- # @private
71
- #
72
- # Detects if the terminal-notifier-guard gem is available and if not,
73
- # displays an error message unless `opts[:silent]` is true.
74
- #
75
- # @return [Boolean] whether or not the terminal-notifier-guard gem is
76
- # available
77
- #
78
- def self._register!(opts)
79
- if ::TerminalNotifier::Guard.available?
80
- true
81
- else
82
- unless opts[:silent]
83
- UI.error UI::ERROR_TERMINAL_NOTIFIER_ONLY_OSX10
84
- end
85
- false
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,31 +0,0 @@
1
- require "guard/notifiers/base"
2
-
3
- module Guard
4
- module Notifier
5
- # Shows system notifications in the terminal title bar.
6
- #
7
- class TerminalTitle < Base
8
- # Shows a system notification.
9
- #
10
- # @param [Hash] opts additional notification library options
11
- # @option opts [String] message the notification message body
12
- # @option opts [String] type the notification type. Either 'success',
13
- # 'pending', 'failed' or 'notify'
14
- # @option opts [String] title the notification title
15
- #
16
- def notify(message, opts = {})
17
- super
18
-
19
- first_line = message.sub(/^\n/, "").sub(/\n.*/m, "")
20
-
21
- STDOUT.puts "\e]2;[#{ opts[:title] }] #{ first_line }\a"
22
- end
23
-
24
- # Clears the terminal title
25
- #
26
- def self.turn_off
27
- STDOUT.puts "\e]2;\a"
28
- end
29
- end
30
- end
31
- end
@@ -1,335 +0,0 @@
1
- require "guard/notifiers/base"
2
- require "guard/sheller"
3
-
4
- module Guard
5
- module Notifier
6
- # Changes the color of the Tmux status bar and optionally
7
- # shows messages in the status bar.
8
- #
9
- # @example Add the `:tmux` notifier to your `Guardfile`
10
- # notification :tmux
11
- #
12
- # @example Enable text messages
13
- # notification :tmux, display_message: true
14
- #
15
- # @example Customize the tmux status colored for notifications
16
- # notification :tmux, color_location: 'status-right-bg'
17
- #
18
- class Tmux < Base
19
- @@session = nil
20
-
21
- # Default options for the tmux notifications.
22
- class Defaults
23
- DEFAULTS = {
24
- tmux_environment: "TMUX",
25
- success: "green",
26
- failed: "red",
27
- pending: "yellow",
28
- default: "green",
29
- timeout: 5,
30
- display_message: false,
31
- default_message_format: "%s - %s",
32
- default_message_color: "white",
33
- display_on_all_clients: false,
34
- display_title: false,
35
- default_title_format: "%s - %s",
36
- line_separator: " - ",
37
- change_color: true,
38
- color_location: "status-left-bg"
39
- }
40
-
41
- def self.option(opts, name)
42
- opts.fetch(name, DEFAULTS[name])
43
- end
44
-
45
- def self.[](name)
46
- DEFAULTS[name]
47
- end
48
- end
49
-
50
- class Client
51
- CLIENT = "tmux"
52
- class << self
53
- def version
54
- Float(_capture("-V")[/\d+\.\d+/])
55
- end
56
-
57
- def clients
58
- ttys = _capture("list-clients", "-F", "'\#{client_tty}'")
59
- ttys = ttys.split(/\n/)
60
-
61
- # if user is running 'tmux -C' remove this client from list
62
- ttys.delete("(null)")
63
- ttys
64
- end
65
-
66
- def set(client, key, value)
67
- case client
68
- when :all, true
69
- # call ourself
70
- clients.each { |cl| Client.set(cl, key, value) }
71
- else
72
- args = client ? ["-t", client.strip] : nil
73
- _run("set", "-q", *args, key, value)
74
- end
75
- end
76
-
77
- def display(client, message)
78
- case client
79
- when :all, true
80
- # call ourself
81
- clients.each { |cl| Client.display(cl, message) }
82
- else
83
- args += ["-c", client.strip] if client
84
- _run("display", *args, message)
85
- end
86
- end
87
-
88
- def unset(client, key, value)
89
- return set(client, key, value) if value
90
- args = client ? ["-t", client.strip] : []
91
- _run("set", "-q", "-u", *args, key)
92
- end
93
-
94
- def parse_options(client)
95
- output = _capture("show", "-t", client)
96
- Hash[output.lines.map { |line| _parse_option(line) }]
97
- end
98
-
99
- def _parse_option(line)
100
- line.partition(" ").map(&:strip).reject(&:empty?)
101
- end
102
-
103
- def _capture(*args)
104
- Sheller.stdout(([CLIENT] + args).join(" "))
105
- end
106
-
107
- def _run(*args)
108
- Sheller.run(([CLIENT] + args).join(" "))
109
- end
110
- end
111
- end
112
-
113
- class Session
114
- def initialize(_tmux)
115
- @options_store = {}
116
-
117
- Client.clients.each do |client|
118
- @options_store[client] = {
119
- "status-left-bg" => nil,
120
- "status-right-bg" => nil,
121
- "status-left-fg" => nil,
122
- "status-right-fg" => nil,
123
- "message-bg" => nil,
124
- "message-fg" => nil,
125
- "display-time" => nil
126
- }.merge(Client.parse_options(client))
127
- end
128
- end
129
-
130
- def close
131
- @options_store.each do |client, options|
132
- options.each do |key, value|
133
- Client.unset(client, key, value)
134
- end
135
- end
136
- @options_store = nil
137
- end
138
- end
139
-
140
- class Error < RuntimeError
141
- end
142
-
143
- ERROR_NOT_INSIDE_TMUX = "The :tmux notifier runs only on when Guard"\
144
- " is executed inside of a tmux session."
145
-
146
- ERROR_ANCIENT_TMUX = "Your tmux version is way too old!"
147
-
148
- def self.available?(opts = {})
149
- return unless super
150
-
151
- fail "PREVIOUS TMUX SESSION NOT CLEARED!" if @@session || nil
152
-
153
- var_name = Defaults.option(opts, :tmux_environment)
154
- fail Error, ERROR_NOT_INSIDE_TMUX unless ENV.key?(var_name)
155
-
156
- version = Client.version
157
- fail Error, format(ERROR_ANCIENT_TMUX, version) if version < 1.7
158
-
159
- true
160
- rescue Error => e
161
- ::Guard::UI.error e.message unless opts[:silent]
162
- false
163
- end
164
-
165
- # Shows a system notification.
166
- #
167
- # By default, the Tmux notifier only makes
168
- # use of a color based notification, changing the background color of the
169
- # `color_location` to the color defined in either the `success`,
170
- # `failed`, `pending` or `default`, depending on the notification type.
171
- #
172
- # You may enable an extra explicit message by setting `display_message`
173
- # to true, and may further disable the colorization by setting
174
- # `change_color` to false.
175
- #
176
- # @param [String] message the notification message
177
- # @param [Hash] options additional notification library options
178
- # @option options [String] type the notification type. Either 'success',
179
- # 'pending', 'failed' or 'notify'
180
- # @option options [String] message the notification message body
181
- # @option options [String] image the path to the notification image
182
- # @option options [Boolean] change_color whether to show a color
183
- # notification
184
- # @option options [String,Array] color_location the location where to draw
185
- # the color notification
186
- # @option options [Boolean] display_message whether to display a message
187
- # or not
188
- # @option options [Boolean] display_on_all_clients whether to display a
189
- # message on all tmux clients or not
190
- #
191
- def notify(message, options = {})
192
- super
193
- options.delete(:image)
194
-
195
- change_color = Defaults.option(options, :change_color)
196
- locations = Array(Defaults.option(options, :color_location))
197
- display_the_title = Defaults.option(options, :display_title)
198
- display_message = Defaults.option(options, :display_message)
199
- type = options.delete(:type).to_s
200
- title = options.delete(:title)
201
-
202
- if change_color
203
- color = tmux_color(type, options)
204
- locations.each { |location| Client.set(_all?, location, color) }
205
- end
206
-
207
- display_title(type, title, message, options) if display_the_title
208
-
209
- return unless display_message
210
- display_message(type, title, message, options)
211
- end
212
-
213
- # Displays a message in the title bar of the terminal.
214
- #
215
- # @param [String] title the notification title
216
- # @param [String] message the notification message body
217
- # @param [Hash] options additional notification library options
218
- # @option options [String] success_message_format a string to use as
219
- # formatter for the success message.
220
- # @option options [String] failed_message_format a string to use as
221
- # formatter for the failed message.
222
- # @option options [String] pending_message_format a string to use as
223
- # formatter for the pending message.
224
- # @option options [String] default_message_format a string to use as
225
- # formatter when no format per type is defined.
226
- #
227
- def display_title(type, title, message, options = {})
228
- format = "#{type}_title_format".to_sym
229
- default_title_format = Defaults.option(options, :default_title_format)
230
- title_format = options.fetch(format, default_title_format)
231
- teaser_message = message.split("\n").first
232
- display_title = title_format % [title, teaser_message]
233
-
234
- Client.set(_all?, "set-titles-string", "'#{display_title}'")
235
- end
236
-
237
- # Displays a message in the status bar of tmux.
238
- #
239
- # @param [String] type the notification type. Either 'success',
240
- # 'pending', 'failed' or 'notify'
241
- # @param [String] title the notification title
242
- # @param [String] message the notification message body
243
- # @param [Hash] options additional notification library options
244
- # @option options [Integer] timeout the amount of seconds to show the
245
- # message in the status bar
246
- # @option options [String] success_message_format a string to use as
247
- # formatter for the success message.
248
- # @option options [String] failed_message_format a string to use as
249
- # formatter for the failed message.
250
- # @option options [String] pending_message_format a string to use as
251
- # formatter for the pending message.
252
- # @option options [String] default_message_format a string to use as
253
- # formatter when no format per type is defined.
254
- # @option options [String] success_message_color the success notification
255
- # foreground color name.
256
- # @option options [String] failed_message_color the failed notification
257
- # foreground color name.
258
- # @option options [String] pending_message_color the pending notification
259
- # foreground color name.
260
- # @option options [String] default_message_color a notification
261
- # foreground color to use when no color per type is defined.
262
- # @option options [String] line_separator a string to use instead of a
263
- # line-break.
264
- #
265
- def display_message(type, title, message, opts = {})
266
- default_format = Defaults.option(opts, :default_message_format)
267
- default_color = Defaults.option(opts, :default_message_color)
268
- display_time = Defaults.option(opts, :timeout)
269
- separator = Defaults.option(opts, :line_separator)
270
-
271
- format = "#{type}_message_format".to_sym
272
- message_format = opts.fetch(format, default_format)
273
-
274
- color = "#{type}_message_color".to_sym
275
- message_color = opts.fetch(color, default_color)
276
-
277
- color = tmux_color(type, opts)
278
- formatted_message = message.split("\n").join(separator)
279
- display_message = message_format % [title, formatted_message]
280
-
281
- Client.set(_all?, "display-time", display_time * 1000)
282
- Client.set(_all?, "message-fg", message_color)
283
- Client.set(_all?, "message-bg", color)
284
- Client.display(_all?, "'#{display_message}'")
285
- end
286
-
287
- # Get the Tmux color for the notification type.
288
- # You can configure your own color by overwriting the defaults.
289
- #
290
- # @param [String] type the notification type
291
- # @return [String] the name of the emacs color
292
- #
293
- def tmux_color(type, opts = {})
294
- type = type.to_sym
295
- opts[type] || Defaults[type] || Defaults.option(opts, :default)
296
- end
297
-
298
- # Notification starting, save the current Tmux settings
299
- # and quiet the Tmux output.
300
- #
301
- def self.turn_on
302
- _start_session
303
- end
304
-
305
- # Notification stopping. Restore the previous Tmux state
306
- # if available (existing options are restored, new options
307
- # are unset) and unquiet the Tmux output.
308
- #
309
- def self.turn_off
310
- _end_session
311
- end
312
-
313
- private
314
-
315
- def self._start_session
316
- fail "Already turned on!" if @@session
317
- @@session = Session.new(self)
318
- end
319
-
320
- def self._end_session
321
- fail "Already turned off!" unless @@session || nil
322
- @@session.close
323
- @@session = nil
324
- end
325
-
326
- def self._session
327
- @@session
328
- end
329
-
330
- def _all?
331
- Defaults.option(options, :display_on_all_clients)
332
- end
333
- end
334
- end
335
- end