`Lint/ErbNewArguments` cop を作った

Ruby 2.6 で変更される ERB.new のメソッド引数に関する Cop となる (Ruby 2.5 までの ERB.new のメソッド引数は非推奨となるので追加ともいえる) 。

github.com

Rails, Bundler, Thor, RSpec (Core) , RuboCop などメジャーどころの Gem にはすでにこの対応を送っているが、未だこのメソッド引数に対応していない Gem や今後のアプリケーション向きに作っておいた。

実は実装自体は1ヶ月くらい前からしていたが、Ruby 2.5 以前のメソッド引数との条件分岐を作る際の good サンプルに関するドキュメントをどうするか悩んでいたので、そのあたり Ruby x Elixir Conf Taiwan 2018 で k0kubun さんに聞いたりして今回 PR への運びとなった。

Examples としては以下。

# Target codes supports Ruby 2.6 and higher only

# bad
ERB.new(str, nil, '-')

# Target codes supports Ruby 2.5 and lower only

# good
ERB.new(str, trim_mode: nil, eoutvar: '-')

# Target codes supports Ruby 2.6, 2.5 and lower
# bad
ERB.new(str, nil, '-')

# good
# Ruby standard library style
# https://github.com/ruby/ruby/commit/3406c5d
if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
  ERB.new(str, trim_mode: nil, eoutvar: '-')
else
  ERB.new(str, nil, '-')
end

# good
# Use `RUBY_VERSION` style
if RUBY_VERSION >= '2.6'
  ERB.new(str, trim_mode: nil, eoutvar: '-')
else
  ERB.new(str, nil, '-')
end

マージされたら次の RuboCop のリリースあたりに入ると思う。