Ginza.rb 第78回

Ginza.rb 第78回だった。会場はメドピアさん。

何が一番の収穫だったかというと Ruby 2.7 に含まれる Numbered parameters について、名前重要なはずなのに引数順序の数字で表現されるのがうーんと思っていたところ「Ruby は Web アプリケーションを書く言語ではなくて、スクリプト言語だから」という初心というか出自を思い出させてくれるコメントを聞けたこと。

例えば書き捨てのときは如何にもスクリプト言語っぽい機能となるという考え方はなるほどと思ったのと、それはそれとしてメンテナンス対象のエンタープライズアプリケーションなどのコードでは名前がついていてもらいたいものだけれど、ユーザーのコンテキストによって選択肢が生まれるのはあるいは面白いのかもしれない。

あとはパターンマッチへの期待や、キーワード引数の分離への破壊的変更についてとか個人的に盛り上がったネタだった。ところどころ tmtms さんのアドベントカレンダーが会を先取りしていたかのようにまとまっていて便利だった。

qiita.com

Rails/OSSパッチ会 2019年11月

Rails/OSSパッチ会 2019年11月を開催した。

いくつか行なっていたことがあり、まずは RuboCop Railsマイグレーションdecimal 型を指定する際に precisionscale を必須にしないと警告を出す提案が来ていて、Active Record メンテナーの kamipo さんに相談をしていたりした。

Active Record では scale オプション値によって、Type::DecimalType::DecimalWithoutScale が返るようになっていて Type::DecimalWithoutScale の方は消したいというお気持ちの FIXME として記されていることを教えてもらった。

if scale == 0
  # FIXME: Remove this class as well
  Type::DecimalWithoutScale.new(precision: precision)
else
  Type::Decimal.new(precision: precision, scale: scale)
end

https://github.com/rails/rails/blob/v6.0.2.rc1/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb#L656-L661

この辺りをヒントに Type::DecimalWithoutScale が誕生しないような cop としてコメントをしたのが以下。

github.com

松田さんには RuboCop core に提案されている PR について相談していた。内容としては Dir.glob(path) が返すパスの配列の順序はファイルシステムに依存しており、開発とプロダクションでファイルシステムが異なると結果が変わって困ることがあったというもの。解決策としては Dir.glob(path).sort を書くといったものだが、Dir.glob(path) の振る舞いを変更する提案は breaking change の話になるし、仮に Dir.glob(path, sort: true)Dir.glob(path, mode: :sort) といったオプションを提案したとしても Dir.glob(path).sort の方が短くてインタフェースとしてどうだろうかという話をしていたりした。とりあえず提案されている cop としては Dir.glob(path) の結果を元に require の順序を一意にしたいという状況に限定されているので、このあとマージを前提にレビューをしようかなと思っている。

QWYNG さんからは Rails アプリケーションのコントローラで Style/RedundantReturn偽陰性があることをフィードバックしてもらって、どのように対処しようかという話をしたりしていた。以下の PR として開いてもらったので、順番に見ていきたいと思う。

github.com

自分としても RuboCop 1.0 までに提案したい breaking change となる手元のパッチがあるので、提案の根拠をコミットメッセージにしるしていたり rebase してコンフリクトを解消したりしていた。

次回のパッチ会は 12月18日(水) です。Ruby 2.7 のリリース前に開催した方が、万が一何か見つけた時に良さそうといった日程になっています。

RuboCop 0.77.0 リリース解説

RuboCop 0.77.0 がリリースされたので、概要をざっくり記しておきます。

今回は cop 名やオプション名などで、以下の理由から多くの名称変更が加えられたリリースです。

  • 例えば UnneededRedundant など cop 名に対してバラバラに使われていた用語を Redundant に統一するなど、用語の統一
  • WhitelistBlanklist といった用語がオプション名に使われていたのを、Allow listDeny list 的な用語に刷新した、潮流の反映

いずれもユーザー定義の .rubocop.yml への breaking change にあたるため、RuboCop 1.0 より前に適用しておきたかったうちのものがリリースされた形です。

このうち部署名変更については、pocke さんが mry を RuboCop 0.77 対応してくれているので RuboCop 0.76 からの移行であればそちらを活用すると便利かもしれません (pocke さんいつもありがとうございます!) 。なお、0.60.0 から 0.76.0 の間は現在 TODO となっているのと、オプション名は現在未対応のようで、それぞれ PR を出してみて良いかもしれません。

github.com

known issue としては Style/TrivialAccessors cop に対するオプション名 AllowedMethodsAllowedMethodtypo しているものがあり、PR がマージされています

なお、今回のリリースで新たな cop は導入されていないため、部署名の変更以外はバグ修正がメインとなっています。

最後におまけ情報。マイルストーンに対するイシューがいくつか残っているので、そのあたりの動きにも影響されると思いますが、RuboCop 1.0 はクリスマス前後にリリースされるかもしれません。

github.com

マイルストーンとしては、それまでのタイムアタックでやることいっぱいなのですが、乞うご期待。

RuboCop Rails 2.4.0 リリース解説

RuboCop 2.4 系の最初のリリースとなる 2.4.0 をリリースしたので、概要をざっくり記しておきます。

github.com

Rails 部署に新たに追加された cop は以下の4つ。

Rails/ApplicationController cop

Rails/ApplicationRecord の Controller 版。

# bad
class MyController < ActionController::Base
end

# good
class MyController < ApplicationController
end

Rails/ApplicationMailer cop

Rails/ApplicationRecord の Mailer 版。ApplicationMailer クラス層が導入された Rails 5.0 以上のアプリケーションが検査対象となる。

