プロジェクト固有のルールを指定できるLinterであるところのQuerlyがめちゃ便利

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