Hatena::ブログ(Diary)

bobchinの日記 このページをアンテナに追加 RSSフィード

2008年09月17日(水)

[][]ob_ 14:40 ob_ - bobchinの日記 を含むブックマーク

Maple4_DocTest_Runner::run()

        ob_start();
        PHPUnit_TextUI_TestRunner::run($suite, $parameters);
        $output = ob_get_contents();
        ob_end_clean();
           ↓
        ob_start();
        PHPUnit_TextUI_TestRunner::run($suite, $parameters);
        $output = ob_get_clean();

2008年09月16日(火)

[][]ちょっとしたとこ 15:42 ちょっとしたとこ - bobchinの日記 を含むブックマーク

相変わらずちょっとしたとこ。

Maple4_DocTest_Parser.php

    private function removeCommentStr($str)
    {
        $str = preg_replace('|^\s*/\*\*|m', '', $str);
        $str = preg_replace('|^\s*\*/|m', '', $str);
        $str = preg_replace('|^\s*\*[ ]{1}|m', '', $str);
        $str = preg_replace('|^\s*\*[ ]{0}|m', '', $str);
        return trim($str);
    }

             ↓

    private function removeCommentStr($str)
    {
        $regex = array(
            '|^\s*/\*\*$|m',
            '|^\s*\*/$|m',
            '|^\s*\*\s?$|m',
        );
        return trim(preg_replace($regex, '', $str));

        //return trim(preg_replace('|^\s*/?\*\*?\s?/?$|m', '', $str)) // おもいきって。。。
    }

[][]クラスだけじゃなくて関数もあるよなとか 16:28 クラスだけじゃなくて関数もあるよなとか - bobchinの日記 を含むブックマーク

現状クラスだけが対象になってるけど、

関数もあることがあったりなかったり。

ま、推奨されはしないけどCakePHP にもグローバル関数はあるわけで。。。

かなり泥臭いけど、ファイル内のクラス名と関数名を取得して

それからそれぞれをリフレクション使ってDocCommentsを取得とかでごにょごにょ

function getClassAndFunc($file)
{
    $result = array(
        'class' => array(),
        'function' => array(),
    );
    if (!file_exists($file)) {
        return $result;
    }
    
    $isCaptureClass = false;
    $isCaptureFunc = false;
    $depth = 0;
    $tokens = token_get_all(file_get_contents($file));
    foreach ($tokens as $token) {
        if (is_array($token)) {
            list($type, $str, ) = $token;
            switch ($type) {
            case T_CLASS:
                $isCaptureClass = true;
                break;

            case T_FUNCTION:
                if ($depth < 1) {
                    $isCaptureFunc = true;
                }
                break;

            case T_STRING:
                if ($isCaptureClass) {
                    $isCaptureClass = false;
                    $result['class'][] = $str;
                } else if ($isCaptureFunc) {
                    $isCaptureFunc = false;
                    $result['function'][] = $str;
                }
                break;
            }

        } else if (is_string($token)) {
            if ($token == '{') {
                $depth++;
            } else if ($token == '}') {
                $depth--;
            }
        }
    }
    return $result;
}

[][]setUpとtearDownを自分で定義した場合 17:07 setUpとtearDownを自分で定義した場合 - bobchinの日記 を含むブックマーク

記述を上に持ってきたいなとか。

Maple4_DocTest_Builder:: createTestClassDefinition()

        $specials = array();
        foreach (array('__setup', '__teardown') as $spe) {
            if (isset($comments[$spe])) {
                $specials[$spe] = $comments[$spe];
                unset($comments[$spe]);
            }
        }
        $comments = array_merge($specials, $comments);

        foreach ($comments as $testname => $commentData) {
              :
              :
        }

[][]Runner 17:26 Runner - bobchinの日記 を含むブックマーク

Runner::run()

        $suite = new PHPUnit_Framework_TestSuite();

        foreach ($testcases as $realpath => $path) {
            if (is_null($realpath) || is_null($path) ||
                !file_exists($realpath)) {
                continue;
            }

            require_once($realpath);

            $classname = $this->classUtils->toClassname($path);

            if (!is_null($classname)) {
                $suite->addTestSuite($classname);
            }
        }
       ↓これじゃだめ?
        $suite = new PHPUnit_Framework_TestSuite();
        $suite->addTestFiles(array_keys($testcases));

