今年作ったRubyのライブラリたち(mruby含む)を紹介します

はじめに

この記事はRubyアドベントカレンダー2021の4日目の記事です(が、公開は5日になってしまいました、遅刻してしまってすみません!)。昨日は@hasumikinによるPicoRubyあるいはRuby言語のコンパイラについてと、@Reichardtによる勝手に「点字メーカープログラム」を作ってみるでした。

今年作ったものたち

今年がファーストコミットなプロジェクトを時系列順に紹介します。

Inherint

github.com

Inherintは"Inheritance"と"Lint"の合成語で、クラス階層の深さが指定のレベルを超えるとブロックを実行できるgemです。

Lintと言いつつ静的解析ではないのですが、メタプロの練習的になかなか面白かったです。技術的な挑戦としては、初めて"Module Builder Pattern"を試してみたことが挙げられます。詳細は以下のスライドを参照してください。

speakerdeck.com

mruby-malba

github.com

mruby-malbaはmrubygems、mrubyのためのgemの一つです。malbaという名前は私が作っているAlbaというJSONリアライザにmrubyの"m"を足し合わせたものです。mrubyの範囲内でAlbaの機能を再現したものですが、実用というよりはmruby向けのgemを作ってみたいという気持ちから始まったプロジェクトです。

技術的な挑戦としては、mrubyを使うのが初めてだったのでそもそもmrubyのビルドの仕組みなどを学ぶのに苦労しました。今見るとコードが非常に古く今年いっぱいでAlbaに対して行った改善が全く反映されていないので、そろそろ書き直すべき時期かもしれません。

mruby-factory

github.com

mruby-factoryは平たく言うとfactory_botのmrubyポートです。といっても、フル機能の移植ではなく一部機能のみとなってはいますが、普段実用するものはなるべく実装するようにしたつもりです(factory_botは機能が多すぎる…)

今回はコードを短くすることを意識した結果、140行でかなりたくさんの機能を実装できました。これもかなり良い練習になりましたね。

TinyHooks

github.com

今年作り始めたもので一番がんばって作ったのはこのTinyHooksです。用途としては任意のクラスにincludeするとそのクラスのインスタンスメソッドと特異メソッドに対して、before, after, aroundの3種類のフックを定義できます。ActiveSupport::Callbacksと似た感じですが、フック対象のメソッドを編集する必要がないという利点があります。またかなり高速に動作し、特に「フックの準備はしたが実際には定義されていないとき」にActiveSupport::Callbacksで発生するオーバーヘッドを回避できる利点が大きいと思います。

Ruby 2.7からキーワード引数の扱いが変わった影響をモロに受けていて、コードが割と汚くなってしまっています。

mruby-callbacks

github.com

mruby-callbacksは前述のTinyHooksをmrubyでも実装できそうと思って試したらあまり実装できなかったやつです。mrubyの制約の多さに驚きました。

range-compacter

github.com

お仕事で作ったgemで、複数の範囲オブジェクトまたは範囲っぽいオブジェクトを受け取り、重複を排除して配列の配列として返します。日本語よりREADMEのコード例の方がわかりやすいかも…

振り返ってみて

今年は結構コードを書いているなあという印象ですが、来年はもっとたくさん書いていきたいですね。