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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +73 -58
  3. data/bin/guard +2 -2
  4. data/lib/guard.rb +64 -59
  5. data/lib/guard/cli.rb +66 -60
  6. data/lib/guard/cli.rb.orig +215 -0
  7. data/lib/guard/commander.rb +45 -69
  8. data/lib/guard/commands/all.rb +21 -19
  9. data/lib/guard/commands/change.rb +17 -22
  10. data/lib/guard/commands/notification.rb +15 -16
  11. data/lib/guard/commands/pause.rb +14 -15
  12. data/lib/guard/commands/reload.rb +19 -20
  13. data/lib/guard/commands/scope.rb +23 -19
  14. data/lib/guard/commands/show.rb +13 -16
  15. data/lib/guard/deprecated_methods.rb +6 -10
  16. data/lib/guard/deprecator.rb +52 -37
  17. data/lib/guard/dsl.rb +55 -33
  18. data/lib/guard/dsl_describer.rb +83 -31
  19. data/lib/guard/dsl_describer.rb.orig +184 -0
  20. data/lib/guard/group.rb +7 -6
  21. data/lib/guard/guard.rb +4 -4
  22. data/lib/guard/guard.rb.orig +42 -0
  23. data/lib/guard/guardfile.rb +12 -13
  24. data/lib/guard/guardfile/evaluator.rb +77 -55
  25. data/lib/guard/guardfile/evaluator.rb.orig +275 -0
  26. data/lib/guard/guardfile/generator.rb +25 -20
  27. data/lib/guard/interactor.rb +52 -293
  28. data/lib/guard/interactor.rb.orig +85 -0
  29. data/lib/guard/jobs/base.rb +21 -0
  30. data/lib/guard/jobs/pry_wrapper.rb +290 -0
  31. data/lib/guard/jobs/pry_wrapper.rb.orig +293 -0
  32. data/lib/guard/jobs/sleep.rb +25 -0
  33. data/lib/guard/notifier.rb +42 -39
  34. data/lib/guard/notifiers/base.rb +25 -24
  35. data/lib/guard/notifiers/emacs.rb +30 -24
  36. data/lib/guard/notifiers/file_notifier.rb +3 -7
  37. data/lib/guard/notifiers/gntp.rb +22 -22
  38. data/lib/guard/notifiers/growl.rb +16 -15
  39. data/lib/guard/notifiers/libnotify.rb +7 -10
  40. data/lib/guard/notifiers/notifysend.rb +15 -14
  41. data/lib/guard/notifiers/rb_notifu.rb +8 -10
  42. data/lib/guard/notifiers/terminal_notifier.rb +15 -11
  43. data/lib/guard/notifiers/terminal_title.rb +4 -8
  44. data/lib/guard/notifiers/tmux.rb +104 -71
  45. data/lib/guard/options.rb +1 -5
  46. data/lib/guard/plugin.rb +1 -3
  47. data/lib/guard/plugin/base.rb +12 -9
  48. data/lib/guard/plugin/hooker.rb +1 -5
  49. data/lib/guard/plugin_util.rb +46 -25
  50. data/lib/guard/plugin_util.rb.orig +178 -0
  51. data/lib/guard/rake_task.rb +4 -7
  52. data/lib/guard/reevaluator.rb +13 -0
  53. data/lib/guard/runner.rb +50 -78
  54. data/lib/guard/runner.rb.orig +200 -0
  55. data/lib/guard/setuper.rb +199 -130
  56. data/lib/guard/setuper.rb.orig +348 -0
  57. data/lib/guard/sheller.rb +107 -0
  58. data/lib/guard/tags +367 -0
  59. data/lib/guard/ui.rb +50 -38
  60. data/lib/guard/ui.rb.orig +254 -0
  61. data/lib/guard/ui/colors.rb +17 -21
  62. data/lib/guard/version.rb +1 -1
  63. data/lib/guard/version.rb.orig +3 -0
  64. data/lib/guard/watcher.rb +49 -62
  65. metadata +21 -4
  66. data/lib/guard/notifiers/growl_notify.rb +0 -93
