Ruby 2.6 での ERB.new のインタフェース

複数の Ruby バージョンをサポートする Gem などで、Ruby 2.6 で導入されるキーワード引数を使った ERB.new の新しいインタフェースと、Ruby 2.5 以前の ERB.new のインタフェースを同居させる場合は ERB.instance_method(:initialize).parameters.assoc(:key) で条件分岐すると Ruby 本体での対応と合わせられると Ruby x Elixir Conf Taiwan 2018 で k0kubun さんに教えてもらった。

if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
  ERB.new(str, trim_mode: nil, eoutvar: '-')
else
  ERB.new(str, nil, '-')
end

コミットとしては以下。対応することがあれば参考にどうぞ。

https://github.com/ruby/ruby/commit/3406c5d

RubyKaigi 2018 に提出した CFP

RubyKaigi 2018 での講演は2日目の午後一となった。

rubykaigi.org

以下は内容の CFP 提出時のもの。いま発表準備しているもののベースになっているので、参考にどうぞ。

Title

Improve a Ruby coding style rules and Lint

Abstract

This talk describes improving a Ruby coding style rules and Lint when using RuboCop.

Opportunities for using static analysis tools to unify coding style within a repository are not uncommon. However, the real world is not unified by the sole coding rule. Even so, we can approach the coding rule that we think is better. I'd like to talk about that in this topic.

Details

In this topic I will mainly talk about the following things.

  • On the difference between coding style and Lint
  • Customize the static analysis tool RuboCop
  • Case study on RuboCop in OSS (e.g. rails/rails repository)
  • A case examples of a patch that I sent to RuboCop
  • Participate in an OSS community to improve coding style and Lint

The focus of this topic will be RuboCop, but by including links with other repositories such as Rails, I'd like to make the audience a sense of familiarity with OSS community and product.

Pitch

I'm a top 10 rankers for commitment to RuboCop. https://github.com/bbatsov/rubocop/graphs/contributors

I think that I can convey hints and internal mechanisms for improving coding rules and Lint related to RuboCop.

`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 のリリースあたりに入ると思う。

台湾ライフ4日目

夜に 5xRuby の竜堂さん、アキラさんたちとのディナーの約束をして、お昼は故宮博物院に行ったりしていた。ディナーは竜堂ファミリー、松田ファミリーを交えて、これぞ中華という夕餉だった。また、アキラさんに RuboCop コミッターの Ted さんを紹介してもらって挨拶をさせてもらったりしていた。

Ruby x Elixir Conf Taiwan 2018 (2日目)

Ruby x Elixir Conf Taiwan 2018 の2日目。

2018.rubyconf.tw

本編とその前後での対話で印象に残ったことを箇条書きで記しておく。

  • 前日の夜に2日目のオープニングキーノートの松田さんが rails/rails にコミットしていたのが気になったところ、案の定今日のキーノートで使われるコードだった
  • 前日のパーティーで Matz と Frozen String Literal の効果についてどうなんでしょうねと話をした流れで、個人的には松田さんが行なっているパフォーマンス改善は対象範囲が明確な点もあわせてなるほどと思う分かりやすさがあったりする
  • 小さな内容ではあるものの、今回のカンファレンスを契機に (vzvu3k6k さんが Querly に PR していた)https://github.com/soutaro/querly/pull/39パッチに乗っかったパッチを送ったりできて面白かった
  • Ruby 2.6 で変更される ERB.new のインタフェースについて、Ruby 2.5 以前の互換を作る際のコードを k0kubun さんに聞いていたりした。手元の PC に RuboCop の実装があるので、そのあたりを good / bad に含んであとで PR する気持ち

続きは追って記す (かもしれない) 。

会のあとは饒河夜市 (Raohe Street Night Market) に連れて行ってもらった。謝謝。

vzvu3k6k もいらっしゃっていたので夜市周辺の Rainbow Bridge でコードリーディングとかしてたりした。

Ruby x Elixir Conf Taiwan 2018 (1日目)

Ruby x Elixir Conf Taiwan 2018 に参加した。前日にあたる昨日から移動してたので、5xRuby さんの Pre-Party に参加していたりしたので台湾2日目にあたる。

2018.rubyconf.tw

本編と GitHub さんによるパーティー参加での対話で印象に残ったことを箇条書きで記しておく。

  • Matz のキーノートはこれまでの Ruby の歴史とこれからの Ruby の展望の話
  • Ruby 3 は 3x3 Ruby を満たした時点へのラベル。東京オリンピックリリースは目標
  • 3x3 Ruby に関する実装候補群として、MJIT / Guild / Steep が取り挙げられている
  • 懇親会で機会があったので、型について「書く」「書かない」「書いても書かなくても良い」の3択での質問をしたところ、「書かない」だった
  • Steep は現状では Ruby の目指している型システムへの展望を満たしているわけではないので、今後の soutaro さんの活動もあわせて興味深い
  • Frozen String Literal について、Ruby 3.0 でのデフォルトとなるか未定のまま。Frozen String Literal がデフォルトになったときに既存のコードで FrozenError が出るのは非互換が現れるのは厳しい
  • 2年くらい前に、backport_dig という dig を切り出した Gem に PR を出してくれた vzvu3k6k さんとはじめてお会いした。RuboCop の新たな Cop 実装をライヴ TDD で作るプレゼンが面白かった

続きは追って記す (かもしれない) 。

会のあとは John Lin に美味しい魚料理を出してくれる地元のお店に連れて行ってもらった。謝謝。