mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
Merge branch 'add_states_on_one_line' of https://github.com/HParker/aasm into HParker-add_states_on_one_line
Conflicts: lib/aasm/base.rb
This commit is contained in:
commit
0e350c01ca
5 changed files with 58 additions and 23 deletions
|
@ -28,8 +28,7 @@ class Job
|
||||||
|
|
||||||
aasm do
|
aasm do
|
||||||
state :sleeping, :initial => true
|
state :sleeping, :initial => true
|
||||||
state :running
|
state :running, :cleaning
|
||||||
state :cleaning
|
|
||||||
|
|
||||||
event :run do
|
event :run do
|
||||||
transitions :from => :sleeping, :to => :running
|
transitions :from => :sleeping, :to => :running
|
||||||
|
|
|
@ -73,28 +73,29 @@ module AASM
|
||||||
end
|
end
|
||||||
|
|
||||||
# define a state
|
# define a state
|
||||||
def state(name, options={})
|
# args
|
||||||
@state_machine.add_state(name, klass, options)
|
# [0] state
|
||||||
|
# [1] options (or nil)
|
||||||
|
# or
|
||||||
|
# [0] state
|
||||||
|
# [1..] state
|
||||||
|
def state(*args)
|
||||||
|
names, options = interpret_state_args(args)
|
||||||
|
names.each do |name|
|
||||||
|
@state_machine.add_state(name, klass, options)
|
||||||
|
|
||||||
aasm_name = @name.to_sym
|
aasm_name = @name.to_sym
|
||||||
state = name.to_sym
|
state = name.to_sym
|
||||||
|
|
||||||
if namespace?
|
method_name = namespace? ? "#{namespace}_#{name}" : name
|
||||||
method_name = "#{namespace}_#{name}"
|
safely_define_method klass, "#{method_name}?", -> do
|
||||||
else
|
aasm(aasm_name).current_state == state
|
||||||
method_name = name
|
end
|
||||||
end
|
|
||||||
safely_define_method klass, "#{method_name}?", -> do
|
|
||||||
aasm(aasm_name).current_state == state
|
|
||||||
end
|
|
||||||
|
|
||||||
if namespace?
|
const_name = namespace? ? "STATE_#{namespace.upcase}_#{name.upcase}" : "STATE_#{name.upcase}"
|
||||||
const_name = "STATE_#{namespace.upcase}_#{name.upcase}"
|
unless klass.const_defined?(const_name)
|
||||||
else
|
klass.const_set(const_name, name)
|
||||||
const_name = "STATE_#{name.upcase}"
|
end
|
||||||
end
|
|
||||||
unless klass.const_defined?(const_name)
|
|
||||||
klass.const_set(const_name, name)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -172,6 +173,7 @@ module AASM
|
||||||
if options[:transition]
|
if options[:transition]
|
||||||
@state_machine.events[options[:transition]].transitions_to_state(state).flatten.map(&:from).flatten
|
@state_machine.events[options[:transition]].transitions_to_state(state).flatten.map(&:from).flatten
|
||||||
else
|
else
|
||||||
|
|
||||||
events.map {|e| e.transitions_to_state(state)}.flatten.map(&:from).flatten
|
events.map {|e| e.transitions_to_state(state)}.flatten.map(&:from).flatten
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -209,5 +211,16 @@ module AASM
|
||||||
@state_machine.config.namespace
|
@state_machine.config.namespace
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def interpret_state_args(args)
|
||||||
|
if args.last.is_a?(Hash) && args.size == 2
|
||||||
|
[[args.first], args.last]
|
||||||
|
elsif args.size > 0
|
||||||
|
[args, {}]
|
||||||
|
else
|
||||||
|
raise "count not parse states: #{args}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
8
spec/models/states_on_one_line_example.rb
Normal file
8
spec/models/states_on_one_line_example.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
class StatesOnOneLineExample
|
||||||
|
include AASM
|
||||||
|
|
||||||
|
aasm :one_line do
|
||||||
|
state :initial, :initial => true
|
||||||
|
state :first, :second
|
||||||
|
end
|
||||||
|
end
|
|
@ -8,8 +8,7 @@ describe 'testing the README examples' do
|
||||||
|
|
||||||
aasm do
|
aasm do
|
||||||
state :sleeping, :initial => true
|
state :sleeping, :initial => true
|
||||||
state :running
|
state :running, :cleaning
|
||||||
state :cleaning
|
|
||||||
|
|
||||||
event :run do
|
event :run do
|
||||||
transitions :from => :sleeping, :to => :running
|
transitions :from => :sleeping, :to => :running
|
||||||
|
|
16
spec/unit/states_on_one_line_example_spec.rb
Normal file
16
spec/unit/states_on_one_line_example_spec.rb
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe StatesOnOneLineExample do
|
||||||
|
let(:example) { StatesOnOneLineExample.new }
|
||||||
|
describe 'on initialize' do
|
||||||
|
it 'should be in the initial state' do
|
||||||
|
expect(example.aasm(:one_line).current_state).to eql :initial
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'states' do
|
||||||
|
it 'should have all 3 states defined' do
|
||||||
|
expect(example.aasm(:one_line).states.map(&:name)).to eq [:initial, :first, :second]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Add a link
Reference in a new issue