mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
Feature: Add permitted_transitions to group permitted event with state (#664)
* Feature: Add permitted_transitions to group permitted event with state resolves #656
This commit is contained in:
parent
65102b6097
commit
f7231d1c31
4 changed files with 36 additions and 0 deletions
|
@ -1141,6 +1141,10 @@ job = Job.new
|
|||
job.aasm.states(permitted: true).map(&:name)
|
||||
#=> [:running]
|
||||
|
||||
# List all the permitted transitions(event and state pairs) from initial state
|
||||
job.aasm.permitted_transitions
|
||||
#=> [{ :event => :run, :state => :running }]
|
||||
|
||||
job.run
|
||||
job.aasm.states(permitted: true).map(&:name)
|
||||
#=> [:sleeping]
|
||||
|
|
|
@ -78,6 +78,17 @@ module AASM
|
|||
events
|
||||
end
|
||||
|
||||
def permitted_transitions
|
||||
events(permitted: true).flat_map do |event|
|
||||
available_transitions = event.transitions_from_state(current_state)
|
||||
allowed_transitions = available_transitions.select { |t| t.allowed?(@instance) }
|
||||
|
||||
allowed_transitions.map do |transition|
|
||||
{ event: event.name, state: transition.to }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def state_object_for_name(name)
|
||||
obj = @instance.class.aasm(@name).states.find {|s| s.name == name}
|
||||
raise AASM::UndefinedState, "State :#{name} doesn't exist" if obj.nil?
|
||||
|
|
|
@ -3,11 +3,17 @@ class SimpleExample
|
|||
aasm do
|
||||
state :initialised, :initial => true
|
||||
state :filled_out
|
||||
state :denied
|
||||
state :authorised
|
||||
|
||||
event :fill_out do
|
||||
transitions :from => :initialised, :to => :filled_out
|
||||
end
|
||||
|
||||
event :deny do
|
||||
transitions from: :initialised, to: :denied
|
||||
end
|
||||
|
||||
event :authorise do
|
||||
transitions :from => :filled_out, :to => :authorised
|
||||
end
|
||||
|
|
|
@ -23,6 +23,21 @@ describe 'state machine' do
|
|||
expect(simple).to be_authorised
|
||||
end
|
||||
|
||||
it 'shows the permitted transitions' do
|
||||
expect(simple.aasm.permitted_transitions).to eq(
|
||||
[
|
||||
{ event: :fill_out, state: :filled_out },
|
||||
{ event: :deny, state: :denied }
|
||||
]
|
||||
)
|
||||
|
||||
simple.fill_out!
|
||||
expect(simple.aasm.permitted_transitions).to eq([{ event: :authorise, state: :authorised }])
|
||||
|
||||
simple.authorise
|
||||
expect(simple.aasm.permitted_transitions).to eq([])
|
||||
end
|
||||
|
||||
it 'denies transitions to other states' do
|
||||
expect {simple.authorise}.to raise_error(AASM::InvalidTransition)
|
||||
expect {simple.authorise!}.to raise_error(AASM::InvalidTransition)
|
||||
|
|
Loading…
Add table
Reference in a new issue