guard 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +24 -0
- data/README.md +85 -79
- data/lib/guard.rb +6 -3
- data/lib/guard/cli.rb +2 -2
- data/lib/guard/commands/all.rb +34 -0
- data/lib/guard/commands/change.rb +37 -0
- data/lib/guard/commands/notification.rb +27 -0
- data/lib/guard/commands/pause.rb +28 -0
- data/lib/guard/commands/reload.rb +35 -0
- data/lib/guard/commands/show.rb +27 -0
- data/lib/guard/dsl.rb +73 -9
- data/lib/guard/interactor.rb +134 -212
- data/lib/guard/notifier.rb +36 -14
- data/lib/guard/notifiers/emacs.rb +23 -19
- data/lib/guard/notifiers/terminal_title.rb +35 -0
- data/lib/guard/notifiers/tmux.rb +67 -10
- data/lib/guard/runner.rb +6 -2
- data/lib/guard/ui.rb +74 -14
- data/lib/guard/version.rb +1 -1
- metadata +44 -10
- 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/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 1.5.0 - 22 October, 2012
|
2
|
+
|
3
|
+
### New features
|
4
|
+
|
5
|
+
- [#327][] Use Pry as interactor. ([@netzpirat][])
|
6
|
+
- [#345][] Use Lumberjack as customizable logger. ([@netzpirat][])
|
7
|
+
- [#342][] Add notifier for displaying result in terminal title. ([@tomas-zemres][])
|
8
|
+
- [#348][] Introduce grouping of the notifiers for better auto-detection. ([@netzpirat][])
|
9
|
+
|
10
|
+
### Improvements
|
11
|
+
|
12
|
+
- [#348][] Introduce grouping of the notifiers. ([@netzpirat][])
|
13
|
+
- [#343][] Customize tmux notifier status location. ([@nickmabry][])
|
14
|
+
- Adds ability to override default options in emacs notifier. ([@d1][])
|
15
|
+
- Use `$stderr` instead of `STDERR` to allow redirection. ([@netzpirat][])
|
16
|
+
- [#334][] Extend `:tmux` notifier with use of `tmux display-message` and options to configure them. ([@matthijsgroen][])
|
17
|
+
|
1
18
|
## 1.4.0 - 26 September, 2012
|
2
19
|
|
3
20
|
- [#331][] Add tmux notifier. ([@royvandewater][])
|
@@ -600,6 +617,9 @@ The Listen integration has been supervised by [@thibaudgg][] and executed by [@M
|
|
600
617
|
[#317]: https://github.com/guard/guard/issues/317
|
601
618
|
[#324]: https://github.com/guard/guard/issues/324
|
602
619
|
[#331]: https://github.com/guard/guard/issues/331
|
620
|
+
[#334]: https://github.com/guard/guard/issues/334
|
621
|
+
[#342]: https://github.com/guard/guard/issues/342
|
622
|
+
[#343]: https://github.com/guard/guard/issues/343
|
603
623
|
[@Gazer]: https://github.com/Gazer
|
604
624
|
[@Maher4Ever]: https://github.com/Maher4Ever
|
605
625
|
[@alandipert]: https://github.com/alandipert
|
@@ -611,6 +631,7 @@ The Listen integration has been supervised by [@thibaudgg][] and executed by [@M
|
|
611
631
|
[@capotej]: https://github.com/capotej
|
612
632
|
[@ches]: https://github.com/ches
|
613
633
|
[@chrisberkhout]: https://github.com/chrisberkhout
|
634
|
+
[@d1]: https://github.com/d1
|
614
635
|
[@dgutov]: https://github.com/dgutov
|
615
636
|
[@dnagir]: https://github.com/dnagir
|
616
637
|
[@docwhat]: https://github.com/docwhat
|
@@ -639,12 +660,14 @@ The Listen integration has been supervised by [@thibaudgg][] and executed by [@M
|
|
639
660
|
[@madtrick]: https://github.com/madtrick
|
640
661
|
[@maio]: https://github.com/maio
|
641
662
|
[@mattgreen]: https://github.com/mattgreen
|
663
|
+
[@matthijsgroen]: https://github.com/matthijsgroen
|
642
664
|
[@mcmire]: https://github.com/mcmire
|
643
665
|
[@mislav]: https://github.com/mislav
|
644
666
|
[@monocle]: https://github.com/monocle
|
645
667
|
[@mordaroso]: https://github.com/mordaroso
|
646
668
|
[@nestegg]: https://github.com/nestegg
|
647
669
|
[@netzpirat]: https://github.com/netzpirat
|
670
|
+
[@nickmabry]: https://github.com/nickmabry
|
648
671
|
[@nicksieger]: https://github.com/nicksieger
|
649
672
|
[@niklas]: https://github.com/niklas
|
650
673
|
[@oliamb]: https://github.com/oliamb
|
@@ -667,6 +690,7 @@ The Listen integration has been supervised by [@thibaudgg][] and executed by [@M
|
|
667
690
|
[@thibaudgg]: https://github.com/thibaudgg
|
668
691
|
[@thierryhenrio]: https://github.com/thierryhenrio
|
669
692
|
[@tinogomes]: https://github.com/tinogomes
|
693
|
+
[@tomas-zemres]: https://github.com/tomas-zemres
|
670
694
|
[@tpope]: https://github.com/tpope
|
671
695
|
[@uk-ar]: https://github.com/uk-ar
|
672
696
|
[@veged]: https://github.com/veged
|
data/README.md
CHANGED
@@ -101,8 +101,7 @@ end
|
|
101
101
|
|
102
102
|
### System notifications
|
103
103
|
|
104
|
-
You can configure Guard to make use of the following system notification libraries
|
105
|
-
to use either Ruby GNTP, Libnotify or Notifu:
|
104
|
+
You can configure Guard to make use of the following system notification libraries:
|
106
105
|
|
107
106
|
#### Ruby GNTP
|
108
107
|
|
@@ -219,13 +218,45 @@ group :development do
|
|
219
218
|
end
|
220
219
|
```
|
221
220
|
|
221
|
+
#### Terminal Title
|
222
|
+
|
223
|
+
* Runs in every terminal supporting XTerm escape sequences to set the window title.
|
224
|
+
|
222
225
|
#### Emacs
|
223
226
|
|
224
227
|
* Runs on any platform with Emacs + emacsclient (http://www.emacswiki.org/emacs/EmacsClient)
|
225
228
|
|
226
|
-
###
|
229
|
+
### TMux
|
230
|
+
|
231
|
+
* To use TMux notifications, you have to start Guard within a [TMux](http://tmux.sourceforge.net/) session.
|
232
|
+
|
233
|
+
The TMux notifier will color the background of the left part of the
|
234
|
+
status bar indicating the status of the notifications. Optionally you
|
235
|
+
can set `:display_message => true` to display the Guard notification as
|
236
|
+
'display-message' notification.
|
237
|
+
|
238
|
+
The way these messages are formatted is configurable.
|
239
|
+
|
240
|
+
```ruby
|
241
|
+
# Guardfile
|
242
|
+
notification :tmux,
|
243
|
+
:display_message => true,
|
244
|
+
:timeout => 5, # in seconds
|
245
|
+
:default_message_format => '%s >> %s',
|
246
|
+
# the first %s will show the title, the second the message
|
247
|
+
# Alternately you can also configure *success_message_format*,
|
248
|
+
# *pending_message_format*, *failed_message_format*
|
249
|
+
:line_separator => ' > ', # since we are single line we need a separator
|
250
|
+
:color_location => 'status-left-bg' # to customize which tmux element will change color
|
251
|
+
```
|
252
|
+
|
253
|
+
The result will be for RSpec using example above
|
254
|
+
|
255
|
+
RSpec >> 15 test, 0 failures > in 0.002 sec
|
256
|
+
|
257
|
+
You can use nice powerline chars here if you have that configured.
|
227
258
|
|
228
|
-
|
259
|
+
You can get the message history by using `Ctrl+b ~` (where `Ctrl+b` is your key to activate TMux).
|
229
260
|
|
230
261
|
Add Guard plugins
|
231
262
|
-----------------
|
@@ -457,82 +488,41 @@ read more about these files in the shared configuration section below.
|
|
457
488
|
Interactions
|
458
489
|
------------
|
459
490
|
|
460
|
-
|
491
|
+
Guard shows a [Pry](http://pryrepl.org/) console whenever it has nothing to do and comes with some Guard specific Pry
|
492
|
+
commands:
|
461
493
|
|
462
|
-
*
|
463
|
-
* `h`, `help`:
|
464
|
-
* `
|
465
|
-
* `
|
466
|
-
* `
|
467
|
-
* `
|
468
|
-
* `
|
469
|
-
|
470
|
-
* `e`, `exit`: Stop all plugins and quit Guard.
|
494
|
+
* `↩`, `a`, `all`: Run all plugins.
|
495
|
+
* `h`, `help`: Show help for all interactor commands.
|
496
|
+
* `c`, `change`: Trigger a file change.
|
497
|
+
* `n`, `notification`: Toggles the notifications.
|
498
|
+
* `p`, `pause`: Toggles the file listener.
|
499
|
+
* `r`, `reload`: Reload all plugins.
|
500
|
+
* `s`, `show`: Show all Guard plugins.
|
501
|
+
* `e`, `exit`: Stop all plugins and quit Guard
|
471
502
|
|
472
|
-
|
503
|
+
The `all` and `reload` commands supports an optional scope, so you limit the Guard action to either a Guard plugin or
|
504
|
+
a Guard group like:
|
473
505
|
|
474
506
|
```bash
|
475
|
-
> rspec
|
507
|
+
[1] guard(main)> all rspec
|
508
|
+
[2] guard(main)> all frontend
|
476
509
|
```
|
477
510
|
|
478
|
-
|
511
|
+
Remember, you can always use `help` on the Pry command line to see all available commands and `help <command>` for
|
512
|
+
more detailed information. `help guard` will show all Guard related commands available
|
479
513
|
|
480
|
-
|
481
|
-
|
482
|
-
|
514
|
+
Pry supports the Ruby built-in Readline, [rb-readline](https://github.com/luislavena/rb-readline) and
|
515
|
+
[Coolline](https://github.com/Mon-Ouie/coolline). Just install the readline implementation of your choice by adding it
|
516
|
+
to your `Gemfile.
|
483
517
|
|
484
|
-
|
518
|
+
You can also disable the interactions completely by running Guard with the `--no-interactions` option.
|
485
519
|
|
486
|
-
|
487
|
-
> ronn reload
|
488
|
-
```
|
489
|
-
|
490
|
-
This will reload only the Ronn plugin. You can also reload all plugins within a group:
|
491
|
-
|
492
|
-
```bash
|
493
|
-
> backend reload
|
494
|
-
```
|
495
|
-
|
496
|
-
The action and plugin/group name can have any order, so you can also write:
|
497
|
-
|
498
|
-
```bash
|
499
|
-
> reload backend
|
500
|
-
```
|
501
|
-
|
502
|
-
You can pass a list of filenames to the `change` command to trigger manually a file modification:
|
503
|
-
|
504
|
-
```bash
|
505
|
-
> change spec/guard_spec.rb
|
506
|
-
```
|
520
|
+
### Customizations
|
507
521
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
Unfortunately Readline [does not work on MRI](http://bugs.ruby-lang.org/issues/5539) on Mac OS X by default. You can
|
514
|
-
work around the issue by installing a pure Ruby implementation:
|
515
|
-
|
516
|
-
```ruby
|
517
|
-
platforms :ruby do
|
518
|
-
gem 'rb-readline'
|
519
|
-
end
|
520
|
-
```
|
521
|
-
|
522
|
-
Guard will automatically enable Readline support if your environment supports it, but you can disable Readline with the
|
523
|
-
`interactor` DSL method or turn off completely with the `--no-interactions` option.
|
524
|
-
|
525
|
-
### Coolline support
|
526
|
-
|
527
|
-
With Ruby 1.9.3 you can use a [Coolline](https://github.com/Mon-Ouie/coolline) based interactor, which uses the new
|
528
|
-
`io/console` from stdlib. Just add it to your `Gemfile`
|
529
|
-
|
530
|
-
```ruby
|
531
|
-
gem 'coolline'
|
532
|
-
```
|
533
|
-
|
534
|
-
Guard will automatically enable Coolline support if your environment supports it, but you can disable Coolline with the
|
535
|
-
`interactor` DSL method or turn off completely with the `--no-interactions` option.
|
522
|
+
Further Guard specific customizations can be made in `~/.guardrc` that will be evaluated prior the Pry session is
|
523
|
+
started. This allows you to make use of the Pry plugin architecture to provide custom commands and extend Guard for
|
524
|
+
your own needs and distribute as a gem. Please have a look at the [Pry Wiki](https://github.com/pry/pry/wiki) for more
|
525
|
+
information.
|
536
526
|
|
537
527
|
### Signals
|
538
528
|
|
@@ -683,15 +673,7 @@ notification :off
|
|
683
673
|
|
684
674
|
### interactor
|
685
675
|
|
686
|
-
|
687
|
-
|
688
|
-
```ruby
|
689
|
-
interactor :coolline
|
690
|
-
interactor :readline
|
691
|
-
interactor :simple
|
692
|
-
```
|
693
|
-
|
694
|
-
If you do not need the keyboard interactions with Guard at all, you can turn them off:
|
676
|
+
If you do not need the Pry interactions with Guard at all, you can turn it off:
|
695
677
|
|
696
678
|
```ruby
|
697
679
|
interactor :off
|
@@ -744,6 +726,30 @@ Please note that method only accept regexps. More on the
|
|
744
726
|
filter /\.txt$/, /.*\.zip/
|
745
727
|
```
|
746
728
|
|
729
|
+
### logger
|
730
|
+
|
731
|
+
The `logger` method allows you to customize the Guard log output to your needs by specifying one or more options like:
|
732
|
+
|
733
|
+
```ruby
|
734
|
+
logger :level => :warn,
|
735
|
+
:template => '[:severity - :time - :progname] :message',
|
736
|
+
:time_format => 'at %I:%M%p',
|
737
|
+
:only => [:rspec, :jasmine, 'coffeescript'],
|
738
|
+
:except => :jammit
|
739
|
+
```
|
740
|
+
|
741
|
+
Log `:level` option must be either `:debug`, `:info`, `:warn` or `:error`. If Guard is started in debug mode, the log
|
742
|
+
level will be automatically set to `:debug`.
|
743
|
+
|
744
|
+
The `:template` option is a string which can have one or more of the following placeholders: `:time`, `:severity`,
|
745
|
+
`:progname`, `:pid`, `:unit_of_work_id` and `:message`. A unit of work is assigned for each action Guard performs on
|
746
|
+
multiple Guard plugin.
|
747
|
+
|
748
|
+
The `:time_format` option directives are the same as Time#strftime or can be `:milliseconds`
|
749
|
+
|
750
|
+
The `:only` and `:except` are either a string or a symbol, or an array of strings or symbols that matches the name of
|
751
|
+
the Guard plugin name that sends the log message. They cannot be specified at the same time.
|
752
|
+
|
747
753
|
### Example
|
748
754
|
|
749
755
|
```ruby
|
data/lib/guard.rb
CHANGED
@@ -54,13 +54,16 @@ module Guard
|
|
54
54
|
setup_listener
|
55
55
|
setup_signal_traps
|
56
56
|
|
57
|
-
debug_command_execution if @options[:debug]
|
58
|
-
|
59
57
|
::Guard::Dsl.evaluate_guardfile(options)
|
60
58
|
::Guard::UI.error 'No guards found in Guardfile, please add at least one.' if @guards.empty?
|
61
59
|
|
62
60
|
runner.deprecation_warning if @options[:show_deprecations]
|
63
61
|
|
62
|
+
if @options[:debug]
|
63
|
+
::Guard::UI.options[:level] = :debug
|
64
|
+
debug_command_execution
|
65
|
+
end
|
66
|
+
|
64
67
|
setup_notifier
|
65
68
|
setup_interactor
|
66
69
|
|
@@ -130,7 +133,7 @@ module Guard
|
|
130
133
|
#
|
131
134
|
def setup_interactor
|
132
135
|
unless options[:no_interactions]
|
133
|
-
@interactor = ::Guard::Interactor.
|
136
|
+
@interactor = ::Guard::Interactor.new
|
134
137
|
end
|
135
138
|
end
|
136
139
|
|
data/lib/guard/cli.rb
CHANGED
@@ -21,13 +21,13 @@ module Guard
|
|
21
21
|
:type => :boolean,
|
22
22
|
:default => false,
|
23
23
|
:aliases => '-c',
|
24
|
-
:banner => 'Auto clear shell before each
|
24
|
+
:banner => 'Auto clear shell before each action'
|
25
25
|
|
26
26
|
method_option :notify,
|
27
27
|
:type => :boolean,
|
28
28
|
:default => true,
|
29
29
|
:aliases => '-n',
|
30
|
-
:banner => 'Notifications feature
|
30
|
+
:banner => 'Notifications feature'
|
31
31
|
|
32
32
|
method_option :debug,
|
33
33
|
:type => :boolean,
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Guard
|
2
|
+
class Interactor
|
3
|
+
|
4
|
+
ALL = Pry::CommandSet.new do
|
5
|
+
create_command 'all' do
|
6
|
+
|
7
|
+
group 'Guard'
|
8
|
+
description 'Run all plugins.'
|
9
|
+
|
10
|
+
banner <<-BANNER
|
11
|
+
Usage: all <scope>
|
12
|
+
|
13
|
+
Run the Guard plugin `run_all` action.
|
14
|
+
|
15
|
+
You may want to specify an optional scope to the action,
|
16
|
+
either the name of a Guard plugin or a plugin group.
|
17
|
+
BANNER
|
18
|
+
|
19
|
+
def process(*entries)
|
20
|
+
scopes, rest = ::Guard::Interactor.convert_scope(entries)
|
21
|
+
|
22
|
+
if rest.length == 0
|
23
|
+
::Guard.run_all scopes
|
24
|
+
else
|
25
|
+
output.puts "Unkown scope #{ rest.join(', ') }"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Pry.commands.import ::Guard::Interactor::ALL
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Guard
|
2
|
+
class Interactor
|
3
|
+
|
4
|
+
CHANGE = Pry::CommandSet.new do
|
5
|
+
create_command 'change' do
|
6
|
+
|
7
|
+
group 'Guard'
|
8
|
+
description 'Trigger a file change.'
|
9
|
+
|
10
|
+
banner <<-BANNER
|
11
|
+
Usage: change <scope>
|
12
|
+
|
13
|
+
Runs the Guard plugin `run_on_changes` action.
|
14
|
+
|
15
|
+
You may want to specify an optional scope to the action,
|
16
|
+
either the name of a Guard plugin or a plugin group.
|
17
|
+
BANNER
|
18
|
+
|
19
|
+
def process(*entries)
|
20
|
+
scopes, rest = ::Guard::Interactor.convert_scope(entries)
|
21
|
+
|
22
|
+
if rest.length != 0
|
23
|
+
::Guard.within_preserved_state do
|
24
|
+
::Guard.runner.run_on_changes(rest, [], [])
|
25
|
+
end
|
26
|
+
else
|
27
|
+
output.puts 'Please specify a file.'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Pry.commands.import ::Guard::Interactor::CHANGE
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'guard/notifier'
|
2
|
+
|
3
|
+
module Guard
|
4
|
+
class Interactor
|
5
|
+
|
6
|
+
NOTIFICATION = Pry::CommandSet.new do
|
7
|
+
create_command 'notification' do
|
8
|
+
|
9
|
+
group 'Guard'
|
10
|
+
description 'Toggles the notifications.'
|
11
|
+
|
12
|
+
banner <<-BANNER
|
13
|
+
Usage: notification
|
14
|
+
|
15
|
+
Toggles the notifications on and off.
|
16
|
+
BANNER
|
17
|
+
|
18
|
+
def process
|
19
|
+
::Guard::Notifier.toggle
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Pry.commands.import ::Guard::Interactor::NOTIFICATION
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Guard
|
2
|
+
class Interactor
|
3
|
+
|
4
|
+
PAUSE = Pry::CommandSet.new do
|
5
|
+
create_command 'pause' do
|
6
|
+
|
7
|
+
group 'Guard'
|
8
|
+
description 'Toggles the file listener.'
|
9
|
+
|
10
|
+
banner <<-BANNER
|
11
|
+
Usage: pause
|
12
|
+
|
13
|
+
Toggles the file listener on and off.
|
14
|
+
|
15
|
+
When the file listener is paused, the default Guard Pry
|
16
|
+
prompt will show the pause sign `[p]`.
|
17
|
+
BANNER
|
18
|
+
|
19
|
+
def process
|
20
|
+
::Guard.pause
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Pry.commands.import ::Guard::Interactor::PAUSE
|