Pyramid
PythonのフレームワークPyramidをとりあえず動かすまで。
環境はwindows7
virtualenvのインストール
モジュールのバージョン違いとかに悩まされないように、Pythonの仮想環境を管理してくれるvirtualenvを入れとくと便利。
pip install virtualenv
インストールしてあるモジュールを全部はずした環境を用意
virtualenv --no-site-packages DIR_NAME
仮想環境を実行するにはDIR_NAME/Script以下にあるactivateを実行するんだけど、毎回マンドを打つのがめんどくさいのと色々忘れそうだからbatを用意
call パス\Scripts\activate.bat cd ワークスペース\pyramid cmd start
ちなみにactivateで仮想環境を実行した後はdeactivateコマンドで仮想環境を終了できる。
virtualenvは↓を参考にしました。
今日のPython: VIRTUALENV について
Pyramidをインストール
Pyramidのサイトを見るとeasy_installを使えとのことだったのでeasy_installでインストール。
ちゃんとvirtualenvで構築した仮想環境で以下を実行。
easy_install pyramid
Pyramidのプロジェクト作成
pcreateっていうコマンドを使います。
pcreate -s starter PROJECT_NAME
このコマンドをうつと便利機能のついたページを用意してくれるので、初心者はたぶん実行しといたほうがいいと思います。
で、sqlalchemyを使うので
pcreate -s alchemy PROJECT_NAME
Pyramidプロジェクト開発用ビルド
作成されたプロジェクトにはsetup.pyが用意されてるのでそれを使います。
python setup.py develop
テスト実行
自動生成されたプロジェクトにテストコードも含まれてるので、一応それの実行方法ト
python setup.py test -q
アプリケーションの実行
pserveコマンドを使います
pserve development.ini
ブラウザでhttp://localhost:6543にアクセスしてページが出ればOK。
Pyramidは日本語のドキュメントあるので、すごくとっつきやすいです。
Pyramid Web アプリケーション開発フレームワーク — The Pyramid Web Application Development Framework v1.4.3 (翻訳)
Pythonとイテレータ
class Counter: def __init__(self, max): self.max = max def __iter__(self): self.n = 0 return self def next(self): if self.n > self.max - 1: raise StopIteration self.n += 1 return self.n - 1 if __name__ == '__main__': for i in Counter(5): print(i)
イテレータはfor文に使える。
イテレータは__iter__メソッドと、nextメソッド(python3だと__next__?)を持つこと。StopIteration例外でストップさせる。
Pythonのユニットテストとモック
class Language: def getName(self): return 'Java' class Person: def __init__(self): self.language = Language() def getLanguage(self): self.language.getName()
Language.getNameはJavaという文字列を返すだけ、Person.getLanguageはLanguage.getNameに委譲をかけてるだけ。
class PersonTest(unittest.TestCase): def setUp(self): self.person = Person() def testGetLanguage(self): self.assertEqual('Java', self.person.getLanguage()) if __name__ == '__main__': unittest.main()
実行すれば、当然のごとくOK。
じゃ、テストコードをちょっと変えてみると・・・
class PersonTest(unittest.TestCase): def setUp(self): self.person = Person() def testGetLanguage(self): def getName(self): return 'Python' #Language.getNameの実装を上のgetNameに置き換えてる Language.getName = getName self.assertEqual('Python', self.person.getLanguage()) if __name__ == '__main__': unittest.main()
とこんなことができて、モックライブラリとかいるの?見たいな状況に・・・
TitaniumでSMSを送る
まだ、Androidでしか確認できてないんですが・・・
Titanium、SMSでググルと結構出てきますが大体ここら辺で終わり・・・
Ti.Platform.openURL('sms:09000000000');
これだとSMS送信画面が開くだけ。肝心の本文が入らない・・・
で、GitHubのTitaniumのコードを見てみると・・・
titanium_mobile/PlatformModule.java at master · appcelerator/titanium_mobile · GitHub
@Kroll.method public boolean openURL(String url) { ... Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); try { getActivity().startActivity(intent); .... } ..... }
引数のurlをパースしてIntent発行してるだけ。URLでもパラメータ渡せるから、後はキーが何かが問題だな・・・、なんかいけそうだと思って調べていると・・・
ここのページに、http://d.hatena.ne.jp/thorikawa/20100930/p1
ContentValues values = new ContentValues();
values.put("address", "090xxxxxxxx");
values.put("date", System.currentTimeMillis());
values.put("read", false);
values.put("subject", "test subject");
values.put("body", "test body");
getContentResolver().insert(Uri.parse("content://sms/inbox"), values);
こんなの見つけました。あ、なるほどね、本文はbodyってキーワードか、と思って
Ti.Platform.openURL('sms:09000000000?body=TEST');
ってやったら、みごと本文が入ってました。