guard 1.4.0 → 2.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1 -677
- data/LICENSE +4 -2
- data/README.md +91 -753
- data/bin/_guard-core +11 -0
- data/bin/guard +108 -3
- data/lib/guard/aruba_adapter.rb +59 -0
- data/lib/guard/cli/environments/bundler.rb +22 -0
- data/lib/guard/cli/environments/evaluate_only.rb +35 -0
- data/lib/guard/cli/environments/valid.rb +69 -0
- data/lib/guard/cli.rb +129 -128
- data/lib/guard/commander.rb +104 -0
- data/lib/guard/commands/all.rb +37 -0
- data/lib/guard/commands/change.rb +31 -0
- data/lib/guard/commands/notification.rb +26 -0
- data/lib/guard/commands/pause.rb +29 -0
- data/lib/guard/commands/reload.rb +36 -0
- data/lib/guard/commands/scope.rb +38 -0
- data/lib/guard/commands/show.rb +24 -0
- data/lib/guard/config.rb +18 -0
- data/lib/guard/deprecated/dsl.rb +45 -0
- data/lib/guard/deprecated/evaluator.rb +39 -0
- data/lib/guard/deprecated/guard.rb +328 -0
- data/lib/guard/deprecated/guardfile.rb +84 -0
- data/lib/guard/deprecated/watcher.rb +27 -0
- data/lib/guard/dsl.rb +332 -363
- data/lib/guard/dsl_describer.rb +132 -122
- data/lib/guard/dsl_reader.rb +51 -0
- data/lib/guard/group.rb +34 -14
- data/lib/guard/guardfile/evaluator.rb +232 -0
- data/lib/guard/guardfile/generator.rb +128 -0
- data/lib/guard/guardfile.rb +24 -60
- data/lib/guard/interactor.rb +31 -255
- data/lib/guard/internals/debugging.rb +68 -0
- data/lib/guard/internals/groups.rb +40 -0
- data/lib/guard/internals/helpers.rb +13 -0
- data/lib/guard/internals/plugins.rb +53 -0
- data/lib/guard/internals/queue.rb +51 -0
- data/lib/guard/internals/scope.rb +121 -0
- data/lib/guard/internals/session.rb +180 -0
- data/lib/guard/internals/state.rb +25 -0
- data/lib/guard/internals/tracing.rb +33 -0
- data/lib/guard/internals/traps.rb +10 -0
- data/lib/guard/jobs/base.rb +21 -0
- data/lib/guard/jobs/pry_wrapper.rb +336 -0
- data/lib/guard/jobs/sleep.rb +26 -0
- data/lib/guard/notifier.rb +46 -212
- data/lib/guard/options.rb +22 -0
- data/lib/guard/plugin.rb +303 -0
- data/lib/guard/plugin_util.rb +191 -0
- data/lib/guard/rake_task.rb +42 -0
- data/lib/guard/runner.rb +80 -140
- data/lib/guard/templates/Guardfile +14 -0
- data/lib/guard/terminal.rb +13 -0
- data/lib/guard/ui/colors.rb +56 -0
- data/lib/guard/ui/config.rb +70 -0
- data/lib/guard/ui/logger.rb +30 -0
- data/lib/guard/ui.rb +163 -128
- data/lib/guard/version.rb +1 -2
- data/lib/guard/watcher/pattern/deprecated_regexp.rb +45 -0
- data/lib/guard/watcher/pattern/match_result.rb +18 -0
- data/lib/guard/watcher/pattern/matcher.rb +33 -0
- data/lib/guard/watcher/pattern/pathname_path.rb +15 -0
- data/lib/guard/watcher/pattern/simple_path.rb +23 -0
- data/lib/guard/watcher/pattern.rb +24 -0
- data/lib/guard/watcher.rb +52 -95
- data/lib/guard.rb +108 -376
- data/lib/tasks/releaser.rb +116 -0
- data/man/guard.1 +12 -9
- data/man/guard.1.html +18 -12
- metadata +148 -77
- data/images/guard.png +0 -0
- data/lib/guard/guard.rb +0 -156
- data/lib/guard/hook.rb +0 -120
- data/lib/guard/interactors/coolline.rb +0 -64
- data/lib/guard/interactors/helpers/completion.rb +0 -32
- data/lib/guard/interactors/helpers/terminal.rb +0 -46
- data/lib/guard/interactors/readline.rb +0 -94
- data/lib/guard/interactors/simple.rb +0 -19
- data/lib/guard/notifiers/emacs.rb +0 -69
- data/lib/guard/notifiers/gntp.rb +0 -118
- data/lib/guard/notifiers/growl.rb +0 -99
- data/lib/guard/notifiers/growl_notify.rb +0 -92
- data/lib/guard/notifiers/libnotify.rb +0 -96
- data/lib/guard/notifiers/notifysend.rb +0 -84
- data/lib/guard/notifiers/rb_notifu.rb +0 -102
- data/lib/guard/notifiers/terminal_notifier.rb +0 -66
- data/lib/guard/notifiers/tmux.rb +0 -69
- data/lib/guard/version.rbc +0 -130
data/lib/guard/ui.rb
CHANGED
@@ -1,62 +1,112 @@
|
|
1
|
-
|
1
|
+
require "guard/ui/colors"
|
2
|
+
require "guard/ui/config"
|
3
|
+
|
4
|
+
require "guard/terminal"
|
5
|
+
require "forwardable"
|
6
|
+
|
7
|
+
# TODO: rework this class from the bottom-up
|
8
|
+
# - remove dependency on Session and Scope
|
9
|
+
# - extract into a separate gem
|
10
|
+
# - change UI to class
|
2
11
|
|
3
|
-
|
4
|
-
#
|
5
|
-
#
|
12
|
+
module Guard
|
13
|
+
# The UI class helps to format messages for the user. Everything that is
|
14
|
+
# logged through this class is considered either as an error message or a
|
15
|
+
# diagnostic message and is written to standard error ($stderr).
|
6
16
|
#
|
7
|
-
# If your Guard plugin does some output that is piped into another process
|
8
|
-
# processing, please just write it to STDOUT with `puts`.
|
17
|
+
# If your Guard plugin does some output that is piped into another process
|
18
|
+
# for further processing, please just write it to STDOUT with `puts`.
|
9
19
|
#
|
10
20
|
module UI
|
21
|
+
include Colors
|
22
|
+
|
11
23
|
class << self
|
24
|
+
# Get the Guard::UI logger instance
|
25
|
+
#
|
26
|
+
def logger
|
27
|
+
@logger ||=
|
28
|
+
begin
|
29
|
+
require "lumberjack"
|
30
|
+
Lumberjack::Logger.new(options.device, options.logger_config)
|
31
|
+
end
|
32
|
+
end
|
12
33
|
|
13
|
-
|
34
|
+
# Since logger is global, for Aruba in-process to properly
|
35
|
+
# separate output between calls, we need to reset
|
36
|
+
#
|
37
|
+
# We don't use logger=() since it's expected to be a Lumberjack instance
|
38
|
+
def reset_logger
|
39
|
+
@logger = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get the logger options
|
43
|
+
#
|
44
|
+
# @return [Hash] the logger options
|
45
|
+
#
|
46
|
+
def options
|
47
|
+
@options ||= Config.new
|
48
|
+
end
|
49
|
+
|
50
|
+
# Set the logger options
|
51
|
+
#
|
52
|
+
# @param [Hash] options the logger options
|
53
|
+
# @option options [Symbol] level the log level
|
54
|
+
# @option options [String] template the logger template
|
55
|
+
# @option options [String] time_format the time format
|
56
|
+
#
|
57
|
+
# TODO: deprecate?
|
58
|
+
def options=(options)
|
59
|
+
@options = Config.new(options)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Assigns a log level
|
63
|
+
def level=(new_level)
|
64
|
+
options.logger_config.level = new_level
|
65
|
+
@logger.level = new_level if @logger
|
66
|
+
end
|
14
67
|
|
15
68
|
# Show an info message.
|
16
69
|
#
|
17
70
|
# @param [String] message the message to show
|
18
71
|
# @option options [Boolean] reset whether to clean the output before
|
72
|
+
# @option options [String] plugin manually define the calling plugin
|
19
73
|
#
|
20
|
-
def info(message, options = {
|
21
|
-
|
22
|
-
reset_line if options[:reset]
|
23
|
-
STDERR.puts color(message) if message != ''
|
24
|
-
end
|
74
|
+
def info(message, options = {})
|
75
|
+
_filtered_logger_message(message, :info, nil, options)
|
25
76
|
end
|
26
77
|
|
27
78
|
# Show a yellow warning message that is prefixed with WARNING.
|
28
79
|
#
|
29
80
|
# @param [String] message the message to show
|
30
81
|
# @option options [Boolean] reset whether to clean the output before
|
82
|
+
# @option options [String] plugin manually define the calling plugin
|
31
83
|
#
|
32
|
-
def warning(message, options = {
|
33
|
-
|
34
|
-
reset_line if options[:reset]
|
35
|
-
STDERR.puts color('WARNING: ', :yellow) + message
|
36
|
-
end
|
84
|
+
def warning(message, options = {})
|
85
|
+
_filtered_logger_message(message, :warn, :yellow, options)
|
37
86
|
end
|
38
87
|
|
39
88
|
# Show a red error message that is prefixed with ERROR.
|
40
89
|
#
|
41
90
|
# @param [String] message the message to show
|
42
91
|
# @option options [Boolean] reset whether to clean the output before
|
92
|
+
# @option options [String] plugin manually define the calling plugin
|
43
93
|
#
|
44
|
-
def error(message, options = {
|
45
|
-
|
46
|
-
reset_line if options[:reset]
|
47
|
-
STDERR.puts color('ERROR: ', :red) + message
|
48
|
-
end
|
94
|
+
def error(message, options = {})
|
95
|
+
_filtered_logger_message(message, :error, :red, options)
|
49
96
|
end
|
50
97
|
|
51
98
|
# Show a red deprecation message that is prefixed with DEPRECATION.
|
99
|
+
# It has a log level of `warn`.
|
52
100
|
#
|
53
101
|
# @param [String] message the message to show
|
54
102
|
# @option options [Boolean] reset whether to clean the output before
|
103
|
+
# @option options [String] plugin manually define the calling plugin
|
55
104
|
#
|
56
|
-
def deprecation(message, options = {
|
57
|
-
unless ENV[
|
58
|
-
|
59
|
-
|
105
|
+
def deprecation(message, options = {})
|
106
|
+
unless ENV["GUARD_GEM_SILENCE_DEPRECATIONS"] == "1"
|
107
|
+
backtrace = Thread.current.backtrace[1..5].join("\n\t >")
|
108
|
+
msg = format("%s\nDeprecation backtrace: %s", message, backtrace)
|
109
|
+
warning(msg, options)
|
60
110
|
end
|
61
111
|
end
|
62
112
|
|
@@ -64,27 +114,37 @@ module Guard
|
|
64
114
|
#
|
65
115
|
# @param [String] message the message to show
|
66
116
|
# @option options [Boolean] reset whether to clean the output before
|
117
|
+
# @option options [String] plugin manually define the calling plugin
|
67
118
|
#
|
68
|
-
def debug(message, options = {
|
69
|
-
|
70
|
-
reset_line if options[:reset]
|
71
|
-
STDERR.puts color("DEBUG (#{Time.now.strftime('%T')}): ", :yellow) + message if ::Guard.options && ::Guard.options[:debug]
|
72
|
-
end
|
119
|
+
def debug(message, options = {})
|
120
|
+
_filtered_logger_message(message, :debug, :yellow, options)
|
73
121
|
end
|
74
122
|
|
75
123
|
# Reset a line.
|
76
124
|
#
|
77
125
|
def reset_line
|
78
|
-
|
126
|
+
$stderr.print(color_enabled? ? "\r\e[0m" : "\r\n")
|
79
127
|
end
|
80
128
|
|
81
129
|
# Clear the output if clearable.
|
82
130
|
#
|
83
|
-
def clear(
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
131
|
+
def clear(opts = {})
|
132
|
+
return unless Guard.state.session.clear?
|
133
|
+
|
134
|
+
fail "UI not set up!" if @clearable.nil?
|
135
|
+
return unless @clearable || opts[:force]
|
136
|
+
|
137
|
+
@clearable = false
|
138
|
+
Terminal.clear
|
139
|
+
rescue Errno::ENOENT => e
|
140
|
+
warning("Failed to clear the screen: #{e.inspect}")
|
141
|
+
end
|
142
|
+
|
143
|
+
# TODO: arguments: UI uses Guard::options anyway
|
144
|
+
# @private api
|
145
|
+
def reset_and_clear
|
146
|
+
@clearable = false
|
147
|
+
clear(force: true)
|
88
148
|
end
|
89
149
|
|
90
150
|
# Allow the screen to be cleared again.
|
@@ -96,26 +156,58 @@ module Guard
|
|
96
156
|
# Show a scoped action message.
|
97
157
|
#
|
98
158
|
# @param [String] action the action to show
|
99
|
-
# @param [Hash]
|
159
|
+
# @param [Hash] scope hash with a guard or a group scope
|
100
160
|
#
|
101
|
-
def action_with_scopes(action,
|
102
|
-
|
103
|
-
|
104
|
-
scope_message ||= 'all'
|
105
|
-
|
106
|
-
info "#{action} #{scope_message}"
|
161
|
+
def action_with_scopes(action, scope)
|
162
|
+
titles = Guard.state.scope.titles(scope)
|
163
|
+
info "#{action} #{titles.join(', ')}"
|
107
164
|
end
|
108
165
|
|
109
166
|
private
|
110
167
|
|
111
|
-
#
|
168
|
+
# Filters log messages depending on either the
|
169
|
+
# `:only`` or `:except` option.
|
112
170
|
#
|
113
|
-
# @
|
114
|
-
# @
|
171
|
+
# @param [String] plugin the calling plugin name
|
172
|
+
# @yield When the message should be logged
|
173
|
+
# @yieldparam [String] param the calling plugin name
|
115
174
|
#
|
116
|
-
def
|
117
|
-
|
118
|
-
|
175
|
+
def _filter(plugin)
|
176
|
+
only = options.only
|
177
|
+
except = options.except
|
178
|
+
plugin ||= _calling_plugin_name
|
179
|
+
|
180
|
+
match = !(only || except)
|
181
|
+
match ||= (only && only.match(plugin))
|
182
|
+
match ||= (except && !except.match(plugin))
|
183
|
+
return unless match
|
184
|
+
yield plugin
|
185
|
+
end
|
186
|
+
|
187
|
+
# @private
|
188
|
+
def _filtered_logger_message(message, method, color_name, options = {})
|
189
|
+
message = color(message, color_name) if color_name
|
190
|
+
|
191
|
+
_filter(options[:plugin]) do
|
192
|
+
reset_line if options[:reset]
|
193
|
+
logger.send(method, message)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# Tries to extract the calling Guard plugin name
|
198
|
+
# from the call stack.
|
199
|
+
#
|
200
|
+
# @param [Integer] depth the stack depth
|
201
|
+
# @return [String] the Guard plugin name
|
202
|
+
#
|
203
|
+
def _calling_plugin_name
|
204
|
+
name = caller.lazy.map do |line|
|
205
|
+
%r{(?<!guard\/lib)\/(guard\/[a-z_]*)(/[a-z_]*)?.rb:}i.match(line)
|
206
|
+
end.reject(&:nil?).take(1).force.first
|
207
|
+
return "Guard" unless name || (name && name[1] == "guard/lib")
|
208
|
+
name[1].split("/").map do |part|
|
209
|
+
part.split(/[^a-z0-9]/i).map(&:capitalize).join
|
210
|
+
end.join("::")
|
119
211
|
end
|
120
212
|
|
121
213
|
# Checks if color output can be enabled.
|
@@ -123,26 +215,22 @@ module Guard
|
|
123
215
|
# @return [Boolean] whether color is enabled or not
|
124
216
|
#
|
125
217
|
def color_enabled?
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
@color_enabled = true
|
218
|
+
@color_enabled_initialized ||= false
|
219
|
+
@color_enabled = nil unless @color_enabled_initialized
|
220
|
+
@color_enabled_initialized = true
|
221
|
+
return @color_enabled unless @color_enabled.nil?
|
222
|
+
return (@color_enabled = true) unless Gem.win_platform?
|
223
|
+
return (@color_enabled = true) if ENV["ANSICON"]
|
224
|
+
|
225
|
+
@color_enabled =
|
226
|
+
begin
|
227
|
+
require "rubygems" unless ENV["NO_RUBYGEMS"]
|
228
|
+
require "Win32/Console/ANSI"
|
229
|
+
true
|
230
|
+
rescue LoadError
|
231
|
+
info "Run 'gem install win32console' to use color on Windows"
|
232
|
+
false
|
142
233
|
end
|
143
|
-
end
|
144
|
-
|
145
|
-
@color_enabled
|
146
234
|
end
|
147
235
|
|
148
236
|
# Colorizes a text message. See the constant in the UI class for possible
|
@@ -157,71 +245,18 @@ module Guard
|
|
157
245
|
# @param [Array] color_options the color options
|
158
246
|
#
|
159
247
|
def color(text, *color_options)
|
160
|
-
color_code =
|
248
|
+
color_code = ""
|
161
249
|
color_options.each do |color_option|
|
162
250
|
color_option = color_option.to_s
|
163
|
-
if color_option
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
color_code += ';' + color_option
|
251
|
+
next if color_option == ""
|
252
|
+
|
253
|
+
unless color_option =~ /\d+/
|
254
|
+
color_option = const_get("ANSI_ESCAPE_#{ color_option.upcase }")
|
168
255
|
end
|
256
|
+
color_code += ";" + color_option
|
169
257
|
end
|
170
258
|
color_enabled? ? "\e[0#{ color_code }m#{ text }\e[0m" : text
|
171
259
|
end
|
172
|
-
|
173
260
|
end
|
174
|
-
|
175
|
-
# Brighten the color
|
176
|
-
ANSI_ESCAPE_BRIGHT = '1'
|
177
|
-
|
178
|
-
# Black foreground color
|
179
|
-
ANSI_ESCAPE_BLACK = '30'
|
180
|
-
|
181
|
-
# Red foreground color
|
182
|
-
ANSI_ESCAPE_RED = '31'
|
183
|
-
|
184
|
-
# Green foreground color
|
185
|
-
ANSI_ESCAPE_GREEN = '32'
|
186
|
-
|
187
|
-
# Yellow foreground color
|
188
|
-
ANSI_ESCAPE_YELLOW = '33'
|
189
|
-
|
190
|
-
# Blue foreground color
|
191
|
-
ANSI_ESCAPE_BLUE = '34'
|
192
|
-
|
193
|
-
# Magenta foreground color
|
194
|
-
ANSI_ESCAPE_MAGENTA = '35'
|
195
|
-
|
196
|
-
# Cyan foreground color
|
197
|
-
ANSI_ESCAPE_CYAN = '36'
|
198
|
-
|
199
|
-
# White foreground color
|
200
|
-
ANSI_ESCAPE_WHITE = '37'
|
201
|
-
|
202
|
-
# Black background color
|
203
|
-
ANSI_ESCAPE_BGBLACK = '40'
|
204
|
-
|
205
|
-
# Red background color
|
206
|
-
ANSI_ESCAPE_BGRED = '41'
|
207
|
-
|
208
|
-
# Green background color
|
209
|
-
ANSI_ESCAPE_BGGREEN = '42'
|
210
|
-
|
211
|
-
# Yellow background color
|
212
|
-
ANSI_ESCAPE_BGYELLOW = '43'
|
213
|
-
|
214
|
-
# Blue background color
|
215
|
-
ANSI_ESCAPE_BGBLUE = '44'
|
216
|
-
|
217
|
-
# Magenta background color
|
218
|
-
ANSI_ESCAPE_BGMAGENTA = '45'
|
219
|
-
|
220
|
-
# Cyan background color
|
221
|
-
ANSI_ESCAPE_BGCYAN = '46'
|
222
|
-
|
223
|
-
# White background color
|
224
|
-
ANSI_ESCAPE_BGWHITE = '47'
|
225
|
-
|
226
261
|
end
|
227
262
|
end
|
data/lib/guard/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative "matcher"
|
2
|
+
|
3
|
+
module Guard
|
4
|
+
class Watcher
|
5
|
+
class Pattern
|
6
|
+
# TODO: remove before Guard 3.x
|
7
|
+
class DeprecatedRegexp
|
8
|
+
def initialize(pattern)
|
9
|
+
@original_pattern = pattern
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.convert(pattern)
|
13
|
+
Matcher.new(Regexp.new(pattern))
|
14
|
+
end
|
15
|
+
|
16
|
+
def deprecated?
|
17
|
+
regexp = /(^(\^))|(>?(\\\.)|(\.\*))|(\(.*\))|(\[.*\])|(\$$)/
|
18
|
+
@original_pattern.is_a?(String) && regexp.match(@original_pattern)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.show_deprecation(pattern)
|
22
|
+
@warning_printed ||= false
|
23
|
+
|
24
|
+
unless @warning_printed
|
25
|
+
msg = "*" * 20 + "\nDEPRECATION WARNING!\n" + "*" * 20
|
26
|
+
msg += <<-MSG
|
27
|
+
You have a string in your Guardfile watch patterns that seem to
|
28
|
+
represent a Regexp.
|
29
|
+
|
30
|
+
Guard matches String with == and Regexp with Regexp#match.
|
31
|
+
|
32
|
+
You should either use plain String (without Regexp special
|
33
|
+
characters) or real Regexp.
|
34
|
+
MSG
|
35
|
+
UI.deprecation(msg)
|
36
|
+
@warning_printed = true
|
37
|
+
end
|
38
|
+
|
39
|
+
new_regexp = Regexp.new(pattern).inspect
|
40
|
+
UI.info "\"#{pattern}\" will be converted to #{new_regexp}\n"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Guard
|
2
|
+
class Watcher
|
3
|
+
class Pattern
|
4
|
+
class MatchResult
|
5
|
+
def initialize(match_result, original_value)
|
6
|
+
@match_result = match_result
|
7
|
+
@original_value = original_value
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](index)
|
11
|
+
return @match_result[index] if index.is_a?(Symbol)
|
12
|
+
return @original_value if index.zero?
|
13
|
+
@match_result.to_a[index]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Guard
|
2
|
+
class Watcher
|
3
|
+
class Pattern
|
4
|
+
class Matcher
|
5
|
+
attr_reader :matcher
|
6
|
+
|
7
|
+
def initialize(obj)
|
8
|
+
@matcher = obj
|
9
|
+
end
|
10
|
+
|
11
|
+
# Compare with other matcher
|
12
|
+
# @param other [Guard::Watcher::Pattern::Matcher]
|
13
|
+
# other matcher for comparing
|
14
|
+
# @return [true, false] equal or not
|
15
|
+
def ==(other)
|
16
|
+
matcher == other.matcher
|
17
|
+
end
|
18
|
+
|
19
|
+
def match(string_or_pathname)
|
20
|
+
@matcher.match(normalized(string_or_pathname))
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def normalized(string_or_pathname)
|
26
|
+
path = Pathname.new(string_or_pathname).cleanpath
|
27
|
+
return path.to_s if @matcher.is_a?(Regexp)
|
28
|
+
path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Guard
|
2
|
+
class Watcher
|
3
|
+
class Pattern
|
4
|
+
class SimplePath
|
5
|
+
def initialize(string_or_pathname)
|
6
|
+
@path = normalize(string_or_pathname)
|
7
|
+
end
|
8
|
+
|
9
|
+
def match(string_or_pathname)
|
10
|
+
cleaned = normalize(string_or_pathname)
|
11
|
+
return nil unless @path == cleaned
|
12
|
+
[cleaned]
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def normalize(string_or_pathname)
|
18
|
+
Pathname.new(string_or_pathname).cleanpath.to_s
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "guard/ui"
|
2
|
+
|
3
|
+
require_relative "pattern/match_result"
|
4
|
+
require_relative "pattern/matcher"
|
5
|
+
require_relative "pattern/deprecated_regexp"
|
6
|
+
require_relative "pattern/simple_path"
|
7
|
+
require_relative "pattern/pathname_path"
|
8
|
+
|
9
|
+
module Guard
|
10
|
+
class Watcher
|
11
|
+
class Pattern
|
12
|
+
def self.create(pattern)
|
13
|
+
if DeprecatedRegexp.new(pattern).deprecated?
|
14
|
+
DeprecatedRegexp.show_deprecation(pattern)
|
15
|
+
return DeprecatedRegexp.convert(pattern)
|
16
|
+
end
|
17
|
+
|
18
|
+
return PathnamePath.new(pattern) if pattern.is_a?(Pathname)
|
19
|
+
return SimplePath.new(pattern) if pattern.is_a?(String)
|
20
|
+
Matcher.new(pattern)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|