こんにちは クラウド経費開発チーム ・ クラウド債務支払開発チーム の 宮村(みやむー) @miyamura.koyo です。
今回は 初めての OSS 貢献で ActiveHash に PR を出してみたことを書いてみます。
Ruby3 対応の最中
こちらの記事でも執筆した Ruby3 対応中、依存する gem の更新が必要な場面がありました。
基本的には Ruby3 の記法に対応したリリースがされているので、それを取り込めば OK なのですが、ActiveHash に関してはそれだけではエラーが出てしまいました。
な!なんだって〜!
細かく調べてみると、どうも ActiveHash::Associations::ActiveRecordExtensions#belongs_to
で ActiveRecord 側の belongs_to をオーバーライドする際に、元の引数の options
に破壊的変更を加えてから super
しているのが原因でした。
def belongs_to(name, scope = nil, **options) options = {:class_name => name.to_s.camelize }.merge(options) # ここで破壊的変更をしてしまう! klass = begin options[:class_name].constantize rescue nil rescue LoadError nil end if klass && klass < ActiveHash::Base belongs_to_active_hash(name, options) else super(name, **options) # 破壊的変更をした options を受け渡してしまっている end end
今回対応したアプリケーションでは、その破壊的に変更された options
の値を使用していたため、挙動が変わったことでエラーになっていました。
一旦はモンキーパッチを当てることで対処しましたが、さすがに永久的にモンキーパッチしたくないのと、あまりにニッチなバグなので誰かが直してくれることは期待できないと思い、これは OSS コントリビュートせねば!ということでチャレンジしてみました!
Fukuoka Engineer Cafe 主催の OSS halfway 参加
とはいえ、今まで OSS コントリビュートをしたことがなく、しかも ActiveHash という著名な gem にコントリビューションするということで、どうやったらいいのか悩んでいました。
そんな時に福岡にあるEngineer Cafeという福岡市運営のエンジニアコミュニティスペースにて、 OSS halfway という「OSS に気軽にコントリビュートしてみよう」という趣旨のイベントが開催されることを発見しました。
しかもあの @udzura さんのサポート付きという豪華なイベント!これは参加するっきゃない!ということで参加してみました。
イベントでは普段からOSS活動をされている方からアドバイスをいただき、OSSにPRを出す際の流れなどを学ぶことができました。
当日の参加の様子はこちらです! engineercafe.jp
福岡で気軽にオフラインでエンジニアについての相談ができる場所があるのは便利ですね。 オフィスからも非常に近いので助かっています。
PR作成!そして英語でのやりとり
上記のイベントに参加しつつ、社内のエンジニアにアドバイスいただいて作成したPRがこちらです!
社内で OSS コントリビュートの相談ができる環境素晴らしいですね。
日本語で説明しても難しいバグを英語で書くのは大変でしたが、英語化していくのが大事!ということで頑張って書いてみました。
メンテナの方も多忙のようで数ヶ月やりとりしてましたが、粘り強く何度かやりとりして、最後にはメンテナにお礼をいただける結果になり、無事マージされました!
そしてリリース
そして私の PR は先日リリースされた v3.2.0 にて無事リリースされました!
リリースされた取り込み
ということでクラウド経費・債務支払でも取り込みを行なって、無事モンキーパッチを削除することができました!
なお、リリースされた ActiveHash を取り込んだ際に、下記の PR にて pluck メソッドの互換性が崩れている箇所があったので、同じバグを踏む人が出ないように共有です。
今まではメソッド定義されていれば呼び出せていたところ、クラスの属性であるかもチェックするようになっているので、 pluck メソッドでうっかりメソッド呼び出ししているところは nil が返るようになっているので気を付けましょう。
もう少し詳しく説明すると v3.1.1 では & 記法で proc オブジェクトをコールしています。つまりメソッドであれば呼べてしまっています。
all.map(&column_name.to_sym)
v3.2.0 では ActiveHash が定義している []
でアクセスしているため、メソッド名を入れても nil が返ってしまいます。
all.map { |record| record[column_name] }
map を使うようにすればメソッドが呼び出せるので、もしそのような記述がある場合は map に書き換えてみてください。
まとめ
初めてでしたが、ライブラリのバグを見つけて OSS に PR を出し、それをプロダクトに取り込むという理想的な体験ができ、エンジニアとして良い動きができたと自信になりました!
いつか OSS に PR 出したいなーと思っていたので、業務を通じてこのような体験ができて嬉しかったです。
今回で流れもわかったので、今後も機会があれば OSS コントリビュートしていこうと思います!
マネーフォワード福岡拠点では、エンジニアを募集しています!
OSS に PR 出したいエンジニアはぜひ応募してみてください!
福岡開発拠点のサイトもあるのでぜひみてください!