annotaterb commit log(20260704)

annotaterb commit log (20260510) | odentakashi からの差分コミットログを読みました。


Fix annotation placement above inner class declarations under `nested_position` by yamat47 · Pull Request #336 · drwl/annotaterb

nested_position オプション利用時に発生していたバグの修正です
nested_position では、ネストされたクラスの上にannotationを付与しますが、ネストクラス内に対象ネストクラス以外のエラークラスなどが定義されていた場合に、その上にannotationが付与されてしまっていました。

なので、対象クラスであることを確認した上でannotationを付与するように修正しています。


Add `position_in_class: after_doc` to keep class doc adjacent to class by yamat47 · Pull Request #337 · drwl/annotaterb

class 定義の上にコメント等を付与していた場合にannotationを付与しようとすると、下記のようにcommentが上に行ってしまいます。
なので、class の上にcommentを残せるように各positionオプションにbefore_docを渡せるようにしています。

# comment
# annotation
class Hoge
end

Fix NameError in ZeitwerkClassGetter for collapsed Zeitwerk paths by KaiyuanMa · Pull Request #339 · drwl/annotaterb

ファイル名からclass名を取得する処理内において定義されていない変数を利用していたため、修正しています。


Fix update_config for non-default config locations by OdenTakashi · Pull Request #341 · drwl/annotaterb

既存のアノテーションがあるファイルに、再度アノテーションを付与するときのロジックにバグがあり、それを修正しました。

force: true などでアノテーションを書き直す際、annotaterb は アノテーション前後の空行を保持 しようとします。 そのため、既存アノテーションの直前・直後に空行があるかを調べ、削除・再挿入の範囲に含めます。

例:

# frozen_string_literal: true
                     アノテーション直前の空行
# == Schema Information
# ...
#                     ← アノテーション直後の空行
class User < ApplicationRecord

この判定では「アノテーション開始行の1つ上(annotation_start - 1)が空行か?」を見ています。

アノテーションが ファイル先頭 にある場合、annotation_start は 0 です。 このとき annotation_start - 1 は -1 になり、Ruby では 配列の最後の行 を指します。

# == Schema Information
# ...
#
class User < ApplicationRecord
end
                     ファイル末尾の空行

末尾に空行があると、ファイル末尾の空行 が「アノテーション直前の空行」と誤判定されます。 その結果:

  1. annotation_start が -1 になる
  2. 既存アノテーションの削除範囲(annotations_with_whitespace)が空文字になる
  3. sub(“”, “”) となり、古いアノテーションが削除されない
  4. 新しいアノテーションが追加され、実行のたびに重複 する

アノテーション開始位置が 0(ファイル先頭)のときは、annotation_start - 1 を参照しないよう annotation_start > 0 のガードを追加しました。 これにより、ファイル末尾の空行をアノテーション直前の空行と誤認しなくなります。