@@ -0,0 +1,25 @@
1
+ require "guard/jobs/base"
2
+
3
+ module Guard
4
+ module Jobs
5
+ class Sleep < Base
6
+ def foreground
7
+ ::Guard::UI.debug "Guards jobs done. Sleeping..."
8
+ sleep
9
+ ::Guard::UI.debug "Sleep interrupted by events."
10
+ :stopped
11
+ rescue Interrupt
12
+ ::Guard::UI.debug "Sleep interrupted by user."
13
+ :exit
14
+ end
15
+
16
+ def background
17
+ Thread.main.wakeup
18
+ end
19
+
20
+ def handle_interrupt
21
+ Thread.main.raise Interrupt
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,29 +1,26 @@
1
- require 'yaml'
2
- require 'rbconfig'
3
- require 'pathname'
4
-
5
- require 'guard/ui'
6
- require 'guard/notifiers/emacs'
7
- require 'guard/notifiers/file_notifier'
8
- require 'guard/notifiers/gntp'
9
- require 'guard/notifiers/growl_notify'
10
- require 'guard/notifiers/growl'
11
- require 'guard/notifiers/libnotify'
12
- require 'guard/notifiers/notifysend'
13
- require 'guard/notifiers/rb_notifu'
14
- require 'guard/notifiers/terminal_notifier'
15
- require 'guard/notifiers/terminal_title'
16
- require 'guard/notifiers/tmux'
1
+ require "yaml"
2
+ require "rbconfig"
3
+ require "pathname"
4
+
5
+ require "guard/ui"
6
+ require "guard/notifiers/emacs"
7
+ require "guard/notifiers/file_notifier"
8
+ require "guard/notifiers/gntp"
9
+ require "guard/notifiers/growl"
10
+ require "guard/notifiers/libnotify"
11
+ require "guard/notifiers/notifysend"
12
+ require "guard/notifiers/rb_notifu"
13
+ require "guard/notifiers/terminal_notifier"
14
+ require "guard/notifiers/terminal_title"
15
+ require "guard/notifiers/tmux"
17
16
 
18
17
  module Guard
19
-
20
18
  # The notifier handles sending messages to different notifiers. Currently the
21
19
  # following
22
20
  # libraries are supported:
23
21
  #
24
22
  # * Ruby GNTP
25
23
  # * Growl
26
- # * GrowlNotify
27
24
  # * Libnotify
28
25
  # * rb-notifu
29
26
  # * emacs
@@ -45,7 +42,7 @@ module Guard
45
42
  # The notification type selection is based on the image option that is
46
43
  # sent to {#notify}. Each image type has its own notification type, and
47
44
  # notifications with custom images goes all sent as type `notify`. The
48
- # `gntp` and `growl_notify` notifiers are able to register these types
45
+ # `gntp` notifier is able to register these types
49
46
  # at Growl and allows customization of each notification type.
50
47
  #
51
48
  # Guard can be configured to make use of more than one notifier at once.
@@ -53,7 +50,6 @@ module Guard
53
50
  # @see Guard::Dsl
54
51
  #
55
52
  module Notifier
56
-
57
53
  extend self
58
54
 
59
55
  # List of available notifiers, grouped by functionality
@@ -61,7 +57,6 @@ module Guard
61
57
  {
62
58
  gntp: GNTP,
63
59
  growl: Growl,
64
- growl_notify: GrowlNotify,
65
60
  terminal_notifier: TerminalNotifier,
66
61
  libnotify: Libnotify,
67
62
  notifysend: NotifySend,
@@ -74,17 +69,17 @@ module Guard
74
69
  ]
75
70
 
76
71
  def notifiers
