Skip to content

Commit

Permalink
fix nested transitions trigger name checking (#449)
Browse files Browse the repository at this point in the history
  • Loading branch information
aleneum committed Jul 13, 2020
1 parent f12936e commit 9c6a2cf
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 11 deletions.
1 change: 1 addition & 0 deletions Changelog.md
Expand Up @@ -4,6 +4,7 @@

- Bugfix: `allow_substates` did not consider enum states
- Feature #447: allow custom states to be derived from Enum, string or dict (thanks @chrko)
- Bugfix #449: get_triggers did not return nested triggers correctly (thanks @alexandretanem)

## 0.8.2 (June 2020)

Expand Down
24 changes: 13 additions & 11 deletions transitions/extensions/nesting.py
Expand Up @@ -562,14 +562,17 @@ def get_nested_state_names(self):
ordered_states.extend(self.get_nested_state_names())
return ordered_states

def get_nested_triggers(self, dest=None):
if dest:
triggers = _super(HierarchicalMachine, self).get_triggers(dest)
def get_nested_triggers(self, dest_path=None):
if dest_path:
triggers = _super(HierarchicalMachine, self).get_triggers(self.state_cls.separator.join(dest_path))
if len(dest_path) > 1 and dest_path[0] in self.states:
with self(dest_path[0]):
triggers.extend(self.get_nested_triggers(dest_path[1:]))
else:
triggers = list(self.events.keys())
for state in self.states.values():
with self(state.name):
triggers.extend(self.get_nested_triggers())
for state in self.states:
with self(state.name):
triggers.extend(self.get_nested_triggers())
return triggers

def get_state(self, state, hint=None):
Expand Down Expand Up @@ -610,16 +613,15 @@ def get_states(self, states):

def get_triggers(self, *args):
""" Extends transitions.core.Machine.get_triggers to also include parent state triggers. """
# add parents to state set
triggers = []
with self():
for state_name in args:
state_path = state_name.split(self.state_cls.separator)
root = state_path[0]
while state_path:
if len(state_path) > 1: # we only need to check substates when 'state_name' referes to a substate
with self(state_path[0]):
triggers.extend(self.get_nested_triggers(state_path[1:]))
while state_path: # check all valid transitions for parent states
triggers.extend(_super(HierarchicalMachine, self).get_triggers(self.state_cls.separator.join(state_path)))
with self(root):
triggers.extend(self.get_nested_triggers(self.state_cls.separator.join(state_path)))
state_path.pop()
return triggers

Expand Down

0 comments on commit 9c6a2cf

Please sign in to comment.