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
@@ -1,11 +1,10 @@
1
1
  # encoding: utf-8
2
- require 'formatador'
2
+ require "formatador"
3
3
 
4
- require 'guard/guardfile/evaluator'
5
- require 'guard/ui'
4
+ require "guard/guardfile/evaluator"
5
+ require "guard/ui"
6
6
 
7
7
  module Guard
8
-
9
8
  # The DslDescriber evaluates the Guardfile and creates an internal structure
10
9
  # of it that is used in some inspection utility methods like the CLI commands
11
10
  # `show` and `list`.
@@ -14,20 +13,20 @@ module Guard
14
13
  # @see Guard::CLI
15
14
  #
16
15
  class DslDescriber
17
-
18
- attr_reader :options
19
-
20
16
  # Initializes a new DslDescriber object.
21
17
  #
22
18
  # @option options [String] guardfile the path to a valid Guardfile
23
- # @option options [String] guardfile_contents a string representing the content of a valid Guardfile
19
+ #
20
+ # @option options [String] guardfile_contents a string representing the
21
+ # content of a valid Guardfile
24
22
  #
25
23
  # @see Guard::Guardfile::Evaluator#initialize
26
24
  #
27
25
  def initialize(options = {})
28
- @options = options
29
26
  ::Guard.reset_groups
30
27
  ::Guard.reset_plugins
28
+ ::Guard.reset_scope
29
+ ::Guard.reset_options(options)
31
30
  end
32
31
 
33
32
  # List the Guard plugins that are available for use in your system and marks
@@ -38,11 +37,15 @@ module Guard
38
37
  def list
39
38
  _evaluate_guardfile
40
39
 
41
- rows = ::Guard::PluginUtil.plugin_names.sort.uniq.inject([]) do |rows, name|
42
- rows << { Plugin: name.capitalize, Guardfile: ::Guard.plugins(name) ? '✔' : '✘' }
40
+ names = ::Guard::PluginUtil.plugin_names.sort.uniq
41
+ final_rows = names.inject([]) do |rows, name|
42
+ rows << {
43
+ Plugin: name.capitalize,
44
+ Guardfile: ::Guard.plugins(name) ? "✔" : "✘"
45
+ }
43
46
  end
44
47
 
45
- Formatador.display_compact_table(rows, [:Plugin, :Guardfile])
48
+ Formatador.display_compact_table(final_rows, [:Plugin, :Guardfile])
46
49
  end
47
50
 
48
51
  # Shows all Guard plugins and their options that are defined in
@@ -52,21 +55,42 @@ module Guard
52
55
  #
53
56
  def show
54
57
  _evaluate_guardfile
58
+ groups = ::Guard.groups
55
59
 
56
- rows = ::Guard.groups.inject([]) do |rows, group|
57
- Array(::Guard.plugins(group: group.name)).each do |plugin|
58
- options = plugin.options.inject({}) { |o, (k, v)| o[k.to_s] = v; o }.sort
60
+ final_rows = groups.each_with_object([]) do |group, rows|
61
+
62
+ plugins = Array(::Guard.plugins(group: group.name))
63
+
64
+ plugins.each do |plugin|
65
+ options = plugin.options.inject({}) do |o, (k, v)|
66
+ o.tap { |option| option[k.to_s] = v }
67
+ end.sort
59
68
 
60
69
  if options.empty?
61
70
  rows << :split
62
- rows << { Group: group.title, Plugin: plugin.title, Option: '', Value: '' }
71
+ rows << {
72
+ Group: group.title,
73
+ Plugin: plugin.title,
74
+ Option: "",
75
+ Value: ""
76
+ }
63
77
  else
64
78
  options.each_with_index do |(option, value), index|
65
79
  if index == 0
66
80
  rows << :split
67
- rows << { Group: group.title, Plugin: plugin.title, Option: option.to_s, Value: value.inspect }
81
+ rows << {
82
+ Group: group.title,
83
+ Plugin: plugin.title,
84
+ Option: option.to_s,
85
+ Value: value.inspect
86
+ }
68
87
  else
69
- rows << { Group: '', Plugin: '', Option: option.to_s, Value: value.inspect }
88
+ rows << {
89
+ Group: "",
90
+ Plugin: "",
91
+ Option: option.to_s,
92
+ Value: value.inspect
93
+ }
70
94
  end
71
95
  end
72
96
  end