77
- ENV['GUARD_NOTIFIERS'] ? YAML::load(ENV['GUARD_NOTIFIERS']) : []
72
+ ENV["GUARD_NOTIFIERS"] ? YAML::load(ENV["GUARD_NOTIFIERS"]) : []
78
73
  end
79
74
 
80
75
  def notifiers=(notifiers)
81
- ENV['GUARD_NOTIFIERS'] = YAML::dump(notifiers)
76
+ ENV["GUARD_NOTIFIERS"] = YAML::dump(notifiers)
82
77
  end
83
78
 
84
79
  # Clear available notifications.
85
80
  #
86
81
  def clear_notifiers
87
- ENV['GUARD_NOTIFIERS'] = nil
82
+ ENV["GUARD_NOTIFIERS"] = nil
88
83
  end
89
84
 
90
85
  # Turn notifications on. If no notifications are defined in the `Guardfile`
@@ -94,19 +89,24 @@ module Guard
94
89
  # @option options [Boolean] silent disable any logging
95
90
  #
96
91
  def turn_on(opts = {})
97
- _auto_detect_notification if notifiers.empty? && (!::Guard.options || ::Guard.options[:notify])
92
+ if notifiers.empty? && (::Guard.options || {})[:notify]
93
+ _auto_detect_notification
94
+ end
98
95
 
99
96
  if notifiers.empty?
100
97
  turn_off
101
98
  else
102
99
  notifiers.each do |notifier|
103
100
  notifier_class = _get_notifier_module(notifier[:name])
104
- ::Guard::UI.info "Guard is using #{ notifier_class.title } to send notifications." unless opts[:silent]
101
+ unless opts[:silent]
102
+ ::Guard::UI.info \
103
+ "Guard is using #{ notifier_class.title } to send notifications."
104
+ end
105
105
 
106
106
  notifier_class.turn_on if notifier_class.respond_to?(:turn_on)
107
107
  end
108
108
 
109
- ENV['GUARD_NOTIFY'] = 'true'
109
+ ENV["GUARD_NOTIFY"] = "true"
110
110
  end
111
111
  end
112
112
 
@@ -119,14 +119,14 @@ module Guard
119
119
  notifier_class.turn_off if notifier_class.respond_to?(:turn_off)
120
120
  end
121
121
 
122
- ENV['GUARD_NOTIFY'] = 'false'
122
+ ENV["GUARD_NOTIFY"] = "false"
123
123
  end
124
124
 
125
125
  # Toggle the system notifications on/off
126
126
  #
127
127
  def toggle
128
128
  if enabled?
129
- ::Guard::UI.info 'Turn off notifications'
129
+ ::Guard::UI.info "Turn off notifications"
130
130
  turn_off
131
131
  else
132
132
  turn_on
@@ -138,7 +138,7 @@ module Guard
138
138
  # @return [Boolean] whether the notifications are on
139
139
  #
140
140
  def enabled?
141
- ENV['GUARD_NOTIFY'] == 'true'
141
+ ENV["GUARD_NOTIFY"] == "true"
142
142
  end
143
143
 
144
144
  # Add a notification library to be used.
@@ -175,8 +175,10 @@ module Guard
175
175
 
176
176
  begin
177
177
  notifier.notify(message, opts.dup)
178
- rescue Exception => e
179
- ::Guard::UI.error "Error sending notification with #{ notifier.name }: #{ e.message }"
178
+ rescue RuntimeError => e
179
+ ::Guard::UI.error \
180
+ "Error sending notification with #{ notifier.name }: #{ e.message }"
181
+
180
182
  ::Guard::UI.debug e.backtrace.join("\n")
181
183
  end
182
184
  end
@@ -191,11 +193,9 @@ module Guard
191
193
  #
192
194
  def _get_notifier_module(name)
193
195
  NOTIFIERS.each do |group|
