did_you_mean(1.2.0)のコードリーディングをしました。

まずlib/did_you_mean.rbでNameErrorとKeyErrorにDidYouMean::Correctableをprependします

DidYouMean::Correctableは以下のように定義されています。to_sメソッドを定義しており、PlainFormatter.message_forでエラーメッセージを追加しています。引数のcorrectionsはNameErrorの場合はNameErrorCheckers#correctionsになります。

NameErrorCheckers#newはメッセージの内容でクラス名(定数)の誤りなのか変数名、メソッド名の誤りなのかを判別しClassNameCheckerやVariableNameCheckerのクラスをインスタンス化します。

VariableNameCheckerはコンストラクタでインスタンス変数名、クラス変数名、メソッド名を取得し、#correctionsではそれらを引数にSpellChecker#correctを呼び出します。

SpellChecker#correctはdid_you_meanのメイン処理で、誤った文字列とインスタンス変数などの各変数との類似度を計算し、閾値以上の類似度の文字列を取り出します。

類似度はジャロウィンクラー距離とレーベンシュタイン距離を使って計測、フィルタリングしています。

PlainFormatter.message_forは類似しているクラス名、定数名、変数名、メソッド名の配列を引数に文字列を生成しています。