やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

RailsにIssueを立てたらPRが作成されてマージされた

とんでもないことが起こりました。まじでやばいです。
前回の記事で共有したように「RailsのgithubにIssueとして気軽に立てて良いよ〜」という旨の返信をJean Boussierさんから頂いたので、RailsのIssueを作成してから3日ほど経過しました。

www.okb-shelf.work

しばらく何も反応がなかったので「やっぱりダメかぁ...」と思っていたところ、事態が急変したのです。

対応のPRが作成・マージされた

なんとJean Boussierさん自ら対応のPRを作成してくれました。

github.com

元々は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月頃までにリリースされるかもしれません。

rubyonrails.org

今回は自分がコードを書いて対応をした訳ではありませんが、問題提起した箇所がRailsに取り込まれたなんて考えると飲みの席でのネタが出来ました(飲みに行くとは言ってない)。

最後に

Jean Boussierさんの対応には感謝しかありません。
自分のような新参者がRails Discussionへ作成したトピックに返信をくれた上、コードの対応までして頂きました。Rails Discussionにトピックを作成したのはつい先週のことなので、Railsという巨大なサービスがこれだけの対応速度を持っていることには非常に驚きました。

今回はコードを自分で書いた訳ではないので、次は自分の力でPRまで出せるところまでチャレンジしたいです。