mercurialアドベントカレンダー2011 21日目precommit hookでrequirements.txtをチェックする

mercurialアドベントカレンダー21日目です。

今回は小ネタでいきます。

pythonで開発しているときに、依存するライブラリはsetup.pyに書きますが、テストツールやドキュメンテーションツールはsetup.pyに書かないわけです。

そういうのはrequirements.txtに書いとくのです。

あと、setup.pyには細かいバージョン指定をせずに、これまたrequirements.txtに書くことが多いのですが、開発しているうちにrequirements.txtを更新するのを忘れてしまうわけです。

まあ、こんなのpip freezeしてあげればいいのですが、そんなの機械がやってくれよ!

ということでprecommit hookでrequirements.txtが古くなっていないか確認します。

あと、virtualenvで作業してるのになぜかプロジェクトに関係ないライブラリが入ってしまってないかの確認にもなります。

 

[hooks]

precommit.freeze = pip freeze | sed "/-e .*$/d" | diff - requirements.txt

非常に不親切なエラーが出ますがまあ、実際の環境とrequirements.txtの内容が違ってたらそのdiffが表示されて、commitされないようになります。
今開発しているものもeditableでインストールしていてpip freezeに含まれますが、 "-e" で始まるので、それをsedで消してから、確認します。
そうしないとリビジョンが含まれているので、毎回diffにひっかかってしまいますからね。

ということで、21日目の内容はおしまい。

次は@sabo2さんでいいのでしょうか?

python3でwebプログラミングに使えるライブラリ

From Evernote:

python3でwebプログラミングに使えるライブラリ

各フレームワークが対応中といううわさをそこそこ聞きますが、
今すぐpython3でwebプログラミングをしてみたい人もいると思うので、
python3で使えるライブラリを調べてみた。

Webアプリケーションライブラリ

  • Beaker セッションとキャッシュ
  • Jinja2 HTMLテンプレート
  • Mako HTMLテンプレート
  • MarkupSafe HTMLのエスケープなど
  • PasteDeploy WSGIアプリケーションの設定ファイル
  • SQLAlchemy O/Rマッパー
  • WebDispatch URLやメソッドに対応したディスパッチャ
  • WebOb リクエストレスポンスオブジェクト

1とおりのライブラリが出揃っているけど、
認証、認可と、フォームライブラリが不足しているかな?
あとPasteDeployは対応しているけどPasteScriptがないので、
コマンドラインツールが足りてない。
weberrorのようなデバッグツール、エラーレポートも欲しいところ。

WSGIサーバー

  • tornado
  • cherrypy
paste.httpあたりのポーティングが望まれるところ。
あと、tornadoはpastedeployのエントリポイント持ってない。
(10行以内で書けるけど)

テストツール

  • nose ディスカバリやプラグインに対応したテストランナー
  • Mock モックライブラリ
  • WebTest 擬似リクエストを使ったWebアプリケーションテストツール

このあたり鉄板の組み合わせが使えるので、あまり不満はない。

ドキュメンテーション

  • docutils
  • Sphinx

docutilsはCategoriesに入ってないけど実際はpy3k対応されている。

まとめ
Webアプリケーションを書くにはまだちょっと足りない印象。
が、Webアプリケーションフレームワークを作るのには十分な下地ができてると思う。
各フレームワークがpython3対応したバージョンをリリースするのも近い。
とはいえ、実用で使おうと思うとサーバーに悩みます。
早くgunicornが対応してくれれば....

さて、アドベントカレンダーの次は @t2y さんにまわします。
よろしく。

その他、python3に対応を表明しているものは以下のリンクから一覧を確認できる。

pypyでZODBを動かそうとした

はろーえぶりわん

pypyをはじめようとしてそのまま日がたち、アドベントカレンダーで一念発起してpypyをいじっているaodagです。

さて、アドベントカレンダーが回ってきましたが、ほかのみんなのようなpypyで処理系を!ということはあんまり考えてないわけです。

pypyがcpythonよりも速いと聞いてきました!

さてpypyはpyramidですでに公式サポートしているので、まあpypy使えますよねというところですが、ZODBが動かないわけです。

動かないので、動かすためにあがいてみました。(まだちゃんと動かせていません。)

まずはこちらのmlポストを見て欲しい

https://mail.zope.org/pipermail/zodb-dev/2011-September/014364.html

手順が書いてあります。

ということでそのままやってみます。

>>>> storage = FileStorage('data1.fs')
>>>> from ZODB.DB import DB
>>>> db = DB(storage)
>>>> conn = db.open()
>>>> root = conn.root()
>>>> root
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/aodag/Envs/pypypy/lib-python/modified-2.7/UserDict.py", line 15, in __repr__
    def __repr__(self): return repr(self.data)
  File "/home/aodag/Envs/pypypy/site-packages/persistent/mapping.py", line 30, in __get__
    return self.func(inst)
  File "/home/aodag/Envs/pypypy/site-packages/persistent/mapping.py", line 99, in data
    data = self.__dict__.pop('_container')
