https://github.com/soutaro/querly
- Rubyを構文解析したASTに対して独自DSLでパターンマッチ&メッセージを出すツール
- プロジェクト固有の事情に配慮したLinterとして使える
- false positive 上等で注意喚起として使う
たとえばKibelaの querly.yaml から一部抜粋するとこんな感じです。
rules: # ... - id: kibela.order_by_string pattern: - "order(:dstr:)" - "where(:dstr:)" - "find(:dstr:)" - "exists?(:dstr:)" message: "文字列によるSQL構築は本当に必要ですか? SQL Injection を引き起こさないように気をつけてください。" - id: kibela.block_call pattern: - "yield" message: "yieldではなくblock.callを使いましょう。そのほうが渡す引数が明確になります。"
kibela.order_by_string
のルールの :dstr:
は double-quoted string で、変数展開を伴う生SQLに対して注意を促しています。実際Querlyを使い始めてから1年以上たちますが、「気をつけてください」というレベルのメッセージでも十分役に立ちます。プロジェクト固有のガイドラインを(DSLがサポートしているかぎり)どんどん足していけるのは非常にいいですね。
ルールの設定は querly console
でREPLを起動できるので、そこで行います。Railsプロジェクトだと querly console app lib
ですかね。対象がRubyなのでそんなに正確ではないものの、構文解析をするぶん正規表現によるパターンマッチよりも遥かに正確ですし、実用上はそれで十分です。
惜しむらくはRubyしかターゲットにできないこと! TypeScript 用にもほしい…(切実)。
なお実行にそこそこ時間がかかってpush前にやるのは大変なので、 Kibelaの場合はSider で実行を自動化しています。
See Also
- コードレビュー自動化の最前線から - Speaker Deck (querly開発者による発表資料, 2018年3月)