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 に向けたお蔵出し機能のひとつとなる。

RuboCop 本体から Performance Cops が外される

次の RuboCop バージョンとして予定されている 0.68 から Performance Cops が外されます。今後 Performance Cops を使う場合は Gemify された rubocop-performance gem を使うことになるため、RuboCop 0.67 から警告が出るようにしています。

github.com

これから 0.68 までの間を移行期間としているため RuboCop の Performance Cops を使う場合は、以下のような設定を加えてください。

Gemfile に rubocop-performance gem を追加して bundle install する。

gem 'rubocop-performance'

.rubocop.yml に require: rubocop-performance を追加する。例えば以下のように足すことになります。

 inherit_from: .rubocop_todo.yml
 require:
+  - rubocop-performance
   - rubocop-rspec

 AllCops:
   Exclude:
     - 'vendor/**/*'
     - 'spec/fixtures/**/*'
     - 'tmp/**/*'
   TargetRubyVersion: 2.6

rubocop-performance gem についての詳細は https://github.com/rubocop-hq/rubocop-performance を参照してください。

RuboCop 本体と rubocop-performance gem 両方に実装がある場合、rubocop-performance gem の実装が方が優先される動きになります。

Performance Cops が外されることについての移行スケジュールは以下です。

  • RuboCop 0.67 ... Gemfile (あるいは gemspec) に rubocop-performance への依存がない場合に警告を表示します
  • RuboCop 0.68 ... RuboCop Core から Performance Cops を削除します

RuboCop 本体の開発についても RuboCop Performance に依存する形になるので設定のサンプルとして一例まで。

github.com

Performance Cops を Gemify する意図については、以下スライド 67 ページあたりからまとめていますので興味のある方はどうぞ。

Rails/OSSパッチ会 (2019年2月)

Rails/OSSパッチ会 (2019年2月) だった。

個人的に今回のパッチ会については、うなすけメンバーがくれている PR について Rails コミッターに意見を伺うのが目的のひとつだった。

github.com

断言できるような回答はないものの、文字列の方が好ましい上で、シンボルについても Rails が許可しているので許可しておくといった流れで良いのではと後日コメントした。

それとは別として書いたパッチは以下。再現確認から PR を開くまで1時間くらいだった。

github.com

次回 Rails/OSS パッチ会は 2019年3月13日(水)です。

Asakusa.rb 第502回

Asakusa.rb 第502回だった。

RuboCop に提案の来ていた new cop をクローズするにあたり、同僚の何名かに加えて ujihisa さんはじめ Asakusa.rb メンバーの何名かに意見を聞いてみたりしてクローズしていた。

github.com

あとは RuboCop Rails の config へのメタデータの追加とそれらをドキュメント反映するような rake task の更新をした後に、Railsdm どんな感じでしょう的な話を okuramasafumi さんとするなどして過ごしていた。

github.com

RuboCop Rails については、config のための injection ハックといくらかのドキュメント書きをすればリリースレディになると思っている (ほか何かあったかな...) 。まとまった時間がとれたタイミングで行う予定。

RuboCop 0.65.0 のリリース予定内容

今晩 (2/19) くらいにリリースされる予定である RuboCop 0.65.0 のざっくり内容です。

github.com

New features

#6126: Add an experimental strict mode to Style/MutableConstant that will freeze all constants, rather than just literals. ([@rrosenblum][])

Style/MutableConstant cop に strict モードがオプションとして入りました。デフォルトで strict というのが当初の提案でしたが、厳しすぎるように思えたためオルタナティブという形で落ち着きました。

Bug fixes

#6765: Fix false positives in keyword arguments for Style/MethodCallWithArgsParentheses omit_parentheses. ([@gsamokovarov][])

Style/MethodCallWithArgsParentheses のエッジケースについての不具合修正です。

#6763: Fix false positives in range literals for Style/MethodCallWithArgsParentheses omit_parentheses. ([@gsamokovarov][])

同じく Style/MethodCallWithArgsParentheses のエッジケースについての不具合修正です。

#6748: Fix Style/RaiseArgs auto-correction breaking in contexts that require parentheses. ([@drenmi][])

Style/RaiseArgs の auto-correct で invalid なコードに破壊してしまうケースを修正しています。

#6751: Prevent Style/OneLineConditional from breaking on retry and break keywords. ([@drenmi][])

if true then retry else 7 end のようなワンライナー中で retry あるいは break を使っているエッジケースでのエラーを防ぐようにしています。

#6755: Prevent Style/TrailingCommaInArgument from breaking when a safe method call is chained on the offending method. ([@drenmi], [@hoshinotsuyoshi])

Style/TrailingCommaInArgumentscsend (&.) を使ったコードに対してエラーになるケースを防いでいます。

Changes

#6766: Drop support for Ruby 2.2.0 and 2.2.1. ([@pocke][])

Psych 3.1.0 以上を使うため、Ruby 2.2.0 と 2.2.1 のサポートをドロップしています。なお近々 Ruby 2.3 系が EOL になった頃に Ruby 2.2 系のドロップを検討しています。

#6733: Warn duplicated keys in .rubocop.yml. ([@pocke][])

.rubocop.yml で重複している cop 設定を見つけるようにしています。

#6613: Mark Style/ModuleFunction as SafeAutocorrect: false and disable autocorrect by default. ([@dduugg][])

Style/ModuleFunction が行う auto-correct が常に意図された互換になるものではないため unsafe にしています。

何かあればフィードバックをといいたいところですが、いまのところ RC リリースなどはないためお試しいただく場合はリポジトリのコードを手元に持って来て rake install などでソースインストールしてお試しください。