前提
世は大パーサー時代ということで、SyntaxTreeを触ってみて、実際にRSpecファイルからドキュメンテーション部分を抜き出すことに成功したのでちょっと書きます。
SyntaxTreeについて
RubyのASTをいい感じに触れるgemです。機能的にはRipperという標準ライブラリと近いのですが、各ノードが情報を豊富に持っているために色々と便利になっています。
SyntaxTree実践:RSpecから情報を抜き出す
コードを読んだほうが早いと思うのでコードをどうぞ。
上のコードではRSpecのファイルからdescribe
などに与えられた文字列を解析し、RSpecが--format documentation
のときに出力する文字列と似た文字列を出力しています。
特に57行目のvisit_command
メソッドが重要で、ここでメソッド名に応じて処理を変更しています。super
を呼ばないと下のノードが処理されなくなってしまうのですが、super
の後ろで後片付けができる(感覚的には対応するend
に来たときの処理を書ける)のが便利です。
お読みいただけるとわかるのですが、中核となるRSpecVisitor
クラスはSyntaxTree::Visitor
を継承することでわずか40行ほどに収まっており、全体でも100行以下で目的を達成できています。
まとめ
ということで短いですがSyntaxTreeの紹介と実践例でした。パーサーというと大がかりに聞こえがちですが、このような小規模なコードでも便利さを実感できます。SyntaxTreeは使用感がとても良いですし、機能も豊富ですので手軽にやりたいことを実現できるかもしれません。