祢占堂

はい

ミラクルライト作った - プリキュア Advent Calendar 2013 #cure_advent

この記事はプリキュア Advent Calendar 2013のやつです。

大きなお友達は基本的にミラクルライトもらえないみたいなので Python で作った。プリキュアに力を与えてテストを実行する。

pypi: https://pypi.python.org/pypi/miraclelight
github: https://github.com/drillbits/miraclelight

$ pip install miraclelight

これで miraclelight コマンドができるけど、今回はテスト用意するのめんどくさいのでリポジトリに入ってるサンプルのテストを実行する。

$ git clone git@github.com:drillbits/miraclelight.git
$ cd miraclelight
$ python setup.py install
$ tree
.
├── README.rst
├── setup.py
├── src
│   └── miraclelight
│       └── __init__.py
└── tests
    ├── __init__.py
    └── test_sample.py

3 directories, 5 files

カレントディレクトリに Python の unittest が discover してくれそうなやつがあるので、そのまま実行すればいい。*1

$ miraclelight

実行すると、このように表示されて止まる。

ライトをふって プリキュアを おうえんしてね!(Press enter, enter, enter)
( ^q^)ノシ

このままだとテストは永久に実行されず、プロジェクトは崩壊し、世界が砂漠になってもうダメです。

エンターキーを連打してプリキュアを応援しましょう。

10 エンターで 1 テストケース倒せる。

このテストランナーを使うと Jenkins で自動的に定期テストとかいっさいできなくなるけど、そんな人任せじゃダメだと思う。年末あたりに滅びかける世界は救えないと思う。「みんなで力を合わせれば不可能はない」とプリキュア 5 つの誓いの 6 つ目にもある。

がんばってすべてのテストを倒そう。

技術的な話

基本的には標準の unittest 拡張しただけだけど、普通にエンター入力すると改行されてしまうので、こんな感じで防いでる。

import fcntl
import os
import sys
import termios

fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    c = sys.stdin.read(1)
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

参考: http://stackoverflow.com/a/5004022

*1:ちなみに開始ディレクトリを指定したい場合は unittest と同じで miraclelight discover -s などとする。