guard 2.6.1 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
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