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
@@ -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