Parser gem のリリース権とコミット権をもらった

Ruby 2.7 での kwargs 警告が起因して RuboCop の Ruby 2.7 マトリックスが落ちていて、それを直そうとすると Parser gem の修正とリリースが必要だったので、そのあたりのイシューを立てていた。

github.com

結果として Parser gem チームが動けない時に、RuboCop core チームでも動けると良いということでリリース権とコミット権をもらった (現在のメインメンテナーは Opal チームの人でもある) 。リリースタスクがうまく動いていないのでそのあたりは後続の相談と調査という形であるものの、そのあたりを解決して今後必要に応じて動いていく気持ち。

ちょうど Ruby の parse.y の変更から Parser gem にフォワーディングするものがないか見始めた頃合いだったので、そのあたり捗っていくかもしれない。

Asakusa.rb 第 531 回

勤務先が会場だったので参加できる時間でサッと参加していた。

サッとRuboCop とその周辺イシューを見ていた。

github.com

rubocop-rails_config のサポートバージョンについて、toshimaru さんからメンションがあったので自分の見解を伝えた。特にメンテナンスコストが上がるわけではないので、サポートできる分の Ruby バージョンをサポートすると良さそうというのと、オフトピックとして CI マトリックスのコストは気になるかもだけれど sue445 先生がエントリに記した GitHub Actions のリポジトリあたりジョブ 20 並列で解決できる時代が近づいて来ている気がしている。

github.com

RuboCop に false positive のレポートが上がってきたので見た所、Ruby の結合順序の仕様の話で false positive ではないものだった。だいたいこういうときは Ruby のコードを ruby-parse コマンドを使って S 式で AST を見るのを初手に動作比較して、念のため Parser gem に問題がないか確認してみている。今回もそんな感じで見ていた。

github.com

Parser gem へのイシューで先週末にやろうと思っていて手が動いていなかったもの。Ruby 2.7 での kwargs まわりの警告で RuboCop の CI の Ruby 2.7 マトリックス が落ちていて、その解決に Parser gem のリリースが欲しかったのでイシューを立てた。

Faker 2.2.2 がリリースされた

Faker 2.2.2 がリリースされた。含まれている自分のパッチは以下。

github.com

先日実装した RuboCop Faker を使った auto-correct で Faker 2 スタイルに移行するためのコマンドをコピペで実施できるようにしている。これは FactoryBot から得たアイデア

% cat example.rb
require 'faker'

Faker::Lorem.words(10000, true)

% bundle exec ruby example.rb
example.rb:3: Passing `number` with the 1st argument of `words` is
deprecated. Use keyword argument like `words(number: ...)` instead.
example.rb:3: Passing `supplemental` with the 2nd argument of `words` is
deprecated. Use keyword argument like `words(supplemental: ...)`
instead.

To automatically update from positional arguments to keyword arguments,
install rubocop-faker and run:

rubocop \
  --require rubocop-faker \
  --only Faker/DeprecatedArguments \
  --auto-correct

bundle update したら Faker 2.0 の破壊的変更によるエラーに遭遇して、それを upstream で緩和できないかと思ってからの一連のサーガは以下。

  1. Faker 2 実行時に古い positional arguments スタイルを使っている時に動的に警告を出すようパッチを書いた http://koic.hatenablog.com/archive/2019/08/28
  2. Faker 2 の keyword arguments スタイルに auto-correct する RuboCop Faker を実装してリリースした http://koic.hatenablog.com/entry/rubocop-faker-has-been-released
  3. Faker 2 実行時の警告に RuboCop Faker を使った auto-correct を示すようパッチにして打診して取り込まれた (今回)

こういったパッチを送ったりコードを書いたりして Faker の org メンバーに招待されたのが昨日のパッチ会の最中だった。

現在、Faker 2.2.2 ではこれらのパッチが適用されているので、Faker 2 への一連の動きとしては落ち着いたと思う。今後はもしかすると Faker 3 でインターフェースが変わる可能性がなくはないので、そのときはアップグレードしやすい仕組みを導入しておけるマイルストーンをあとで提案しようと思っている。

RuboCop Faker を作った

以前の日記に書いた Faker 2 での破壊的変更となる positional arguments から keyword arguments への移行をサポートする Gem を作った。

github.com

RuboCop の 3rd party gem として作っているので、gem i rubocop-faker などして以下のように使う。

非推奨な引数の形式を使っている場所を検出するには以下のコマンドを実行する。

% rubocop --require rubocop-faker --only Faker/DeprecatedArguments

