タイポフィックス！Rubyのオープンソースプロジェクトにお手軽に貢献する方法を考える

### タイポフィックスでいいからOSSに貢献したい・・・

先日Go言語で有名なmattnさんの

https://twitter.com/mattn_jp/status/1415128525175070722

というツイートを見て、なるほどなーと思ったので記事を書くことにした。

とにかくオープンソースになにか貢献したいと考えている場合は、タイポフィックスのプルリクエストは簡単でとてもいい。しかも、多くの場合タイポフィックスのプルリクエストを嫌がる人はあんまりいない。プロジェクトのオーナーから見ると、タイポフィックスのプルリクエストはさくっとレビューして `Thanks!` とコメントしてマージするだけで自分のプロジェクトのコントリビュータを1人増やせるので、基本的には喜ばれることが多いと思う。

この記事では、いわゆるスペルミスのようなタイポではなくて、打ち損じによってコードの挙動が少しおかしくなっているような、広義でのタイポを発見してプルリクエストを作る方法を考える。

## Rubocopで明らかに怪しそうなコードを探す

お手軽にプルリクエストを作成することを考えた時に、Rubocopはとても便利だ。

https://github.com/rubocop/rubocop

ただ、気をつけなければならないのは、Rubyでは、スタイルや記法の自由さがある程度文化として許容されており、自分好みのスタイルに修正するタイプのプルリクエストは、例え客観的に可読性が上がっているように感じられても、嫌がられる場合があるというところだ。管理人はそれぞれ理由があって自分のスタイルを貫いてることが多く、そうでなくても特に理由のないスタイルフィックスのプルリクエストは、独善的だと思われかねないので、やめたほうがよいだろう。

そこで、Rubocopを使って明確に誤っている部分だけをチェックしたいとする。

## warning以上の警告だけ表示する

おすすめできる方法は、些末なメッセージを無視して、warning以上だけを表示してチェックしていく方法だと思う。

https://qiita.com/mh4gf/items/0f98e55e80fda9589309

```sh
rubocop --fail-level W --display-only-fail-level-offenses
```

このコマンドを使うことで、重要な警告を表示することができる。

## 警告を絞り込む

そのうえで、さらに、`--except` オプションを活用して警告を絞り込んでいく。このオプションは、表示したくないエラーを取り除くことができる。

たとえば、

```sh
rubocop --fail-level warning --display-only-fail-level-offenses \
 --except Lint/UnusedMethodArgument,Lint/UnusedBlockArgument,Lint/ScriptPermission,Lint/UnderscorePrefixedVariableName
```

のように、コンマを利用して連結していくことで表示するエラーメッセージを減らしていくことができる。逆に `--only` オプションを使えば特定の警告のみを表示することもできる。

## VSCode等を利用して実際のコードを目視でチェックしていく

ここから先は、実際に目視でコードをチェックする必要があると思う。たとえばVSCodeのターミナルを利用すれば、エラーメッセージ中のファイルパスを直接クリックして該当部位をチェックしていくことができる。他のツールであっても、Rubocopの結果から直接ファイルを参照する方法が何かあると思うのでそれを使って該当箇所を見ていけばいい。

このようにして、明らかにおかしい部分を探していくと、なにかよっぽど厳密に管理されているプロジェクト以外は、どこかしらタイポが見つかるのが普通だと思う。それらのタイポ修正をプルリクエストすれば、比較的に簡単にOSSに貢献できると思う。

## コメント行のタイポを探す

もう一つおすすめなのが、Yardドキュメントのタイポを探すというものである。Rubocopは有名なツールなので、Rubocopで発見されるような大きなエラーはプロジェクトの管理者の方針によっては、すでに十分にチェックされている可能性がある。そのようなOSSであっても、ドキュメントのタイポは意外と放置されていたりする。よくあるのがYardドキュメント中 `@param` が `@params` になっていたり、`@return` が `@retrun` になっているようなケースである。コードであれば実行時に発見されるところが、コメント行は実行されないので、発見されずそのまま放置されがちだ。そういったものを発見するためのツールとして

https://github.com/zverok/yard-junk

というYardドキュメントのチェックツールがある。

## タイポフィックスでもいいじゃない

実際のところプルリクエスト作成のためにタイポフィックスを探すという姿勢は微妙に不健全な気がする。でも、なんというか初心者としては「OSSに貢献できた！」という実感が強く得られるし、プロジェクトの管理人もタイポフィックスのプルリクエストが来るのは決して悪い気はしないので、基本的には誰も損をしないよい活動だと思う。PRを出すことで、gitの使い方とかいろいろと自分の勉強になる気がする。

## 実践してみた

この記事を書くにあたって、この方法が本当にワークするのか実験してみた。RubyのJupyter Notebook用のカーネルであるirubyプロジェクトをターゲットにする。

https://github.com/sciruby/iruby

実際に上記の手順でrubocopコマンドを実行してみた。すると、次のようなエラーが表示された。

```rubocop
lib/iruby/session/mixin.rb:26:13: W: [Correctable] Lint/InterpolationCheck: Interpolation in single quoted string detected. Use double quoted strings if you need interpolation.
      raise 'malformed message, must have at least #{minlen} elements' unless msg_list.length >= minlen
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

これは、本来はダブルクオテーションでないといけないところが、シングルクオテーションになっており、`#{minlen}` の部分が式展開されませんよという警告である。下のようにコードの部分を書き起こしてみると一目瞭然で、

```ruby
 raise 'malformed message, must have at least #{minlen} elements' unless msg_list.length >= minlen
```

これは明らかなタイポであって次のように修正するべきである。

```ruby
 raise "malformed message, must have at least #{minlen} elements" unless msg_list.length >= minlen
```

これはスタイルの問題ではなく実際に挙動に問題が起きうる例なので、プルリクエストを出してもいい。コミットメッセージはシンプルに `Fix a typo` としておく。実際にプルリクエストを作成した。

https://github.com/SciRuby/iruby/pull/306

実はIRubyはコミット権を頂いているので（なんだ、プロジェクトの宣伝かよ、という声が聞こえてきそうですが…）、テストが通ったのをみてそのまま自分でマージした。しかし、この手のタイポフィックスは全くの部外者がプルリクエストしても、比較的すぐに審査されて適用されるタイプのものだと思う。このように、上記の方法を使うことで実際にタイポを発見し、OSSに対してタイポフィックスのプルリクエストを作成し、マージされることを示した。

どうすればOSSに貢献できるかわからない場合には、こういう方法もあるよという話でした。
Ruby言語で説明しましたが、どの言語でも必ず似たようなツールがあるはずで、おそらく全く同じ方法でタイポフィックスのプルリクエストが作成できるはずである。

この記事は以上です。