バグ #1308
完了Kernel#warnをシグネチャの合わないメソッドで上書きしている
説明
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/warn.html のようにKernel#warn
が組み込みライブラリで定義されていますが、 core/utils.rb でグローバルなwarn
メソッドを別途定義しているため、こちらが呼ばれてしまいます。
しかし core/utils.rb の方ではキーワード引数 uplevel
が無いため、標準ライブラリ内でuplevel
付きのwarn
呼び出しがあると、エラーとなります(通常は無視されるようですが、RUBYOPT=-Wではクラッシュします)。
さしあたり、
def warn(msg, uplevel: nil)
のようにしておけばクラッシュはしませんでした。
再現手順
環境変数RUBYOPT=-W 付きでmikutterを起動するとクラッシュします。
{MIKUTTER_ROOT}/core/utils.rb:114:in `warn': wrong number of arguments (given 2, expected 1) (ArgumentError)
from ~/.rbenv/versions/2.5.3/lib/ruby/2.5.0/uri/common.rb:339:in `regexp'
from {MIKUTTER_ROOT}/core/lib/diva_hacks/entity/url_entity.rb:14:in `<module:Entity>'
toshi_a 初音 さんがほぼ6年前に更新
- ステータス を 分類待ち から 実装待ち に変更
- 担当者 を toshi_a 初音 にセット
Ruby 2.5.0から =uplevel:= 名前付き引数が追加されたようですね。
https://docs.ruby-lang.org/ja/2.5.0/method/Kernel/m/warn.html
warnをオーバライドしているのは知らずにやってしまったことが発端で、現在はloggerの改善と一緒にwarnのモンキーパッチをやめようと考えています。
なので、ruby 2.5でuplevelが渡された時は通常のwarnの振る舞いをしようかと思います。
toshi_a 初音 さんがほぼ6年前に更新
- ステータス を 実装待ち から レビュー待ち に変更
- 担当者 を toshi_a 初音 から cob odo に変更
- 対象バージョン を 3.8 にセット
- ブランチ を topic/1308-strict-warn にセット
こんなのでどうでしょうか