非推奨な引数の形式を Faker 2 の引数の形式に自動修正するには以下のコマンドを実行する。

% rubocop --require rubocop-faker --only Faker/DeprecatedArguments --auto-correct

以下のように keyword arguments を使うスタイルに自動修正される。

-Faker::Avatar.image(slug, size, format, set, bgset)
+Faker::Avatar.image(slug: slug, size: size, format: format, set: set, bgset: bgset)

Faker 2 での破壊的変更については以前の日記を参照のこと。

koic.hatenablog.com

おまけ

今回の移行ツールとして影響されたのは以下。

基本的に一回実行するだけのコマンドとなると思うので、あまり手を掛けずに作る方向で進めた。gem の名前でいろいろと悩んでいたが AST の変換には RuboCop を使うのが一番手が早そうだったので、そのまま素直に RuboCop Faker とした。他の命名案についても Ginza.rb の懇親会で話していたが無難に落ち着けた感じ。

RuboCop Minitest 0.1.0 をリリースした

最初の cop 実装としてもらっていた PR のレビューが終わったのでマージして、RuboCop Minitest 0.1.0 をリリースした。

rubygems.org

現在導入されている Minitest/AssertNil cop は assert_equal(nil, actual) に対して assert_nil(actual) を使うよう Minitest が非推奨警告するものを静的解析段階で伝えるもの。Minitest/AssertNil cop による offense のサンプルは以下。

% bundle exec rubocop --require rubocop-minitest
Inspecting 1 file
C

Offenses:

test/foo_test.rb:1:1: C: Minitest/AssertNil: Prefer using assert_nil(actual) over assert_equal(nil, actual).
assert_equal(nil, actual)
^^^^^^^^^^^^^^^^^^^^^^^^^

bad, good は以下で auto-correct あり。

# bad
assert_equal(nil, actual)

# good
assert_nil(actual)

RuboCop Minitest について、今後は RuboCop HQ でメンテナンスされている The Minitest Style Guide をもとに cop が足されていくと思う。

github.com

Faker 2.0の破壊的変更とその緩和施策

TL;DR: Faker 2 系を使うなら Faker 2.2 に bundle update すると破壊的変更が緩和される。

Faker 2.0 で以下の破壊的変更が入っていた。

% cat example.rb
Faker::Address.zip_code('NY')

% bundle exec ruby example.rb
Traceback (most recent call last):
        1: from example.rb:3:in `<main>'
/Users/koic/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/faker-2.1.2/lib/faker/default/address.rb:32:in
`zip_code': wrong number of arguments (given 1, expected 0) (ArgumentError)

これは以下のように Faker 2.0 で置き換えられたキーワード引数を使うように更新すれば解決する。

-Faker::Address.zip_code('NY')
+Faker::Address.zip_code(state_abbreviation: 'NY')

github.com

というのは自分が踏んだ問題で、この時点ではどんなキーワードを使えば解決するのか突然の ArgumentError から変更履歴を辿って見るまで分からなかった。これを踏まえたパッチを送って Faker 2.2 ではそれが反映されている。

Faker 2.2 ではいきなり ArgumentError になるのではなく、使うべきキーワードを含んだ非推奨警告を出すようにアップグレードへの痛みを緩和した。

github.com

% bundle exec ruby example.rb
example.rb:3: Passing `state_abbreviation` with the 1st argument of
`Address.zip_code` is deprecated. Use keyword argument like
`Address.zip_code(state_abbreviation: ...)` instead.

ただ、引数ひとつの場合にもキーワード引数を使うのは冗長で使いづらいという声もあり、Faker 3 ではもう少しインタフェースが変わるかもしれない。このあたりは faker-ruby/faker#1692 あたりの議論としていくのかなと思っている。

このあたりのインタフェース変更について RSpec 2 から RSpec 3 への移行ほどではないが、Transpec 的な移行ツールを用意してみようと思い手元で WIP となっている。そのうちリリースするかもしれない。

JRuby 9.2.8.0 がリリースされた

RubyConf Taiwan 2019 で soon と言われていた JRuby 9.2.8.0 がリリースされた。

www.jruby.org

TokyuRuby会議13で話した以下のイシュー解決が含まれているので、自分としては待ち望んでいたリリースだった。

rbenv と RVM には PR を開いてマージされているので master を使えばビルドできると思う。

github.com

github.com

CircleCI で使っている Docker イメージも更新したいところで、その過程で見かけたリポジトリにも PR を開いている。

github.com

本命となる CircleCI で使っている Docker イメージも更新したいところだが、まだ追えていない。