annotaterb commit log(20260704)
annotaterb commit log (20260510) | odentakashi からの差分コミットログを読みました。
nested_position オプション利用時に発生していたバグの修正です
nested_position では、ネストされたクラスの上にannotationを付与しますが、ネストクラス内に対象ネストクラス以外のエラークラスなどが定義されていた場合に、その上にannotationが付与されてしまっていました。
なので、対象クラスであることを確認した上でannotationを付与するように修正しています。
class 定義の上にコメント等を付与していた場合にannotationを付与しようとすると、下記のようにcommentが上に行ってしまいます。
なので、class の上にcommentを残せるように各positionオプションにbefore_docを渡せるようにしています。
# comment
# annotation
class Hoge
end
ファイル名からclass名を取得する処理内において定義されていない変数を利用していたため、修正しています。
既存のアノテーションがあるファイルに、再度アノテーションを付与するときのロジックにバグがあり、それを修正しました。
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
← ファイル末尾の空行
末尾に空行があると、ファイル末尾の空行 が「アノテーション直前の空行」と誤判定されます。 その結果:
- annotation_start が -1 になる
- 既存アノテーションの削除範囲(annotations_with_whitespace)が空文字になる
- sub(“”, “”) となり、古いアノテーションが削除されない
- 新しいアノテーションが追加され、実行のたびに重複 する
アノテーション開始位置が 0(ファイル先頭)のときは、annotation_start - 1 を参照しないよう annotation_start > 0 のガードを追加しました。 これにより、ファイル末尾の空行をアノテーション直前の空行と誤認しなくなります。