Python Watchdogのtricksを試す

# はじめに

WatchdogとはPython製のファイル監視ライブラリです。
開発中、ファイルの更新を監視してテストを自動で走らせたい時などに利用します。
今回はWatchdogの`watchmedo`コマンドのtricksを試します。

# インストール

```
$ pip install watchdog
$ watchmedo --version
watchmedo 0.8.3
```

# 使い方

まずはヘルプを眺めます。

```
$ watchmedo --help
usage: watchmedo [-h] [--version]
                 {tricks-from,tricks,tricks-generate-yaml,generate-tricks-yaml,log,shell-command,auto-restart}
                 ...

positional arguments:
  {tricks-from,tricks,tricks-generate-yaml,generate-tricks-yaml,log,shell-command,auto-restart}
    tricks-from (tricks)
                        Subcommand to execute tricks from a tricks
                        configuration file. :param args: Command line argument
                        options.
    tricks-generate-yaml (generate-tricks-yaml)
                        Subcommand to generate Yaml configuration for tricks
                        named on the command line. :param args: Command line
                        argument options.
    log                 Subcommand to log file system events to the console.
                        :param args: Command line argument options.
    shell-command       Subcommand to execute shell commands in response to
                        file system events. :param args: Command line argument
                        options.
    auto-restart        Subcommand to start a long-running subprocess and
                        restart it on matched events. :param args: Command
                        line argument options.

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit

Copyright 2011 Yesudeep Mangalapilly <yesudeep@gmail.com>.
Copyright 2012 Google, Inc.

Licensed under the terms of the Apache license, version 2.0. Please see
LICENSE in the source code for more information.
```

## tricks-generate-yaml

YAMLファイルを生成してくれそうなサブコマンドを打ちます。

```
$ watchmedo tricks-generate-yaml
python-path: [.]
tricks:
```

ちょっと物足りないですね。

## tricksファイルの書き方

続いて書き方を確認します。
[サンプル](https://github.com/gorakhargosh/watchdog/blob/master/docs/source/examples/tricks.yaml
)は以下の様に書かれています。`tricks`以下にクラスとパラメータを指定してあげれば良さそうです。

```yaml:tricks.yaml
tricks:
- watchdog.tricks.LoggerTrick:
    patterns: ["*.py", "*.js"]
- watchmedo_webtricks.GoogleClosureTrick:
    patterns: ['*.js']
    hash_names: true
    mappings_format: json                  # json|yaml|python
    mappings_module: app/javascript_mappings
    suffix: .min.js
    compilation_level: advanced            # simple|advanced
    source_directory: app/static/js/
    destination_directory: app/public/js/
    files:
      index-page:
      - app/static/js/vendor/jquery.js
      - app/static/js/base.js
      - app/static/js/index-page.js
      about-page:
      - app/static/js/vendor/jquery.js
      - app/static/js/base.js
      - app/static/js/about-page.js
```

というわけで以下の方針でファイルを作成しました。

* `LoggerTrick` でログ出力をする
  * ディレクトリの更新は無視
* `ShellCommandTrick`で実行する
  * `*.py` を監視
  * 実行中は監視を無視

```yaml:tricks.yaml
python-path: [.]
tricks:
- watchdog.tricks.LoggerTrick:
    patterns: ["*"]
    ignore_directories: true
- watchdog.tricks.ShellCommandTrick:
    patterns: ["*.py"]
    shell_command: python ${watch_src_path}
    drop_during_process: true
```

## 実行

作成したファイルを`tricks-from`で指定します。

```
$ watchmedo tricks-from tricks.yaml
```

早速適当なエディタでファイルを作ってみます。

```hello.py
#coding: utf-8

print("hello tricks!")
```

保存すると以下が出力されます。作成時のイベントを拾ってスクリプトを実行できているようです。
更新時は`on_modified`、削除時は`on_deleted`が出力されます。

```
on_created(self=<watchdog.tricks.LoggerTrick object at 0x6ffff92b510>, event=<FileCreatedEvent: src_path='./hello.py'>)
hello tricks!
```