とんでもないことが起こりました。まじでやばいです。
前回の記事で共有したように「RailsのgithubにIssueとして気軽に立てて良いよ〜」という旨の返信をJean Boussierさんから頂いたので、RailsのIssueを作成してから3日ほど経過しました。
しばらく何も反応がなかったので「やっぱりダメかぁ...」と思っていたところ、事態が急変したのです。
対応のPRが作成・マージされた
なんとJean Boussierさん自ら対応のPRを作成してくれました。
元々はRailsの起動に影響がないように警告のログを出すという対応を希望していのですが、対応PRを見てみると警告のログを出すのではなく、それぞれ適切な型に変換する処理が追加されていました。
case pool_options when false, nil return false when true pool_options = DEFAULT_POOL_OPTIONS when Hash pool_options[:size] = Integer(pool_options[:size]) if pool_options.key?(:size) pool_options[:timeout] = Float(pool_options[:timeout]) if pool_options.key?(:timeout) pool_options = DEFAULT_POOL_OPTIONS.merge(pool_options) else raise TypeError, "Invalid :pool argument, expected Hash, got: #{pool_options.inspect}" end
to_i
は色々とよしなに数値に処理してくれる一方、予想しない結果を返すことがあります。
厳密な値を指定するために例外が発生するIntegerを使っているのでしょうか。
puts Integer("1").class # Integer puts Float("3.14").class # Float
この対応PRを見て気づいたのですが、Rails7.2系からオプションの指定の仕方が変わるんですね。
新旧どちらのオプション指定でも問題なく処理が実行されるように、コードが実装されていました。これは今回のPRではなく元から実装されているものですが、こういった対応がされているのはOSSならではですね。勉強になります。
if options.key?(:pool_timeout) ActiveSupport.deprecator.warn(<<~MSG) Using :pool_timeout is deprecated and will be removed in Rails 7.2. Use `pool: { timeout: #{options[:pool_timeout].inspect} }` instead. MSG pool_options[:timeout] = options.delete(:pool_timeout) end
そしてマージされました。Railsへコードをマージできる権限を持っているとは...。
やはりJean Boussierさん只者ではない。
その後
この対応がいつリリースされるのかは分かりませんが、Railsのリリース頻度を見る感じだと2ヶ月に1度は軽微なリリースをしているようです。 直近のリリースが2023/05/24だったので、今年の7月頃までにリリースされるかもしれません。
今回は自分がコードを書いて対応をした訳ではありませんが、問題提起した箇所がRailsに取り込まれたなんて考えると飲みの席でのネタが出来ました(飲みに行くとは言ってない)。
最後に
Jean Boussierさんの対応には感謝しかありません。
自分のような新参者がRails Discussionへ作成したトピックに返信をくれた上、コードの対応までして頂きました。Rails Discussionにトピックを作成したのはつい先週のことなので、Railsという巨大なサービスがこれだけの対応速度を持っていることには非常に驚きました。
今回はコードを自分で書いた訳ではないので、次は自分の力でPRまで出せるところまでチャレンジしたいです。