194
- if notifier = group.find { |n, _| n == name }
195
- return notifier.last
196
- end
196
+ next unless (notifier = group.detect { |n, _| n == name })
197
+ return notifier.last
197
198
  end
198
-
199
199
  nil
200
200
  end
201
201
 
@@ -208,12 +208,15 @@ module Guard
208
208
  available = nil
209
209
 
210
210
  NOTIFIERS.each do |group|
211
- notifier_added = group.find { |name, klass| add_notifier(name, silent: true) }
211
+ notifier_added = group.detect do |name, _|
212
+ add_notifier(name, silent: true)
213
+ end
212
214
  available ||= notifier_added
213
215
  end
214
216
 
215
- ::Guard::UI.info('Guard could not detect any of the supported notification libraries.') unless available
217
+ return if available
218
+ ::Guard::UI.info \
219
+ "Guard could not detect any of the supported notification libraries."
216
220
  end
217
221
  end
218
-
219
222
  end
@@ -1,25 +1,26 @@
1
- require 'rbconfig'
2
- require 'guard/ui'
1
+ require "rbconfig"
2
+ require "guard/ui"
3
3
 
4
4
  module Guard
5
5
  module Notifier
6
-
7
6
  # Base class for all notifiers.
8
7
  #
9
8
  class Base
10
-
11
9
  HOSTS = {
12
- darwin: 'Mac OS X',
13
- linux: 'Linux',
14
- freebsd: 'FreeBSD',
15
- openbsd: 'OpenBSD',
16
- sunos: 'SunOS',
17
- solaris: 'Solaris',
18
- mswin: 'Windows',
19
- mingw: 'Windows',
20
- cygwin: 'Windows'
10
+ darwin: "Mac OS X",
11
+ linux: "Linux",
12
+ freebsd: "FreeBSD",
13
+ openbsd: "OpenBSD",
14
+ sunos: "SunOS",
15
+ solaris: "Solaris",
16
+ mswin: "Windows",
17
+ mingw: "Windows",
18
+ cygwin: "Windows"
21
19
  }
22
20
 
21
+ ERROR_ADD_GEM_AND_RUN_BUNDLE = "Please add \"gem '%s'\" to your Gemfile "\
22
+ "and run Guard with \"bundle exec\"."
23
+
23
24
  attr_reader :options
24
25
 
25
26
  def initialize(opts = {})
@@ -46,15 +47,17 @@ module Guard
46
47
  if _supported_host?
47
48
  true
48
49
  else
49
- hosts = supported_hosts.map { |host| HOSTS[host.to_sym] }.join(', ')
50
- ::Guard::UI.error "The :#{name} notifier runs only on #{hosts}." unless opts.fetch(:silent) { false }
50
+ hosts = supported_hosts.map { |host| HOSTS[host.to_sym] }.join(", ")
51
+ unless opts.fetch(:silent) { false }
52
+ ::Guard::UI.error "The :#{name} notifier runs only on #{hosts}."
53
+ end
51
54
  false
52
55
  end
53
56
  end
54
57
 
55
58
  # This method must be overriden.
56
59
  #
57
- def notify(message, opts = {})
60
+ def notify(_message, opts = {})
58
61
  options.delete(:silent)
59
62
  opts.replace(options.merge(opts))
60
63
  normalize_standard_options!(opts)
@@ -69,7 +72,7 @@ module Guard
69
72
  # @return [String] the title of the notifier
70
73
  #
71
74
  def self.title
72
- self.to_s.sub(/.+::(\w+)$/, '\1')
75
+ to_s.sub(/.+::(\w+)$/, '\1')
73
76
  end
74
77
 
75
78
  # Returns the name of the notifier.
@@ -111,7 +114,7 @@ module Guard
111
114
  true
112
115
  rescue LoadError, NameError
113
116
  unless opts[:silent]
