Embulk 0.8.3で導入された-cオプションはLiquidを使った設定ファイルとの連携に便利

## 1. はじめに

Embulk 0.8.3から、``run``時に``-c``(``--config-diff``)オプションが使えるようになりました。
(0.8.2から入っていいましたが不具合がありました。)
これによって、liquidを使った設定ファイルとの連携ができるようになりました。

``-c``オプションは``-o``オプションと似ていますが、指定したパスに**差分情報だけを保存する**点が``-o``オプションと異なります。
**``-c``オプションの導入に伴って、``-o``オプションは非推奨になりました。今後は``-c``を利用してください。**

## 2. 利用例

### 2.1 設定ファイル

次のようなliquidを使った設定ファイルがあります。

```
.
|-- config.yml.liquid
`-- hoge
    `-- csv
        `-- sample_01.csv.gz
```

設定ファイルには、``{{ env.DATA_PATH }}``といった環境変数を読み込むパラメータが設定されています。


```yaml:config.yml.liquid
in:
  type: file
  path_prefix: {{ env.DATA_PATH }} # <-- liquid
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
out: {type: stdout}
```

### 2.2 runコマンド実行(1回目)

runコマンドを実行します。その際、``-c``オプションをつけて最後に読み込んだファイルの情報を``diff.yml``に記録させます。


```
embulk run config.yml.liquid -c diff.yml
2016-02-09 19:14:09.418 +0900: Embulk v0.8.3
2016-02-09 19:14:13.339 +0900 [INFO] (0001:transaction): Listing local files at directory 'hoge/csv' filtering filename by prefix ''
2016-02-09 19:14:13.351 +0900 [INFO] (0001:transaction): Loading files [hoge/csv/sample_01.csv.gz]
2016-02-09 19:14:13.459 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=8 / output tasks 4 = input tasks 1 * 4
2016-02-09 19:14:13.479 +0900 [INFO] (0001:transaction): {done:  0 / 1, running: 0}
1,32864,2015-01-27 19:23:49,20150127,embulk
2,14824,2015-01-27 19:01:23,20150127,embulk jruby
3,27559,2015-01-28 02:20:02,20150128,Embulk "csv" parser plugin
4,11270,2015-01-29 11:54:36,20150129,NULL
2016-02-09 19:14:13.683 +0900 [INFO] (0001:transaction): {done:  1 / 1, running: 0}
2016-02-09 19:14:13.701 +0900 [INFO] (main): Committed.
2016-02-09 19:14:13.701 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"hoge/csv/sample_01.csv.gz"},"out":{}}
```

保存された中身を見ると、``diff.yml``には差分情報のみが記録されています。

```yaml
in: {last_path: hoge/csv/sample_01.csv.gz}
out: {}
```

### 2.3 runコマンド実行(2回目)

同じコマンドを再度実行します。2回目の実行では、``diff.yml``ファイル内に記載されたlast_pathの値が利用されるため、
sample_01.csv.gzは読み込まれてないことが確認できます。

```
embulk run config.yml.liquid -c diff.yml
2016-02-09 19:14:56.046 +0900: Embulk v0.8.3
2016-02-09 19:14:59.228 +0900 [INFO] (0001:transaction): Listing local files at directory 'hoge/csv' filtering filename by prefix ''
2016-02-09 19:14:59.237 +0900 [INFO] (0001:transaction): Loading files []
2016-02-09 19:14:59.360 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=8 / tasks=0
2016-02-09 19:14:59.378 +0900 [INFO] (main): Committed.
2016-02-09 19:14:59.378 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"hoge/csv/sample_01.csv.gz"},"out":{}}
```

## 3. 参考(-oオプションの挙動)

``-o``オプションを使った場合は次のように設定ファイル全体が保存されており、さらに環境変数は展開された値となってしまっていました。
そのため、次回この設定ファイルをliquid形式のファイルとして利用することはできませんでした。

つまり``embulk run config.yml.liquid -o config.yml.liquid``のような使い方ができなかったということです。

```yaml
in:
  type: file
  path_prefix: hoge/csv/ # <-- 展開されてしまった環境変数
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
  last_path: hoge/csv/sample_01.csv.gz
out: {type: stdout}
```