最近querlyに投げたpull request 2019-04
ここ最近querlyにいくつかPRを投げる機会があったので、ブログにまとめてみる。
Add documentation for as
syntax #60
これはドキュメントの更新である。 使いたい機能がドキュメントに書かれていなかったので追加した。
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
trunkでquerlyをbundle installできなかったので直した。詳しくはraccの方のPR/Issueを見ると良い。
raccを使ったRubygemsを作っている人は、もしかしたら対応が必要かも知れない。まあraccのバージョンをpinする必要性を感じないので、だいたい問題はないと思う。
Allow underscore for method name with receiver #63
これはTwitterでhanachinさんが呟いていたのがきっかけで直したもの。
twitter.comゆるぼ: querlyで
— Miyagi (@hanachin_) 2019年4月4日
a.b にはひっかからず
a.b.c にひっかかるようなパターンってかけますか?
「a.b.」とか
「a.b._」とかでいけるかな?と思ったけどなんかうまく行かなさそうで...
querlyでは_
を使うことで任意のメソッド呼び出しにマッチできるが、これがレシーバ付きのメソッド呼び出しだと使えなかった。
# これは動く pattern: _ # 任意のメソッド呼び出しにマッチ pattern: _.bar # 任意のメソッド呼び出しにbarメソッドをチェインしているコードにマッチ # これは動かない pattern: bar._ # barメソッドの呼び出しに任意のメソッド呼び出しがチェインしているコードにマッチ
これが動くようにした。
Support string literal in pattern #64
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とコンフリクトするため。