114
- ::Guard::UI.error "Please add \"gem '#{gem_name}'\" to your Gemfile and run Guard with \"bundle exec\"."
117
+ UI.error ERROR_ADD_GEM_AND_RUN_BUNDLE % [gem_name]
115
118
  end
116
119
  false
117
120
  end
@@ -145,7 +148,7 @@ module Guard
145
148
  # @return [Pathname] the path to the images directory
146
149
  #
147
150
  def images_path
148
- @images_path ||= Pathname.new(File.dirname(__FILE__)).join('../../../images')
151
+ @images_path ||= Pathname.new(__FILE__).dirname + "../../../images"
149
152
  end
150
153
 
151
154
  # @private
@@ -156,7 +159,7 @@ module Guard
156
159
  #
157
160
  def self._supported_host?
158
161
  supported_hosts == :all ||
159
- RbConfig::CONFIG['host_os'] =~ /#{supported_hosts.join('|')}/
162
+ RbConfig::CONFIG["host_os"] =~ /#{supported_hosts.join('|')}/
160
163
  end
161
164
 
162
165
  # Set or modify the `:title`, `:type` and `:image` options for a
@@ -169,7 +172,7 @@ module Guard
169
172
  # @option opts [String] image the path to the notification image
170
173
  #
171
174
  def normalize_standard_options!(opts)
172
- opts[:title] ||= 'Guard'
175
+ opts[:title] ||= "Guard"
173
176
  opts[:type] ||= _notification_type(opts.fetch(:image, :success))
174
177
  opts[:image] = _image_path(opts.delete(:image) { :success })
175
178
  end
@@ -192,7 +195,7 @@ module Guard
192
195
  def _image_path(image)
193
196
  case image
194
197
  when :failed, :pending, :success
195
- images_path.join("#{image.to_s}.png").to_s
198
+ images_path.join("#{image}.png").to_s
196
199
  else
197
200
  image
198
201
  end
@@ -213,8 +216,6 @@ module Guard
213
216
  :notify
214
217
  end
215
218
  end
216
-
217
219
  end
218
-
219
220
  end
220
221
  end
@@ -1,25 +1,24 @@
1
- require 'guard/notifiers/base'
1
+ require "guard/notifiers/base"
2
2
 
3
3
  module Guard
4
4
  module Notifier
5
-
6
- # Send a notification to Emacs with emacsclient (http://www.emacswiki.org/emacs/EmacsClient).
5
+ # Send a notification to Emacs with emacsclient
6
+ # (http://www.emacswiki.org/emacs/EmacsClient).
7
7
  #
8
8
  # @example Add the `:emacs` notifier to your `Guardfile`
9
9
  # notification :emacs
10
10
  #
11
11
  class Emacs < Base
12
-
13
12
  DEFAULTS = {
14
- client: 'emacsclient',
15
- success: 'ForestGreen',
16
- failed: 'Firebrick',
17
- default: 'Black',
18
- fontcolor: 'White',
13
+ client: "emacsclient",
14
+ success: "ForestGreen",
15
+ failed: "Firebrick",
16
+ default: "Black",
17
+ fontcolor: "White",
19
18
  }
20
19
 
21
20
  def self.available?(opts = {})
22
- super and _emacs_client_available?(opts)
21
+ super && _emacs_client_available?(opts)
23
22
  end
24
23
 
25
24
  # @private
@@ -27,8 +26,10 @@ module Guard
27
26
  # @return [Boolean] whether or not the emacs client is available
28
27
  #
29
28
  def self._emacs_client_available?(opts)
30
- result = `#{opts.fetch(:client, DEFAULTS[:client])} --eval '1' 2> #{DEV_NULL} || echo 'N/A'`
31
- !%w(N/A 'N/A').include?(result.chomp!)
29
+ client_name = opts.fetch(:client, DEFAULTS[:client])
30
+ cmd = "#{client_name} --eval '1' 2> #{DEV_NULL} || echo 'N/A'"
31
+ stdout = Sheller.stdout(cmd)
32
+ !%w(N/A 'N/A').include?(stdout.chomp!)
32
33
  end
