Skip to content

Commit

Permalink
should fix #449
Browse files Browse the repository at this point in the history
  • Loading branch information
aleneum committed Jul 17, 2020
1 parent 330330f commit 15b08da
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Changelog.md
Expand Up @@ -4,7 +4,7 @@

- Bugfix: `allow_substates` did not consider enum states
- Feature: Nested enums can now be passed in a dict as `children` with `initial` parameter
- Bugfix #449: get_triggers did not return nested triggers correctly (thanks @alexandretanem)
- Bugfix #449: get_triggers/get_transitions did not return nested triggers correctly (thanks @alexandretanem)

## 0.8.2 (June 2020)

Expand Down
9 changes: 6 additions & 3 deletions transitions/core.py
Expand Up @@ -988,11 +988,14 @@ def get_transitions(self, trigger="", source="*", dest="*"):
""" Return the transitions from the Machine.
Args:
trigger (str): Trigger name of the transition.
source (str): Limits removal to transitions from a certain state.
dest (str): Limits removal to transitions to a certain state.
source (str): Limits list to transitions from a certain state.
dest (str): Limits list to transitions to a certain state.
"""
if trigger:
events = (self.events[trigger], )
try:
events = (self.events[trigger], )
except KeyError:
return []
else:
events = self.events.values()
transitions = []
Expand Down
53 changes: 47 additions & 6 deletions transitions/extensions/nesting.py
Expand Up @@ -565,12 +565,40 @@ def get_nested_state_names(self):
ordered_states.extend(self.get_nested_state_names())
return ordered_states

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:]))
def get_nested_transitions(self, trigger="", src_path=None, dest_path=None):
if src_path and dest_path:
src = self.state_cls.separator.join(src_path)
dest = self.state_cls.separator.join(dest_path)
transitions = _super(HierarchicalMachine, self).get_transitions(trigger, src, dest)
if len(src_path) > 1 and len(dest_path) > 1:
with self(src_path[0]):
transitions.extend(self.get_nested_transitions(trigger, src_path[1:], dest_path[1:]))
elif src_path:
src = self.state_cls.separator.join(src_path)
transitions = _super(HierarchicalMachine, self).get_transitions(trigger, src, "*")
if len(src_path) > 1:
with self(src_path[0]):
transitions.extend(self.get_nested_transitions(trigger, src_path[1:], None))
elif dest_path:
dest = self.state_cls.separator.join(dest_path)
transitions = _super(HierarchicalMachine, self).get_transitions(trigger, "*", dest)
if len(dest_path) > 1:
for state_name in self.states:
with self(state_name):
transitions.extend(self.get_nested_transitions(trigger, None, dest_path[1:]))
else:
transitions = _super(HierarchicalMachine, self).get_transitions(trigger, "*", "*")
for state_name in self.states:
with self(state_name):
transitions.extend(self.get_nested_transitions(trigger, None, None))
return transitions

def get_nested_triggers(self, src_path=None):
if src_path:
triggers = _super(HierarchicalMachine, self).get_triggers(self.state_cls.separator.join(src_path))
if len(src_path) > 1 and src_path[0] in self.states:
with self(src_path[0]):
triggers.extend(self.get_nested_triggers(src_path[1:]))
else:
triggers = list(self.events.keys())
for state_name in self.states:
Expand Down Expand Up @@ -614,6 +642,19 @@ def get_states(self, states):
res.append(self.get_state(state))
return res

def get_transitions(self, trigger="", source="*", dest="*"):
with self():
source_path = [] if source == "*" else source.split(self.state_cls.separator)
dest_path = [] if dest == "*" else dest.split(self.state_cls.separator)
if source_path:
transitions = []
while source_path:
transitions.extend(self.get_nested_transitions(trigger, source_path, dest_path))
source_path.pop()
return transitions
else:
return self.get_nested_transitions(trigger, None, dest_path)

def get_triggers(self, *args):
""" Extends transitions.core.Machine.get_triggers to also include parent state triggers. """
triggers = []
Expand Down

0 comments on commit 15b08da

Please sign in to comment.