# bad
class MyMailer < ActionMailer::Base
end

# good
class MyMailer < ApplicationMailer
end

Rails/RakeEnvironment cop

Rails アプリケーションにおける Rake ファイルのタスク定義で :environment タスクに依存しているか検査する。

# bad
task :foo do
end

# good
task foo: :environment do
end

:environment タスクへの依存を失念するというケースがなるほどの一方で、振る舞いを変える可能性があるため auto-correct はデフォルトで unsafe としている。

Rails/SafeNavigationWithBlank cop

以下について検査する cop で少し説明が必要なので後述。

# bad
do_something if foo&.blank?
do_something unless foo&.blank?

# good
do_something if foo.blank?
do_something unless foo.blank?

これは以下のようにレシーバーが nil の場合に safe navigation operator で blank? メソッドを呼び出した結果 falsy になるので、意図に反している可能性を示唆する cop となる。

nil.blank? #=> true
nil&.blank? #=> nil

そのため auto-correct はデフォルトで unsafe としている。

Rails/UnknownEnv の拡張

Rails/UnknownEnv について以下のケースも検知するようになった。

 # bad
 Rails.env.proudction?
+Rails.env == 'proudction'

 # good
- Rails.env.production?
+ Rails.env == 'production'

Rails/FilePath cop のデフォルトスタイル変更

このリリースでの大きな変更として Rails/FilePath のデフォルトの EnforcedStyle の変更がある。これまでの badgood が反転してデフォルトの EnforcedStyle: slashes では以下のようになる。

# bad
Rails.root.join('app', 'models', 'goober')
File.join(Rails.root, 'app/models/goober')
"#{Rails.root}/app/models/goober"

# good
Rails.root.join('app/models/goober')

もともと Windows 環境でのファイルパスセパレータとの互換を考慮して配列引数で渡しましょうといった流れだったようだが、Rails.root の戻り値となる Pathname オブジェクトはファイルパスセパレータに対する環境差異を吸収してくれているので、文字列引数で問題がなかった。また、生成する文字列の数も減らせそう、かつ、引数はひとつで固定されるなどの理由からデフォルトを変更した。これは Rails/OSS パッチ会で松田さんからデフォルト変更の提案があったことがきっかけになっている。

もし従来のスタイルの方が好ましい場合は EnforcedStyle: arguments を指定してください。

その他に Rails/ReversibleMigration, Rails/EnumHash, Rails/Presence, Rails/SaveBang といった cop へのバグ修正が含まれています。

エンジョイ!

Asakusa.rb 第541回

YARD の以下の PR で言及されていた irb モジュールへの言及について糸柳メンバーに相談しに行っていた。

github.com

少し詳細に入ると、YARD は slex という irb の内部 API に依存した作りになっていて、slex が消えたことについて YARD が困っている話をしたり (内部 API に依存するのはやめましょう事例) 、ruby/ruby リポジトリを slex で grep したら消し忘れっぽい定数があったことをフィードバックしたりしていた (削除された) 。Asakusa.rb べんり。

あとはモリスさんに RWC でカニの時期の松江体験が素晴らしかったという活動報告をしたりして帰宅した。

GitHub Sponsors に承認された

GitHub Sponsors に承認された。Rails/OSS パッチ会の懇親会で、OSS メンテナーのみんな GitHub Sponsors に登録していこうみたいな話をしていたのが最終的なきっかけ。

github.com

GitHub Sponsors への登録については GitHub での2段階の承認があった。

1段階目は GitHub Sponsors の Waitlist に入る。この際にいくつかのアンケートがあるので埋めてフォームを送信する。自分の場合 10 日から 2週間くらいで、GitHub Sponsors へのエントリフォームが送られてきている。

2段階目は GitHub Sponsors としてのプロフィール詳細とサポート層の設定、ならびに振込先の Stripe 連携がある。Stripe へは本人 ID の提出が必要なので免許証やパスポートなどの画像を送付する形になる。ID について3日くらいの営業日で Stripe から承認されたと思う。サポート層については悩ましくこの設定に数日かかっていた。これらの設定ができたら GitHub に2段階目の最終の承認申請をする。自分の場合は翌日くらいに GitHub から最終承認がされた。11月頭の RubyWorld Conference の時期に最初の Waitlist 申請をしていたので、ここまで3週間くらい。

f:id:koic:20191125163417p:plain

その他、プログラミングによる問題解決という趣味の側面でも OSS についてやっていたりするのが葛藤があったところ。いまの判断として何かコミットメントしますといった代償のレイヤーはいまのところありませんが、RuboCop HQ やその他いくつかの OSS について日課として見ているので、イシューとしてより目に留めたりとかそういったことはあるかもしれないです。ただ無限のイシューに対してトリアージを付けて行なっているので、どの程度のプライオリティにできるかはその時々ということで。

そういった GitHub Sponsors のシステム登録面や気持ち的なところで、ちょっと足踏みしそうなところもあるかもなので、GitHub Sponsors に興味のある人がいれば Rails/OSS パッチ会や地域 Ruby コミュニティなどで聞いてもらえれば分かる範囲で回答したりするのでお気軽にどうぞ。

RuboCop Performance 1.5.1 をリリースした

RuboCop Performance 1.5.1 をリリースした。

ユーザー影響のある形で適用しているのは以下の PR で、Performance/StartWith cop と Performance/EndWith cop の偽陰性を解決したもの。

github.com

サッとアップデートすると、これまで当該 cop で見つかっていなかった offense が検出されるかもしれません。