@@ -75,7 +99,10 @@ module Guard
75
99
  rows
76
100
  end
77
101
 
78
- Formatador.display_compact_table(rows.drop(1), [:Group, :Plugin, :Option, :Value])
102
+ Formatador.display_compact_table(
103
+ final_rows.drop(1),
104
+ [:Group, :Plugin, :Option, :Value]
105
+ )
79
106
  end
80
107
 
81
108
  # Shows all notifiers and their options that are defined in
@@ -86,27 +113,28 @@ module Guard
86
113
  def notifiers
87
114
  _evaluate_guardfile
88
115
 
89
- rows = ::Guard::Notifier::NOTIFIERS.inject(:merge).inject([]) do |rows, definition|
116
+ merged_notifiers = ::Guard::Notifier::NOTIFIERS.inject(:merge)
117
+ final_rows = merged_notifiers.each_with_object([]) do |definition, rows|
118
+
90
119
  name = definition[0]
91
120
  clazz = definition[1]
92
- available = clazz.available?(silent: true) ? '' : ''
93
- notifier = ::Guard::Notifier.notifiers.find { |n| n[:name] == name }
94
- used = notifier ? '' : ''
95
- options = notifier ? notifier[:options] : {}
96
- defaults = clazz.const_defined?(:DEFAULTS) ? clazz.const_get(:DEFAULTS) : {}
97
- options = defaults.merge(options)
121
+ available = clazz.available?(silent: true) ? "" : ""
122
+ notifier = ::Guard::Notifier.notifiers.detect { |n| n[:name] == name }
123
+ used = notifier ? "" : ""
124
+
125
+ options = _merge_options(clazz, notifier)
98
126
  options.delete(:silent)
99
127
 
100
128
  if options.empty?
101
129
  rows << :split
102
- rows << { Name: name, Available: available, Used: used, Option: '', Value: '' }
130
+ _add_row(rows, name, available, used, "", "")
103
131
  else
104
132
  options.each_with_index do |(option, value), index|
105
133
  if index == 0
106
134
  rows << :split
107
- rows << { Name: name, Available: available, Used: used, Option: option.to_s, Value: value.inspect }
135
+ _add_row(rows, name, available, used, option.to_s, value.inspect)
108
136
  else
109
- rows << { Name: '', Available: '', Used: '', Option: option.to_s, Value: value.inspect }
137
+ _add_row(rows, "", "", "", option.to_s, value.inspect)
110
138
  end
111
139
  end
112
140
  end
@@ -114,7 +142,10 @@ module Guard
114
142
  rows
115
143
  end
116
144
 
117
- Formatador.display_compact_table(rows.drop(1), [:Name, :Available, :Used, :Option, :Value])
145
+ Formatador.display_compact_table(
146
+ final_rows.drop(1),
147
+ [:Name, :Available, :Used, :Option, :Value]
148
+ )
118
149
  end
119
150
 
120
151
  private
@@ -123,8 +154,29 @@ module Guard
123
154
  # {Guard::Guardfile::Evaluator#evaluate_guardfile}.
124
155
  #
125
156
  def _evaluate_guardfile
126
- ::Guard::Guardfile::Evaluator.new(options).evaluate_guardfile
157
+ ::Guard.save_scope
158
+ ::Guard::Guardfile::Evaluator.new(::Guard.options).evaluate_guardfile
159
+ ::Guard.restore_scope
160
+ end
161
+
162
+ def _merge_options(klass, notifier)
163
+ notify_options = notifier ? notifier[:options] : {}
164
+
165
+ if klass.const_defined?(:DEFAULTS)
166
+ klass.const_get(:DEFAULTS).merge(notify_options)
167
+ else
168
+ notify_options
169
+ end
127
170
  end
128
171
 
172
+ def _add_row(rows, name, available, used, option, value)
173
+ rows << {
174
+ Name: name,
175
+ Available: available,
176
+ Used: used,
177
+ Option: option,
178
+ Value: value
179
+ }
180
+ end
129
181
  end
130
182
  end
