guard 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,20 +1,47 @@
1
+ ## 0.5.0 - July 2, 2011
2
+
3
+ ## New features
4
+
5
+ - Guard::Ego is now part of Guard, so Guardfile is automagically re-evaluated when modified. ([@thibaudgg][])
6
+ - Pull request [#91](https://github.com/guard/guard/pull/91): Show Guards in Guardfile with the `guard -T`. ([@johnbintz][])
7
+
8
+ ## Improvements
9
+
10
+ - Issue [#98](https://github.com/guard/guard/issues/98): Multiple calls per watch event on linux with rb-inotify. ([@jeffutter][] & [@netzpirat][])
11
+ - Pull request [#94](https://github.com/guard/guard/pull/94): Show backtrace in terminal when a problem with a watch action occurs. ([@capotej][])
12
+ - Pull request [#88](https://github.com/guard/guard/pull/88): Write exception trace in the terminal when a supervised task fail. ([@mcmire][])
13
+ - Color in red the "ERROR:" flag when using `UI.error`. ([@rymai][])
14
+ - Issue [#79](https://github.com/guard/guard/issues/79) and Pull request [#82](https://github.com/guard/guard/pull/82): Improve INotify support on Linux. ([@Gazer][] & [@yannlugrin][])
15
+ - Issue [#12](https://github.com/guard/guard/issues/12) and Pull request [#86](https://github.com/guard/guard/pull/86): Eventually exits with SystemStackError. ([@stereobooster][])
16
+ - Pull request [#84](https://github.com/guard/guard/pull/84): Use RbConfig instead of obsolete and deprecated Config. ([@etehtsea][])
17
+ - Pull request [#80](https://github.com/guard/guard/pull/80): Watching dotfile (hidden files under unix). (reported by [@chrisberkhout][], fixed by [@yannlugrin][])
18
+ - Clear the terminal on start when the `:clear` option is given. ([@rymai][])
19
+ - Rename home directory Guardfile to `.Guardfile`. ([@tpope][])
20
+
21
+ ## 0.4.2 - June 7, 2011
22
+
23
+ ### Bugs fixes:
24
+
25
+ - Fixed Guard::Version in ruby 1.8.7 ([@thibaudgg][])
26
+ - Fix ([@mislav][]) link in CHANGELOG (Note: this is a recursive CHANGELOG item). ([@fnichol][])
27
+
1
28
  ## 0.4.1 - June 7, 2011
2
29
 
3
30
  ### Improvements
4
31
 
5
- - Pull request [#77](https://github.com/guard/guard/pull/77): Refactor `get_guard_class` to first try the constant and fallback to require + various tweaks ([@mislav][])
6
- - Notifier improvement, don't use system notification library if could not be required ([@yannlugrin][])
32
+ - Pull request [#77](https://github.com/guard/guard/pull/77): Refactor `get_guard_class` to first try the constant and fallback to require + various tweaks. ([@mislav][])
33
+ - Notifier improvement, don't use system notification library if could not be required. ([@yannlugrin][])
7
34
 
8
35
  ## 0.4.0 - June 5, 2011
9
36
 
10
37
  ### Bugs fixes:
11
38
 
12
- - In Ruby < 1.9, Symbol#downcase doesn't exist! ([@rymai][])
39
+ - In Ruby < 1.9, `Symbol#downcase` doesn't exist! ([@rymai][])
13
40
 
14
41
  ### New features:
15
42
 
16
43
  - Pull request [#73](https://github.com/guard/guard/pull/73): Allow DSL's `group` method to accept a Symbol as group name. ([@johnbintz][])
17
- - Pull request [#51](https://github.com/guard/guard/pull/51): Allow options (like :priority) to be passed through to the Notifier. ([@indirect][] and [@netzpirat][])
44
+ - Pull request [#51](https://github.com/guard/guard/pull/51): Allow options (like `:priority`) to be passed through to the Notifier. ([@indirect][] & [@netzpirat][])
18
45
 
19
46
  ### Improvements
20
47
 
@@ -24,10 +51,10 @@
24
51
 
25
52
  ### Bugs fixes:
26
53
 
27
- - Pull request [#69](https://github.com/guard/guard/pull/69): Fixed typo in README: Ctr-/ => Ctr-\\. ([@tinogomes][])
54
+ - Pull request [#69](https://github.com/guard/guard/pull/69): Fixed typo in README: `Ctr-/` => `Ctr-\`. ([@tinogomes][])
28
55
  - Pull request [#66](https://github.com/guard/guard/pull/66): Support for dashes in guard names. ([@johnbintz][])
29
56
  - Require `guard/ui` because `Guard::Notifier` can be required without full Guard. ([@yannlugrin][])
30
- - Handled quick file (<1s) modification. Avoid to catch modified files without content modification (sha1 checksum). ([@thibaudgg][] and [@netzpirat][])
57
+ - Handled quick file (<1s) modification. Avoid to catch modified files without content modification (sha1 checksum). ([@thibaudgg][] & [@netzpirat][])
31
58
  - Fixed `Guard::Notifier` (when growl/libnotify not present). ([@thibaudgg][])
32
59
  - Fixed Rubygems deprecation messages. ([@thibaudgg][])
33
60
 
@@ -115,8 +142,8 @@
115
142
 
116
143
  ### Bugs fixes:
117
144
 
118
- - Pull request [#7](https://github.com/guard/guard/pull/7): Fixes for Linux support. ([@yannlugrin][]))
119
- - Pull request [#6](https://github.com/guard/guard/pull/6): Locate guard now chomp newline in result path. ([@yannlugrin][]))
145
+ - Pull request [#7](https://github.com/guard/guard/pull/7): Fixes for Linux support. ([@yannlugrin][])
146
+ - Pull request [#6](https://github.com/guard/guard/pull/6): Locate guard now chomp newline in result path. ([@yannlugrin][])
120
147
 
121
148
 
122
149
  ## 0.2.0 - October 21, 2010
@@ -137,12 +164,19 @@
137
164
 
138
165
  [@anithri]: https://github.com/anithri
139
166
  [@brainopia]: https://github.com/brainopia
167
+ [@capotej]: https://github.com/capotej
168
+ [@chrisberkhout]: https://github.com/chrisberkhout
169
+ [@etehtsea]: https://github.com/etehtsea
170
+ [@fnichol]: https://github.com/fnichol
171
+ [@Gazer]: https://github.com/Gazer
140
172
  [@gix]: https://github.com/gix
141
173
  [@hashrocketeer]: https://github.com/hashrocketeer
142
174
  [@indirect]: https://github.com/indirect
175
+ [@jeffutter]: https://github.com/jeffutter
143
176
  [@johnbintz]: https://github.com/johnbintz
144
177
  [@jrsacks]: https://github.com/jrsacks
145
178
  [@koshigoe]: https://github.com/koshigoe
179
+ [@mcmire]: https://github.com/mcmire
146
180
  [@mislav]: https://github.com/mislav
147
181
  [@netzpirat]: https://github.com/netzpirat
148
182
  [@nicksieger]: https://github.com/nicksieger
@@ -155,6 +189,7 @@
155
189
  [@thibaudgg]: https://github.com/thibaudgg
156
190
  [@thierryhenrio]: https://github.com/thierryhenrio
157
191
  [@tinogomes]: https://github.com/tinogomes
192
+ [@tpope]: https://github.com/tpope
158
193
  [@veged]: https://github.com/veged
159
194
  [@wereHamster]: https://github.com/wereHamster
160
195
  [@yannlugrin]: https://github.com/yannlugrin
data/README.md CHANGED
@@ -3,7 +3,7 @@ Guard [![Build Status](http://travis-ci.org/guard/guard.png)](http://travis-ci.o
3
3
 
4
4
  Guard is a command line tool that easily handle events on files modifications.
5
5
 
6
- If you have any questions/issues please join us on our [Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
6
+ If you have any questions please join us on our [Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
7
7
 
8
8
  Features
9
9
  --------
@@ -26,7 +26,7 @@ Install the gem:
26
26
  $ gem install guard
27
27
  ```
28
28
 
29
- Add it to your Gemfile (inside the `test` group):
29
+ Add it to your Gemfile (inside the `development` group):
30
30
 
31
31
  ``` ruby
32
32
  gem 'guard'
@@ -38,7 +38,7 @@ Generate an empty Guardfile with:
38
38
  $ guard init
39
39
  ```
40
40
 
41
- You may optionally place this Guardfile in your home directory to use it across multiple projects.
41
+ You may optionally place a .Guardfile in your home directory to use it across multiple projects.
42
42
 
43
43
  Add the guards you need to your Guardfile (see the existing guards below).
44
44
 
@@ -117,22 +117,26 @@ $ guard [start]
117
117
  or if you use Bundler, to run the Guard executable specific to your bundle:
118
118
 
119
119
  ``` bash
120
- $ bundle exec guard
120
+ $ bundle exec guard [start]
121
121
  ```
122
122
 
123
- Guard will look for a Guardfile in your current directory. If it does not find one, it will look in your `$HOME` directory for one.
123
+ Guard will look for a Guardfile in your current directory. If it does not find one, it will look in your `$HOME` directory for a .Guardfile.
124
124
 
125
125
  Command line options
126
126
  --------------------
127
127
 
128
- Shell can be cleared after each change with:
128
+ ### `--clear` option
129
+
130
+ Shell can be cleared after each change:
129
131
 
130
132
  ``` bash
131
133
  $ guard --clear
132
134
  $ guard -c # shortcut
133
135
  ```
134
136
 
135
- Notifications (growl/libnotify) can be disabled with:
137
+ ### `--notify` option
138
+
139
+ Notifications (growl/libnotify) can be disabled:
136
140
 
137
141
  ``` bash
138
142
  $ guard --notify false
@@ -141,14 +145,25 @@ $ guard -n f # shortcut
141
145
 
142
146
  Notifications can also be disabled globally by setting a `GUARD_NOTIFY` environment variable to `false`
143
147
 
144
- The guards to start can be specified by group (see the Guardfile DSL below) specifying the `--group` (or `-g`) option:
148
+ ### `--group` option
149
+
150
+ Only certain guards groups can be run (see the Guardfile DSL below for creating groups):
145
151
 
146
152
  ``` bash
147
153
  $ guard --group group_name another_group_name
148
154
  $ guard -g group_name another_group_name # shortcut
149
155
  ```
150
156
 
151
- Options list is available with:
157
+ ### `--debug` option
158
+
159
+ Guard can be run in debug mode:
160
+
161
+ ``` bash
162
+ $ guard --debug
163
+ $ guard -d # shortcut
164
+ ```
165
+
166
+ An exhaustive list of options is available with:
152
167
 
153
168
  ``` bash
154
169
  $ guard help [TASK]
@@ -159,20 +174,20 @@ Signal handlers
159
174
 
160
175
  Signal handlers are used to interact with Guard:
161
176
 
162
- * `Ctrl-C` - Calls each guard's `stop` method, in the same order they are declared in the Guardfile, and then quits Guard itself.
163
- * `Ctrl-\` - Calls each guard's `run_all` method, in the same order they are declared in the Guardfile.
164
- * `Ctrl-Z` - Calls each guard's `reload` method, in the same order they are declared in the Guardfile.
177
+ * `Ctrl-C` - Calls each guard's `#stop` method, in the same order they are declared in the Guardfile, and then quits Guard itself.
178
+ * `Ctrl-\` - Calls each guard's `#run_all` method, in the same order they are declared in the Guardfile.
179
+ * `Ctrl-Z` - Calls each guard's `#reload` method, in the same order they are declared in the Guardfile.
165
180
 
166
- You can read more about [configure the signal keyboard shortcuts](https://github.com/guard/guard/wiki/Configure-keyboard-shortcuts) on the wiki.
181
+ You can read more about [configure the signal keyboard shortcuts](https://github.com/guard/guard/wiki/Configure-keyboard-shortcuts) in the wiki.
167
182
 
168
183
  Available Guards
169
184
  ----------------
170
185
 
171
- [Available Guards list](https://github.com/guard/guard/wiki/List-of-available-Guards) (on the wiki now)
186
+ A list of the available guards is present [in the wiki](https://github.com/guard/guard/wiki/List-of-available-Guards).
172
187
 
173
188
  ### Add a guard to your Guardfile
174
189
 
175
- Add it to your Gemfile (inside the `test` group):
190
+ Add it to your Gemfile (inside the `development` group):
176
191
 
177
192
  ``` ruby
178
193
  gem '<guard-name>'
@@ -184,21 +199,21 @@ Insert default guard's definition to your Guardfile by running this command:
184
199
  $ guard init <guard-name>
185
200
  ```
186
201
 
187
- You are good to go!
202
+ You are good to go, or you can modify your guards' definition to suit your needs.
188
203
 
189
204
  Guardfile DSL
190
205
  -------------
191
206
 
192
- The Guardfile DSL consists of just three simple methods: `guard`, `watch` & `group`.
207
+ The Guardfile DSL consists of just three simple methods: `#guard`, `#watch` & `#group`.
193
208
 
194
209
  Required:
195
210
 
196
- * The `guard` method allows you to add a guard with an optional hash of options.
197
- * The `watch` method allows you to define which files are supervised by this guard. An optional block can be added to overwrite the paths sent to the `run_on_change` guard method or to launch any arbitrary command.
211
+ * The `#guard` method allows you to add a guard with an optional hash of options.
198
212
 
199
213
  Optional:
200
214
 
201
- * The `group` method allows you to group several guards together. Groups to be run can be specified with the Guard DSL option `--group` (or `-g`). This comes in handy especially when you have a huge Guardfile and want to focus your development on a certain part.
215
+ * The `#watch` method allows you to define which files are supervised by this guard. An optional block can be added to overwrite the paths sent to the guard's `#run_on_change` method or to launch any arbitrary command.
216
+ * The `#group` method allows you to group several guards together. Groups to be run can be specified with the Guard DSL option `--group` (or `-g`). This comes in handy especially when you have a huge Guardfile and want to focus your development on a certain part.
202
217
 
203
218
  Example:
204
219
 
@@ -210,10 +225,10 @@ group 'backend' do
210
225
 
211
226
  guard 'rspec', :cli => '--color --format doc' do
212
227
  # Regexp watch patterns are matched with Regexp#match
213
- watch(%r{^spec/.+_spec\.rb})
214
- watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
215
- watch(%r{^spec/models/.+\.rb}) { ["spec/models", "spec/acceptance"] }
216
- watch(%r{^spec/.+\.rb}) { `say hello` }
228
+ watch(%r{^spec/.+_spec\.rb$})
229
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
230
+ watch(%r{^spec/models/.+\.rb$}) { ["spec/models", "spec/acceptance"] }
231
+ watch(%r{^spec/.+\.rb$}) { `say hello` }
217
232
 
218
233
  # String watch patterns are matched with simple '=='
219
234
  watch('spec/spec_helper.rb') { "spec" }
@@ -222,22 +237,24 @@ end
222
237
 
223
238
  group 'frontend' do
224
239
  guard 'coffeescript', :output => 'public/javascripts/compiled' do
225
- watch(%r{^app/coffeescripts/.+\.coffee})
240
+ watch(%r{^app/coffeescripts/.+\.coffee$})
226
241
  end
227
242
 
228
243
  guard 'livereload' do
229
- watch(%r{^app/.+\.(erb|haml)})
244
+ watch(%r{^app/.+\.(erb|haml)$})
230
245
  end
231
246
  end
232
247
  ```
233
248
 
249
+ ### Using a Guardfile without the `guard` binary
250
+
234
251
  The Guardfile DSL can also be used in a programmatic fashion by calling directly `Guard::Dsl.evaluate_guardfile`.
235
252
  Available options are as follow:
236
253
 
237
254
  * `:guardfile` - The path to a valid Guardfile.
238
255
  * `:guardfile_contents` - A string representing the content of a valid Guardfile
239
256
 
240
- Without any options given, Guard will look for a Guardfile in your current directory and if it does not find one, it will look in your `$HOME` directory for one.
257
+ Remember, without any options given, Guard will look for a Guardfile in your current directory and if it does not find one, it will look for it in your `$HOME` directory.
241
258
 
242
259
  For instance, you could use it as follow:
243
260
 
@@ -247,28 +264,57 @@ require 'guard'
247
264
 
248
265
  Guard.setup
249
266
 
250
- Guard::Dsl.evaluate_guardfile(:guardfile => '/Your/Custom/Path/To/A/Valid/Guardfile')
267
+ Guard::Dsl.evaluate_guardfile(:guardfile => '/your/custom/path/to/a/valid/Guardfile')
251
268
  # or
252
269
  Guard::Dsl.evaluate_guardfile(:guardfile_contents => "
253
270
  guard 'rspec' do
254
- watch(%r{^spec/.+_spec\.rb})
271
+ watch(%r{^spec/.+_spec\.rb$})
255
272
  end
256
273
  ")
257
274
  ```
258
275
 
276
+ ### Listing defined guards/groups for the current project
277
+
278
+ You can list the defined groups and guards for the current Guardfile from the command line using `guard show` or `guard -T`:
279
+
280
+ ``` bash
281
+ # guard -T
282
+
283
+ (global):
284
+ shell
285
+ Group backend:
286
+ bundler
287
+ rspec: cli => "--color --format doc'
288
+ Group frontend:
289
+ coffeescript: output => "public/javascripts/compiled"
290
+ livereload
291
+ ```
292
+
259
293
  Create a new guard
260
294
  ------------------
261
295
 
262
296
  Creating a new guard is very easy, just create a new gem (`bundle gem` if you use Bundler) with this basic structure:
263
297
 
264
- lib/
265
- guard/
266
- guard-name/
267
- templates/
268
- Guardfile (needed for guard init <guard-name>)
269
- guard-name.rb
298
+ ```
299
+ .travis.yml # bonus point!
300
+ CHANGELOG.md # bonus point!
301
+ Gemfile
302
+ guard-name.gemspec
303
+ Guardfile
304
+ lib/
305
+ guard/
306
+ guard-name/
307
+ templates/
308
+ Guardfile # needed for `guard init <guard-name>`
309
+ version.rb
310
+ guard-name.rb
311
+ test/ # or spec/
312
+ README.md
313
+ ```
314
+
315
+ `Guard::GuardName` (in `lib/guard/guard-name.rb`) must inherit from `Guard::Guard` and should overwrite at least one of the five basic `Guard::Guard` instance methods.
270
316
 
271
- `Guard::GuardName` (in `lib/guard/guard-name.rb`) must inherit from `Guard::Guard` and should overwrite at least one of the five basic `Guard::Guard` instance methods. Example:
317
+ Here is an example scaffold for `lib/guard/guard-name.rb`:
272
318
 
273
319
  ``` ruby
274
320
  require 'guard'
@@ -321,7 +367,7 @@ module Guard
321
367
  end
322
368
  ```
323
369
 
324
- Please take a look at the existing guards' source code (see the list above) for more concrete example.
370
+ Please take a look at the [existing guards' source code](https://github.com/guard/guard/wiki/List-of-available-Guards) for more concrete example and inspiration.
325
371
 
326
372
  Alternatively, a new guard can be added inline to a Guardfile with this basic structure:
327
373
 
@@ -341,14 +387,17 @@ module ::Guard
341
387
  end
342
388
  ```
343
389
 
390
+ Here is a very cool example by [@avdi](https://github.com/avdi) : http://avdi.org/devblog/2011/06/15/a-guardfile-for-redis
391
+
344
392
  Development
345
393
  -----------
346
394
 
347
395
  * Source hosted at [GitHub](https://github.com/guard/guard).
348
- * Report Issues/Feature requests on [GitHub Issues](https://github.com/guard/guard/issues).
396
+ * Report issues and feature requests to [GitHub Issues](https://github.com/guard/guard/issues).
397
+
398
+ Pull requests are very welcome! Make sure your patches are well tested. Please create a topic branch for every separate change you make. Please **do not change** the version in your pull-request.
349
399
 
350
- Pull requests are very welcome! Make sure your patches are well tested. Please create a topic branch for every separate change
351
- you make. Please do not change the version in your pull-request.
400
+ For questions please join us on our [Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
352
401
 
353
402
  Author
354
403
  ------
data/lib/guard.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  module Guard
2
2
 
3
- autoload :UI, 'guard/ui'
4
- autoload :Dsl, 'guard/dsl'
5
- autoload :Interactor, 'guard/interactor'
6
- autoload :Listener, 'guard/listener'
7
- autoload :Watcher, 'guard/watcher'
8
- autoload :Notifier, 'guard/notifier'
3
+ autoload :UI, 'guard/ui'
4
+ autoload :Dsl, 'guard/dsl'
5
+ autoload :DslDescriber, 'guard/dsl_describer'
6
+ autoload :Interactor, 'guard/interactor'
7
+ autoload :Listener, 'guard/listener'
8
+ autoload :Watcher, 'guard/watcher'
9
+ autoload :Notifier, 'guard/notifier'
9
10
 
10
11
  class << self
11
12
  attr_accessor :options, :guards, :listener
@@ -22,22 +23,21 @@ module Guard
22
23
  end
23
24
 
24
25
  def start(options = {})
26
+ UI.clear if options[:clear]
25
27
  setup(options)
26
28
 
27
29
  Interactor.init_signal_traps
28
30
  Dsl.evaluate_guardfile(options)
29
31
 
30
- if guards.empty?
31
- UI.error "No guards found in Guardfile, please add at least one."
32
- else
33
- listener.on_change do |files|
34
- run { run_on_change_for_all_guards(files) } if Watcher.match_files?(guards, files)
35
- end
32
+ listener.on_change do |files|
33
+ Dsl.revaluate_guardfile if Watcher.match_guardfile?(files)
36
34
 
37
- UI.info "Guard is now watching at '#{Dir.pwd}'"
38
- guards.each { |guard| supervised_task(guard, :start) }
39
- listener.start
35
+ run { run_on_change_for_all_guards(files) } if Watcher.match_files?(guards, files)
40
36
  end
37
+
38
+ UI.info "Guard is now watching at '#{Dir.pwd}'"
39
+ guards.each { |guard| supervised_task(guard, :start) }
40
+ listener.start
41
41
  end
42
42
 
43
43
  def run_on_change_for_all_guards(files)
@@ -58,11 +58,12 @@ module Guard
58
58
  # fire it if his work leads to a system failure
59
59
  def supervised_task(guard, task_to_supervise, *args)
60
60
  guard.send(task_to_supervise, *args)
61
- rescue Exception
62
- UI.error("#{guard.class.name} guard failed to achieve its <#{task_to_supervise.to_s}> command: #{$!}")
61
+ rescue Exception => ex
62
+ UI.error("#{guard.class.name} failed to achieve its <#{task_to_supervise.to_s}>, exception was:" +
63
+ "\n#{ex.class}: #{ex.message}\n#{ex.backtrace.join("\n")}")
63
64
  guards.delete guard
64
- UI.info("Guard #{guard.class.name} has just been fired")
65
- return $!
65
+ UI.info("\n#{guard.class.name} has just been fired")
66
+ return ex
66
67
  end
67
68
 
68
69
  def run
@@ -76,8 +77,12 @@ module Guard
76
77
  end
77
78
 
78
79
  def add_guard(name, watchers = [], options = {})
79
- guard_class = get_guard_class(name)
80
- @guards << guard_class.new(watchers, options)
80
+ if name.downcase == 'ego'
81
+ UI.deprecation("Guard::Ego is now part of Guard you can removed it from your Guardfile.")
82
+ else
83
+ guard_class = get_guard_class(name)
84
+ @guards << guard_class.new(watchers, options)
85
+ end
81
86
  end
82
87
 
83
88
  def get_guard_class(name)
data/lib/guard/cli.rb CHANGED
@@ -15,13 +15,13 @@ module Guard
15
15
  ::Guard.start(options)
16
16
  end
17
17
 
18
- desc "version", "Prints Guard's version information"
18
+ desc "version", "Prints Guard's version"
19
19
  def version
20
20
  ::Guard::UI.info "Guard version #{Guard::VERSION}"
21
21
  end
22
22
  map %w(-v --version) => :version
23
23
 
24
- desc "init [GUARD]", "Generates a Guardfile into the current working directory, or insert the given GUARD"
24
+ desc "init [GUARD]", "Generates a Guardfile into the current working directory, or insert the given GUARD in an existing Guardfile"
25
25
  def init(guard_name = nil)
26
26
  if !File.exist?("Guardfile")
27
27
  puts "Writing new Guardfile to #{Dir.pwd}/Guardfile"
@@ -37,5 +37,31 @@ module Guard
37
37
  end
38
38
  end
39
39
 
40
+ desc "show", "Show all defined Guards and their options"
41
+ def show
42
+ ::Guard::DslDescriber.evaluate_guardfile(options)
43
+
44
+ ::Guard::DslDescriber.guardfile_structure.each do |group|
45
+ if !group[:guards].empty?
46
+ if group[:group]
47
+ ::Guard::UI.info "Group #{group[:group]}:"
48
+ else
49
+ ::Guard::UI.info "(global):"
50
+ end
51
+
52
+ group[:guards].each do |guard|
53
+ line = " #{guard[:name]}"
54
+
55
+ if !guard[:options].empty?
56
+ line += ": #{guard[:options].collect { |k, v| "#{k} => #{v.inspect}" }.join(", ")}"
57
+ end
58
+ ::Guard::UI.info line
59
+ end
60
+ end
61
+ end
62
+
63
+ ::Guard::UI.info ''
64
+ end
65
+ map %w(-T) => :show
40
66
  end
41
- end
67
+ end
data/lib/guard/dsl.rb CHANGED
@@ -2,12 +2,22 @@ module Guard
2
2
  class Dsl
3
3
  class << self
4
4
  @@options = nil
5
-
5
+
6
6
  def evaluate_guardfile(options = {})
7
7
  options.is_a?(Hash) or raise ArgumentError.new("evaluate_guardfile not passed a Hash!")
8
8
 
9
9
  @@options = options.dup
10
10
  instance_eval_guardfile(fetch_guardfile_contents)
11
+
12
+ UI.error "No guards found in Guardfile, please add at least one." if ::Guard.guards.empty?
13
+ end
14
+
15
+ def revaluate_guardfile
16
+ ::Guard.guards.clear
17
+ Dsl.evaluate_guardfile(@@options)
18
+ msg = "Guardfile has been re-evaluated."
19
+ UI.info(msg)
20
+ Notifier.notify(msg)
11
21
  end
12
22
 
13
23
  def instance_eval_guardfile(contents)
@@ -69,6 +79,10 @@ module Guard
69
79
  @@options ? @@options[:guardfile_contents] : ""
70
80
  end
71
81
 
82
+ def guardfile_path
83
+ @@options ? @@options[:guardfile_path] : ""
84
+ end
85
+
72
86
  def guardfile_contents_usable?
73
87
  guardfile_contents && guardfile_contents.size >= 'guard :a'.size # smallest guard-definition
74
88
  end
@@ -84,7 +98,7 @@ module Guard
84
98
  end
85
99
 
86
100
  def home_guardfile_path
87
- File.expand_path(File.join("~", "Guardfile"))
101
+ File.expand_path(File.join("~", ".Guardfile"))
88
102
  end
89
103
 
90
104
  end
@@ -0,0 +1,29 @@
1
+ require 'guard/dsl'
2
+
3
+ module Guard
4
+ class DslDescriber < Dsl
5
+ @@guardfile_structure = [ { :guards => [] } ]
6
+
7
+ class << self
8
+ def guardfile_structure
9
+ @@guardfile_structure
10
+ end
11
+ end
12
+
13
+ private
14
+ def group(name, &guard_definition)
15
+ @@guardfile_structure << { :group => name.to_sym, :guards => [] }
16
+
17
+ @group = true
18
+ guard_definition.call
19
+ @group = false
20
+ end
21
+
22
+ def guard(name, options = {}, &watch_definition)
23
+ node = (@group ? @@guardfile_structure.last : @@guardfile_structure.first)
24
+
25
+ node[:guards] << { :name => name, :options => options }
26
+ end
27
+ end
28
+ end
29
+
@@ -47,7 +47,7 @@ module Guard
47
47
  end
48
48
 
49
49
  def modified_files(dirs, options = {})
50
- files = potentially_modified_files(dirs, options).select { |path| File.file?(path) && file_modified?(path) }
50
+ files = potentially_modified_files(dirs, options).select { |path| file_modified?(path) }
51
51
  relativate_paths files
52
52
  end
53
53
 
@@ -77,12 +77,11 @@ module Guard
77
77
  !!@relativate_paths
78
78
  end
79
79
 
80
-
81
80
  private
82
81
 
83
82
  def potentially_modified_files(dirs, options = {})
84
83
  match = options[:all] ? "**/*" : "*"
85
- Dir.glob(dirs.map { |dir| "#{dir}#{match}" })
84
+ Dir.glob(dirs.map { |dir| "#{dir}#{match}" }, File::FNM_DOTMATCH).select { |file| File.file?(file) }
86
85
  end
87
86
 
88
87
  # Depending on the filesystem, mtime is probably only precise to the second, so round
@@ -116,15 +115,15 @@ module Guard
116
115
  end
117
116
 
118
117
  def self.mac?
119
- Config::CONFIG['target_os'] =~ /darwin/i
118
+ RbConfig::CONFIG['target_os'] =~ /darwin/i
120
119
  end
121
120
 
122
121
  def self.linux?
123
- Config::CONFIG['target_os'] =~ /linux/i
122
+ RbConfig::CONFIG['target_os'] =~ /linux/i
124
123
  end
125
124
 
126
125
  def self.windows?
127
- Config::CONFIG['target_os'] =~ /mswin|mingw/i
126
+ RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
128
127
  end
129
128
 
130
129
  end
@@ -47,7 +47,8 @@ module Guard
47
47
  end
48
48
 
49
49
  def watch(directory)
50
- worker.watch(directory, :recursive, :modify, :create) do |event|
50
+ # The event selection is based on https://github.com/guard/guard/wiki/Analysis-of-inotify-events-for-different-editors
51
+ worker.watch(directory, :recursive, :create, :move_self, :close_write) do |event|
51
52
  unless event.name == "" # Event on root directory
52
53
  @files << event.absolute_name
53
54
  end
@@ -58,18 +59,15 @@ module Guard
58
59
  def watch_change
59
60
  @watch_change = true
60
61
  until @stop
61
- if Config::CONFIG['build'] =~ /java/ || IO.select([inotify.to_io], [], [], latency)
62
+ if RbConfig::CONFIG['build'] =~ /java/ || IO.select([inotify.to_io], [], [], latency)
62
63
  break if @stop
63
64
 
64
65
  sleep latency
65
66
  inotify.process
66
- update_last_event
67
67
 
68
- unless files.empty?
69
- files.uniq!
70
- callback.call( relativate_paths(files) )
71
- files.clear
72
- end
68
+ modified_files = modified_files(files.shift(files.size).map{|f| File.dirname(f) + '/' }.uniq)
69
+ update_last_event
70
+ callback.call(modified_files) unless modified_files.empty?
73
71
  end
74
72
  end
75
73
  @watch_change = false
@@ -2,8 +2,9 @@ module Guard
2
2
  class Windows < Listener
3
3
  attr_reader :fchange
4
4
 
5
- def initialize
5
+ def initialize(*)
6
6
  super
7
+
7
8
  @fchange = FChange::Notifier.new
8
9
  end
9
10
 
@@ -11,7 +11,7 @@ module Guard
11
11
 
12
12
  def self.turn_on
13
13
  ENV["GUARD_NOTIFY"] = 'true'
14
- case Config::CONFIG['target_os']
14
+ case RbConfig::CONFIG['target_os']
15
15
  when /darwin/i
16
16
  require_growl
17
17
  when /linux/i
@@ -26,7 +26,7 @@ module Guard
26
26
  image = options.delete(:image) || :success
27
27
  title = options.delete(:title) || "Guard"
28
28
 
29
- case Config::CONFIG['target_os']
29
+ case RbConfig::CONFIG['target_os']
30
30
  when /darwin/i
31
31
  notify_mac(title, message, image, options)
32
32
  when /linux/i
data/lib/guard/ui.rb CHANGED
@@ -12,7 +12,14 @@ module Guard
12
12
  def error(message, options = {})
13
13
  unless ENV["GUARD_ENV"] == "test"
14
14
  reset_line if options[:reset]
15
- puts "ERROR: #{message}"
15
+ puts "#{color('ERROR:', ';31')} #{message}"
16
+ end
17
+ end
18
+
19
+ def deprecation(message, options = {})
20
+ unless ENV["GUARD_ENV"] == "test"
21
+ reset_line if options[:reset]
22
+ puts "#{color('DEPRECATION:', ';31')} #{message}"
16
23
  end
17
24
  end
18
25
 
@@ -24,11 +31,7 @@ module Guard
24
31
  end
25
32
 
26
33
  def reset_line
27
- if color_enabled?
28
- print "\r\e[0m"
29
- else
30
- print "\r\n"
31
- end
34
+ print(color_enabled? ? "\r\e[0m" : "\r\n")
32
35
  end
33
36
 
34
37
  def clear
@@ -38,24 +41,21 @@ module Guard
38
41
  private
39
42
 
40
43
  def reset_color(text)
41
- color(text, "\e[0m")
44
+ color(text, "")
42
45
  end
43
46
 
44
47
  def color(text, color_code)
45
- if color_enabled?
46
- return "#{color_code}#{text}\e[0m"
47
- else
48
- return text
49
- end
48
+ color_enabled? ? "\e[0#{color_code}m#{text}\e[0m" : text
50
49
  end
51
50
 
52
51
  def color_enabled?
53
- @color_enabled ||= if Config::CONFIG['target_os'] =~ /mswin|mingw/i
52
+ @color_enabled ||= if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
54
53
  unless ENV['ANSICON']
55
54
  begin
56
55
  require 'rubygems' unless ENV['NO_RUBYGEMS']
57
56
  require 'Win32/Console/ANSI'
58
57
  rescue LoadError
58
+ @color_enabled = false
59
59
  info "You must 'gem install win32console' to use color on Windows"
60
60
  false
61
61
  end
data/lib/guard/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Guard
2
- VERSION = "0.4.2" unless defined? Guard::VERSION
2
+ VERSION = "0.5.0" unless defined? Guard::VERSION
3
3
  end
data/lib/guard/watcher.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  module Guard
2
2
  class Watcher
3
3
  attr_accessor :pattern, :action
4
-
4
+
5
5
  def initialize(pattern, action = nil)
6
6
  @pattern, @action = pattern, action
7
7
  @@warning_printed ||= false
8
-
8
+
9
9
  # deprecation warning
10
10
  if @pattern.is_a?(String) && @pattern =~ /(^(\^))|(>?(\\\.)|(\.\*))|(\(.*\))|(\[.*\])|(\$$)/
11
11
  unless @@warning_printed
@@ -17,7 +17,7 @@ module Guard
17
17
  @pattern = Regexp.new(@pattern)
18
18
  end
19
19
  end
20
-
20
+
21
21
  def self.match_files(guard, files)
22
22
  guard.watchers.inject([]) do |paths, watcher|
23
23
  files.each do |file|
@@ -33,7 +33,7 @@ module Guard
33
33
  paths.flatten.map { |p| p.to_s }
34
34
  end
35
35
  end
36
-
36
+
37
37
  def self.match_files?(guards, files)
38
38
  guards.any? do |guard|
39
39
  guard.watchers.any? do |watcher|
@@ -41,7 +41,7 @@ module Guard
41
41
  end
42
42
  end
43
43
  end
44
-
44
+
45
45
  def match_file?(file)
46
46
  if @pattern.is_a?(Regexp)
47
47
  file.match(@pattern)
@@ -49,14 +49,18 @@ module Guard
49
49
  file == @pattern ? [file] : nil
50
50
  end
51
51
  end
52
-
52
+
53
+ def self.match_guardfile?(files)
54
+ files.any? { |file| "#{Dir.pwd}/#{file}" == Dsl.guardfile_path }
55
+ end
56
+
53
57
  def call_action(matches)
54
58
  begin
55
59
  @action.arity > 0 ? @action.call(matches) : @action.call
56
- rescue
57
- UI.error "Problem with watch action!"
60
+ rescue Exception => e
61
+ UI.error "Problem with watch action!\n#{e.message}\n\n#{e.backtrace.join("\n")}"
58
62
  end
59
63
  end
60
-
64
+
61
65
  end
62
66
  end
data/man/guard.1 ADDED
@@ -0,0 +1,70 @@
1
+ .\" generated with Ronn/v0.7.3
2
+ .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
+ .
4
+ .TH "GUARD" "1" "June 2011" "" ""
5
+ .
6
+ .SH "NAME"
7
+ \fBguard\fR \- Guard keeps an eye on your file modifications\.
8
+ .
9
+ .SH "SYNOPSIS"
10
+ guard \fIcommand\fR \fIoptions\fR
11
+ .
12
+ .SH "DESCRIPTION"
13
+ Guard is a command line tool that easily handle events on files modifications\.
14
+ .
15
+ .SH "HOMEPAGE"
16
+ https://github\.com/guard/guard
17
+ .
18
+ .SH "OPTIONS"
19
+ .
20
+ .TP
21
+ \fB\-c\fR, \fB\-\-clear\fR
22
+ Clears the Shell after each change\.
23
+ .
24
+ .TP
25
+ \fB\-n\fR \fIflag\fR, \fB\-\-notify\fR \fIflag\fR
26
+ Disable notifications (Growl or Libnotify depending on your system)\. Note that notifications can also be disabled globally by setting a GUARD_NOTIFY environment variable to false\. The \fIflag\fR part can be passed to guard using true/false or t/f\.
27
+ .
28
+ .TP
29
+ \fB\-g\fR \fIgroup\fR \.\.\., \fB\-\-group\fR \fIgroup\fR \.\.\.
30
+ Runs only the groups specified\.
31
+ .
32
+ .TP
33
+ \fB\-d\fR, \fB\-\-debug\fR
34
+ Runs Guard in debug mode\.
35
+ .
36
+ .TP
37
+ \fB\-h\fR
38
+ List all of Guard\'s available commands\.
39
+ .
40
+ .SH "COMMANDS"
41
+ .
42
+ .TP
43
+ \fBstart\fR
44
+ Starts Guard\. This is the default command if none is provided\.
45
+ .
46
+ .TP
47
+ \fBinit\fR [guard]
48
+ Add the requested guard\'s default Guardfile configuration to the current Guardfile\.
49
+ .
50
+ .TP
51
+ \fBshow\fR, \fB\-T\fR
52
+ List defined groups and guards for the current Guardfile\.
53
+ .
54
+ .SH "EXAMPLES"
55
+ \fB[bundle exec] guard \-\-clear \-\-group backend frontend \-\-notify false \-\-debug\fR
56
+ .
57
+ .P
58
+ or in a more concise way:
59
+ .
60
+ .P
61
+ \fB[bundle exec] guard \-c \-g backend frontend \-n f \-d\fR
62
+ .
63
+ .SH "AUTHORS / CONTRIBUTORS"
64
+ Thibaud Guillaume\-Gentil is the main author\.
65
+ .
66
+ .P
67
+ A list of contributors based on all commits can be found here: https://github\.com/guard/guard/contributors
68
+ .
69
+ .P
70
+ For an exhaustive list of all the contributors, please see the CHANGELOG: https://github\.com/guard/guard/blob/master/CHANGELOG\.md
data/man/guard.1.html ADDED
@@ -0,0 +1,138 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' value='text/html;charset=utf8'>
5
+ <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
6
+ <title>guard(1) - Guard keeps an eye on your file modifications.</title>
7
+ <style type='text/css' media='all'>
8
+ /* style: man */
9
+ body#manpage {margin:0}
10
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
11
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
12
+ .mp h2 {margin:10px 0 0 0}
13
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
14
+ .mp h3 {margin:0 0 0 4ex}
15
+ .mp dt {margin:0;clear:left}
16
+ .mp dt.flush {float:left;width:8ex}
17
+ .mp dd {margin:0 0 0 9ex}
18
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
19
+ .mp pre {margin-bottom:20px}
20
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
21
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
22
+ .mp img {display:block;margin:auto}
23
+ .mp h1.man-title {display:none}
24
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
25
+ .mp h2 {font-size:16px;line-height:1.25}
26
+ .mp h1 {font-size:20px;line-height:2}
27
+ .mp {text-align:justify;background:#fff}
28
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
29
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
30
+ .mp u {text-decoration:underline}
31
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
32
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
33
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
34
+ .mp b.man-ref {font-weight:normal;color:#434241}
35
+ .mp pre {padding:0 4ex}
36
+ .mp pre code {font-weight:normal;color:#434241}
37
+ .mp h2+pre,h3+pre {padding-left:0}
38
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
39
+ ol.man-decor {width:100%}
40
+ ol.man-decor li.tl {text-align:left}
41
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
42
+ ol.man-decor li.tr {text-align:right;float:right}
43
+ </style>
44
+ </head>
45
+ <!--
46
+ The following styles are deprecated and will be removed at some point:
47
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
48
+
49
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
50
+ .man-navigation should be used instead.
51
+ -->
52
+ <body id='manpage'>
53
+ <div class='mp' id='man'>
54
+
55
+ <div class='man-navigation' style='display:none'>
56
+ <a href="#NAME">NAME</a>
57
+ <a href="#SYNOPSIS">SYNOPSIS</a>
58
+ <a href="#DESCRIPTION">DESCRIPTION</a>
59
+ <a href="#HOMEPAGE">HOMEPAGE</a>
60
+ <a href="#OPTIONS">OPTIONS</a>
61
+ <a href="#COMMANDS">COMMANDS</a>
62
+ <a href="#EXAMPLES">EXAMPLES</a>
63
+ <a href="#AUTHORS-CONTRIBUTORS">AUTHORS / CONTRIBUTORS</a>
64
+ </div>
65
+
66
+ <ol class='man-decor man-head man head'>
67
+ <li class='tl'>guard(1)</li>
68
+ <li class='tc'></li>
69
+ <li class='tr'>guard(1)</li>
70
+ </ol>
71
+
72
+ <h2 id="NAME">NAME</h2>
73
+ <p class="man-name">
74
+ <code>guard</code> - <span class="man-whatis">Guard keeps an eye on your file modifications.</span>
75
+ </p>
76
+
77
+ <h2 id="SYNOPSIS">SYNOPSIS</h2>
78
+
79
+ <p>guard <var>command</var> <var>options</var></p>
80
+
81
+ <h2 id="DESCRIPTION">DESCRIPTION</h2>
82
+
83
+ <p>Guard is a command line tool that easily handle events on files modifications.</p>
84
+
85
+ <h2 id="HOMEPAGE">HOMEPAGE</h2>
86
+
87
+ <p>https://github.com/guard/guard</p>
88
+
89
+ <h2 id="OPTIONS">OPTIONS</h2>
90
+
91
+ <dl>
92
+ <dt><code>-c</code>, <code>--clear</code></dt><dd><p>Clears the Shell after each change.</p></dd>
93
+ <dt><code>-n</code> <var>flag</var>, <code>--notify</code> <var>flag</var></dt><dd><p>Disable notifications (Growl or Libnotify depending on your system).
94
+ Note that notifications can also be disabled globally by setting a GUARD_NOTIFY environment variable to false.
95
+ The <var>flag</var> part can be passed to guard using true/false or t/f.</p></dd>
96
+ <dt><code>-g</code> <var>group</var> ..., <code>--group</code> <var>group</var> ...</dt><dd><p>Runs only the groups specified.</p></dd>
97
+ <dt><code>-d</code>, <code>--debug</code></dt><dd><p>Runs Guard in debug mode.</p></dd>
98
+ <dt class="flush"><code>-h</code></dt><dd><p>List all of Guard's available commands.</p></dd>
99
+ </dl>
100
+
101
+
102
+ <h2 id="COMMANDS">COMMANDS</h2>
103
+
104
+ <dl>
105
+ <dt class="flush"><code>start</code></dt><dd><p>Starts Guard. This is the default command if none is provided.</p></dd>
106
+ <dt><code>init</code> [guard]</dt><dd><p>Add the requested guard's default Guardfile configuration to the current Guardfile.</p></dd>
107
+ <dt><code>show</code>, <code>-T</code></dt><dd><p>List defined groups and guards for the current Guardfile.</p></dd>
108
+ </dl>
109
+
110
+
111
+ <h2 id="EXAMPLES">EXAMPLES</h2>
112
+
113
+ <p><code>[bundle exec] guard --clear --group backend frontend --notify false --debug</code></p>
114
+
115
+ <p>or in a more concise way:</p>
116
+
117
+ <p><code>[bundle exec] guard -c -g backend frontend -n f -d</code></p>
118
+
119
+ <h2 id="AUTHORS-CONTRIBUTORS">AUTHORS / CONTRIBUTORS</h2>
120
+
121
+ <p>Thibaud Guillaume-Gentil is the main author.</p>
122
+
123
+ <p>A list of contributors based on all commits can be found here:
124
+ https://github.com/guard/guard/contributors</p>
125
+
126
+ <p>For an exhaustive list of all the contributors, please see the CHANGELOG:
127
+ https://github.com/guard/guard/blob/master/CHANGELOG.md</p>
128
+
129
+
130
+ <ol class='man-decor man-foot man foot'>
131
+ <li class='tl'></li>
132
+ <li class='tc'>June 2011</li>
133
+ <li class='tr'>guard(1)</li>
134
+ </ol>
135
+
136
+ </div>
137
+ </body>
138
+ </html>
metadata CHANGED
@@ -1,101 +1,76 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: guard
3
- version: !ruby/object:Gem::Version
4
- hash: 11
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 4
9
- - 2
10
- version: 0.4.2
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Thibaud Guillaume-Gentil
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-06-08 00:00:00 +02:00
12
+ date: 2011-07-02 00:00:00.000000000 +02:00
19
13
  default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
22
16
  name: bundler
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &2164408000 !ruby/object:Gem::Requirement
25
18
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
33
23
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rspec
37
24
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: *2164408000
26
+ - !ruby/object:Gem::Dependency
27
+ name: rspec
28
+ requirement: &2164407200 !ruby/object:Gem::Requirement
39
29
  none: false
40
- requirements:
30
+ requirements:
41
31
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 23
44
- segments:
45
- - 2
46
- - 6
47
- - 0
32
+ - !ruby/object:Gem::Version
48
33
  version: 2.6.0
49
34
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: guard-rspec
53
35
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
36
+ version_requirements: *2164407200
37
+ - !ruby/object:Gem::Dependency
38
+ name: guard-rspec
39
+ requirement: &2164406640 !ruby/object:Gem::Requirement
55
40
  none: false
56
- requirements:
41
+ requirements:
57
42
  - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 17
60
- segments:
61
- - 0
62
- - 3
63
- - 1
43
+ - !ruby/object:Gem::Version
64
44
  version: 0.3.1
65
45
  type: :development
66
- version_requirements: *id003
67
- - !ruby/object:Gem::Dependency
68
- name: thor
69
46
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
47
+ version_requirements: *2164406640
48
+ - !ruby/object:Gem::Dependency
49
+ name: thor
50
+ requirement: &2164406140 !ruby/object:Gem::Requirement
71
51
  none: false
72
- requirements:
52
+ requirements:
73
53
  - - ~>
74
- - !ruby/object:Gem::Version
75
- hash: 43
76
- segments:
77
- - 0
78
- - 14
79
- - 6
54
+ - !ruby/object:Gem::Version
80
55
  version: 0.14.6
81
56
  type: :runtime
82
- version_requirements: *id004
57
+ prerelease: false
58
+ version_requirements: *2164406140
83
59
  description: Guard is a command line tool to easily handle events on file system modifications.
84
- email:
60
+ email:
85
61
  - thibaud@thibaud.me
86
- executables:
62
+ executables:
87
63
  - guard
88
64
  extensions: []
89
-
90
65
  extra_rdoc_files: []
91
-
92
- files:
66
+ files:
93
67
  - bin/guard
94
68
  - images/failed.png
95
69
  - images/pending.png
96
70
  - images/success.png
97
71
  - lib/guard/cli.rb
98
72
  - lib/guard/dsl.rb
73
+ - lib/guard/dsl_describer.rb
99
74
  - lib/guard/guard.rb
100
75
  - lib/guard/interactor.rb
101
76
  - lib/guard/listener.rb
@@ -109,44 +84,34 @@ files:
109
84
  - lib/guard/version.rb
110
85
  - lib/guard/watcher.rb
111
86
  - lib/guard.rb
87
+ - CHANGELOG.md
112
88
  - LICENSE
89
+ - man/guard.1
90
+ - man/guard.1.html
113
91
  - README.md
114
- - CHANGELOG.md
115
92
  has_rdoc: true
116
93
  homepage: https://github.com/guard/guard
117
94
  licenses: []
118
-
119
95
  post_install_message:
120
96
  rdoc_options: []
121
-
122
- require_paths:
97
+ require_paths:
123
98
  - lib
124
- required_ruby_version: !ruby/object:Gem::Requirement
99
+ required_ruby_version: !ruby/object:Gem::Requirement
125
100
  none: false
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
129
- hash: 3
130
- segments:
131
- - 0
132
- version: "0"
133
- required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
106
  none: false
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- hash: 23
139
- segments:
140
- - 1
141
- - 3
142
- - 6
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
143
110
  version: 1.3.6
144
111
  requirements: []
145
-
146
112
  rubyforge_project: guard
147
113
  rubygems_version: 1.6.2
148
114
  signing_key:
149
115
  specification_version: 3
150
116
  summary: Guard keeps an eye on your file modifications
151
117
  test_files: []
152
-