RuboCop (>= 0.69) からRuby 2.2サポートを外した

おそらく次のリリースとなる RuboCop 0.69 のリリースで、Ruby 2.2 のサポートを外すことになった。

RuboCop の実装として safe navigation operator や squiggly heredoc など使うようにしているので、構文上も Ruby 2.2 は動かなくなる。

今回サポート対象をどうするかについては以下のイシューがベースになっていて、Ruby 2.3 は様子見をしたいので保留し Ruby 2.2 のみを外した。

github.com

加えて Ruby 2.3 に関する PR が最近来たりなどしてもいたので、しばらくサポートする見込み。

他に特筆しておく点としては Ruby 2.2 を外したことにより、以下の Cop に変更が入る。Ruby 2.2 以前をターゲットにしていた場合は Breaking change になる。

まず Layout/IndentHeredoc cop だが、Ruby 2.2 以下で Rails を有効にしている場合と Ruby 2.3 以上の場合で処理を分けていた auto_detection オプションは、今後必ず Ruby 2.3 以上ので廃止。これまで Ruby 2.3 以上の振る舞いとなっていた squiggly オプションを新たなデフォルトとした。言い換えると Active Support の String#strip_heredocRuby 2.3 以上の <<~ かの判定はなくなり、デフォルトとでは <<~ が選ばれることになる。

次にStyle/FrozenStringLiteralComment cop となるが、Ruby 2.3 以上のときのみに frozen string literal マジックコメントを有効としていた when_needed オプションは廃止して、これまで Ruby 2.3 以上の振る舞いとなっていた always オプションを新たなデフォルトとした。つまり frozen string literal マジックコメントがデフォルトで要求されるようになる。この関係で RuboCop 本体のテストコードの改修が骨だったのは裏話。

あとは流れで squiggly heredoc に関する JRuby の非互換を見つけて jruby/jruby の既存イシューにコメントしていたりした。

RuboCop Performance 1.2.0 をリリースした

RuboCop Performance 1.2.0 をリリースした。ミネアポリス時間で朝7時前だったので健康的。

RuboCop 0.68 での NodePattern への拡張にともなって、RuboCop Performance 1.1.0 までリグレッションになった以下のようなコードにおける偽陰性の修正を含んでいる。

def foo
  if /re/.match(foo, 1)
    do_something
  end
end

github.com

上記の偽陰性の修正と、それにともない RuboCop 0.68 以上を要求するようにした点が主な変更となる。

RuboCop Performance 1.2.0 とマイナーバージョンを上げた理由は、RuboCop 0.68 以上を要求するようにしたことから。これは RuboCop Performance 自体が RuboCop 0.68 で本格的に切り離されたものになることと、RuboCop 0.68 で追加された NodePattern に依存する実装になったことが理由。

GemifyされたCSVを使う

RubyKaigi 2019 で kou さんと秒速さんが話されたプレゼンで得た今日から使える tips 紹介。

https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2019/

Ruby にデフォルトでバンドルされている CSV ではなく、Gemify されて独立してリリースされている新しい CSV を使うことで、業務とエクセルとCSVという三位一体のシステムを少しずつ速くできる (かもしれない) 。

単純に Gemfile に gem 'csv' を指定して bundle install をする。

# Gemfile
gem 'csv'

これによって使っている Ruby のバージョンに縛られず新しい CSV gem を使えるようになる例。

% bin/rails r 'p CSV::VERSION'
"2.4.8"

% bundle install
(snip)
Installing csv 3.1.0

% bin/rails r 'p CSV::VERSION'
"3.1.0"

以下のようなメッセージの改善があったりするので、当然ながらアプリケーションの CI がとおるなどざっとは見ておきましょう。

github.com

kou さん、秒速さん、今日から使える改善と紹介ありがとうございました。

Active Record Oracle enhanced adapter 6.0.0.rc1 がリリースされた

Rails 6.0.0.rc1 にあわせて Active Record Oracle enhanced adapter 6.0.0.rc1 がリリースされた。yahonda さんリリースありがとうございます。

github.com

今回の Oracle への ORM としての目玉は Address ORA-01795: maximum number of expressions in a list is 1000 で、SQLIN 句に 1,000 件を超えるリストを指定した場合に発生する ORA-01795 を 1,000 件ごとの OR で繋ぐことでエラーを抑制する振る舞いになる。

