micro_state_machine

A small state machine! You don't need all that other crap. What's not included here is as important as what's included.

Features Included:

Features NOT included:

Usage Example

Rails Example:

include MicroStateMachine

# first state declared is automatically the default state for new objects
state :new
state :running, from: %w(new paused deferred)
state :paused, from: %w(running)
state :deferred, from: %w(new running paused deferred)
state :completed, from: %w(new running paused deferred)
state :closed, from: %w(new running paused deferred)

Ruby Object Example:

include MicroStateMachine

# first state declared is automatically the default state for new objects
state :new
state :running, from: %w(new paused deferred)
state :paused, from: %w(running)
state :deferred, from: %w(new running paused deferred)
state :completed, from: %w(new running paused deferred)
state :closed, from: %w(new running paused deferred)

def initialize
  set_initial_state
end

Event Transitions:

after_state_change do |from_state, to_state|
  state_histories.create!(from_state: from_state, to_state: to_state, user: current_user)
  pause_users_other_tasks if to_state.to_s == 'running'
end

on_enter_state :running do
  self.started_at = Time.now.utc
end

on_exit_state :running do
  running_time = (Time.now.utc - started_at).round
  time_logs.create!(task: self, user: current_user, seconds: running_time)
end

To change the name of the state column:

def state_column
  'something_other_than_state'
end

Contributing to micro_state_machine

Copyright © 2014 Steven Soroka. See LICENSE.txt for further details.