Home Blog 初めてOSS開発(IPython)にコミットした話 ②
初めてoss開発(ipython)にコミットした話 ②
Cancel

初めてOSS開発(IPython)にコミットした話 ②

この記事は、 初めて OSS 開発(IPython)にコミットした話(その1) の続きです。

いざやってみる

とりあえず CONTRIBUTING.md を読む

規模の大きいプロジェクトにはよくあるファイルで、開発に参加する際のルールが全て記載されています。 PR についての決まりは「master ブランチに対して出してね」くらいでした。 ここには記載されていませんでしたが、他の開発者はみんなリポジトリをフォークしてから PR を出していたのでそれに習いました。

実装する

編集したクラスはこの機能です。

This documentation covers IPython versions 6.0 and higher. Beginning with version 6.0, IPython stopped supporting compatibility with Python versions lower than 3.3 including all versions of Python 2.7.

まあ、方針は定まっていたので実装自体は秒で終わりました。 実装する際は以下のような点を意識しました。

  • IPython は Python3.6 をサポートしているので、:=などの新しい文法を使わない。
  • 破壊的変更をしない。
    • 引数を追加するときはデフォルト値(ex: hoge=None)を持たせて、引数が渡されなくても動作するようにする。
    • flag=Falseのように新機能はデフォルトではオフにする。

レビューを受ける

恥ずかしいですけど百聞は一見に如かずということで、今回の PR のリンクを共有しておきます。

Added a new argument to autoplay YouTubeVideo in Chrome without muting it. The official Chrome Developers blog on this topic is here: https://developer.chrome.com/blog/autoplay/

簡単な機能追加だからポチッと承認されて終了かなと思ったけどそんなことはなく、 以下のようなコメントを頂きました。

  1. darkerを使ってフォーマットしてください。
  2. 変数名をextraからextrasに変更してください。
  3. ドキュメント自動生成時にエラーが起きているので調査する必要があります。
  4. 新機能の説明を.rst形式のファイルで書いてください。

1. darkerを使ってフォーマットしてください。

darker というフォーマッタをインストールしてコマンドを実行するだけで終了しました。 一応、コーディング規約には準拠していたのですが、独自の少し細かいルールがあるみたいです。

2. 変数名をextraからextrasに変更してください。

最初、extrasextraと読み間違えて「どういうことだ?」と思って反論(?)してしまったのですが、 「複数の要素を受け付ける変数名は複数形であるべきだ」という意図のレビューだったそうです。 これには同意なのでレビューに従って修正しました。

3. ドキュメント自動生成時にエラーが起きているので調査する必要があります。

これの解決の方が機能追加よりもむしろ良い貢献だったかもしれません。どうやら同じエラーが複数の PR でも起きていたようで原因調査中だったらしいです。 このエラーは、GitHub Actions1 の実行中に起きていたので、 その設定ファイル(.github/workflows/docs.yml)を見て、 自分の PC で同じコマンドを実行してみました。

すると、intersphinx という機能を使って IPython のドキュメントから ipyparallel という 別のライブラリのドキュメントを張っている箇所でエラーが起きていました。 その原因は単純で、ipyparallel がインベントリと呼ばれる URL の設定を変更したので、IPython もそれに追従する必要があったということです。

インベントリは sphinx がインストールされていれば、intersphinx の公式ドキュメントより

1
$  python -msphinx.ext.intersphinx https://ipyparallel.readthedocs.io/en/stable/objects.inv > ipykernel

を実行すれば入手できます。(出力が膨大なのでファイルに出力した。)

無効になったリンクを修正したらエラーは解決したのでプッシュをしたら、 「Thank you very much」「Big thanks」というコメントを頂きテンションが上りました。 そして、「この修正部分だけ先に master ブランチに反映させよう」ということになりました。

実はこのときの修正箇所はたった 3 ヶ所だったのですが、それだけを 1 つのコミットとしていました。 そのおかげでコミットを cherry-pick するだけで簡単にバグ修正単体の PR が作成できました。 粒度が細かすぎるのもどうなんだろうと思いましたが今回は成功だったようです。

4. 新機能の説明を.rst形式のファイルで書いてください。

要は、英作文してくださいってことですね。とりあえず書きました → approve されて merge されました → そしたら、後で作成された PR で 9 割くらい書き直されてました。(笑) メンションされていなかったのでコレを見つけたのは偶然でした。

そして完成したのがこちらになります。

This documentation covers IPython versions 6.0 and higher. Beginning with version 6.0, IPython stopped supporting compatibility with Python versions lower than 3.3 including all versions of Python 2.7.

多分、英作文スキルが駄目だったのではなく、単に僕の文章に面白みがなかったことが原因だったみたいです。 今回実装した機能が自分が欲しいものだったので自己中っぽさが出ないように、 スポットは副産物的な部分に当てて YouTubeVideo はそのついでみたいに書いたのですが、 修正された文章だと YouTubeVideo が結構クローズアップされていました。 また、サンプルコードは内部の挙動の説明用ではなく実用的なものに置き換わっていて、より魅力的になっていました。

これだから自己 PR が苦手なわけだ。(プルリクではない。)

感想

英語には生まれたころから苦手意識があったので不安でしたが、なんとか会話のキャッチボールは成り立ったようで良かったです。最初は緊張してましたが途中からは楽しくなってました。また、

1
pip install ipython

をして自分が追加した機能が実行されるのは不思議な感覚でした。

機械学習系のライブラリを利用してる際によくソースコードを参照して定義を確認するのですが、 コードを見てるとそろそろ自分も実装できるレベルになっているのではないかと最近感じてきています。 今回、OSS 開発が意外と楽しいということを知ることができたので、日頃から共同開発者という気持ちで利用して アイデアが浮かび次第コントリビュートしたいと思いました。

  1. リモートリポジトリにプッシュしたり、PR を出したときにコマンドを自動で実行してくれるサービス。 個人のパブリック・リポジトリなら無料で、このブログでも使っている。