インターフェイスでスキーマを定義する
ここまでで、3つのデータモデルをクラスとして定義しました。しかし、これではそれぞれのクラスがどんな情報を扱うのか分からないので、それぞれのクラスに対応するインターフェイスクラスを作ってスキーマを定義しましょう。
Python自身にはインターフェイスという概念はありませんが、Zope 3は拡張モジュールとしてインターフェイスの機能をPythonに持ち込んでいます。データのスキーマ定義にはインターフェイスを用います。
掲示板にはタイトルと概要の2つの情報を保存できるようにしましょう。app.pyは次のようになります。
import grok |
app.py |
IMyForumクラスがインターフェイスです。Zope 3の提供するインターフェイスはクラス定義のシンタックスを利用しています。インターフェイスクラスはzope.interface.Interfaceを継承する必要があり、名前はアルファベットのIから始める規則になっています。
インターフェイスの定義の中でzope.schemaを使ってスキーマの定義をしています。これはRDBMSのCREATE TABLE文のようなもので、データ構造を表しています。
RDBMSと違ってZopeはオブジェクトデータベースを使っているので、実際に保存される情報はあくまで永続クラスのインスタンスであり、それが必ずしもインターフェイスの定義と一致している必要はないのですが、インターフェイスにはコンポーネントのAPIを保証する役割があるので、正しく定義しておきましょう。
IMyForumインターフェイスでtitleとdescriptionの2つのスキーマを定義しました。TextLineスキーマは改行なしのUnicodeテキストデータ、Textスキーマは改行ありのUnicodeテキストデータを表します。
ちなみに、Zope 3の内部ではテキストデータはすべてUnicodeで扱うことになっていますので、スキーマの引数のtitleの値はUnicodeでなければいけません。
MyForumクラスではIMyForumインターフェイスの定義に準じて、2つのアトリビュートを定義し、grok.implementsで該当のインターフェイスを実装したことを宣言しています。
次にスレッドのスキーマを定義しましょう。スレッドにはその題目としてタイトルを保存できるようにします。forumthread.pyは次のようになります。
import grok |
forumthread.py |
最後にコメントのスキーマ定義です。匿名の掲示板でコメントには名前と本文を保存できるようにしました。comment.pyは次のようになります。
import grok |
comment.py |
以上でスキーマの定義は完成です。これでアプリケーションのデータモデルが完成しました。
ユニットテストを書く
さて、データモデルが完成したので、簡単なテストを書いておきましょう。ここでは、appモジュール(app.py)のテストの中で、上で作ったデータモデルを簡単にテストすることにします。
appモジュールをテストするには、app_testsディレクトリを作って、その中にテストコードを置きます。src/myforumディレクトリの中で次のようにコマンドを実行してください。
$ mkdir app_tests |
これで、新しく作ったapp_testsディレクトリの中に空の__init__.pyとtest_app.pyファイルができました。__init__.pyファイルはこのディレクトリをPythonのパッケージ化するのに必要なだけなので、中身は空のままで構いません。test_app.pyには次のテストコードを書いてください。
# -*- coding:utf-8 -*- |
test_app.py |
これは非常に単純なテストで、何もテストしていないようなものですが、引数やシンタックスエラーなどの確認には使えます。このような形でテストコードを追加できるということを覚えておいてください。
次にmyforumパッケージにユニットテストがあることをgrokに登録しましょう。src/myforumの中にtests.pyを作って、以下のように書いてください。
import grok |
tests.py |
これで、myforumパッケージ内の全ユニットテストがgrokに登録されて、testコマンドで実行できるようになります。
src/myforumからMyForumディレクトリに移動して、testコマンドを実行してみましょう。
$ cd ../.. |
上で作ったユニットテストが実行され、無事テストが成功しました。もし、ここでテストに失敗したならば、書き間違いがあると思います。調べて直してください。
2/3 |
Index | |
掲示板を作ろう(データモデルの定義とユニットテスト) | |
Page1 grokprojectでアプリケーションの開発環境を作る データモデルを考える |
|
Page2 インターフェイスでスキーマを定義する ユニットテストを書く |
|
Page3 buildout.cfgの調整 Subversionにコミットする |
Zope 3とは何ぞや? |
Coding Edgeお勧め記事 |
いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
|
Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
|
貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
|
Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
|
ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|