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:
Dāvis Namsons 2020-02-08 14:49:30 +02:00 committed by GitHub
parent 65102b6097
commit f7231d1c31
4 changed files with 36 additions and 0 deletions

View File

@ -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]

View File

@ -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?

View File

@ -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

View File

@ -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)