KeyError: '_container'

だめでした(´・ω・`)

でもこれってpypyだからだめなの?

ひょっとして、このブランチがだめなんじゃないの?

ということで、このブランチをcpythonで試してみました。

まずはパッチなしの場合。

python2.6では動きます。

python2.7でも動きました。

さて、パッチ適用後です。

python2.7で動きました。

pypyのバージョンが関係しているかもしれませんが、このあたりで心折れたので(日付変わっちゃってるし(´・ω・`) )ZODB動かす夢はまた情報が入ったら試すことにします。

残念な結果になりましたが、ひとまずアデュー。

pyramid アドベントカレンダー 1日目

Pyramidとは

PyramidはWebアプリケーションフレームワークです。

2011年に1.0, 1.1, 1.2 とハイスピードで開発が進み、現在の最新バージョンは1.2.3です。

Pyramidの特徴

Pyramidは、ミニマリズムを原則としています。

そのため、ある設定をするだけでいきなりなにかが動き出したり、ちょっと呼ぶだけで自動でいろいろなものが設定されたりすることはほとんどありません。書いたまま動きます。

Pyramidの利点は拡張性です。

ありとあらゆる場所にフック可能で、リクエストオブジェクトやセッション、DB接続など、あらゆるフレームワークの動きを変更可能です。

また、こうしたフックは自分のアプリケーションでも利用可能で、拡張性の高いアプリケーション作成に非常に役立つものと思います。

小さなアプリケーションは小さく書けることを目標においています。

実際、helloworldのようアプリケーションはWebサーバーの起動まで含めて1ファイルに収めることも可能です。

目的に合わせてできることを制限したフレームワークは非常に便利です。その目的に合わせたアプリケーションを書く限りは....。

フレームワークの制限に泣いたことのある人、昔ながらのCMS的なWeb+DBサイトのフレームワークを使うことに限界を感じている人。

また、単に新しいフレームワークを知って知見を広めたい人。

Pyramidをぜひ触ってみてください。

インストール

今後説明する環境はubuntuに限定します。

WindowsやMacの方は、VirtualBoxやVMWarePlayerで環境を用意してください。

build-essentialとpython-devが入ってることを確認しておきましょう。

$ wget http://python-distribute.org/distribute_setup.py

$ python distribute_setup.py

$ easy_install virtualenv --user

$ easy_install virtualenvwarpper --user

$ cat >> ~/.bashrc
export WORKON_HOME "$HOME/.envs"
mkdir -p "$WORKON_HOME"
export VIRTUALENV_USE_DISTRIBUTE=1
source ~/.local/virtualenvwrapper.sh
^D
$ source ~/.bashrc

とりあえず動かす

実際に環境を作ってpyramidを動かしてみます。

$ mkvirtualenv --no-site-packages pyramid
(pyramid)$ pip install pyramid
(pyramid)$ paster create -t pyramid_starter mypyramid
(pyramid)$ cd mypyramid
(pyramid)$ pip install -e .
(pyramid)$ paster serve development.ini

http://locahost:6543 にアクセスすると、Pyramidのデフォルトページを見れるはずです。

1日目からいきなり遅れてしまいましたが、2日目以降はPyramidのいろいろな話題を12/25まで取り上げていく予定です。

Python3でPyramidを動かしてみよう

githubのリポジトリから直接インストールします。

pip install git://github.com/Pylons/pyramid.git#egg=pyramid

 

インストール後のパッケージ状況

Chameleon==2.5.2
Mako==0.5.0
MarkupSafe==0.15
PasteDeploy==1.5.0
WebOb==1.2b2
distribute==0.6.19
-e git://github.com/Pylons/pyramid.git@b75e577383936454d8b3e912f4f5478bf9af01e6#egg=pyramid-dev
repoze.lru==0.4
translationstring==0.4
venusian==1.0a2
wsgiref==0.1.2
zope.deprecation==3.5.0
zope.interface==3.8.0

main.py

from pyramid.config import Configurator
from wsgiref.simple_server import make_server

def index(request):
    request.response.text = "hello, world"
    return request.response

config = Configurator()
config.add_view(index)
app = config.make_wsgi_app()

httpd = make_server('0.0.0.0', 8080, app)
httpd.serve_forever()

ひとまず簡単なアプリケーションは動きました。

Pyramid1.2リリース!

(´  > ω < )Pyramid1.2リリースだよーーーー!

インストールするには

pip install pyramid==1.2

easy_install pyramid==1.2

