エキスパートPythonプログラミングの6章やってみた。

ので自分用メモ。
この間virtualenvwrapperを導入したので~/.zshrcの抜粋から。

export WORKON_HOME=$HOME/work/python_virtual
export PIP_DOWNLOAD_CACHE=$HOME/.pip_cache
export PIP_RESPECT_VIRTUALENV=true
#export PIP_REQUIRE_VIRTUALENV=true
if [ -f ~/bin/virtualenvwrapper.sh ]; then
    . ~/bin/virtualenvwrapper.sh
fi

開始。

% mkvirtualenv --no-site-packages Atomisator
% cdvirtualenv
% pip install nose
% mkdir packages
% cd packages
% pip install PasteScript
% pip install pbp.skels (5章で作るテンプレートを著者がpypiに上げたもの)
% workon Atomisator (もっかいworkonしないとライブラリが読めなかった)
% paster create -t pbp_package atomisator.parser
Selected and implied templates:
  pbp.skels#pbp_package  A namespaced package
Variables:
  egg:      atomisator.parser
  package:  atomisatorparser
  project:  atomisator.parser
Enter namespace_package (Namespace package (like pbp)) ['pbp']: atomisator
Enter package (The package contained namespace package (like example)) ['example']: parser
Enter version (Version) ['0.1.0']:
: (後はEnter)
% cd atomisator.parser
% python setup.py develop
% nosetests --with-doctest --doctest-extension=.txt
.
----------------------------------------------------------------------
Ran 1 test in 0.051s
OK

このテストは足し算の計算してるだけなので通る。
ここで作るアプリケーションで使うパッケージをsetup.pyに書いておく。

      install_requires=[
          'setuptools',
          'feedparser', ★
          # -*- Extra requirements: -*-
      ],

追加したパッケージを開発環境に入れる。

% python setup.py develop

で、テストを書いてテストすると

atomisator/parser/README.txt編集(p191)
% nosetests --with-doctest --doctest-extension=.txt
:
Ran 1 test in 0.048s
FAILED (failures=1)

テストにこけるので、テストが通るようにコードを書く、と。なるほど。

% cd atomisator/parser
% wget http://bitbucket.org/tarek/atomisator/raw/c2e2e1af7c4b/packages/atomisator.parser/atomisator/parser/tests/sample.xml
atomisator/parser/README.txt編集(p192)
__init__.py編集(p192)
atomisator/parser/README.txt編集(p193)
% nosetests --with-doctest --doctest-extension=.txt

ってやってもこけるので何でかなーと思ったらdoctestのELLPSISが効いてないよう。
どうすればいいかは…カンニングした*1http://vkgtaro.jp/2011/02/21/nosetest_with_doctest

    >>> res = parse(os.path.join(os.path.dirname(__file__), 'sample.xml'))
    >>> res #doctest: +ELLIPSIS
    <itertools.islice ...>

これでテストが通るはず。

% nosetests --with-doctest --doctest-extension=.txt
.
----------------------------------------------------------------------
Ran 1 test in 1.337s
OK

通った。


本では次にatomisator.dbパッケージを作れと書いてあるんだが、なんでこんなに細かくパッケージを分けろと言っているのか、自分がいまいち理解できていない…


続きの章に書いてあったところもちょっとメモ。
作った関数をコンソールスクリプトとしてフックするには、setup.pyでconsole_scriptだと明示しておけばいい。
これどうやたらできるのか知らんかったから、またひとつ新しいことを覚えれた。

      entry_points="""
      # -*- Entry points: -*-
          [console_scripts]
          atomisator = atomisator.main:atomisator
      """,

今日はこんなところで。

*1:こういうのをどのドキュメント見て探せばいいのかがよくわからん