-
Notifications
You must be signed in to change notification settings - Fork 483
/
guard.rb
192 lines (173 loc) · 5.6 KB
/
guard.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
require 'rbconfig'
require 'guard/commander'
require 'guard/deprecated_methods'
require 'guard/deprecator'
require 'guard/dsl'
require 'guard/group'
require 'guard/guardfile'
require 'guard/interactor'
require 'guard/notifier'
require 'guard/plugin_util'
require 'guard/runner'
require 'guard/setuper'
require 'guard/ui'
require 'guard/watcher'
# Guard is the main module for all Guard related modules and classes.
# Also Guard plugins should use this namespace.
#
module Guard
WINDOWS = RbConfig::CONFIG['host_os'] =~ %r!(msdos|mswin|djgpp|mingw)!
DEV_NULL = WINDOWS ? 'NUL' : '/dev/null'
extend Commander
extend DeprecatedMethods
extend Setuper
class << self
attr_accessor :evaluator, :interactor, :runner, :listener, :lock, :scope, :running
# Smart accessor for retrieving specific plugins at once.
#
# @see Guard.plugin
# @see Guard.group
# @see Guard.groups
#
# @example Filter plugins by String or Symbol
# Guard.plugins('rspec')
# Guard.plugins(:rspec)
#
# @example Filter plugins by Regexp
# Guard.plugins(/rsp.+/)
#
# @example Filter plugins by Hash
# Guard.plugins(name: 'rspec', group: 'backend')
#
# @param [String, Symbol, Regexp, Hash] filter the filter to apply to the plugins
# @return [Plugin, Array<Plugin>] the filtered plugin(s)
#
def plugins(filter = nil)
@plugins ||= []
return @plugins if filter.nil?
filtered_plugins = case filter
when String, Symbol
@plugins.find_all do |plugin|
plugin.name == filter.to_s.downcase.gsub('-', '')
end
when Regexp
@plugins.find_all do |plugin|
plugin.name =~ filter
end
when Hash
@plugins.find_all do |plugin|
filter.all? do |k, v|
case k
when :name
plugin.name == v.to_s.downcase.gsub('-', '')
when :group
plugin.group.name == v.to_sym
end
end
end
end
filtered_plugins
end
# Smart accessor for retrieving a specific plugin.
#
# @see Guard.plugins
# @see Guard.group
# @see Guard.groups
#
# @example Find a plugin by String or Symbol
# Guard.plugin('rspec')
# Guard.plugin(:rspec)
#
# @example Find a plugin by Regexp
# Guard.plugin(/rsp.+/)
#
# @example Find a plugin by Hash
# Guard.plugin(name: 'rspec', group: 'backend')
#
# @param [String, Symbol, Regexp, Hash] filter the filter for finding the plugin
# the Guard plugin
# @return [Plugin, nil] the plugin found, nil otherwise
#
def plugin(filter)
plugins(filter).first
end
# Smart accessor for retrieving specific groups at once.
#
# @see Guard.plugin
# @see Guard.plugins
# @see Guard.group
#
# @example Filter groups by String or Symbol
# Guard.groups('backend')
# Guard.groups(:backend)
#
# @example Filter groups by Regexp
# Guard.groups(/(back|front)end/)
#
# @param [String, Symbol, Regexp] filter the filter to apply to the Groups
# @return [Array<Group>] the filtered group(s)
#
def groups(filter = nil)
return @groups if filter.nil?
filtered_groups = case filter
when String, Symbol
@groups.find_all { |group| group.name == filter.to_sym }
when Regexp
@groups.find_all { |group| group.name.to_s =~ filter }
end
filtered_groups
end
# Smart accessor for retrieving a specific group.
#
# @see Guard.plugin
# @see Guard.plugins
# @see Guard.groups
#
# @example Find a group by String or Symbol
# Guard.group('backend')
# Guard.group(:backend)
#
# @example Find a group by Regexp
# Guard.group(/(back|front)end/)
#
# @param [String, Symbol, Regexp] filter the filter for finding the group
# @return [Group] the group found, nil otherwise
#
def group(filter)
groups(filter).first
end
# Add a Guard plugin to use.
#
# @param [String] name the Guard name
# @param [Hash] options the plugin options (see the given Guard documentation)
# @option options [String] group the group to which the Guard plugin belongs
# @option options [Array<Watcher>] watchers the list of declared watchers
# @option options [Array<Hash>] callbacks the list of callbacks
# @return [Plugin] the added Guard plugin
# @see Plugin
#
def add_plugin(name, options = {})
plugin_instance = ::Guard::PluginUtil.new(name).initialize_plugin(options)
@plugins << plugin_instance
plugin_instance
end
# Add a Guard plugin group.
#
# @param [String] name the group name
# @option options [Boolean] halt_on_fail if a task execution
# should be halted for all Guard plugins in this group if
# one Guard throws `:task_has_failed`
# @return [Group] the group added (or retrieved from the `@groups`
# variable if already present)
#
# @see Group
#
def add_group(name, options = {})
unless group = group(name)
group = ::Guard::Group.new(name, options)
@groups << group
end
group
end
end
end