@@ -0,0 +1,184 @@
1
+ # encoding: utf-8
2
+ require "formatador"
3
+
4
+ require "guard/guardfile/evaluator"
5
+ require "guard/ui"
6
+
7
+ module Guard
8
+ # The DslDescriber evaluates the Guardfile and creates an internal structure
9
+ # of it that is used in some inspection utility methods like the CLI commands
10
+ # `show` and `list`.
11
+ #
12
+ # @see Guard::Dsl
13
+ # @see Guard::CLI
14
+ #
15
+ class DslDescriber
16
+ attr_reader :options
17
+
18
+ # Initializes a new DslDescriber object.
19
+ #
20
+ # @option options [String] guardfile the path to a valid Guardfile
21
+ #
22
+ # @option options [String] guardfile_contents a string representing the
23
+ # content of a valid Guardfile
24
+ #
25
+ # @see Guard::Guardfile::Evaluator#initialize
26
+ #
27
+ def initialize(options = {})
28
+ @options = options
29
+ ::Guard.reset_groups
30
+ ::Guard.reset_plugins
31
+ ::Guard.reset_scope
32
+ end
33
+
34
+ # List the Guard plugins that are available for use in your system and marks
35
+ # those that are currently used in your `Guardfile`.
36
+ #
37
+ # @see CLI#list
38
+ #
39
+ def list
40
+ _evaluate_guardfile
41
+
42
+ names = ::Guard::PluginUtil.plugin_names.sort.uniq
43
+ final_rows = names.inject([]) do |rows, name|
44
+ rows << {
45
+ Plugin: name.capitalize,
46
+ Guardfile: ::Guard.plugins(name) ? "✔" : "✘"
47
+ }
48
+ end
49
+
50
+ Formatador.display_compact_table(final_rows, [:Plugin, :Guardfile])
51
+ end
52
+
53
+ # Shows all Guard plugins and their options that are defined in
54
+ # the `Guardfile`.
55
+ #
56
+ # @see CLI#show
57
+ #
58
+ def show
59
+ _evaluate_guardfile
60
+ groups = ::Guard.groups
61
+
62
+ final_rows = groups.each_with_object([]) do |group, rows|
63
+
64
+ plugins = Array(::Guard.plugins(group: group.name))
65
+
66
+ plugins.each do |plugin|
67
+ options = plugin.options.inject({}) do |o, (k, v)|
68
+ o.tap { |option| option[k.to_s] = v }
69
+ end.sort
70
+
71
+ if options.empty?
72
+ rows << :split
73
+ rows << {
74
+ Group: group.title,
75
+ Plugin: plugin.title,
76
+ Option: "",
77
+ Value: ""
78
+ }
79
+ else
80
+ options.each_with_index do |(option, value), index|
81
+ if index == 0
82
+ rows << :split
83
+ rows << {
84
+ Group: group.title,
85
+ Plugin: plugin.title,
86
+ Option: option.to_s,
87
+ Value: value.inspect
88
+ }
89
+ else
90
+ rows << {
91
+ Group: "",
92
+ Plugin: "",
93
+ Option: option.to_s,
94
+ Value: value.inspect
95
+ }
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ rows
102
+ end
103
+
104
+ Formatador.display_compact_table(
105
+ final_rows.drop(1),
106
+ [:Group, :Plugin, :Option, :Value]
107
+ )
108
+ end
109
+
110
+ # Shows all notifiers and their options that are defined in
111
+ # the `Guardfile`.
112
+ #
113
+ # @see CLI#show
114
+ #
115
+ def notifiers
116
+ _evaluate_guardfile
117
+
118
+ merged_notifiers = ::Guard::Notifier::NOTIFIERS.inject(:merge)
119
+ final_rows = merged_notifiers.each_with_object([]) do |definition, rows|
120
+
121
+ name = definition[0]
122
+ clazz = definition[1]
123
+ available = clazz.available?(silent: true) ? "✔" : "✘"
124
+ notifier = ::Guard::Notifier.notifiers.detect { |n| n[:name] == name }
125
+ used = notifier ? "✔" : "✘"
126
+
127
+ options = _merge_options(clazz, notifier)
128
+ options.delete(:silent)
129
+
130
+ if options.empty?
131
+ rows << :split
132
+ _add_row(rows, name, available, used, "", "")
133
+ else
134
+ options.each_with_index do |(option, value), index|
135
+ if index == 0
136
+ rows << :split
137
+ _add_row(rows, name, available, used, option.to_s, value.inspect)
138
+ else
139
+ _add_row(rows, "", "", "", option.to_s, value.inspect)
140
+ end
141
+ end
142
+ end
143
+
144
+ rows
145
+ end
146
+
147
+ Formatador.display_compact_table(
148
+ final_rows.drop(1),
149
+ [:Name, :Available, :Used, :Option, :Value]
150
+ )
151
+ end
152
+
153
+ private
154
+
155
+ # Evaluates the `Guardfile` by delegating to
156
+ # {Guard::Guardfile::Evaluator#evaluate_guardfile}.
157
+ #
158
+ def _evaluate_guardfile
159
+ ::Guard.save_scope
160
+ ::Guard::Guardfile::Evaluator.new(options).evaluate_guardfile
161
+ ::Guard.restore_scope
162
+ end
163
+
164
+ def _merge_options(klass, notifier)
165
+ notify_options = notifier ? notifier[:options] : {}
166
+
167
+ if klass.const_defined?(:DEFAULTS)
168
+ klass.const_get(:DEFAULTS).merge(notify_options)
169
+ else
170
+ notify_options
171
+ end
172
+ end
173
+
174
+ def _add_row(rows, name, available, used, option, value)
175
+ rows << {
176
+ Name: name,
177
+ Available: available,
178
+ Used: used,
179
+ Option: option,
180
+ Value: value
181
+ }
182
+ end
183
+ end
184
+ end
data/lib/guard/group.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  module Guard
2
-
3
2
  # A group of Guard plugins. There are two reasons why you want to group your
