factory.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. """
  2. transitions.extensions.factory
  3. ------------------------------
  4. This module contains the definitions of classes which combine the functionality of transitions'
  5. extension modules. These classes can be accessed by names as well as through a static convenience
  6. factory object.
  7. """
  8. from ..core import Machine
  9. from .nesting import HierarchicalMachine, NestedTransition, NestedEvent
  10. from .locking import LockedMachine
  11. from .diagrams import GraphMachine, TransitionGraphSupport
  12. from .markup import MarkupMachine
  13. try:
  14. from transitions.extensions.asyncio import AsyncMachine, AsyncTransition
  15. from transitions.extensions.asyncio import HierarchicalAsyncMachine, NestedAsyncTransition
  16. except (ImportError, SyntaxError):
  17. class AsyncMachine: # Mocks for Python version 3.6 and earlier
  18. pass
  19. class AsyncTransition:
  20. pass
  21. class HierarchicalAsyncMachine:
  22. pass
  23. class NestedAsyncTransition:
  24. pass
  25. class MachineFactory(object):
  26. """
  27. Convenience factory for machine class retrieval.
  28. """
  29. # get one of the predefined classes which fulfill the criteria
  30. @staticmethod
  31. def get_predefined(graph=False, nested=False, locked=False, asyncio=False):
  32. """ A function to retrieve machine classes by required functionality.
  33. Args:
  34. graph (bool): Whether the returned class should contain graph support.
  35. nested: Whether the returned machine class should support nested states.
  36. locked: Whether the returned class should facilitate locks for threadsafety.
  37. Returns (class): A machine class with the specified features.
  38. """
  39. try:
  40. return _CLASS_MAP[(graph, nested, locked, asyncio)]
  41. except KeyError:
  42. raise ValueError("Feature combination not (yet) supported")
  43. class NestedGraphTransition(TransitionGraphSupport, NestedTransition):
  44. """
  45. A transition type to be used with (subclasses of) `HierarchicalGraphMachine` and
  46. `LockedHierarchicalGraphMachine`.
  47. """
  48. pass
  49. class HierarchicalMarkupMachine(MarkupMachine, HierarchicalMachine):
  50. pass
  51. class HierarchicalGraphMachine(GraphMachine, HierarchicalMarkupMachine):
  52. """
  53. A hierarchical state machine with graph support.
  54. """
  55. transition_cls = NestedGraphTransition
  56. class LockedHierarchicalMachine(LockedMachine, HierarchicalMachine):
  57. """
  58. A threadsafe hierarchical machine.
  59. """
  60. event_cls = NestedEvent
  61. class LockedGraphMachine(GraphMachine, LockedMachine):
  62. """
  63. A threadsafe machine with graph support.
  64. """
  65. pass
  66. class LockedHierarchicalGraphMachine(GraphMachine, LockedMachine, HierarchicalMarkupMachine):
  67. """
  68. A threadsafe hierarchical machine with graph support.
  69. """
  70. transition_cls = NestedGraphTransition
  71. event_cls = NestedEvent
  72. class AsyncGraphMachine(GraphMachine, AsyncMachine):
  73. transition_cls = AsyncTransition
  74. class HierarchicalAsyncGraphMachine(GraphMachine, HierarchicalAsyncMachine):
  75. transition_cls = NestedAsyncTransition
  76. # 4d tuple (graph, nested, locked, async)
  77. _CLASS_MAP = {
  78. (False, False, False, False): Machine,
  79. (False, False, True, False): LockedMachine,
  80. (False, True, False, False): HierarchicalMachine,
  81. (False, True, True, False): LockedHierarchicalMachine,
  82. (True, False, False, False): GraphMachine,
  83. (True, False, True, False): LockedGraphMachine,
  84. (True, True, False, False): HierarchicalGraphMachine,
  85. (True, True, True, False): LockedHierarchicalGraphMachine,
  86. (False, False, False, True): AsyncMachine,
  87. (True, False, False, True): AsyncGraphMachine,
  88. (False, True, False, True): HierarchicalAsyncMachine,
  89. (True, True, False, True): HierarchicalAsyncGraphMachine
  90. }