annotaterb v4.14.0コミット流し読み

annotaterb v4.14.0で入ったコミットを流し読みしました。
入ったコミットは下記

Opt-in for MFA requirement #166

gem にMFA(Multi-Factor Authentication)を導入することでより secure にしてくれる設定を追加している。 この設定を追加していると、新しいversionをデプロイする際に認証されていない場合弾いてくれる。

refs:

Lock concurrent-ruby gem to fix CI #180

dummyapp(Rails7.0.x)のCIにて発生していたエラーの解消PRです。

activesupport-7.0.8.7/lib/active_support/logger_thread_safe_level.rb:12:in `<module:LoggerThreadSafeLevel>': uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

Rails7.0.8 では activesupport/lib/active_support/logger_thread_safe_level.rbにて loggerをrequireせずに実装していました。
coccurent-ruby 1.3.4ではrequire coccurentにより内部でloggerが読み込まれていたので、問題なかったのですが1.3.5に上がるタイミングでloggerの依存が削除されたため、上記エラーが発生していました。

なのでこのPRではcoccurent-rubyを1.3.4に固定して対応しています。本エラーはRails7.1より修正されています。

refs:

Fix translation foreign key exclusion bug #181

globalizegemを利用した際に発生するバグの修正です。
上記gemを使用した際に、ABCustomerというモデルの翻訳モデルとしてABCustomer::Translationが追加されます。
追加されたモデルにはオリジナルモデルの外部キーが追加されますが、それを下記ではannotateの対象から除外するため自前で外部キー名を生成しようとしていました。
ですが、下記のロジックでは ABCustomer -> abcutomer_idと変換されます。(翻訳モデルに紐づくテーブルに存在しているのはcustomer_id)
結果的に翻訳モデルから上記外部外部キー見つからず、キーが除外されないというバグが発生していました。

# lib/annotate_rb/model_annotator/model_wrapper.rb
...
      def ignored_translation_table_columns
        # Construct the foreign column name in the translations table
        # eg. Model: Car, foreign column name: car_id
        foreign_column_name = [
          @klass.translation_class.to_s
            .gsub("::Translation", "").gsub("::", "_")
            .downcase,
          "_id"
        ].join.to_sym

        [
          :id,
          :created_at,
          :updated_at,
          :locale,
          foreign_column_name
        ]
      end
    end

そのためこのPRでは自前実装で外部キー生成をせずに、ActiveSupport::Inflectorで定義されているforeign_keyメソッドを利用しています。(Stringに拡張されている。)

refs:

Add expected file to automatically require #185

lib/annotaterb.rbが存在しないため、app側では明示的にrequire annotate_rbを記述する必要があったため、lib/annotaterb.rbを追加したPRです。
bundlerはGemfileに書かれた名前からlib配下にあるgem_name.rbをrequireしてくれますが、今回はその対象がないためlib配下のファイルパスがLOAD_PATHに追加される時点で処理が終わっていました。
そのため、このPRではlib/annotaterb.rbを追加し、その中でrequire annotate_rbを行うように修正しています。

ref: Add expected file to automatically require #185

Chore: alert when multiple conmmands were selected #179

複数コマンドが指定された際にalertを出すPRです。

bundle exec annotaterb models --version
#=> ❯ Only one command can be run at a time

ref: Chore: alert when multiple conmmands were selected #179

Updated COLUMN_PATTERN to handle optional metadata (e.g., constraints or descriptions) enclosed in parentheses. #170

annotateを実行する際のdiff照合にて、カラムをscanする正規表現がメタデータに対応するように修正されたPRです。

ref: Updated COLUMN_PATTERN to handle optional metadata (e.g., constraints or descriptions) enclosed in parentheses. #170

Add support for virtual columns #163

カラムがvirtualカラムの場合、name_upcased :virtual(string)のように 型の前に virtualという文字が付与されるようになりました。

ref: Add support for virtual columns #163