2 // vim: foldmethod=marker
4 * Ethna_MockProject.php
6 * @author Yoshinari Takaoka <takaoka@beatcraft.com>
10 define('ETHNA_TEST_DIR', ETHNA_BASE . '/test');
11 define('ETHNA_TEST_PROJECT', 'mockproject');
12 define('ETHNA_TEST_SKELDIR', ETHNA_TEST_DIR . '/skel/');
13 define('ETHNA_TEST_SKELTPLDIR', ETHNA_TEST_SKELDIR . '/template/');
16 * ethna command, and project Emulator Class.
20 class Ethna_MockProject
31 * @param $basedir プロジェクトベースディレクトリ
32 * @param $project_name プロジェクト名
33 * @param $skel_dir スケルトンディレクトリ
36 function Ethna_MockProject($basedir = ETHNA_TEST_DIR,
37 $project_name = ETHNA_TEST_PROJECT,
38 $skel_dir = ETHNA_TEST_SKELDIR)
40 $this->basedir = $basedir;
41 $this->skel_dir = $skel_dir;
42 $this->project_name = $project_name;
43 $this->proj_basedir = "${basedir}/${project_name}";
44 $this->is_created = false;
49 * ethna add-project コマンドをエミュレートします。
52 * @return 成功したらtrue, 失敗したらEthna_Error
56 $this->is_created = true;
58 if (!is_dir($this->proj_basedir)) {
61 $r = Ethna_Util::mkdir($this->proj_basedir, 0775);
62 } while ($r == false || is_dir($this->proj_basedir) == false);
65 // fire ethna add-project command
69 $this->basedir . '/' . $this->project_name,
74 $r = $this->runCmd($id, $options);
75 if (Ethna::isError($r)) {
84 * 実行することで、ethna コマンドをエミュレートします。
85 * (プロジェクトがない場合は作成されます)
88 * @param string $id コマンドID (e.x add-action)
89 * @param array $options コマンドラインオプション
90 * e.x ethna add-action -b /tmp test の場合
91 * array('-b', '/tmp', 'test') を指定
92 * @return 成功したらtrue, 失敗したらEthna_Error
94 function runCmd($id, $options = array())
96 if (($r = $this->create_ifnot_exists()) !== true) {
100 // supplement basedir option.
101 $in_basedir_opt = false;
102 foreach ($options as $opt) {
103 if ($opt == '-b' || $opt == '--basedir') {
104 $in_basedir_opt = true;
107 if (!$in_basedir_opt) {
108 $base_opt = array('-b', $this->proj_basedir);
109 $options = array_merge($base_opt, $options);
112 $eh =& new Ethna_Handle();
113 $handler =& $eh->getHandler($id);
114 if (Ethna::isError($handler)) {
118 ob_start(); // supress output.
119 $handler->setArgList($options);
120 $r = $handler->perform();
123 if (Ethna::isError($r)) {
127 // set plain ActionForm
128 $ctl =& $this->getController();
129 $backend =& $ctl->getBackend();
130 $af =& new Ethna_ActionForm($ctl);
131 $backend->setActionForm($af);
137 * アプリケーションのエントリポイントをエミュレートします。
140 * @param mixed $action_name 指定のアクション名(省略可)
141 * @param array $submit_value ブラウザからSubmitする値
142 * @return string ブラウザへの出力
144 function runMain($action_name = 'index', $submit_value = array())
146 if (($r = $this->create_ifnot_exists()) !== true) {
150 $_SERVER['REQUEST_METHOD'] = 'POST';
151 $_POST["action_${action_name}"] = true;
152 $_POST = array_merge($_POST, $submit_value);
154 $c =& $this->getController();
155 $c->setGateway(GATEWAY_WWW);
157 @$c->trigger($action_name, ""); // suppress header related error.
159 $result = ob_get_contents();
166 * 作成したプロジェクトのコントローラクラス
168 * (プロジェクトがない場合は作成されます)
171 * @return Ethna_Controller コントローラクラスのインスタンス
174 function &getController()
176 if (($r = $this->create_ifnot_exists()) !== true) {
179 $ctl =& Ethna_Handle::getAppController($this->proj_basedir);
181 // キャッシュが返されるため、$GLOBALSが設定されない場合がある
182 $GLOBALS['_Ethna_controller'] =& $ctl;
187 * 作成したプロジェクトのベースディレクトリを取得します。
190 * @return string プロジェクトのベースディレクトリ
192 function getBaseDir()
194 return $this->proj_basedir;
204 Ethna_Util::purgeDir($this->proj_basedir);
208 * プロジェクトが既に作成されているかをチェックし,
212 * @return boolean 既に作成している場合はtrue.
213 * プロジェクトの作成に失敗したらEthna_Error
215 function create_ifnot_exists()
217 if ($this->is_created === false) {
218 $r = $this->create();
219 if (Ethna::isError($r)) {