【不定期配信】最新のRuby & Railsへのバージョンアップ時の注意点 (~ 2021-10-24)

12 minute read

Ruby と Rails を安定して使い続けるために 最新の Ruby と Rails に対して行われた変更がバージョンアップするときに問題になるかどうか という観点で情報をまとめています。

情報が多いので時間がない人は Rubyの仕様変更の一覧Railsの仕様変更の一覧 を見てください。

Ruby の最新情報は nagachikaさん (@nagachika) / Twitterruby trunk changes で公開してくださっています。

Rails の最新情報は Pull requests · rails/rails でマージされた PR を確認できるのと、y-yagiさん (@y_yagi) / TwitterなるようになるブログTechRacho|BPS株式会社のRuby on Rails開発情報サイト週刊Railsウォッチの記事一覧|TechRacho by BPS株式会社 で公開してくださっています。

これらは大変有益な情報です。本当にありがたいことです。

Google広告


Ruby

Rubyの仕様変更の一覧

ruby trunk

  • ruby --enable=all のときに YJIT が有効になります。ただし、 ruby 自身のビルドオプションによっては MJIT に戻すこともできます。
  • require 'did_you_mean/formatters/plain_formatter'
  • require 'did_you_mean/formatters/verbose_formatter'
  • CSV::Parserの問題のある行を解析する処理
  • CSV::Parser のクラス変数 @@string_scanner_scan_accept_string

以下、変更点の詳細です。

ruby-trunk-changes 2021-10-22 - ruby trunk changes

Fix TestRubyOptions#test_enable for -DMJIT_FORCE_ENABLE · ruby/ruby@6469038

【仕様変更】
なるほど、昨日の YJIT 導入後は ruby –enable=all のときに YJIT が有効になり MJIT が無効になります。MJIT を期待していた人にとっては仕様変更があったんですね。

[ruby/uri] URI#HTTP#origin and URI#HTTP#authority (https://github.com… · ruby/ruby@553f234

OK
仕様変更ではありません。URI に便利なメソッドが追加されています。 authority と origin です。どちらも素敵!

[ruby/mutex_m] Make VERSION shareable · ruby/ruby@d09cb64

nagachikaさん (@nagachika) / Twitter もコメントされていましたが、たしかにこの修正の意図がわかりませんね…。 PR には Ractor で共有するために修正したとあります。なぜ VERSION を共有しないといけないのかを知りたいんですよね。必要ならユーザーが共有すればよく、わざわざライブラリ側でする理由がわからない、ということです。

ruby-trunk-changes 2021-10-23 - ruby trunk changes

allow to access ivars of classes/modules · ruby/ruby@acb2345

OK

Sync did_you_mean · ruby/ruby@e22d293
Revert “Sync did_you_mean” · ruby/ruby@22249bb
Sync did_you_mean again · ruby/ruby@66df18c
Remove the test for DYM’s verbose formatter · ruby/ruby@905be49
Disable did_you_mean in TestPatternMatching · ruby/ruby@93badf4
Sync did_you_mean · ruby/ruby@e353bcd

【仕様変更】
DidYouMean関連のrequireで警告が出るようになりました。

  • require 'did_you_mean/formatters/plain_formatter'
    • 代わりに require 'did_you_mean/formatter' としてください。
  • require 'did_you_mean/formatters/verbose_formatter'
    • 削除されました。

ruby-trunk-changes 2021-10-24 - ruby trunk changes

[ruby/csv] Changed line ending handling to consider the combination \… · ruby/ruby@7f3dd60

【仕様変更】
影響の有無が判断できないのですが、CSV.parseなどのCSVを解析する処理のうち、ダブルクオーテーションの対応がとれていないというような問題のある行の処理において、改行の正規表現が間違っていて CR のみ or LF のみとしていたので CR + LF が追加されました。
通常のケースだと CR + LF をうまく扱えているので、問題となるケースは特殊なものだと思います。

テストケースをみると "2",""NOT" OK"\r\n のようにダブルクオーテーションの対応が取れていないものでかつ、行末が\r\nの場合に問題だったようです。

