コンテンツにスキップ

rigor-statesman

transition_to(:state)呼び出しを、同一ファイル内のstate_machine do … endブロックで宣言された状態に照らして検証します。宣言されていない状態への遷移はフラグが立てられます(誤り候補の提示付き)。ソースのみを読み取り、Statesmanのランタイム依存はありません。(DSLのメソッド名は設定可能なので、AASM形式の状態機械にも適合します。)

rigortypeにバンドルされて配布されます。plugins:の下で有効化します。

plugins:
- rigor-statesman
class Order
state_machine do
state :draft, initial: true
state :submitted
state :approved
end
end
order.transition_to(:submitted) # info: 既知の状態
order.transition_to(:approval) # error: 未知の状態 :approval(:approved の誤りでは?)
order.transition_to(:purgatory) # error: 未知の状態 :purgatory
ルール重大度発火するとき
plugin.statesman.known-stateinfotransition_to(:sym)で、:symがファイル内のstate_machineブロックで宣言されている
plugin.statesman.unknown-stateerrortransition_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を特定の機械に結びつけることはしません。

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.