変更点の細かいところは、公式を見てもらうとして、大きな変更点を紹介するよ!

 

debug toolbar

*あの* Django の debug toolbar を移植したもの。

SQLAlchemyのクエリデバッグにも対応してます。

これまでブラウザ上で対話的なデバッグに使われていた WebError はここで引退?ということになるのか。

WebErrorのデバッグ機能はdebug toolbarに、メール通知などはpyramid_exclogに分割されました。

PasteScriptで生成するプロジェクトテンプレートも、 debug toolbar を使うように変更されてます。

 

route_prefix

PyramidはConfigurator.includeで別アプリケーションをインクルードできるようになっていたのですが、URLのルーティングは完全にグローバルな状態でした。

今回、includeメソッドでroute_prefixを追加することで、サブアプリケーションがあるURL以下にマッピングされるようになります。

たとえば、 include('admin', route_prefix='/admin') とすることで、 adminアプリケーションの、 'login' などは、 '/admin/login' とマッピングされるようになります。

 

tween

tweenはWSGIミドルウェアのPyramid版といったもので、 Viewを包み込んでリクエストの処理を行えます。

WSGIミドルウェアとの違いは、リクエストオブジェクトやレンダラーのようなPyramid機能を使えるというところ。

CSRF処理の追加や、リクエストオブジェクトへの情報付加など、いろんなことができますね。

 

route_prefixとtweenで、アプリケーションの拡張性や再利用性がぐんとあがったように思います。

そろそろ仕事で使ってもいいかもね。

 

https://docs.pylonsproject.org/projects/pyramid/1.2/whatsnew-1.2.html

PyCon JP 2011 資料リンク

恒例の資料リンク集め

UST

http://www.ustream.tv/channel/pyconjp1

http://www.ustream.tv/channel/pyconjp2

http://www.ustream.tv/channel/pyconjp3

 

C APIへの誘い cocoatomo

https://docs.google.com/present/view?id=dchk96tc_2ftxfgqck

 

Webフォームウィジェットツールキットを総括する aodag

http://www.slideshare.net/aodag/form-libraries-9031180

 

Pythonエンジニアの作り方 tkOmiya

http://www.slideshare.net/TakeshiKomiya/python-201108-pyconjp

 

Asynchronous Python Programming Ian Lewis

http://ianlewis.bitbucket.org/pyconjp_2011_slides/template/index.html#1

Pythonを使った次世代組み込みシステム Yuta Kitagami

http://www.slideshare.net/yutakitagami/pycon-jp2011-yuta-kitagami

Pythonによる日本語自然言語処理 nokuno

http://www.slideshare.net/nokuno/python-pyconjp

 

PyQtではじめるGUIプログラミング RansuiIso

http://www.slideshare.net/RansuiIso/pyqtgui

 

Openspace

 

フレームワークなしでWSGIプログラミング aodag

http://www.slideshare.net/aodag/wsgi

Pythonの相対インポートなど

import .baconとかfrom . import egg とかの書式ってなんなんだ?という疑問を小耳に挟んだので、なんかがんばっちゃうよ。

 

spam/egg.pyからspam/bacon.pyをインポートするときって、import baconとか書いちゃうよね。

だが、ちょっと考えてみて欲しい。

  • bacon.py
  • spam/egg.py
  • spam/bacon.py

こんな構成の場合はどうなるだろう。

spam/eggからimport baconすると、

このときのbaconは、spam/bacon.py だ。

このとき bacon.py は、spam/bacon.pyにかくされてしまっている。

じゃあ、トップレベルにあるbacon.pyはどうすればインポートできるのか?

こうした問題を解決するのがPEP328

http://www.python.org/dev/peps/pep-0328/

まずは、 from __future__ import absolute_import を使った場合と使わない場合。

 

absolute_import がない場合は、そのモジュールと同じパッケージにあるモジュールが優先される。

この場合、soam/bacon.pyに隠されてしまうため、トップにある bacon.pyは、__import__とか面倒なことをしないとインポートできなくなる。

 

absolute_importがある場合は、import baconってのは、トップレベルにbacon.pyがないといけない。

また、このとき 同じモジュールにbacon.pyがあってもインポートできない。

spam/bacon.py は、 from spam import bacon ってインポートする。

from spam import bacon って書き方はどちらの場合でも通用する書き方だけど、

パッケージの名前を変えたいときに、全部書き換えないといけなくなる。

このため、相対importであることを明示する方法がPEP328で追加されている。

from . import bacon と書くと、そのモジュールが属するパッケージからbaconをインポートする。

 

ちなみに、python3.xだと、デフォルトでabsolute_importになっている。

python2,3両方に対応する場合、相対インポートを意図している箇所は、明示的に相対インポートの書式にしましょうということ。

わかったかな?tell-kさん?