rigor-statesman
transition_to(:state)呼び出しを、同一ファイル内のstate_machine do … endブロックで宣言された状態に照らして検証します。宣言されていない状態への遷移はフラグが立てられます(誤り候補の提示付き)。ソースのみを読み取り、Statesmanのランタイム依存はありません。(DSLのメソッド名は設定可能なので、AASM形式の状態機械にも適合します。)
rigortypeにバンドルされて配布されます。plugins:の下で有効化します。
plugins: - rigor-statesman何をチェックするか
Section titled “何をチェックするか”class Order state_machine do state :draft, initial: true state :submitted state :approved endend
order.transition_to(:submitted) # info: 既知の状態order.transition_to(:approval) # error: 未知の状態 :approval(:approved の誤りでは?)order.transition_to(:purgatory) # error: 未知の状態 :purgatory| ルール | 重大度 | 発火するとき |
|---|---|---|
plugin.statesman.known-state | info | transition_to(:sym)で、:symがファイル内のstate_machineブロックで宣言されている |
plugin.statesman.unknown-state | error | transition_to(:sym)で、:symが宣言されていない(Base.suggestによる誤り候補の提示付き) |
1つのファイル内に複数のstate_machineブロックがある場合、それらの状態は和集合になります。リテラルのシンボルでない引数や、状態機械を持たないファイルは、暗黙のうちに素通りされます。
plugins: - gem: rigor-statesman config: dsl_method: "state_machine" # デフォルト。ブロックを開くメソッド state_method: "state" # デフォルト。状態を宣言するメソッド transition_method: "transition_to" # デフォルト。検証する呼び出しこれらをリネームすると、プラグインを別の状態機械DSL(例: AASMのaasm do … state … end)に適合させられます。
- ファイルスコープ。
models/order.rbで宣言された状態は別のファイルからは見えません ── 各ファイルが独立して検証します。 - リテラルのシンボルのみ。変数やメソッド呼び出しの引数はチェックされません。
- レシーバーに依存しない。チェックは、ファイル内のいずれかの状態機械がそのシンボルを宣言している限り、任意のレシーバーに対して発火します。
transition_toを特定の機械に結びつけることはしません。
プラグインの内部
Section titled “プラグインの内部”rigor-statesmanは、2パス(収集してから検証する)パターンのリファレンス例です。node_file_contextパスが宣言済みの状態を一度収集し、node_ruleがエンジン所有のウォーク上で各transition_toを検証します。レイアウト、デモ、契約(contract)サーフェスはプラグインのREADMEにあります。プラグインの書き方については、examples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.