2008年09月02日(火)

[][]DocTestつづき 10:25 DocTestつづき - bobchinの日記 を含むブックマーク

話すよ〜とか言ってしまったので、見直していたり。


Maple4_Utils_Class::toClassname()

せっかく Maple4_Utils_Array というのがあるのだから

そっちに任せた方がいい気がする。

もちろん依存することになってしまうんだけどね。

        $doUcfirst = true;
        if (isset($options['ucfirst']) &&
            !is_null($options['ucfirst'])) {
            $doUcfirst = $options['ucfirst'];
        }
Maple4_Utils_Array
    public function isSet($key, $default = null)
    {
        return isset($this->array[$key])? $this->array[$key]: $default;
    }
    public function isEmpty($key, $default = null)
    {
        return isset($this->array[$key]) && empty($this->array[$key])? $this->array[$key]: $default;
    }
    public function isNotEmpty($key, $default = null)
    {
        return isset($this->array[$key]) && !empty($this->array[$key])? $this->array[$key]: $default;
    }
    public function isNull($key, $default = null)
    {
        return isset($this->array[$key]) && is_null($this->array[$key])? $this->array[$key]: $default;
    }
    public function isNotNull($key, $default = null)
    {
        return isset($this->array[$key]) && !is_null($this->array[$key])? $this->array[$key]: $default;
    }
    public function isBool($key, $default = null)
    {
        return isset($this->array[$key]) && ($this->array[$key])? $this->array[$key]: $default;
    }
    public function isNotBool($key, $default = null)
    {
        return isset($this->array[$key]) && !($this->array[$key])? $this->array[$key]: $default;
    }

Maple4_Utils_Class::toClassname()
        $a = new Maple4_Utils_Array($options);
        $doUcfirst = $a->isNotNull('ucfirst', true);
        $namespace = $a->isNotNull('namespace', '');

[][]Maple4_Utils_File::searchBasePathname() ちょっとキモい気が 10:36 Maple4_Utils_File::searchBasePathname() ちょっとキモい気が - bobchinの日記 を含むブックマーク

'__BASEDIR__'というファイルがあるフォルダを基準とするという仕様だけど、

汎用ユーティリティクラスの機能ではない気がする。

Maple4_Utils_File を利用することを考えた場合DocTest以外では使うとは

ちょっと考えにくい機能なので入れる場所が違うかなという印象。

あと、仕様的にもPython(おそらくrhacoか?)の__init__.py(__init__.php)に

啓蒙されているかと思うけど、微妙

設定が$optionsと'__BASEDIR__'ファイルに別れているのも。。。

声にならない声として、やたらむやみな仕様変更?機能追加?はユーザを混乱させ

使ってもらえなくなりやすいかも。

せっかくDocTestいいよねって声が出てきてますし。。。


#いや単純に間違って'__BASEDIR__'を作り忘れてて、

#ハマって動かんってだっただけかもしれないんですけど。(^^;

[][]テスト実行ファイル 10:54 テスト実行ファイル - bobchinの日記 を含むブックマーク

http://blog.bz2.jp/archives/2008/04/post-78.html

を参考に、DocTest.php で済ませられたらなぁ。

オプション指定に困るけど。。。

そこは上記リンク内の ARGF でとか。

KuniTsujiKuniTsuji 2008/09/02 10:25 北海道といえば、15年ぐらい前に一度いって
親子丼食べた気がします。

kunitkunit 2008/09/02 11:49 前の対象ディレクトリ+prefixというやり方があまりにもわかりにくかったので、
変更したんですがアプローチを間違えた感がありますかね・・・

オプションで基準ディレクトリを指定する方がいいですかね。
__BASEDIR__はおけばいいだけなのでそっちの方が楽かなぁと思っただけなんですが。
両方できるようにするか。

kunitkunit 2008/09/02 11:51 いろいろ仕様変更をしてしまってすみません。

DocTestはまだまだ使いにくいものになっていると思うので、
がんばっていいものにしていきたいと思います。
8月で進んだくらいのスピードでいろいろやって、
早く仕様を確定したいと思います。