annotaterb v4.22.0 commit log 流し読み

annotaterb v4.22.0 commit logを流しで読みました 👀
読んだコミットは下記です。

Run CI on CRuby 4.0 #308

CI にて実行されているマトリクスに Ruby 4.0 を追加しています。
Ruby 4.0 から benchmark, ostruct が bundled gem に変わったため Gemfile に明示されるようになりました。

refs: Run CI on CRuby 4.0#308

Use #lease_connection if available#292

connection が利用されている箇所を lease_connection を利用するように修正されています。

refs: Use #lease_connection if available

fix NoMethodError when using nested_position with fixture files#298

nested-position オプションを利用した際に NoMethodError が発生していました。原因は、YAML ファイル専用のカスタムパーサーに対して存在しないメソッドを呼び出していたことによるものです。

このコミットでは、該当箇所に適切なガード処理を追加し、メソッド呼び出しが行われないよう修正しています。

refs: fix NoMethodError when using nested_position with fixture files

Honor skip_on_db_migrate config option when runnig migrate tasks#274

skip_on_db_migrate オプションを指定していても、migration 実行時に annotation 処理がスキップされない状態になっていました。

このコミットでは、当該オプションが有効な場合に migration 実行時の annotation を実行しないよう制御を追加し、オプションの挙動が正しく反映されるよう修正しています。

refs: Honor skip_on_db_migrate config option when runnig migrate tasks

fix: Respect configured sort#295

classified_sortsort オプションを利用している場合でも、既存の annotation にその設定が正しく反映されないことがある不具合の修正です。

従来の実装では、既存の annotation と新しく生成した annotation を比較する際に、どちらも sort してから差分を計算していました。そのため、実際には並び順がオプション通りになっていなくても、比較時にソートされてしまうことで「差分なし」と判定され、annotation が更新されない状態になっていました。

def generate
  # Ignore the Schema version line because it changes with each migration
  current_annotations = @file_content.match(HEADER_PATTERN).to_s
  new_annotations = @annotation_block.match(HEADER_PATTERN).to_s

  current_annotation_columns = if current_annotations.present?
    current_annotations.scan(COLUMN_PATTERN).sort
  else
    []
  end

  new_annotation_columns = if new_annotations.present?
    new_annotations.scan(COLUMN_PATTERN).sort
  else
    []
  end

  _result = AnnotationDiff.new(current_annotation_columns, new_annotation_columns)
end

今回の修正では、この sort を削除し、並び順も含めて差分を判定するように変更しています。これにより、classified_sortsort オプションを使用しているにもかかわらず既存の annotation が設定通りでない場合、正しく差分が検出され、annotation が上書きされるようになりました。

def generate
  # Ignore the Schema version line because it changes with each migration
  current_annotations = @file_content.match(HEADER_PATTERN).to_s
  new_annotations = @annotation_block.match(HEADER_PATTERN).to_s

  current_annotation_columns = if current_annotations.present?
    current_annotations.scan(COLUMN_PATTERN)
  else
    []
  end

  new_annotation_columns = if new_annotations.present?
    new_annotations.scan(COLUMN_PATTERN)
  else
    []
  end

  _result = AnnotationDiff.new(current_annotation_columns, new_annotation_columns)
end

refs: fix: Respect configured sort

refactor: simplify primary key check logic (no functional changes)#285

特定カラムが FK かどうか判別するメソッドのリファクタリングを行っています。複雑な条件をシンプルになるように修正しています。

refs: refactor: simplify primary key check logic (no functional changes)