OSDN Git Service

- controller での smarty_xx_plugin で Smarty プラグインを指定する機能を削除 http://sourceforge.jp/ticke...
[ethna/ethna.git] / test / Ethna_MockProject.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna_MockProject.php
5  *
6  *  @author     Yoshinari Takaoka <takaoka@beatcraft.com>
7  *  @version    $Id$
8  */
9
10 define('ETHNA_TEST_DIR', ETHNA_BASE . '/test');
11 define('ETHNA_TEST_PROJECT', 'mockproject');
12 define('ETHNA_TEST_SKELDIR', ETHNA_TEST_DIR . '/skel/');
13
14 /**
15  *  ethna command Emulator Class. 
16  *  
17  *  @access public
18  */
19 class Ethna_MockProject
20 {
21     var $basedir;
22     var $skel_dir;
23     var $project_name;
24     var $proj_basedir;
25     var $is_created;
26
27     /*
28      *  コンストラクタ
29      * 
30      *  @param $basedir プロジェクトベースディレクトリ  
31      *  @param $project_name プロジェクト名
32      *  @param $skel_dir スケルトンディレクトリ
33      *  @access public
34      */
35     function Ethna_MockProject($basedir = ETHNA_TEST_DIR,
36                                $project_name = ETHNA_TEST_PROJECT,
37                                $skel_dir = ETHNA_TEST_SKELDIR)
38     {
39         $this->basedir = $basedir;
40         $this->skel_dir = $skel_dir;
41         $this->project_name = $project_name;
42         $this->proj_basedir = "${basedir}/${project_name}";
43         $this->is_created = false;
44     }
45
46     /*
47      *  プロジェクトを作成します。
48      *  ethna add-project コマンドをエミュレートします。
49      * 
50      *  @access public
51      *  @return 成功したらtrue, 失敗したらEthna_Error 
52      */
53     function create()
54     {
55         $this->is_created = true;
56
57         if (!is_dir($this->proj_basedir)) {
58             do {
59                 sleep(0.1);
60                 $r = Ethna_Util::mkdir($this->proj_basedir, 0775);
61             } while ($r == false || is_dir($this->proj_basedir) == false);
62         }
63
64         //  fire ethna add-project command
65         $id = 'add-project';
66         $options = array(
67                        '-b',
68                        $this->basedir . '/' . $this->project_name,
69                        '-s',
70                        $this->skel_dir, 
71                        $this->project_name,
72                    );
73         $r = $this->runCmd($id, $options); 
74         if (Ethna::isError($r)) {
75             return $r;
76         }
77
78         return true;
79     } 
80
81     /*
82      *  作成したプロジェクトに対してコマンドを
83      *  実行することで、ethna コマンドをエミュレートします。
84      *  (プロジェクトがない場合は作成されます)
85      * 
86      *  @access public
87      *  @param string $id  コマンドID (e.x add-action)
88      *  @param array  $options コマンドラインオプション
89      *                e.x ethna add-action -b /tmp test の場合
90      *                    array('-b', '/tmp', 'test') を指定
91      *  @return 成功したらtrue, 失敗したらEthna_Error 
92      */
93     function runCmd($id, $options = array())
94     {
95         if (($r = $this->create_ifnot_exists()) !== true) {
96             return $r;
97         }
98
99         //   supplement basedir option.
100         $in_basedir_opt = false;
101         foreach ($options as $opt) {
102             if ($opt == '-b' || $opt == '--basedir') {
103                 $in_basedir_opt = true;
104             }
105         }
106         if (!$in_basedir_opt) { 
107             $base_opt = array('-b', $this->proj_basedir);
108             $options = array_merge($base_opt, $options);
109         }
110
111         $eh =& new Ethna_Handle();
112         $handler =& $eh->getHandler($id);
113         if (Ethna::isError($handler)) {
114             return $r;
115         }
116
117         ob_start(); //  supress output.
118         $handler->setArgList($options);
119         $r = $handler->perform();
120         ob_end_clean();
121
122         if (Ethna::isError($r)) {
123             return $r;
124         }
125
126         return true;
127     }
128
129     /*
130      *  作成したプロジェクトのコントローラクラス
131      *  のインスタンスを取得します。
132      *  (プロジェクトがない場合は作成されます)
133      * 
134      *  @access public
135      *  @return Ethna_Controller コントローラクラスのインスタンス
136      *          失敗したらEthna_Error 
137      */
138     function &getController()
139     {
140         if (($r = $this->create_ifnot_exists()) !== true) {
141             return $r;
142         }
143         return Ethna_Handle::getAppController($this->proj_basedir);
144     }
145
146     /*
147      *  作成したプロジェクトのベースディレクトリを取得します。
148      *
149      *  @access public 
150      *  @return string  プロジェクトのベースディレクトリ
151      */
152     function getBaseDir()
153     {
154         return $this->proj_basedir;
155     }
156
157     /*
158      *  プロジェクトを削除します。
159      *
160      *  @access public 
161      */
162     function delete()
163     {
164         Ethna_Util::purgeDir($this->proj_basedir);
165     }
166
167     /*
168      *  プロジェクトが既に作成されているかをチェックし,
169      *  存在しない場合は作成します。
170      *
171      *  @access private
172      *  @return boolean  既に作成している場合はtrue.
173      *                   プロジェクトの作成に失敗したらEthna_Error 
174      */
175     function create_ifnot_exists()
176     {
177         if ($this->is_created === false) {
178             $r = $this->create();
179             if (Ethna::isError($r)) {
180                 return $r;
181             }
182         }
183         return true;
184     }
185 }
186
187 ?>