はじめに
Ruby 3.0 Advent Calendar 2020 2日目の記事になります。
昨日は、【Ruby 3.0 Advent Calendar 2020】Ruby に右代入がやってくる【1日目】です。
secret-garden.hatenablog.com
右代入、このまま何事もなく入るといいなぁ……
この記事では、僕が投げたPull Requestで何をやっているかを書いています。
テスト修正関係
基本的には`make test-all`を複数回動かす際のテスト修正になっています。
これはdid_you_mean
のテストでBook::Cover
が二回目のテストで定義済みのため落ちていたのを修正しています。
当初はBook.send(:remove_const, :Cover)
するだけで対応できそうかと思ったんですが、別の個所でCoverage
が期待される挙動となってしまったので、Book::Spine
へとリネームしています。
そのうえで既に定数として定義済みであればそれを削除するようにしています。
これは二回目以降のテスト時にAWESOME
が既に定義済みである警告を無くす対応です。
先ほど同様remove_const
で削除しています。
こちらも同様に二回目以降のテストで警告が出ていたので、定義済みの定数MyBookStruct
をremove_const
で削除しています。
で、先ほどの修正で漏れていた箇所(シンボルで渡していなかったの)を修正したものです
複数回テストを回す際にdid_you_mean
で使用するフォーマッタの初期化がされていなかったため意図しない挙動になっていたのを修正しています。
setup
でDidYouMean.formatter = DidYouMean::VerboseFormatter.new
しているだけの対応ですが、原因が上手くつかめず苦労した覚えがありますね……
二回目以降のテストでwebrick
のserver[:DocumentRootOptions][:NondisclosureName]
が初期化されていないため失敗していたのを修正しています。
具体的にはserver[:DocumentRootOptions][:NondisclosureName] = []
のように初期化しています。
make test-all TESTS="--repeat-count="50""
のように実行すると時々テストが落ちるという問題に対応したものです。
原因としてはReadline.special_prefixes
などの区切り文字の設定周りが初期化されていないことでテストが落ちていました。
そこでteardown
にそのあたりを初期化するように修正しています。
CI修正関係
RubyではWindows用のCIとしてAppVeyorを使っているんですが、これが時々なぜか落ちるという現象がありました。
調べてみたところshallow_clone: true
と設定している場合でうまくソースコードをcloneできないということがあるとわかりました。
そこで、cloneする深さをclone_depth: 10
のように設定して落ちないようにしています。
正直落ちるかどうか不安でたまらなかった覚えがあります……。
で、治ったみたいだったんですが、PR時のCIチェックが別のエラーを出してきたので直したのがこれです。
原因としてはソースコードをcloneしてくるときにGitのユーザーなどが設定されていないのでエラーになっていました。
で、とりあえず初期設定でユーザーなどを設定したんですが、あまりいい直し方ではなかった感じですね……。
ドキュメント関係
最近のRubyではRubyでRuby自身(と一部のCコード)で組み込みメソッドを書くと高速化するケースがあります。
そういったケースでRuby内部のRubyのソースコード上にドキュメント用のコメントが記載されてます。
それらのコメントは.document
に追記することでビルド時によしなにドキュメント生成を行ってくれます。
で、array.rb
が無かったのでそれを追加しているPRですね。
これはHash#delete
のドキュメントで矢印になっていないのを修正したものですね。
これはドキュメント内のリンクがOracleのドキュメントにリダイレクトされたのでわかった修正ですね。
リダイレクト先のURLに変更しています。
これはrb_class_real
の挙動についてのドキュメントでtypoしてそうと思って投げたPRですね。
実際にはドキュメントが違ってた模様(typoではなかった)
またこの一件でコードの修正とかもされてます(詳しくは下記を参照)
ruby-trunk-changes.hatenablog.com
これはアクセス先のURLがhttps
に変更されていたので修正しています。
性能向上関係
ko1さんがRubyKaigi2019で発表されていた「RubyでRubyを実装して高速化する」件をPRにしたものですね。
今回はKernel#clone
でそれを行っています。
こちらはKernel#Float
のバージョンですね。
コードの修正関係
これはrb_str_clear
が宣言されているが使われていないのでそれを削除しています。
多分、以前は使うこともあって残っていたんだろうなぁというコードですね。
これはstaticを付けてもよさそうな関数だったので付けた方がいいのではと投げたPRですね。
これも同様にstaticを付けてます。
hash.c
内でいくつかの関数にstaticを付けています。
こちらも同様にstaticを付けています。
こちらはrb_int_ceil
とrb_int_floor
にstaticを付けています。
int_even_p
とrb_int_odd_p
で現在では使われてなさそうな処理を削除しています。
flo_prev
とflo_next
の処理がほとんど同じだったのでまとめています。
バグ修正関係
Time#strftime
の引数にTimezoneを渡した時に表示される出力結果がおかしいのを修正しています。
直近で似たような修正をnobuさんがされていたのでそれを参考に修正したやつですね。
Time#to_a
でも同じようにTimezoneを渡した時の出力がおかしいのを修正しています。
雑感
そこそこ色々と投げれているなぁと感慨深くなりました。
自分が投げたパッチが取り込まれてるRuby3.0がリリースされるのが楽しみですね