サンゴラボ

4年目ソシャゲエンジニア

git-flowのfeature finishで--no-ffなmargeにならないときがある

git-flowをいじっていて、A successful Git branching modelみたいなリビジョングラフにならなくて悩んでいたのですが、やっと解決しました。

問題は、featureブランチで開発してdevelopブランチにマージ(feature finish)したときに起こります。なぜか、リビジョングラフが真っ直ぐになってしまうときがあります。つまり、featureブランチなんてなかった!という感じになります。

調べたらどうやら、1回しかコミットしてないfeatureブランチをfeature finishすると、ffなmargeになってしまうようです。git-flowプラグインの仕様といったとこでしょうか。

参考:feature finish not doing a --no-ff merge

Tornadoを使ってみる

新しい技術を知っておきたいので、なんとなく興味があったTornadoをいじっています。TornadoはPythonで書かれたノンブロッキングなWebサーバとツールのことです。立ち位置は最近流行りのNode.jsと似たような感じですね。Webサーバーやフレームワークを含んだWebアプリケーションの環境といったとこでしょうか。

お決まりのHello, world(+α)からはじめました。ソースコードgithubにあって、demos以下にいろいろサンプルがあるので親切だと思います。

以下は、Hello, worldとGETメソッドとPOSTメソッドのサンプルです。適切なとこに置いて実行すればサーバーが立ち上がるかと。

test.py

#!/usr/bin/env python

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

class TestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('<html><body><form action="/test" method="post">'
                   '<input type="text" name="message">'
                   '<input type="submit" value="Submit">'
                   '</form></body></html>')

    def post(self):
        self.set_header("Content-Type", "text/plain")
        self.write("You wrote " + self.get_argument("message"))


def main():
    tornado.options.parse_command_line()
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/test", TestHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()

tornado.web.RequestHandlerを継承したリクエストハンドラ(上ではMainHandler、TestHandler)を作って、tornado.web.Applicationでマッピング(main関数のとこ)していく感じみたいです。

http://localhost:8888でHello, worldが表示されればオッケーです。http://localhost:8888/testにアクセスすればフォームが出てくるはずです。get()とpost()はそれぞれHTTPのGETとPOSTに対応しています。他のHTTPメソッド(PUT、DELETE、HEAD、OPTION)も使うことができて、何かしら実装しないとHTTPメソッドを処理できません。

ノンブロッキングのとこはあとで勉強する。

FuelPHPのコントローラのテストは割と簡単?

fuelphpのコントローラのテストは簡単なのか?

このリンクにもあるように、たびたび社内でもコントローラのテストは話題にあがります。
僕もどうやってテストすればいいかわかっていないのですが、とりあえずステータスコードとビューに渡してるデータだけでもチェックしてみようと思いました。

以下は適当に書いたサンプル

welcomコントローラのテスト

fuel/app/tests/controller/welcome.php

<?php

/**
 * Tests for Controller_Welcome
 *
 * @group  App
 */
class Test_Controller_Welcome extends TestCase
{

    /**
     * ステータスコードのテスト
     */
    public function test_index_status()
    {
        // リクエストオブジェクトを作成、HTTPメソッドも指定可能
        $request = Request::forge('welcome/index')->set_method('GET');
        // リクエストを実行してレスポンスオブジェクトを取得
        $response = $request->execute()->response();
        // ステータスコードを取得
        $test = $response->status; // ステータスコードを取得
        $expected = 200;
        $this->assertEquals($expected, $test); 
    }

    /**
     * ビューに送るデータのテスト
     * データ送ってないので失敗する
     */
    public function test_index_data()
    {
        $response = Request::forge('welcome/index')->execute()->response();
        // data['test'] = 'hoge'みたいにして送ったデータを取得
        $test = $response->body->test;
        $expected = 'hoge';
        $this->assertEquals($expected, $test); 
    }
}


リクエストオブジェクトとレスポンスオブジェクトがあるので、これだけなら簡単です。
あとはリクエストオブジェクトにGETとかPOSTのパラメータをセットできたらいいんだけど、それはよくわからなかった。
なんかいい方法ないかなー?