4
3
  # Guard plugins:
5
4
  #
@@ -11,16 +10,18 @@ module Guard
11
10
  # @example Group that aborts on failure
12
11
  #
13
12
  # group :frontend, halt_on_fail: true do
14
- # guard 'coffeescript', input: 'spec/coffeescripts', output: 'spec/javascripts'
13
+ # guard 'coffeescript', input: 'spec/coffeescripts',
14
+ # output: 'spec/javascripts'
15
15
  # guard 'jasmine-headless-webkit' do
16
- # watch(%r{^spec/javascripts/(.*)\..*}) { |m| newest_js_file("spec/javascripts/#{m[1]}_spec") }
16
+ # watch(%r{^spec/javascripts/(.*)\..*}) do |m|
17
+ # newest_js_file("spec/javascripts/#{m[1]}_spec")
18
+ # end
17
19
  # end
18
20
  # end
19
21
  #
20
22
  # @see Guard::CLI
21
23
  #
22
24
  class Group
23
-
24
25
  attr_accessor :name, :options
25
26
 
26
27
  # Initializes a Group.
@@ -28,7 +29,8 @@ module Guard
28
29
  # @param [String] name the name of the group
29
30
  # @param [Hash] options the group options
30
31
  # @option options [Boolean] halt_on_fail if a task execution
31
- # should be halted for all Guard plugins in this group if a Guard plugin throws `:task_has_failed`
32
+ # should be halted for all Guard plugins in this group if a Guard plugin
33
+ # throws `:task_has_failed`
32
34
  #
33
35
  def initialize(name, options = {})
34
36
  @name = name.to_sym
@@ -58,6 +60,5 @@ module Guard
58
60
  def to_s
59
61
  "#<#{self.class} @name=#{name} @options=#{options}>"
60
62
  end
61
-
62
63
  end
63
64
  end
data/lib/guard/guard.rb CHANGED
@@ -1,7 +1,6 @@
1
- require 'guard/plugin/base'
1
+ require "guard/plugin/base"
2
2
 
3
3
  module Guard
4
-
5
4
  # @deprecated Inheriting from `Guard::Guard` is deprecated, please inherit
6
5
  # from {Plugin} instead. Please note that the constructor signature has
7
6
  # changed from `Guard::Guard#initialize(watchers = [], options = {})` to
@@ -30,13 +29,14 @@ module Guard
30
29
  # @option options [Symbol] group the group this Guard plugin belongs to
31
30
  # @option options [Boolean] any_return allow any object to be returned from
32
31
  # a watcher
32
+ # @option options [Boolean] first_match stop after the first watcher that
33
+ # returns a valid result
33
34
  #
34
35
  def initialize(watchers = [], options = {})
35
- ::Guard::UI.deprecation(::Guard::Deprecator::GUARD_GUARD_DEPRECATION % title)
36
+ UI.deprecation(Deprecator::GUARD_GUARD_DEPRECATION % title)
36
37
 
37
38
  _set_instance_variables_from_options(options.merge(watchers: watchers))
38
39
  _register_callbacks
39
40
  end
40
-
41
41
  end
42
42
  end