CKAN Extension開発
どうも皆様、こんにちは!
オープンデータを公開するために使われているCKAN
この拡張機能(Extension)の開発に参加いたしました!
公式のドキュメントのみではハマることがあったので、記事にまとめておきます。
CKAN環境の構築
docker composeでCKANをインストールし、進めていきます!
インストール方法については前回の記事をご覧ください。
ハマりポイント① cookiecutter
CKAN公式がExtension開発のためのチュートリアルを作成してくれています。
ここでハマったポイントが1つ😥
extensionのディレクトリを作成するために以下のコードを打つ必要があるとの記述があります
cookiecutter ckan/contrib/cookiecutter/ckan_extension/
実際に打ってみると...
ERROR: Stopping generation because post_gen_project hook script didn't exit successfully
エラー文を検索すると以下のissueに辿り着きますが...
CKANのコンテナ内で色々と設定をするのは面倒に感じます。😅
しかし、同様のことができるコードが実はすぐ下にあります!
ckan --config=/etc/ckan/production.ini generate extension
こちらのコードであれば特にエラーも発生せずに実行が出来ました!
usr/lib/ckan/venv/src
下に設定した名前のディレクトリが作成されているはずです。
※ --config
オプションのパスについては環境によって異なる可能性があります。
ここを突破しないと次にいけないと思い、そこそこ時間を使いました😂
ハマりポイント② 言語対応
これは軽めのハマりでした!
多言語(日本語など)に対応するには以下のチュートリアルを理解し、進める必要があります。
ざっくりした流れで言うと以下の通りです。
template
の作成→.pot
の生成→.po
の生成と編集→.mo
の生成
この.po
を作成する際に少しハマりました😅
以下のコマンドで.po
ファイルを生成するのですが、上手く.po
が生成されませんでした。
python setup.py init_catalog --locale ja
理由としては「日本語に複数形がない」ということでした。
そうした理由から以下のコードに修正が必要でした。
#: 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
を生成することが出来ました。
ハマりポイント③ テスト
一番ハマったポイントと言っても過言ではないです!
まずは以下のドキュメントを進め、テストの下準備をします
テスト用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
このコードを実行する前の処理がだいぶ端折られています。
- DBのコンテナに移動する(dockerでの構築だからかもしれません)
docker exec -it --user root db /bin/bash
- sudo コマンドをインストールする
apt-get update
apt-get install sudo
- postgresのロールを作成する
CREATE ROLE postgres WITH LOGIN PASWORD 'pass' SUPERUSER;
- ckan_defaultのロールを作成する
CREATE ROLE ckan_default WITH LOGIN PASWORD 'pass' SUPERUSER;
これらの手順を行うことで公式ドキュメントのコマンドを実行できます。
その他の手順を行い、ようやくExtensionのテストのドキュメントを行います!
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開発を行っていて特に記憶に残っているハマりポイントです!
ハマりポイントを自力で脱出できるように、
初歩的なところではハマらないように精進していきます。
今回の記事が皆様のお役に立てれば幸いです。