Rubyのメソッド定義のdefの前でp selfすると特異ではないクラスなのでこのメソッドはインスタンスメソッドとして定義されてると思うんだけどあとで呼ばれてる時にはクラスをレシーバにしてsendされててクラスメソッドに化けてるんだけどどこでどうなってるんだろうぐぬぬ
まって。メソッドの定義を他のメソッドの実行中に定義してるw
びっくりして日本語がおかしくなったw
何をしてるかと書くとMastodonのmainのテストが1個だけruby-3.2.0-rc1で落ちるんだけど3.1.3では落ちないんだよね…。
Mastodonのmainを3.2.0対応にする:
$ patch -p1 <<_END
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
# frozen_string_literal: true
source 'https:// rubygems.org'
-ruby '>= 2.7.0', '< 3.1.0'
+ruby '>= 2.7.0', '< 3.3.0'
gem 'pkg-config', '~> 1.5'
gem 'rexml', '~> 3.2'
@@ -12,6 +12,8 @@ gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.2'
gem 'rack', '~> 2.2.4'
+gem 'mail', git: 'https:// github.com/Shopify/mail.git', branch: 'net-smtp-dependency'
+
gem 'hamlit-rails', '~> 0.2'
gem 'pg', '~> 1.4'
gem 'makara', '~> 0.5'
@@ -12,6 +12,8 @@ gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.2'
gem 'rack', '~> 2.2.4'
+gem 'mail', git: 'https:// github.com/Shopify/mail.git', branch: 'net-smtp-dependency'
+
gem 'hamlit-rails', '~> 0.2'
gem 'pg', '~> 1.4'
gem 'makara', '~> 0.5'
$ rbenv local 3.2.0-rc1; rm -f Gemfile.lock; bundle install
テストが落ちる
$ bundle exec rspec ./spec/controllers/api/v1/emails/confirmations_controller_spec.rb:41
:
ArgumentError:
wrong number of arguments (given 2, expected 1)
# ./app/mailers/user_mailer.rb:51:in `email_changed'
# ./app/models/user.rb:444:in `render_and_send_devise_message'
# ./app/models/user.rb:430:in `block in send_pending_devise_notifications'
:
https://bugs.ruby-lang.org/issues/18633
proc { |a, **kw| a } autosplats and treats empty kwargs specially
への修正
https://bugs.ruby-lang.org/projects/ruby-master/repository/git/revisions/fbaadd1cfe7fbfd1b904f193f99d7c845a6ed804
はv3_1_3には入っておらずv3_2_0_rc1には入ってる。これかな!?
この変更はブロックを呼んだ時だけ影響するはずなのにMastodonのコードだけ見てもブロックを呼んでなくっぽく見えるから別の何かかと思って呼ばれる側で
puts caller.join("\n")
したらちゃんと
/home/zunda/c/src/github.com/zunda/mastodon/vendor/bundle/ruby/3.2.0+3/gems/actionpack-6.1.7/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
なら何やらたっぷり呼んでたね