require "csv"

data = <<-CSV
"1","OK"\r
"2",""NOT" OK"\r
"3","OK"\r
CSV
csv = CSV.new(data)

# - - -
# ruby 2.7.3での挙動です。3行なはずが4行でエラーから復帰できません。
csv.shift
#=> ["1", "OK"]

csv.shift
#=> CSV::MalformedCSVError (Any value after quoted field isn't allowed in line 2.)

csv.shift
#=> CSV::MalformedCSVError (New line must be <"\r"> not <"\n"> in line 3.)

csv.shift
#=> CSV::MalformedCSVError (New line must be <"\r"> not <"\n"> in line 4.)

# - - -
# ruby trunkでの挙動です。全部で3行、エラーから復帰できています。
csv.shift
#=> ["1", "OK"]

csv.shift
#=> CSV::MalformedCSVError (Any value after quoted field isn't allowed in line 2.)

csv.shift
#=> ["3", "OK"]

いちおう仕様変更としておきます。

[ruby/csv] Add support for Ractor (https://github.com/ruby/csv/pull/218) · ruby/ruby@ee948fc

【仕様変更】
まず問題ないと思いますが、CSV::Parser のクラス変数 @@string_scanner_scan_accept_string が定数 STRING_SCANNER_SCAN_ACCEPT_STRING に変わりました。
これもいちおう仕様変更に挙げます。

ruby 3.0

変更なし。

ruby 2.7

変更なし。

Google広告


Rails

Railsの仕様変更の一覧

変更なし

以下、変更点の詳細です。

Pull requests

Pull requests · rails/rails 2021-10-22

日本語の解説: rails commit log流し読み(2021/10/22) - なるようになるブログ

Enable eager loading by default on CI systems by byroot · Pull Request #43508 · rails/rails

OK: generator
rails newで新しくプロジェクトを作成したときに環境変数CIが設定されていたら自動テストでEager loadingが有効になりました。地味に便利です。

ActionCable Client ensures subscribe command is confirmed. by spinosa · Pull Request #43507 · rails/rails

OK: レースコンディションで発生する ActionCable のバグ修正。

ActionCable client ensures subscribe command is confirmed. by spinosa · Pull Request #41581 · rails/rails のRails 6.1.4へのバックポートです (ブログ記事を書くようになってから初めてです。正直、ワクワクしています)。

具体的には ActionCable: Sporadically not receiving confirmation for (re)subscription to same channel · Issue #38668 · rails/rails のバグ修正になります。リリースするほどのものではないため、 6.1.5 はまだリリースされないでしょうね。

Pull requests · rails/rails 2021-10-23

日本語の解説: なし

Fix nill typo in the Upgrade Guide for Rails 7. by connorshea · Pull Request #43514 · rails/rails

OK: doc

Typo: subject-verb agreement in guide by kwiliarty · Pull Request #43513 · rails/rails

OK: doc

Pull requests · rails/rails 2021-10-24

日本語の解説: rails commit log流し読み(2021/10/24) - なるようになるブログ

なし

Google広告


今回のおまけ

永久保存版!?伊藤さん式・Railsアプリのアップグレード手順 - Qiita 経由で RailsDiff を知りました。Rails の各バージョンで rails new した内容を比較できるサイトです。

例えば、 https://railsdiff.org/6.0.4.1/6.1.4.1 のように 6.0系の最新と 6.1系の最新のものを比較してバージョンアップの際の問題点を予想することができます。

rails-diff の実装言語は TypeScript、フレームワークは Ember を使っています。どうやって rails newのdiffを生成しているか気になったので調べました。
なんと レポジトリ にはデータが一切ありません。

実は、別のレポジトリ railsdiff/rails-new-output に各バージョンの rails new の結果があります。各バージョンにタグがついていて、 https://github.com/railsdiff/rails-new-output/compare/v7.0.0.alpha1...v7.0.0.alpha2 の結果と同じものを GitHub の API 経由でとってきて整形して表示しているだけでした。

やりますね。GitHub の機能をうまく使っています。

タグ: ,

カテゴリー:

更新日時: