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 となっている。そのうちリリースするかもしれない。