pockestrap

Programmer's memo

最近querlyに投げたpull request 2019-04

ここ最近querlyにいくつかPRを投げる機会があったので、ブログにまとめてみる。

Add documentation for as syntax #60

github.com

これはドキュメントの更新である。 使いたい機能がドキュメントに書かれていなかったので追加した。

querlyにはinterpolation syntaxという機能がある。

id: find_by_abc_and_def
pattern:
  subject: "'finder(...)"
  where:
    finder: 
      - /find_by_\w+\_.*/
      - find_by_id

この例では、一旦全てのメソッド名をfinderというメタ変数にマッチさせて、その後そのメソッド名がwhereの中で定義している正規表現/文字列とマッチするかを検査している。

この時メタ変数にはシングルクオートを使用していて、つまり'finderがメタ変数の宣言である。

この構文はメソッド呼び出しには使えるが、リテラルに使うことができない。つまり、指定した正規表現にマッチする文字列を検索したい、という場合にはそのままではシングルクオートを使ったメタ変数は使えない。 そのような場合にはas syntaxを使う。この構文のドキュメントが漏れていたので、このPRで追加した。

id: migration_references
pattern:
  subject: "t.integer(:symbol: as 'column, ...)"
  where:
    column: '/.+_id/'

この例では任意のシンボルに対して'columnというメタ変数を割り当てている。

Relax racc dependency to fix build on Ruby trunk #62

github.com

trunkでquerlyをbundle installできなかったので直した。詳しくはraccの方のPR/Issueを見ると良い。

raccを使ったRubygemsを作っている人は、もしかしたら対応が必要かも知れない。まあraccのバージョンをpinする必要性を感じないので、だいたい問題はないと思う。

Allow underscore for method name with receiver #63

github.com

これはTwitterでhanachinさんが呟いていたのがきっかけで直したもの。

twitter.com

querlyでは_を使うことで任意のメソッド呼び出しにマッチできるが、これがレシーバ付きのメソッド呼び出しだと使えなかった。

# これは動く
pattern: _ # 任意のメソッド呼び出しにマッチ
pattern: _.bar # 任意のメソッド呼び出しにbarメソッドをチェインしているコードにマッチ

# これは動かない
pattern: bar._ # barメソッドの呼び出しに任意のメソッド呼び出しがチェインしているコードにマッチ

これが動くようにした。

Support string literal in pattern #64

github.com

querlyのパターン内でstring literalを書けるようにした。これは便利。 次のようなパターンが書けるようになった。

pattern: require("active_support")

同じコードにマッチするパターンは前述のinterpolation syntaxを使えばすでに書けるのだけど、リテラルを直接書いた方が明らかに楽だし、interpolation syntaxを使わないことでquerly consoleなどでも使えるようになる。

PRでは例にrequireを書いているけど、実際に欲しくなったのはitamaeのinclude_cookbookで特定のクックブックをincludeしているroleをググりたくなったのがきっかけ。 実質requireだしrequireの方が一般的でわかりやすそうなのでそちらを例に挙げた。

単純にgrepしようとすると、カッコの有無とかクオートのスタイルとか色々考えることが多くてめんどくさいので、querlyでできるのは便利。

ちなみに、string literalはダブルクオートのみで書くことができる。シングルクオートはinterpolation syntaxとコンフリクトするため。