CKAN Extension開発でハマった３選！

# CKAN Extension開発

どうも皆様、こんにちは！
オープンデータを公開するために使われている**CKAN**
この拡張機能(Extension)の開発に参加いたしました！
公式のドキュメントのみではハマることがあったので、記事にまとめておきます。

## CKAN環境の構築

docker composeでCKANをインストールし、進めていきます！
インストール方法については[前回の記事](https://qiita.com/To-Ki-O/items/ecd1795cbdecad18ce66)をご覧ください。

## ハマりポイント① cookiecutter

CKAN公式がExtension開発のためのチュートリアルを作成してくれています。

https://docs.ckan.org/en/2.9/extensions/tutorial.html#setup-py

ここでハマったポイントが１つ😥

extensionのディレクトリを作成するために以下のコードを打つ必要があるとの記述があります
```bash
cookiecutter ckan/contrib/cookiecutter/ckan_extension/
```

実際に打ってみると...

```
ERROR: Stopping generation because post_gen_project hook script didn't exit successfully
```

エラー文を検索すると以下のissueに辿り着きますが...
CKANのコンテナ内で色々と設定をするのは面倒に感じます。😅

https://github.com/patdaburu/cookiecutter-click/issues/83

しかし、同様のことができるコードが実はすぐ下にあります！

```
ckan --config=/etc/ckan/production.ini generate extension
```

こちらのコードであれば特にエラーも発生せずに実行が出来ました！
`usr/lib/ckan/venv/src`下に設定した名前のディレクトリが作成されているはずです。

※ `--config`オプションのパスについては環境によって異なる可能性があります。

ここを突破しないと次にいけないと思い、そこそこ時間を使いました😂

## ハマりポイント② 言語対応

これは軽めのハマりでした！

多言語(日本語など)に対応するには以下のチュートリアルを理解し、進める必要があります。

https://docs.ckan.org/en/2.9/contributing/i18n.html

ざっくりした流れで言うと以下の通りです。
`template`の作成→`.pot`の生成→`.po`の生成と編集→`.mo`の生成

この`.po`を作成する際に少しハマりました😅
以下のコマンドで`.po`ファイルを生成するのですが、上手く`.po`が生成されませんでした。

```
python setup.py init_catalog --locale ja
```

理由としては「日本語に複数形がない」ということでした。
そうした理由から以下のコードに修正が必要でした。

```python
#: ckanext/feedback/templates/header.html:23
#, python-format
msgid "Dashboard (%(num)d new item)"
msgid_plural "Dashboard (%(num)d new items)"
msgstr[0] ""
msgstr[1] ""
```

この`msgstr[1]`を削除することで問題なく`.po`を生成することが出来ました。

## ハマりポイント③ テスト

一番ハマったポイントと言っても過言ではないです！

まずは以下のドキュメントを進め、テストの下準備をします

https://docs.ckan.org/en/2.9/contributing/test.html

### テスト用DBの作成

ここで以下のコードを実行し、テスト用のDBを構築するのですが...

```
sudo -u postgres createdb -O ckan_default ckan_test -E utf-8
sudo -u postgres createdb -O ckan_default datastore_test -E utf-8
```

このコードを実行する前の処理がだいぶ端折られています。

1. DBのコンテナに移動する(dockerでの構築だからかもしれません)
`docker exec -it --user root db /bin/bash`
2. sudo コマンドをインストールする
`apt-get update`
`apt-get install sudo`
3. postgresのロールを作成する
`CREATE ROLE postgres WITH LOGIN PASWORD 'pass' SUPERUSER;`
4. ckan_defaultのロールを作成する
`CREATE ROLE ckan_default WITH LOGIN PASWORD 'pass' SUPERUSER;`

これらの手順を行うことで公式ドキュメントのコマンドを実行できます。

その他の手順を行い、ようやくExtensionのテストのドキュメントを行います！

https://docs.ckan.org/en/2.9/extensions/testing-extensions.html

### `test.ini`の場所

テストを記述し、公式通りに進めていくと以下のコードを実行するとエラーが起きます

```
pytest --ckan-ini=test.ini ckanext/iauthfunctions/tests
```

まずExtensionの配置されるディレクトリがインストール方法によって少し変わります。

* `pip install`を使う場合
`/usr/lib/ckan/venv/lib/pythonX.X/site-packages/`
    * 公式通りに`test.ini`を配置しているとコンテナ内に取り込まれません
    * `ckanext`以下のどこかに配置しましょう

* Githubから直接インストールする場合
`/usr/lib/ckan/venv/src/`

ですので、`--ckan-ini`オプションの指定するパスが変わってきます

### テスト用DBの指定

さて、実行していきます！
しかし、テストファイルの`clean_db`での初期化が上手くいきません😥

これは`test.ini`の`sqlalchemy.url`で指定したDBがテスト実行時に上書きされているからだそうです。(自分では見つけられませんでした泣)

ですので、コマンドの前に
```
CKAN_SQLALCHEMY_URL= CKAN_DATASTORE_READ_URL= CKAN_DATASTORE_WRITE_URL= 
```
をおいてあげる必要があるそうです。

## まとめ

以上が私がCKAN Extension開発を行っていて特に記憶に残っているハマりポイントです！

ハマりポイントを自力で脱出できるように、
初歩的なところではハマらないように精進していきます。

今回の記事が皆様のお役に立てれば幸いです。