33
34
 
34
35
  # Shows a system notification.
@@ -58,13 +59,13 @@ module Guard
58
59
  opts = DEFAULTS.merge(opts)
59
60
  color = emacs_color(opts[:type], opts)
60
61
  fontcolor = emacs_color(:fontcolor, opts)
61
- elisp = <<-EOF.gsub(/\s+/, ' ').strip
62
+ elisp = <<-EOF.gsub(/\s+/, " ").strip
62
63
  (set-face-attribute 'mode-line nil
63
64
  :background "#{color}"
64
65
  :foreground "#{fontcolor}")
65
66
  EOF
66
67
 
67
- _run_cmd(opts[:client], '--eval', elisp)
68
+ _run_cmd(opts[:client], "--eval", elisp)
68
69
  end
69
70
 
70
71
  # Get the Emacs color for the notification type.
@@ -72,10 +73,19 @@ module Guard
72
73
  #
73
74
  # @param [String] type the notification type
74
75
  # @param [Hash] options aditional notification options
75
- # @option options [String] success the color to use for success notifications (default is 'ForestGreen')
76
- # @option options [String] failed the color to use for failure notifications (default is 'Firebrick')
77
- # @option options [String] pending the color to use for pending notifications
78
- # @option options [String] default the default color to use (default is 'Black')
76
+ #
77
+ # @option options [String] success the color to use for success
78
+ # notifications (default is 'ForestGreen')
79
+ #
80
+ # @option options [String] failed the color to use for failure
81
+ # notifications (default is 'Firebrick')
82
+ #
83
+ # @option options [String] pending the color to use for pending
84
+ # notifications
85
+ #
86
+ # @option options [String] default the default color to use (default is
87
+ # 'Black')
88
+ #
79
89
  # @return [String] the name of the emacs color
80
90
  #
81
91
  def emacs_color(type, options = {})
@@ -85,13 +95,9 @@ module Guard
85
95
 
86
96
  private
87
97
 
88
- def _run_cmd(*args)
89
- p = IO.popen(args)
90
- p.readlines
91
- p.close
98
+ def _run_cmd(cmd, *args)
99
+ Sheller.run(cmd, *args)
92
100
  end
93
-
94
101
  end
95
-
96
102
  end
97
103
  end
@@ -1,15 +1,13 @@
1
- require 'guard/notifiers/base'
1
+ require "guard/notifiers/base"
2
2
 
3
3
  module Guard
4
4
  module Notifier
5
-
6
5
  # Writes Guard notification results to a file.
7
6
  #
8
7
  # @example Add the `:file` notifier to your `Guardfile`
9
8
  # notification :file, path: 'tmp/guard_result'
10
9
  #
11
10
  class FileNotifier < Base
12
-
13
11
  DEFAULTS = {
14
12
  format: "%s\n%s\n%s\n"
15
13
  }
@@ -19,7 +17,7 @@ module Guard
19
17
  # results will be written
20
18
  #
21
19
  def self.available?(opts = {})
22
- super and opts.has_key?(:path)
20
+ super && opts.has_key?(:path)
23
21
  end
24
22
 
25
23
  # Writes the notification to a file. By default it writes type, title,
@@ -42,7 +40,7 @@ module Guard
42
40
 
43
41
  _write(opts[:path], format % [opts[:type], opts[:title], message])
44
42
  else
45
- ::Guard::UI.error ':file notifier requires a :path option'
43
+ ::Guard::UI.error ":file notifier requires a :path option"
46
44
  end
47
45
  end
48
46
 
@@ -51,8 +49,6 @@ module Guard
51
49
  def _write(path, contents)
52
50
  File.write(path, contents)
53
51
  end
54
-
55
52
  end
56
-
57
53
  end
58
54
  end