guard 2.5.1 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dfaee517cc2aeebf0c6f342096d0096c3bc6b2d8
4
- data.tar.gz: 2d9a10f8924c4869b26b498c6bd9f21d3b89e5d0
3
+ metadata.gz: 949af1dc04bc3ed850cf0b63fd523bc1ddb3316a
4
+ data.tar.gz: a200da636376286362b7c8c06bfe48586c52124b
5
5
  SHA512:
6
- metadata.gz: 0c631b422854e4addbb6416c6644bc764fe012f6026ca420ea851fe32962f91f717f2f92f01af5adf2a95bf5fad29ab10c3967cbef836271a9674aeef2bf0b77
7
- data.tar.gz: 755d7a94b32acedca6b56cec9680b2cc64aeaefd1e06d753d1facdf0c71580ee3de720e3a586fd59093e5b41fc7603a32bc94c2fe73041dcb8ffaf7cba85b455
6
+ metadata.gz: 409a80a8cf1172d1d077e5a147d26a2dc91f4d90e0adcb17b1fbbe183e6404b087e91294536c3d94448ed0cc59f63bd2b30f2c21275e80fea34bd4ab17c7bece
7
+ data.tar.gz: 6642c59beed12c1b3bddd5eb93b3e8579a56a85f4c531ede1c193811feb1b3d32f96b0164b4c982c467dba2f3fbc15a4b1ee8b5508006c6f7af48398f8fd6b4f
data/LICENSE CHANGED
@@ -1,3 +1,5 @@
1
+ The MIT License (MIT)
2
+
1
3
  Copyright (c) 2009-2014 Thibaud Guillaume-Gentil
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
- Guard [![Gem Version](https://badge.fury.io/rb/guard.png)](http://badge.fury.io/rb/guard) [![Build Status](https://travis-ci.org/guard/guard.png?branch=master)](https://travis-ci.org/guard/guard) [![Dependency Status](https://gemnasium.com/guard/guard.png)](https://gemnasium.com/guard/guard) [![Code Climate](https://codeclimate.com/github/guard/guard.png)](https://codeclimate.com/github/guard/guard) [![Coverage Status](https://coveralls.io/repos/guard/guard/badge.png?branch=master)](https://coveralls.io/r/guard/guard)
1
+ Guard
2
2
  =====
3
3
 
4
+ [![Gem Version](https://badge.fury.io/rb/guard.png)](http://badge.fury.io/rb/guard) [![Build Status](https://travis-ci.org/guard/guard.png?branch=master)](https://travis-ci.org/guard/guard) [![Dependency Status](https://gemnasium.com/guard/guard.png)](https://gemnasium.com/guard/guard) [![Code Climate](https://codeclimate.com/github/guard/guard.png)](https://codeclimate.com/github/guard/guard) [![Coverage Status](https://coveralls.io/repos/guard/guard/badge.png?branch=master)](https://coveralls.io/r/guard/guard) [![Inline docs](http://inch-pages.github.io/github/guard/guard.png)](http://inch-pages.github.io/github/guard/guard)
5
+
4
6
  <img src="http://cl.ly/image/1k3o1r2Z3a0J/guard-Icon.png" alt="Guard Icon" align="right" />
5
7
  Guard is a command line tool to easily handle events on file system modifications.
6
8
 
@@ -399,7 +401,7 @@ more detailed information. `help guard` will show all Guard related commands ava
399
401
 
400
402
  Pry supports the Ruby built-in Readline, [rb-readline](https://github.com/luislavena/rb-readline) and
401
403
  [Coolline](https://github.com/Mon-Ouie/coolline). Just install the readline implementation of your choice by adding it
402
- to your `Gemfile.
404
+ to your `Gemfile`.
403
405
 
404
406
  You can also disable the interactions completely by running Guard with the `--no-interactions` option.
405
407
 
@@ -492,10 +494,17 @@ You can also launch any arbitrary command in the supplied block:
492
494
 
493
495
  ```ruby
494
496
  guard :shell do
495
- watch('.*') { `git status` }
497
+ watch(/.*/) { `git status` }
496
498
  end
497
499
  ```
498
500
 
501
+ You can also define `watch`es outside of a `guard` plugin. This is useful to perform arbitrary Ruby
502
+ logic (i.e. something project-specific).
503
+
504
+ ```ruby
505
+ watch(/.*/) { |m| puts "#{m[0]} changed." }
506
+ ```
507
+
499
508
  ### group
500
509
 
501
510
  The `group` method allows you to group several plugins together. This comes in handy especially when you
@@ -165,16 +165,16 @@ module Guard
165
165
  # @see #group
166
166
  #
167
167
  def guard(name, options = {})
168
- @watchers = []
169
- @callbacks = []
168
+ @plugin_options = options.merge(watchers: [], callbacks: [])
170
169
 
171
170
  yield if block_given?
172
171
 
173
172
  groups = @current_groups && @current_groups.last || [:default]
174
173
  groups.each do |group|
175
- options.merge!(group: group, watchers: @watchers, callbacks: @callbacks)
176
- ::Guard.add_plugin(name, options)
174
+ ::Guard.add_plugin(name, @plugin_options.merge(group: group))
177
175
  end
176
+
177
+ @plugin_options = nil
178
178
  end
179
179
 
180
180
  # Defines a pattern to be watched in order to run actions on file modification.
@@ -186,6 +186,9 @@ module Guard
186
186
  # watch(%r{^app/controllers/(.+).rb}) { |m| 'spec/acceptance/#{m[1]}s_spec.rb' }
187
187
  # end
188
188
  #
189
+ # @example Declare global watchers outside of a Guard
190
+ # watch(%r{^(.+)$}) { |m| puts "#{m[1]} changed." }
191
+ #
189
192
  # @param [String, Regexp] pattern the pattern that Guard must watch for modification
190
193
  # @yield a block to be run when the pattern is matched
191
194
  # @yieldparam [MatchData] m matches of the pattern
@@ -195,7 +198,11 @@ module Guard
195
198
  # @see #guard
196
199
  #
197
200
  def watch(pattern, &action)
198
- @watchers << ::Guard::Watcher.new(pattern, action)
201
+ # Allow watches in the global scope (to execute arbitrary commands) by
202
+ # building a generic Guard::Plugin.
203
+ return guard(:plugin) { watch(pattern, &action) } unless @plugin_options
204
+
205
+ @plugin_options[:watchers] << ::Guard::Watcher.new(pattern, action)
199
206
  end
200
207
 
201
208
  # Defines a callback to execute arbitrary code before or after any of
@@ -216,6 +223,8 @@ module Guard
216
223
  # @see Guard::Hooker
217
224
  #
218
225
  def callback(*args, &block)
226
+ fail "callback must be called within a guard block" unless @plugin_options
227
+
219
228
  block, events = if args.size > 1
220
229
  # block must be the first argument in that case, the yielded block is
221
230
  # ignored
@@ -223,7 +232,7 @@ module Guard
223
232
  else
224
233
  [block, args[0]]
225
234
  end
226
- @callbacks << { events: events, listener: block }
235
+ @plugin_options[:callbacks] << { events: events, listener: block }
227
236
  end
228
237
 
229
238
  # Ignores certain paths globally.
@@ -10,7 +10,7 @@ module Guard
10
10
  #
11
11
  class Evaluator
12
12
 
13
- attr_reader :options
13
+ attr_reader :options, :guardfile_source, :guardfile_path
14
14
 
15
15
  # Initializes a new Guard::Guardfile::Evaluator object.
16
16
  #
@@ -41,6 +41,9 @@ module Guard
41
41
  # the current Guard configuration.
42
42
  #
43
43
  def reevaluate_guardfile
44
+ # Don't re-evaluate inline Guardfile
45
+ return if @guardfile_source == :inline
46
+
44
47
  _before_reevaluate_guardfile
45
48
  evaluate_guardfile
46
49
  _after_reevaluate_guardfile
@@ -50,10 +53,10 @@ module Guard
50
53
  #
51
54
  # @example Programmatically test if a Guardfile contains a specific Guard plugin
52
55
  # File.read('Guardfile')
53
- # #=> "guard :rspec"
56
+ # => "guard :rspec"
54
57
  #
55
58
  # Guard::Guardfile::Evaluator.new.guardfile_include?('rspec)
56
- # #=> true
59
+ # => true
57
60
  #
58
61
  # @param [String] plugin_name the name of the Guard
59
62
  # @return [Boolean] whether the Guard plugin has been declared
@@ -62,39 +65,12 @@ module Guard
62
65
  _guardfile_contents_without_user_config.match(/^guard\s*\(?\s*['":]#{ plugin_name }['"]?/)
63
66
  end
64
67
 
65
- # Gets the file path to the project `Guardfile`.
66
- #
67
- # @example Gets the path of the currently evaluated Guardfile
68
- # Dir.pwd
69
- # #=> "/Users/remy/Code/github/guard"
70
- #
71
- # evaluator = Guard::Guardfile::Evaluator.new
72
- # evaluator.evaluate_guardfile
73
- # #=> nil
74
- #
75
- # evaluator.guardfile_path
76
- # #=> "/Users/remy/Code/github/guard/Guardfile"
77
- #
78
- # @example Gets the "path" of an inline Guardfile
79
- # > Guard::Guardfile::Evaluator.new(guardfile_contents: 'guard :rspec').evaluate_guardfile
80
- # => nil
81
- #
82
- # > Guard::Guardfile::Evaluator.new.guardfile_path
83
- # => "Inline Guardfile"
84
- #
85
- # @return [String] the path to the Guardfile or 'Inline Guardfile' if
86
- # the Guardfile has been specified via the `:guardfile_contents` option.
87
- #
88
- def guardfile_path
89
- options[:guardfile_path] || ''
90
- end
91
-
92
68
  # Gets the content of the `Guardfile` concatenated with the global
93
69
  # user configuration file.
94
70
  #
95
71
  # @example Programmatically get the content of the current Guardfile
96
72
  # Guard::Guardfile::Evaluator.new.guardfile_contents
97
- # #=> "guard :rspec"
73
+ # => "guard :rspec"
98
74
  #
99
75
  # @return [String] the Guardfile content
100
76
  #
@@ -110,7 +86,7 @@ module Guard
110
86
  # @return [String] the Guardfile content
111
87
  #
112
88
  def _guardfile_contents_without_user_config
113
- options[:guardfile_contents] || ''
89
+ @guardfile_contents || ''
114
90
  end
115
91
 
116
92
  # Evaluates the content of the `Guardfile`.
@@ -118,14 +94,13 @@ module Guard
118
94
  # @param [String] contents the content to evaluate.
119
95
  #
120
96
  def _instance_eval_guardfile(contents)
121
- ::Guard::Dsl.new.instance_eval(contents, options[:guardfile_path], 1)
97
+ ::Guard::Dsl.new.instance_eval(contents, @guardfile_path || '', 1)
122
98
  rescue => ex
123
99
  ::Guard::UI.error "Invalid Guardfile, original error is:\n#{ $! }"
124
100
  raise ex
125
101
  end
126
102
 
127
- # Gets the content to evaluate and stores it into
128
- # the options as `:guardfile_contents`.
103
+ # Gets the content to evaluate and stores it into @guardfile_contents.
129
104
  #
130
105
  def _fetch_guardfile_contents
131
106
  _use_inline_guardfile || _use_provided_guardfile || _use_default_guardfile
@@ -138,26 +113,40 @@ module Guard
138
113
  # Use the provided inline Guardfile if provided.
139
114
  #
140
115
  def _use_inline_guardfile
141
- return false unless options[:guardfile_contents]
116
+ if (@guardfile_source.nil? && options[:guardfile_contents]) || @guardfile_source == :inline
117
+
118
+ @guardfile_source = :inline
119
+ @guardfile_contents = options[:guardfile_contents]
120
+
121
+ ::Guard::UI.info 'Using inline Guardfile.'
142
122
 
143
- ::Guard::UI.info 'Using inline Guardfile.'
144
- options[:guardfile_path] = 'Inline Guardfile'
123
+ true
124
+ else
125
+ false
126
+ end
145
127
  end
146
128
 
147
129
  # Try to use the provided Guardfile. Exits Guard if the Guardfile cannot
148
130
  # be found.
149
131
  #
150
132
  def _use_provided_guardfile
151
- return false unless options[:guardfile]
133
+ if (@guardfile_source.nil? && options[:guardfile]) || @guardfile_source == :custom
134
+
135
+ @guardfile_source = :custom
136
+
137
+ options[:guardfile] = File.expand_path(options[:guardfile])
138
+ if File.exist?(options[:guardfile])
139
+ _read_guardfile(options[:guardfile])
140
+ ::Guard::UI.info "Using Guardfile at #{ options[:guardfile] }."
141
+ true
142
+ else
143
+ ::Guard::UI.error "No Guardfile exists at #{ options[:guardfile] }."
144
+ exit 1
145
+ end
152
146
 
153
- options[:guardfile] = File.expand_path(options[:guardfile])
154
- if File.exist?(options[:guardfile])
155
- _read_guardfile(options[:guardfile])
156
- ::Guard::UI.info "Using Guardfile at #{ options[:guardfile] }."
157
147
  true
158
148
  else
159
- ::Guard::UI.error "No Guardfile exists at #{ options[:guardfile] }."
160
- exit 1
149
+ false
161
150
  end
162
151
  end
163
152
 
@@ -166,6 +155,7 @@ module Guard
166
155
  #
167
156
  def _use_default_guardfile
168
157
  if guardfile_path = _find_default_guardfile
158
+ @guardfile_source = :default
169
159
  _read_guardfile(guardfile_path)
170
160
  else
171
161
  ::Guard::UI.error 'No Guardfile found, please create one with `guard init`.'
@@ -185,8 +175,8 @@ module Guard
185
175
  # @param [String] guardfile_path the path to the Guardfile
186
176
  #
187
177
  def _read_guardfile(guardfile_path)
188
- options[:guardfile_path] = guardfile_path
189
- options[:guardfile_contents] = File.read(guardfile_path)
178
+ @guardfile_path = guardfile_path
179
+ @guardfile_contents = File.read(guardfile_path)
190
180
  rescue => ex
191
181
  ::Guard::UI.error "Error reading file #{ guardfile_path }:"
192
182
  ::Guard::UI.error ex.inspect
@@ -204,9 +204,10 @@ module Guard
204
204
  # Notification starting, save the current Tmux settings
205
205
  # and quiet the Tmux output.
206
206
  #
207
- def turn_on
207
+ def self.turn_on
208
208
  unless @options_stored
209
209
  _reset_options_store
210
+
210
211
  _clients.each do |client|
211
212
  options_store[client] ||= {}
212
213
  `#{ DEFAULTS[:client] } show -t #{ client }`.each_line do |line|
@@ -214,6 +215,7 @@ module Guard
214
215
  @options_store[client][option] = setting
215
216
  end
216
217
  end
218
+
217
219
  @options_stored = true
218
220
  end
219
221
  end
@@ -222,7 +224,7 @@ module Guard
222
224
  # if available (existing options are restored, new options
223
225
  # are unset) and unquiet the Tmux output.
224
226
  #
225
- def turn_off
227
+ def self.turn_off
226
228
  if @options_stored
227
229
  @options_store.each do |client, options|
228
230
  options.each do |key, value|
@@ -237,7 +239,7 @@ module Guard
237
239
  end
238
240
  end
239
241
 
240
- def options_store
242
+ def self.options_store
241
243
  @options_store ||= {}
242
244
  end
243
245
 
@@ -248,8 +250,12 @@ module Guard
248
250
  super
249
251
  end
250
252
 
253
+ def self._clients
254
+ `#{ DEFAULTS[:client] } list-clients -F '\#{ client_tty }'`.split(/\n/)
255
+ end
256
+
251
257
  def _clients
252
- %x( #{DEFAULTS[:client]} list-clients -F '\#{client_tty}').split(/\n/);
258
+ self.class._client
253
259
  end
254
260
 
255
261
  def _run_client(cmd, args)
@@ -271,10 +277,11 @@ module Guard
271
277
 
272
278
  # Reset the internal Tmux options store defaults.
273
279
  #
274
- def _reset_options_store
280
+ def self._reset_options_store
275
281
  @options_stored = false
276
282
  @options_store = {}
277
- _clients.each do | client |
283
+
284
+ _clients.each do |client|
278
285
  @options_store[client] = {
279
286
  'status-left-bg' => nil,
280
287
  'status-right-bg' => nil,
@@ -287,16 +294,8 @@ module Guard
287
294
  end
288
295
  end
289
296
 
290
- # Remove clients which no longer exist from options store
291
- #
292
- def _remove_old_clients
293
- (options_store.keys - _clients).each do | old_client |
294
- options_store.delete old_client
295
- end
296
- end
297
-
298
297
  def _tmux_version
299
- @tmux_version ||= `tmux -V`.chomp.gsub(/[^0-9.]/,'').to_f
298
+ @tmux_version ||= `tmux -V`.chomp.gsub(/[^0-9.]/, '').to_f
300
299
  end
301
300
 
302
301
  end
@@ -1,3 +1,3 @@
1
1
  module Guard
2
- VERSION = '2.5.1'
2
+ VERSION = '2.6.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: guard
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thibaud Guillaume-Gentil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-24 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.6'
33
+ version: '2.7'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.6'
40
+ version: '2.7'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,34 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.2.4
83
- - !ruby/object:Gem::Dependency
84
- name: bundler
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rspec
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '='
102
- - !ruby/object:Gem::Version
103
- version: 3.0.0.beta1
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '='
109
- - !ruby/object:Gem::Version
110
- version: 3.0.0.beta1
111
83
  description: Guard is a command line tool to easily handle events on file system modifications.
112
84
  email:
113
85
  - thibaud@thibaud.gg