リファクタリングのお供に使えるcodemod

こんにちは、中川です。

今回はリファクタリングの際に役に立つcodemodというツールをご紹介したいと思います。
codemodとは、facebookが公開しているCUIの文字列置換ツールでpythonで作られています。
ツールといってもpythonファイルひとつですので非常に導入もしやすくなっています。

文字列の置き換えなら sed とかでできるのではと思われますが、
変換対象が多いときには、中には置換してはいけないものがあったり、
一部はそのまま置換でなくちょっと手直しが必要などがあったりしますよね。

そんな時に、codemod は変換対象をひとつひとつ確認・編集しながら置換をしていくことができます。

では、早速試してみましょう。 (※今回は手元のubuntuで試してみました。)

■インストール

https://github.com/facebook/codemod から適当なディレクトリにgit cloneなり、ファイルをダウンロードして下さい。


$ wget https://raw.github.com/facebook/codemod/master/src/codemod.py
$ chmod +x codemod.py

 

■動作例

「user」という文字列を「member」に置換する例です。


$ ./codemod.py -m -d /var/www/nippou/app/ 'user' 'member'
※上記コマンドのオプションの意味
 -m 複数行に対応
 -d ターゲットのパス


画面のように、置換前を赤色、置換後を緑で表示してくれます。
この画面でEnterを押せば置換が実行され、次の対象に画面が切り替わります。

単純に置換でなく編集がしたい場合は、


Accept change (y = yes [default], n = no, e = edit, E = yes+edit)?

の時に、「e」か、「E」を入力してEnterでエディタが起動して編集できます。
編集後に保存して閉じると、次の対象に進みます。
中断したい場合は、「Ctrl+c」で中断でき、再度実行すると再開するか確認してくれます。

当然、正規表現も利用でき、helpにあるように以下のような指定できます。


$ ./codemod.py -m -d /home/jrosenstein/www --extensions php,html \
    '<font *color="?(.*?)"?>(.*?)</font>' \
    '<span style="color: \1;">\2</span>'

codemodを使うと確認しながらの変換・編集となるので安心・安全に作業できますので、
ぜひ機会があれば試してみてください。