Pyramidを拡張する作法 知識編

(´  > ω < )拡張しちゃうよ!

アドオン作るために必要なこと。
pyramidのアドオンは、config.includeメソッドで取り込まれます。
そのとき、アドオンのincludeme関数が呼び出されます。ここがアドオンの入り口です。

config.include('hoge')

hoge.py

def includeme(config):
    ここでアドオンの処理をする

アドオンがなにをするかはなにも決まってません。なにもしなくてもincludeできればアドオンです。
引数でconfigが渡されるので、定型的な設定(認証やセッションなどの設定)をすることもあれば、viewやmodelまでそろえたアプリケーションを追加することまで可能です。

拡張とは?
directive
pyramidでは、configのメソッド(directiveと呼びます)を通じてアプリケーションの構成を定義していきますが、directiveを追加できます。

設定内容を追加する
directiveでは最終的にconfigが持っているコンポーネントレジストリ(registry)に設定内容を登録していきます。
registryへの登録内容も、アドオンで追加可能です。
これにより、アドオンを書く場合にありがちなモジュールグローバルなオブジェクトを回避できます。

venusianデコレータ
directiveはconfigがないと呼べないので、configを持ちまわるのがかったるいですね。
デコレータで設定してしまうのがイマドキです。
が、デコレータはimportするだけで効果を発揮するため、import順を気にしたり、ユニットテストのときまで動いてしまったりと副作用が大きすぎます。
pyramidではvenusianデコレータを全般で利用して、config.scanでトリガーを引くまでデコレータの副作用を発生させないようになっています。

view_configデコレータが一番多く利用されますが、これらは内部でconfig.add_viewを呼び出すフックを設定するだけです。
scanしたときに初めてadd_viewが実行されるようになっています。
と、いうのが拡張するときに知っておくべきことです。