これによりアプリケーション側で 1,000 件より多くを渡さないようにロジックを組んだり、それを想定したコードレビューをしたり、データ量が増えるとエラーになったりといったことが発生しなくなる。このあたりたびたびパッチ会などでも相談したりしていた。

yahonda さん、kamipo さん、対応ありがとうございました。

Ginza.rb 第70回

Ginza.rb 第70回 RubyKaigi 2019を肴に一杯呑もう!にバグ・オブ・ザ・イヤーとして参加した。会場はメドピアさん。

ginzarb.doorkeeper.jp

先週開催された RubyKaigi 2019 のふりかえりということで、Matz のキーノートと Ruby 3 への進捗のセッションで全体を俯瞰しつつ、気になるトピックについて掘り下げて話されていった。個人的に RubyKaigi 2019 で強く印象に残ったのは Ruby 2.7 で導入される Pattern Matching の話で、セッションで示された JSON パースへのパターンマッチといったユースケースが分かりやすくこれは便利だと思っていた中で、代入ではなく束縛という概念が入っている (という認識で良いだろうか?) といった自分が消化しきれていなかった視点をキャッチアップできたりして面白かった。

今回の Ginza.rb のふりかえりでは、Numbered block arguments など諸々についてお気持ちがあれば bugs.ruby-lang.org にフィードバックしようといった感じで本編閉会。楽しかったです。

RubyKaigi 2019のLightning Talksで話した

RubyKaigi 2019 の Lightning Talks で話した。

今回、コンテンツ、英訳のレビューにご協力頂いた方々への感謝という日記エントリということで、54枚の尺を5分で収めるにあたってトークで漏れていたパートへの補完は割愛。それも含めて今回の Lighitning ⚡️だったということで Lightning Talks の時間を賑やかにできてれば嬉しいです。

探偵小説風のショートストーリー展開を狙っていたため、ネタバレにならないよう公開を控えていた Lightning Talks に提出していたプロポーザルは以下です。

Title

The TracePoint Bomb!

Abstract

I will talk about the impact of patch to gems using TracePoint on the real world development of Ruby.

Details

I will talk about the beginning of the following issue and the subsequent incident. https://bugs.ruby-lang.org/issues/15400

In conclusion the patch I wrote below was the cause. https://github.com/bblimke/webmock/pull/751

Why did I write a patch using TracePoint? What was the factor behind the lack of ideas? What is the retrospective from there? I will speak.

Through this talk, listeners can learn about the dosage and administration of TracePoint. At the same time, listeners will recognize the possibilities of Ruby again.

Pitch

I made this bug with the following pull request. https://github.com/bblimke/webmock/pull/751

This is the beginning of this case.

ささださんはじめ Ruby コミッターのみなさんありがとうございました。

f:id:koic:20190422181950j:plain:w400

`rubocop` コマンドに `--init` オプションを用意した

rubocop コマンドに --init オプションを用意した。次のリリースとなる RuboCop 0.68 で有効になる予定。

github.com

使い方

% rubocop --init
Writing new .rubocop.yml to /private/tmp/example/.rubocop.yml

rubocop --init を実行すると、カレントディレクトリに以下のような .rubocop.yml ができる。

% cat .rubocop.yml
# The behavior of RuboCop can be controlled via the .rubocop.yml
# configuration file. It makes it possible to enable/disable
# certain cops (checks) and to alter their behavior if they accept
# any parameters. The file can be placed either in your home
# directory or in some project directory.
#
# RuboCop will start looking for the configuration file in the directory
# where the inspected file is and continue its way up to the root directory.
#
# See https://github.com/rubocop-hq/rubocop/blob/master/manual/configuration.md

すでに .rubocop.yml が存在している場合は以下のように失敗する。

% rubocop --init # A warning will occur when .rubocop.yml already exists
.rubocop.yml already exists at /private/tmp/example/.rubocop.yml

RuboCop JP に神速さんが開いてくれたイシューがアイデアの元になっている。

github.com

基本的な設定項目として何を示すかといった選別が悩ましいため、このイシューのすべての問題が解決するわけではないが手始めとしてコンフィグレーションのリンクを示すまででひとまず用意した。

不足していたテストコードは PR 直前に書き加えているものの、去年の7月には基本線を実装してコミットしていた (おそらくもっと前に作っていたが、一度手元のリポジトリを飛ばしてしまった時にそれは消えていると思う) 。元々はアイデアの多くを実現してから PR を開こうと思っていたところ、来月の銀座 Rails に向けたお蔵出し機能のひとつとなる。