はじめに
OSSコントリビュートに挑戦してみた備忘録です。
挑戦した理由
筆者は2月からエンジニアとして働く予定でして、
- なにかコードを書いてプルリクして面識のあまりない誰かにマージされる、というサイクルを経験したい
- コントリビューターという響きに単純に憧れがある
の2つの理由から、なにかコードを書く形でOSSコントリビュートに挑戦しよう!と考えました。
筆者の技術レベル
OSSコントリビューターになりたい、とぬかしているものの、筆者の技術力は、昨年からプログラミングに興味を持ち、Rubyを少し学んで2月からなんとかエンジニアとしてお金を貰えるようになった程度です。
議論されているissueは自分の力量を遥かに超えるものが大多数である、と考えたほうがいいでしょう。
自分にあった難易度のissueを探す
あまりに歯がたたないものは難しいし、「当てずっぽうでプルリクして見てもらえばいいや」というのは無責任だな、と考えたため
ある程度基礎的なことがわかるRubyで貢献でき、自分で概要を把握できるissueを探すことにしました。
今回はGithub上のissueを言語別についているラベルによってフィルターしてくれるサービス
Github Help Wantedを使用しました。
Good first issue, help wanted, easyといったラベルがはられているisuueを中心にみていくと良いと思います。
first-timers-onlyなんていう今までコントリビュートしたことがない方向けのラベルなんかもあります。issueにやり方が丁寧に書いてあり、後はやるだけ、というissueが多いです。「ようこそOSSへ!」といった文が添えられているものも多く、エンジニアコミュニティの懐の深さを感じました。
Issueをみつけたら
今回見つけたレポジトリはこちら
GitHub - jbodah/spy_rb: Transparent Test Spies for Ruby
JSのテストなんかでよく使われているようなのですが、テストスパイというもので、テスト対象の出力(呼び出し回数等)を記録して値を出して検証できるというもののようです。とりあえず何をやっているものなのか、概要だけはREADMEを読んで把握しました。
そしてこちらが今回の対象のissue
add Spy::Instance.called? · Issue #50 · jbodah/spy_rb · GitHub
Spy::Instanceにcalled?メソッドをつくる、というものです。
- スパイしてるメソッドを呼び出したかどうかはインスタンス変数@call_historyでわかる。
-
結果をbooleanで返すようにする。(※Rubyでbooleanはおかしいですね。trueかfalseを返す、です。)
ある程度手順の想定ができたので、これなら貢献できるかもと思いforkしてcloneしました。
以下が実際に書いたコードです。
require_relative 'test_helper'
class CalledTest < Minitest::Spec
describe 'Spy::Instance#called?' do
it 'works' do
obj = Object.new
spy = Spy.on(obj, :to_s)
assert_equal spy.called?, false
obj.to_s
assert_equal spy.called?, true
end
end
end
module Spy
class Instance
#....
def called?
@call_history.any?
end
#....
end
end
内容は簡単なもので、プロを目指す人のためのRuby入門
なんかを一通りやっている人なら誰でもかけるものだと思います。テストは他のテストの空気を読んで書いてみました。
いざプルリク!
Nice to meet youと拙い英語を添えてプルリクしてみました。あやしすぎますね。
この時は勢いで送信ボタンおしてました。
マージされる
半日くらい後、思っていたよりすんなりマージされました。
何よりうれしかったのは「Looks great, thanks!」の言葉です。
簡単なコードですが、自分が書いたコードで誰かに少しでも感謝されるって本当に嬉しいものなんですね。
どこの馬の骨なのかもわからないような者に対応して頂いたjbodah氏に感謝します。
OSSコントリビュートに挑戦してみるのは勉強になる そして楽しい
いろいろなOSSのissueを把握するためにローカルに開発環境を構築したりしていると、必然的に多くのコードを読むことになるので勉強になります。例えばModuleのmixinがどんなものなのか本で読んでわかったつもりになっていても、いざ実際のコードをみるとあまり理解できませんでした…。そういった時に本を再度開きながらコードを読んで…を繰り返して行くのはよい勉強になっていると思います。
現状はGood first issueやeasyとラベルがあるissueでも、解決できるコードをプルリクする、とまでは行かないんですけどね。
あまりにとんちんかんなプルリクあげられて迷惑な方はいらっしゃるとおもいますが、forkされて怒る人は(多分)いないと思うので積極的にやっていきたいです。
自分のコードが、住む国も話す言葉も違う方のコードの一部になるというのは本当に嬉しいですし、問題を解決できるコードを考えるのは楽しいです。
反省
(コードの反省なんですがrequire_relative -> requireでいいですし、テストは最後の改行を忘れています。マージされたものを追加で修正するのってどうなんだろう…)
追記
コードを少し訂正してプルリクを投げてみました。みなさんありがとうございます!
無事マージしていただきました。
require 'test_helper'
class CalledTest < Minitest::Spec
describe 'Spy::Instance#called?' do
it 'works' do
obj = Object.new
spy = Spy.on(obj, :to_s)
refute(spy.called?)
obj.to_s
assert(spy.called?)
end
end
end