# ExGuard
ExGuard is a mix command to handle events on file system modifications, ExGuard heavily borrowed ideas/art works from [Ruby Guard](https://github.com/guard/guard)
![ExGuard](https://github.com/slashmili/ex_guard/raw/master/logo.png)
[![Build Status](https://travis-ci.org/slashmili/ex_guard.svg?branch=master)](https://travis-ci.org/slashmili/ex_guard)
[![Hex.pm](https://img.shields.io/hexpm/v/ex_guard.svg)](https://hex.pm/packages/ex_guard)
[![Docs](https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat)](https://hexdocs.pm/ex_guard/)
[![Hex.pm](https://img.shields.io/hexpm/dt/ex_guard.svg)](https://hex.pm/packages/ex_guard)
[![Deps Status](https://beta.hexfaktor.org/badge/all/github/slashmili/ex_guard.svg)](https://beta.hexfaktor.org/github/slashmili/ex_guard)
[![Hex.pm](https://img.shields.io/hexpm/l/ex_guard.svg)]()
## Usage
1. Add `ex_guard` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[{:ex_guard, "~> 1.5", only: :dev}]
end
```
2. Create a file named `.exguard.exs` in your root application directory:
```elixir
use ExGuard.Config
guard("unit-test", run_on_start: true)
|> command("mix test --color")
|> watch(~r{\.(erl|ex|exs|eex|xrl|yrl)\z}i)
|> ignore(~r{deps})
|> notification(:auto)
```
Look at below sample file for more fine-grained config.
3. Run `mix guard` as soon as you change any file with above pattern, the test gets executed
## Notification
Currently supports notification with tools:
* [Terminal Title](http://tldp.org/HOWTO/Xterm-Title-3.html) (Xterm)
* [TMux](http://tmux.github.io/) (Universal)
* [Terminal Notifier](https://github.com/julienXX/terminal-notifier) (mac only)
* [Notify Send](http://ss64.com/bash/notify-send.html) (linux distros)
In order to _ExGuard_ sends notification, you need to make sure these tools are setup properly.
If you are using _ExGuard_ mainly for Elixir test you may turn the notification off and use [ExUnit Notifier](https://github.com/navinpeiris/ex_unit_notifier) instead.
## Why ExGuard and not mix-test.watch or eye_drops or XYZ
It's just a matter of taste!
With _ExGuard_ you can run multiple commands and the config looks nice.
```elixir
use ExGuard.Config
guard("elixir test", run_on_start: true)
|> command("mix test --color")
#only run related phoenix test when a file changes
|> watch({~r{lib/(?<lib_dir>.+_web)/(?<dir>.+)/(?<file>.+).ex$}i, fn m -> "test/#{m["lib_dir"]}/#{m["dir"]}/#{m["file"]}_test.exs" end})
# only if the above pattern doesn't match try to match all elixir/erlang source
|> watch(~r{\.(erl|ex|exs|eex|xrl|yrl)\z}i)
|> ignore(~r{deps})
|> notification(:off) #Disabled it and using ex_unit_notifier instead
guard("elm test", run_on_start: true)
|> command("elm-test assets/tests/")
|> watch(~r{\.(elm)\z}i)
|> ignore(~r{elm-stuff})
|> notification(:auto)
```