2011-08-31 15:50:59 -04:00
|
|
|
# AASM - Ruby state machines #
|
2008-02-22 18:23:19 -05:00
|
|
|
|
2008-03-04 18:59:58 -05:00
|
|
|
This package contains AASM, a library for adding finite state machines to Ruby classes.
|
2008-02-22 18:23:19 -05:00
|
|
|
|
2008-03-04 18:59:58 -05:00
|
|
|
AASM started as the acts_as_state_machine plugin but has evolved into a more generic library that no longer targets only ActiveRecord models.
|
2008-02-22 18:23:19 -05:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## Features ##
|
2008-02-22 18:23:19 -05:00
|
|
|
|
2008-05-29 10:24:01 -04:00
|
|
|
* States
|
|
|
|
* Machines
|
|
|
|
* Events
|
|
|
|
* Transitions
|
2008-02-22 18:23:19 -05:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## New Callbacks ##
|
2008-02-22 18:23:19 -05:00
|
|
|
|
2009-02-26 16:18:22 -05:00
|
|
|
The callback chain & order on a successful event looks like:
|
|
|
|
|
2011-08-31 15:56:09 -04:00
|
|
|
oldstate:exit*
|
|
|
|
event:before
|
|
|
|
__find transition, if possible__
|
|
|
|
transition:on_transition*
|
|
|
|
oldstate:before_exit
|
|
|
|
newstate:before_enter
|
|
|
|
newstate:enter*
|
|
|
|
__update state__
|
|
|
|
event:success*
|
|
|
|
oldstate:after_exit
|
|
|
|
newstate:after_enter
|
|
|
|
event:after
|
|
|
|
obj:aasm_event_fired*
|
|
|
|
|
|
|
|
(*) marks old callbacks
|
2008-03-04 18:59:58 -05:00
|
|
|
|
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## Download ##
|
2009-02-26 16:18:22 -05:00
|
|
|
|
|
|
|
The latest AASM can currently be pulled from the git repository on github.
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2009-09-05 22:54:52 -04:00
|
|
|
* http://github.com/rubyist/aasm/tree/master
|
2008-03-04 18:59:58 -05:00
|
|
|
|
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## Installation ##
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
### From RubyGems.org ###
|
2009-10-23 16:33:01 -04:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
```sh
|
|
|
|
% gem install aasm
|
|
|
|
```
|
2008-04-29 20:51:12 -04:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
### Building your own gems ###
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
```sh
|
|
|
|
% rake build
|
2011-08-31 17:56:57 -04:00
|
|
|
% sudo gem install pkg/aasm-x.y.z.gem
|
2011-08-31 15:50:59 -04:00
|
|
|
```
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## Simple Example ##
|
2008-03-04 18:59:58 -05:00
|
|
|
|
|
|
|
Here's a quick example highlighting some of the features.
|
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
```ruby
|
2008-03-04 18:59:58 -05:00
|
|
|
class Conversation
|
|
|
|
include AASM
|
|
|
|
|
2010-01-17 01:12:18 -05:00
|
|
|
aasm_column :current_state # defaults to aasm_state
|
|
|
|
|
2008-12-29 10:05:07 -05:00
|
|
|
aasm_initial_state :unread
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2008-12-29 10:05:07 -05:00
|
|
|
aasm_state :unread
|
2008-03-04 18:59:58 -05:00
|
|
|
aasm_state :read
|
|
|
|
aasm_state :closed
|
|
|
|
|
|
|
|
|
|
|
|
aasm_event :view do
|
2008-12-29 10:05:07 -05:00
|
|
|
transitions :to => :read, :from => [:unread]
|
2008-03-04 18:59:58 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
aasm_event :close do
|
2008-12-29 10:05:07 -05:00
|
|
|
transitions :to => :closed, :from => [:read, :unread]
|
2008-03-04 18:59:58 -05:00
|
|
|
end
|
|
|
|
end
|
2011-08-31 15:50:59 -04:00
|
|
|
```
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## A Slightly More Complex Example ##
|
2009-02-26 12:06:43 -05:00
|
|
|
|
|
|
|
This example uses a few of the more complex features available.
|
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
```ruby
|
2009-02-26 12:06:43 -05:00
|
|
|
class Relationship
|
|
|
|
include AASM
|
2010-01-17 01:12:18 -05:00
|
|
|
|
|
|
|
aasm_column :status
|
2009-02-26 12:06:43 -05:00
|
|
|
|
|
|
|
aasm_initial_state Proc.new { |relationship| relationship.strictly_for_fun? ? :intimate : :dating }
|
|
|
|
|
|
|
|
aasm_state :dating, :enter => :make_happy, :exit => :make_depressed
|
|
|
|
aasm_state :intimate, :enter => :make_very_happy, :exit => :never_speak_again
|
|
|
|
aasm_state :married, :enter => :give_up_intimacy, :exit => :buy_exotic_car_and_wear_a_combover
|
|
|
|
|
|
|
|
aasm_event :get_intimate do
|
|
|
|
transitions :to => :intimate, :from => [:dating], :guard => :drunk?
|
|
|
|
end
|
|
|
|
|
|
|
|
aasm_event :get_married do
|
|
|
|
transitions :to => :married, :from => [:dating, :intimate], :guard => :willing_to_give_up_manhood?
|
|
|
|
end
|
|
|
|
|
|
|
|
def strictly_for_fun?; end
|
|
|
|
def drunk?; end
|
|
|
|
def willing_to_give_up_manhood?; end
|
|
|
|
def make_happy; end
|
|
|
|
def make_depressed; end
|
|
|
|
def make_very_happy; end
|
|
|
|
def never_speak_again; end
|
|
|
|
def give_up_intimacy; end
|
|
|
|
def buy_exotic_car_and_wear_a_combover; end
|
|
|
|
end
|
2011-08-31 15:50:59 -04:00
|
|
|
```
|
2009-02-26 12:06:43 -05:00
|
|
|
|
2011-09-04 11:59:55 -04:00
|
|
|
## Callbacks around events
|
|
|
|
```ruby
|
|
|
|
class Relationship
|
|
|
|
include AASM
|
|
|
|
|
|
|
|
aasm_state :dating
|
|
|
|
aasm_state :married
|
|
|
|
|
2011-09-04 12:00:55 -04:00
|
|
|
aasm_event :get_married,
|
2011-09-04 11:59:55 -04:00
|
|
|
:before => :make_vows,
|
2011-09-04 12:01:29 -04:00
|
|
|
:after => :eat_wedding_cake do
|
2011-09-04 11:59:55 -04:00
|
|
|
transitions :to => :married, :from => [:dating]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
# Other Stuff #
|
2008-03-04 18:59:58 -05:00
|
|
|
|
2008-04-29 02:12:27 -04:00
|
|
|
Author:: Scott Barron <scott at elitists dot net>
|
2009-02-26 16:18:22 -05:00
|
|
|
License:: Original code Copyright 2006, 2007, 2008 by Scott Barron.
|
2008-03-04 18:59:58 -05:00
|
|
|
Released under an MIT-style license. See the LICENSE file
|
|
|
|
included in the distribution.
|
|
|
|
|
2011-08-31 15:50:59 -04:00
|
|
|
## Warranty ##
|
2008-03-04 18:59:58 -05:00
|
|
|
|
|
|
|
This software is provided "as is" and without any express or
|
|
|
|
implied warranties, including, without limitation, the implied
|
|
|
|
warranties of merchantibility and fitness for a particular
|
|
|
|
purpose.
|