rigor-devise
devise :strategy, …宣言からDeviseがモデルにミックスインするメソッドについて、Rigorに教えます。これにより、それらのメソッドへのファイルをまたいだ呼び出し(user.valid_password?("pw")、user.send_reset_password_instructions)が、誤ったcall.undefined-methodをサーフェス(surface)させる代わりに解決され、しかも本来の戻り値の型で解決されます。ソースのみを読み取り、Deviseのランタイム依存はありません。
rigortypeにバンドルされて配布されます。plugins:の下で有効化します。
plugins: - rigor-devise何をするか — 診断なし、設定なし
Section titled “何をするか — 診断なし、設定なし”rigor-deviseはマクロ展開プラグイン(ADR-16のTier B)です。診断を発行せず、設定も持ちません。次のような宣言から、
class User < ApplicationRecord devise :database_authenticatable, :recoverableend名前で指定された各ストラテジーモジュールが提供するインスタンスメソッドを合成し、宣言したクラスに付与します。これにより、別ファイルでの呼び出しが型チェックを通ります。
user.valid_password?("pw") # booluser.send_reset_password_instructions # (モジュールのRBSの戻り値)戻り値の型は、広げられたDynamic[T]ではなく、ストラテジーモジュールが記述したRBSの戻り値(origin_module:の来歴を介する)です。11個のストラテジーが認識されます ── database_authenticatable、recoverable、rememberable、registerable、trackable、validatable、confirmable、lockable、timeoutable、omniauthable、authenticatable ── に加えて、常に含まれるDevise::Models::Authenticatableです。ActiveSupport::Concernのincluded do … endの中で宣言されたストラテジーは、そのconcernをincludeするクラスへと再ターゲットされます。
- インスタンスメソッドのみ。モジュールごとの
ClassMethods(例:User.reset_password_by_token)はまだ合成されません。 - コントローラーヘルパーは保留。
current_user/authenticate_user!/user_signed_in?は、モデルの宣言ではなくルーティングファイルのdevise_for :usersに由来する(Tier Cの作業)ため、まだ提供されません。 - サードパーティのストラテジーはスキャンされない。イニシャライザで
Devise.add_module :fooを介して登録されたストラテジーは、バンドルされたストラテジーテーブルにとって未知です。
プラグインの内部
Section titled “プラグインの内部”マクロマニフェスト(各ストラテジーをそのモジュールにマッピングするトレイトレジストリ)、concernの再ターゲットウォーク、デモ、そしてこのプラグインが行使する契約(contract)サーフェスは、プラグインのREADMEにあります。ハンドブック第9章はTier Bのマクロ基盤を全般的に扱います。プラグインの書き方については、examples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.