python-statemachine 3.1.0__tar.gz → 3.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.github/workflows/python-package.yml +4 -4
  2. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.github/workflows/release.yml +3 -3
  3. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.pre-commit-config.yaml +3 -3
  4. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/PKG-INFO +1 -1
  5. python_statemachine-3.1.2/docs/releases/3.1.1.md +58 -0
  6. python_statemachine-3.1.2/docs/releases/3.1.2.md +53 -0
  7. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/index.md +2 -0
  8. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/pyproject.toml +7 -5
  9. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/__init__.py +1 -1
  10. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/configuration.py +14 -6
  11. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/__init__.py +15 -6
  12. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/factory.py +1 -1
  13. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/locale/en/LC_MESSAGES/statemachine.po +3 -3
  14. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/locale/hi_IN/LC_MESSAGES/statemachine.po +3 -3
  15. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/locale/pt_BR/LC_MESSAGES/statemachine.po +3 -3
  16. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/locale/zh_CN/LC_MESSAGES/statemachine.po +4 -6
  17. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_invoke.py +4 -2
  18. python_statemachine-3.1.2/tests/test_optional_pydot.py +135 -0
  19. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_threading.py +77 -0
  20. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/uv.lock +69 -50
  21. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.git-blame-ignore-revs +0 -0
  22. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.github/FUNDING.yml +0 -0
  23. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.github/ISSUE_TEMPLATE.md +0 -0
  24. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.gitignore +0 -0
  25. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/.readthedocs.yaml +0 -0
  26. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/AGENTS.md +0 -0
  27. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/CLAUDE.md +0 -0
  28. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/LICENSE +0 -0
  29. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/README.md +0 -0
  30. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/conftest.py +0 -0
  31. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/contributing.md +0 -0
  32. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/_static/custom_machine.css +0 -0
  33. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/actions.md +0 -0
  34. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/api.md +0 -0
  35. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/async.md +0 -0
  36. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/authors.md +0 -0
  37. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/behaviour.md +0 -0
  38. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/concepts.md +0 -0
  39. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/conf.py +0 -0
  40. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/contributing.md +0 -0
  41. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/diagram.md +0 -0
  42. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/error_handling.md +0 -0
  43. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/events.md +0 -0
  44. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/guards.md +0 -0
  45. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/how-to/coming_from_state_pattern.md +0 -0
  46. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/how-to/coming_from_transitions.md +0 -0
  47. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/_oc_machine_processing.svg +0 -0
  48. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/internal_transition_sc.png +0 -0
  49. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/lab_approval_machine_accepted.png +0 -0
  50. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/oc_machine_processing.svg +0 -0
  51. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/python-statemachine.png +0 -0
  52. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/readme_trafficlightmachine.png +0 -0
  53. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/test_state_machine_internal.png +0 -0
  54. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/images/traffic_light_machine.png +0 -0
  55. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/index.md +0 -0
  56. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/installation.md +0 -0
  57. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/integrations.md +0 -0
  58. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/invoke.md +0 -0
  59. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/listeners.md +0 -0
  60. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/models.md +0 -0
  61. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/processing_model.md +0 -0
  62. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.1.0.md +0 -0
  63. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.2.0.md +0 -0
  64. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.3.0.md +0 -0
  65. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.4.2.md +0 -0
  66. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.5.0.md +0 -0
  67. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.5.1.md +0 -0
  68. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.6.0.md +0 -0
  69. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.6.1.md +0 -0
  70. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.6.2.md +0 -0
  71. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.7.0.md +0 -0
  72. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.7.1.md +0 -0
  73. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.8.0.md +0 -0
  74. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/0.9.0.md +0 -0
  75. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/1.0.0.md +0 -0
  76. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/1.0.1.md +0 -0
  77. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/1.0.2.md +0 -0
  78. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/1.0.3.md +0 -0
  79. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.0.0.md +0 -0
  80. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.1.0.md +0 -0
  81. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.1.1.md +0 -0
  82. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.1.2.md +0 -0
  83. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.2.0.md +0 -0
  84. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.0.md +0 -0
  85. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.1.md +0 -0
  86. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.2.md +0 -0
  87. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.3.md +0 -0
  88. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.4.md +0 -0
  89. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.5.md +0 -0
  90. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.3.6.md +0 -0
  91. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.4.0.md +0 -0
  92. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.5.0.md +0 -0
  93. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/2.6.0.md +0 -0
  94. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/3.0.0.md +0 -0
  95. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/3.1.0.md +0 -0
  96. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/releases/upgrade_2x_to_3.md +0 -0
  97. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/statechart.md +0 -0
  98. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/states.md +0 -0
  99. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/timeout.md +0 -0
  100. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/transitions.md +0 -0
  101. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/tutorial.md +0 -0
  102. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/validations.md +0 -0
  103. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/docs/weighted_transitions.md +0 -0
  104. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/callbacks.py +0 -0
  105. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/__init__.py +0 -0
  106. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/__main__.py +0 -0
  107. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/extract.py +0 -0
  108. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/formatter.py +0 -0
  109. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/model.py +0 -0
  110. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/renderers/__init__.py +0 -0
  111. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/renderers/dot.py +0 -0
  112. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/renderers/mermaid.py +0 -0
  113. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/renderers/table.py +0 -0
  114. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/diagram/sphinx_ext.py +0 -0
  115. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/timeout.py +0 -0
  116. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/contrib/weighted.py +0 -0
  117. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/dispatcher.py +0 -0
  118. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/engines/__init__.py +0 -0
  119. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/engines/async_.py +0 -0
  120. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/engines/base.py +0 -0
  121. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/engines/sync.py +0 -0
  122. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/event.py +0 -0
  123. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/event_data.py +0 -0
  124. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/events.py +0 -0
  125. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/exceptions.py +0 -0
  126. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/graph.py +0 -0
  127. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/i18n.py +0 -0
  128. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/invoke.py +0 -0
  129. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/__init__.py +0 -0
  130. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/scxml/__init__.py +0 -0
  131. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/scxml/actions.py +0 -0
  132. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/scxml/invoke.py +0 -0
  133. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/scxml/parser.py +0 -0
  134. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/scxml/processor.py +0 -0
  135. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/io/scxml/schema.py +0 -0
  136. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/mixins.py +0 -0
  137. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/model.py +0 -0
  138. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/orderedset.py +0 -0
  139. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/py.typed +0 -0
  140. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/registry.py +0 -0
  141. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/signature.py +0 -0
  142. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/spec_parser.py +0 -0
  143. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/state.py +0 -0
  144. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/statemachine.py +0 -0
  145. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/states.py +0 -0
  146. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/transition.py +0 -0
  147. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/transition_list.py +0 -0
  148. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/transition_mixin.py +0 -0
  149. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/statemachine/utils.py +0 -0
  150. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/__init__.py +0 -0
  151. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/conftest.py +0 -0
  152. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/app.py +0 -0
  153. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/core/__init__,.py +0 -0
  154. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/core/settings.py +0 -0
  155. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/core/wsgi.py +0 -0
  156. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/manage.py +0 -0
  157. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/workflow/__init__.py +0 -0
  158. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/workflow/apps.py +0 -0
  159. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/workflow/models.py +0 -0
  160. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/workflow/statemachines.py +0 -0
  161. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/django_project/workflow/tests.py +0 -0
  162. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/README.rst +0 -0
  163. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/__init__.py +0 -0
  164. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/ai_shell_machine.py +0 -0
  165. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/air_conditioner_machine.py +0 -0
  166. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/all_actions_machine.py +0 -0
  167. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/async_guess_the_number_machine.py +0 -0
  168. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/async_without_loop_machine.py +0 -0
  169. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/enum_campaign_machine.py +0 -0
  170. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/guess_the_number_machine.py +0 -0
  171. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/lor_machine.py +0 -0
  172. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/order_control_machine.py +0 -0
  173. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/order_control_rich_model_machine.py +0 -0
  174. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/persistent_model_machine.py +0 -0
  175. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/recursive_event_machine.py +0 -0
  176. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/reusing_transitions_machine.py +0 -0
  177. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/sqlite_persistent_model_machine.py +0 -0
  178. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_cleanup_machine.py +0 -0
  179. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_compound_machine.py +0 -0
  180. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_delayed_machine.py +0 -0
  181. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_error_handling_machine.py +0 -0
  182. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_eventless_machine.py +0 -0
  183. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_history_machine.py +0 -0
  184. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_in_condition_machine.py +0 -0
  185. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/statechart_parallel_machine.py +0 -0
  186. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/traffic_light_machine.py +0 -0
  187. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/user_machine.py +0 -0
  188. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/examples/weighted_idle_machine.py +0 -0
  189. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/helpers.py +0 -0
  190. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/__init__.py +0 -0
  191. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/__init__.py +0 -0
  192. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/middle_earth_journey.py +0 -0
  193. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/middle_earth_journey_two_compounds.py +0 -0
  194. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/middle_earth_journey_with_finals.py +0 -0
  195. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/moria_expedition.py +0 -0
  196. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/moria_expedition_with_escape.py +0 -0
  197. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/quest_for_erebor.py +0 -0
  198. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/compound/shire_to_rivendell.py +0 -0
  199. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/__init__.py +0 -0
  200. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/destroy_the_ring.py +0 -0
  201. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/destroy_the_ring_simple.py +0 -0
  202. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/nested_quest_donedata.py +0 -0
  203. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/quest_for_erebor_done_convention.py +0 -0
  204. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/quest_for_erebor_explicit_id.py +0 -0
  205. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/quest_for_erebor_multi_word.py +0 -0
  206. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/donedata/quest_for_erebor_with_event.py +0 -0
  207. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/__init__.py +0 -0
  208. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_convention_event.py +0 -0
  209. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_convention_transition_list.py +0 -0
  210. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_action_sc.py +0 -0
  211. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_action_sm_with_flag.py +0 -0
  212. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_after_sc.py +0 -0
  213. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_error_handler_sc.py +0 -0
  214. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_guard_sc.py +0 -0
  215. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_guard_sm.py +0 -0
  216. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/error/error_in_on_enter_sc.py +0 -0
  217. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/__init__.py +0 -0
  218. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/auto_advance.py +0 -0
  219. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/beacon_chain.py +0 -0
  220. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/beacon_chain_lighting.py +0 -0
  221. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/coordinated_advance.py +0 -0
  222. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/ring_corruption.py +0 -0
  223. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/ring_corruption_with_bear_ring.py +0 -0
  224. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/eventless/ring_corruption_with_tick.py +0 -0
  225. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/history/__init__.py +0 -0
  226. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/history/deep_memory_of_moria.py +0 -0
  227. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/history/gollum_personality.py +0 -0
  228. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/history/gollum_personality_default_gollum.py +0 -0
  229. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/history/gollum_personality_with_default.py +0 -0
  230. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/history/shallow_moria.py +0 -0
  231. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/__init__.py +0 -0
  232. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/combined_guard.py +0 -0
  233. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/descendant_check.py +0 -0
  234. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/eventless_in.py +0 -0
  235. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/fellowship.py +0 -0
  236. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/fellowship_coordination.py +0 -0
  237. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/in_condition/gate_of_moria.py +0 -0
  238. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/parallel/__init__.py +0 -0
  239. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/parallel/session.py +0 -0
  240. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/parallel/session_with_done_state.py +0 -0
  241. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/parallel/two_towers.py +0 -0
  242. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/parallel/war_of_the_ring.py +0 -0
  243. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/parallel/war_with_exit.py +0 -0
  244. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_actions.py +0 -0
  245. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_compound.py +0 -0
  246. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_deep_history.py +0 -0
  247. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_guards.py +0 -0
  248. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_history.py +0 -0
  249. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_internal.py +0 -0
  250. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_parallel.py +0 -0
  251. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_parallel_compound.py +0 -0
  252. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_self_transition.py +0 -0
  253. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/showcase_simple.py +0 -0
  254. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/transition_from_any.py +0 -0
  255. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/tutorial_coffee_order.py +0 -0
  256. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/__init__.py +0 -0
  257. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/multi_validator.py +0 -0
  258. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/order_validation.py +0 -0
  259. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/order_validation_no_error_events.py +0 -0
  260. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/validator_fallthrough.py +0 -0
  261. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/validator_with_cond.py +0 -0
  262. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/validators/validator_with_error_transition.py +0 -0
  263. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/workflow/__init__.py +0 -0
  264. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/workflow/campaign_machine.py +0 -0
  265. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/workflow/campaign_machine_with_validator.py +0 -0
  266. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/workflow/campaign_machine_with_values.py +0 -0
  267. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/machines/workflow/reverse_traffic_light.py +0 -0
  268. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/models.py +0 -0
  269. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scrape_images.py +0 -0
  270. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/__init__.py +0 -0
  271. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/conftest.py +0 -0
  272. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/test_microwave.py +0 -0
  273. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/test_scxml_cases.py +0 -0
  274. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/LICENSE +0 -0
  275. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test144.scxml +0 -0
  276. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test145.scxml +0 -0
  277. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test147.scxml +0 -0
  278. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test148.scxml +0 -0
  279. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test149.scxml +0 -0
  280. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test150.scxml +0 -0
  281. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test151.scxml +0 -0
  282. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test152.scxml +0 -0
  283. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test153.scxml +0 -0
  284. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test155.scxml +0 -0
  285. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test156.scxml +0 -0
  286. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test158.scxml +0 -0
  287. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test159.scxml +0 -0
  288. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test172.scxml +0 -0
  289. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test173.scxml +0 -0
  290. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test174.scxml +0 -0
  291. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test175.scxml +0 -0
  292. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test176.scxml +0 -0
  293. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test179.scxml +0 -0
  294. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test183.scxml +0 -0
  295. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test185.scxml +0 -0
  296. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test186.scxml +0 -0
  297. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test187.scxml +0 -0
  298. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test189.scxml +0 -0
  299. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test190.scxml +0 -0
  300. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test191.scxml +0 -0
  301. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test192.scxml +0 -0
  302. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test194.scxml +0 -0
  303. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test198.scxml +0 -0
  304. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test199.scxml +0 -0
  305. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test200.scxml +0 -0
  306. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test205.scxml +0 -0
  307. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test207.scxml +0 -0
  308. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test208.scxml +0 -0
  309. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test210.scxml +0 -0
  310. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test215.scxml +0 -0
  311. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test216.scxml +0 -0
  312. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test216sub1.scxml +0 -0
  313. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test220.scxml +0 -0
  314. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test223.scxml +0 -0
  315. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test224.scxml +0 -0
  316. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test225.scxml +0 -0
  317. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test226.scxml +0 -0
  318. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test226sub1.scxml +0 -0
  319. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test228.scxml +0 -0
  320. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test229.scxml +0 -0
  321. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test232.scxml +0 -0
  322. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test233.scxml +0 -0
  323. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test234.scxml +0 -0
  324. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test235.scxml +0 -0
  325. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test236.scxml +0 -0
  326. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test237.scxml +0 -0
  327. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test239.scxml +0 -0
  328. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test239sub1.scxml +0 -0
  329. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test240.scxml +0 -0
  330. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test241.scxml +0 -0
  331. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test242.scxml +0 -0
  332. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test242sub1.scxml +0 -0
  333. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test243.scxml +0 -0
  334. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test244.scxml +0 -0
  335. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test245.scxml +0 -0
  336. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test247.scxml +0 -0
  337. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test252.scxml +0 -0
  338. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test253.scxml +0 -0
  339. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test276.scxml +0 -0
  340. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test276sub1.scxml +0 -0
  341. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test277.scxml +0 -0
  342. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test279.scxml +0 -0
  343. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test280.scxml +0 -0
  344. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test286.scxml +0 -0
  345. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test287.scxml +0 -0
  346. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test294.scxml +0 -0
  347. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test298.scxml +0 -0
  348. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test302.scxml +0 -0
  349. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test303.scxml +0 -0
  350. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test304.scxml +0 -0
  351. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test309.scxml +0 -0
  352. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test310.scxml +0 -0
  353. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test311.scxml +0 -0
  354. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test312.scxml +0 -0
  355. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test318.scxml +0 -0
  356. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test319.scxml +0 -0
  357. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test321.scxml +0 -0
  358. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test322.scxml +0 -0
  359. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test323.scxml +0 -0
  360. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test324.scxml +0 -0
  361. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test325.scxml +0 -0
  362. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test326.scxml +0 -0
  363. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test329.scxml +0 -0
  364. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test330.scxml +0 -0
  365. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test331.scxml +0 -0
  366. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test332.scxml +0 -0
  367. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test333.scxml +0 -0
  368. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test335.scxml +0 -0
  369. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test336.scxml +0 -0
  370. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test337.scxml +0 -0
  371. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test338.scxml +0 -0
  372. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test339.scxml +0 -0
  373. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test342.scxml +0 -0
  374. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test343.scxml +0 -0
  375. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test344.scxml +0 -0
  376. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test346.scxml +0 -0
  377. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test347.scxml +0 -0
  378. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test348.scxml +0 -0
  379. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test349.scxml +0 -0
  380. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test350.scxml +0 -0
  381. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test351.scxml +0 -0
  382. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test352.scxml +0 -0
  383. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test354.scxml +0 -0
  384. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test355.scxml +0 -0
  385. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test364.scxml +0 -0
  386. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test372.scxml +0 -0
  387. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test375.scxml +0 -0
  388. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test376.scxml +0 -0
  389. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test377.scxml +0 -0
  390. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test378.scxml +0 -0
  391. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test387.scxml +0 -0
  392. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test388.scxml +0 -0
  393. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test396.scxml +0 -0
  394. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test399.scxml +0 -0
  395. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test401.scxml +0 -0
  396. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test402.scxml +0 -0
  397. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test403a.scxml +0 -0
  398. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test403b.scxml +0 -0
  399. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test403c.scxml +0 -0
  400. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test404.scxml +0 -0
  401. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test405.scxml +0 -0
  402. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test406.scxml +0 -0
  403. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test407.scxml +0 -0
  404. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test409.scxml +0 -0
  405. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test411.scxml +0 -0
  406. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test412.scxml +0 -0
  407. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test413.scxml +0 -0
  408. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test416.scxml +0 -0
  409. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test417.scxml +0 -0
  410. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test419.scxml +0 -0
  411. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test421.scxml +0 -0
  412. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test422.scxml +0 -0
  413. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test423.scxml +0 -0
  414. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test487.scxml +0 -0
  415. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test488.scxml +0 -0
  416. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test495.scxml +0 -0
  417. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test496.scxml +0 -0
  418. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test500.scxml +0 -0
  419. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test501.scxml +0 -0
  420. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test503.scxml +0 -0
  421. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test504.scxml +0 -0
  422. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test505.scxml +0 -0
  423. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test506.scxml +0 -0
  424. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test521.scxml +0 -0
  425. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test525.scxml +0 -0
  426. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test527.scxml +0 -0
  427. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test528.scxml +0 -0
  428. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test529.scxml +0 -0
  429. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test530.scxml +0 -0
  430. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test533.scxml +0 -0
  431. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test550.scxml +0 -0
  432. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test551.scxml +0 -0
  433. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test552.scxml +0 -0
  434. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test552.txt +0 -0
  435. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test553.scxml +0 -0
  436. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test554.scxml +0 -0
  437. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test570.scxml +0 -0
  438. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test576.scxml +0 -0
  439. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test579.scxml +0 -0
  440. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/mandatory/test580.scxml +0 -0
  441. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test193.scxml +0 -0
  442. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test201.scxml +0 -0
  443. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test278.scxml +0 -0
  444. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test444.scxml +0 -0
  445. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test445.scxml +0 -0
  446. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test446.scxml +0 -0
  447. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test446.txt +0 -0
  448. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test448.scxml +0 -0
  449. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test449.scxml +0 -0
  450. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test451.scxml +0 -0
  451. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test452.scxml +0 -0
  452. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test453.scxml +0 -0
  453. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test456.scxml +0 -0
  454. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test457.scxml +0 -0
  455. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test459.scxml +0 -0
  456. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test460.scxml +0 -0
  457. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test509.scxml +0 -0
  458. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test510.scxml +0 -0
  459. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test518.scxml +0 -0
  460. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test519.scxml +0 -0
  461. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test520.scxml +0 -0
  462. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test522.scxml +0 -0
  463. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test531.scxml +0 -0
  464. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test532.scxml +0 -0
  465. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test534.scxml +0 -0
  466. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test557.scxml +0 -0
  467. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test557.txt +0 -0
  468. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test558.scxml +0 -0
  469. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test558.txt +0 -0
  470. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test560.scxml +0 -0
  471. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test561.scxml +0 -0
  472. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test562.scxml +0 -0
  473. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test567.scxml +0 -0
  474. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test569.scxml +0 -0
  475. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test577.scxml +0 -0
  476. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/scxml/w3c/optional/test578.scxml +0 -0
  477. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_actions.py +0 -0
  478. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_api_contract.py +0 -0
  479. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_async.py +0 -0
  480. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_async_futures.py +0 -0
  481. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_callbacks.py +0 -0
  482. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_callbacks_isolation.py +0 -0
  483. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_class_listeners.py +0 -0
  484. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_conditions_algebra.py +0 -0
  485. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_configuration.py +0 -0
  486. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_contrib_diagram.py +0 -0
  487. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_contrib_timeout.py +0 -0
  488. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_copy.py +0 -0
  489. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_dispatcher.py +0 -0
  490. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_error_execution.py +0 -0
  491. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_events.py +0 -0
  492. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_examples.py +0 -0
  493. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_fellowship_quest.py +0 -0
  494. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_io.py +0 -0
  495. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_listener.py +0 -0
  496. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_mermaid_renderer.py +0 -0
  497. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_mixins.py +0 -0
  498. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_mock_compatibility.py +0 -0
  499. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_multiple_destinations.py +0 -0
  500. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_profiling.py +0 -0
  501. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_registry.py +0 -0
  502. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_rtc.py +0 -0
  503. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_scxml_units.py +0 -0
  504. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_signature.py +0 -0
  505. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_signature_positional_only.py +0 -0
  506. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_spec_parser.py +0 -0
  507. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_state.py +0 -0
  508. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_state_callbacks.py +0 -0
  509. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_compound.py +0 -0
  510. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_delayed.py +0 -0
  511. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_donedata.py +0 -0
  512. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_error.py +0 -0
  513. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_eventless.py +0 -0
  514. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_history.py +0 -0
  515. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_in_condition.py +0 -0
  516. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statechart_parallel.py +0 -0
  517. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statemachine.py +0 -0
  518. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statemachine_bounded_transitions.py +0 -0
  519. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statemachine_compat.py +0 -0
  520. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_statemachine_inheritance.py +0 -0
  521. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_transition_list.py +0 -0
  522. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_transition_table.py +0 -0
  523. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_transitions.py +0 -0
  524. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_validators.py +0 -0
  525. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/test_weighted_transitions.py +0 -0
  526. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/__init__.py +0 -0
  527. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/issue308.md +0 -0
  528. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/issue384_multiple_observers.md +0 -0
  529. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/issue449.md +0 -0
  530. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/test_issue434.py +0 -0
  531. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/test_issue480.py +0 -0
  532. {python_statemachine-3.1.0 → python_statemachine-3.1.2}/tests/testcases/test_issue509.py +0 -0
@@ -21,16 +21,16 @@ jobs:
21
21
  python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
22
22
 
23
23
  steps:
24
- - uses: actions/checkout@v4
24
+ - uses: actions/checkout@v5
25
25
  - run: git fetch origin develop
26
26
  - name: Set up Python ${{ matrix.python-version }}
27
- uses: actions/setup-python@v5
27
+ uses: actions/setup-python@v6
28
28
  with:
29
29
  python-version: ${{ matrix.python-version }}
30
30
  - name: Setup Graphviz
31
31
  uses: ts-graphviz/setup-graphviz@v2
32
32
  - name: Install uv
33
- uses: astral-sh/setup-uv@v3
33
+ uses: astral-sh/setup-uv@v8.1.0
34
34
  with:
35
35
  enable-cache: true
36
36
  cache-suffix: "python${{ matrix.python-version }}"
@@ -55,7 +55,7 @@ jobs:
55
55
  # upload coverage
56
56
  #----------------------------------------------
57
57
  - name: Upload coverage to Codecov
58
- uses: codecov/codecov-action@v4
58
+ uses: codecov/codecov-action@v6
59
59
  if: matrix.python-version == 3.14
60
60
  with:
61
61
  token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
@@ -11,12 +11,12 @@ jobs:
11
11
  permissions:
12
12
  id-token: write
13
13
  steps:
14
- - uses: actions/checkout@v4
14
+ - uses: actions/checkout@v5
15
15
 
16
16
  - run: git fetch origin develop
17
17
 
18
18
  - name: Setup Python
19
- uses: actions/setup-python@v5
19
+ uses: actions/setup-python@v6
20
20
  with:
21
21
  python-version: '3.14'
22
22
 
@@ -24,7 +24,7 @@ jobs:
24
24
  uses: ts-graphviz/setup-graphviz@v2
25
25
 
26
26
  - name: Install uv
27
- uses: astral-sh/setup-uv@v3
27
+ uses: astral-sh/setup-uv@v8.1.0
28
28
  with:
29
29
  enable-cache: true
30
30
 
@@ -1,15 +1,15 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.6.0
3
+ rev: v6.0.0
4
4
  hooks:
5
5
  - id: check-yaml
6
6
  - id: end-of-file-fixer
7
7
  exclude: docs/auto_examples
8
8
  - id: trailing-whitespace
9
9
  exclude: docs/auto_examples
10
- - repo: https://github.com/charliermarsh/ruff-pre-commit
10
+ - repo: https://github.com/astral-sh/ruff-pre-commit
11
11
  # Ruff version.
12
- rev: v0.15.8
12
+ rev: v0.15.13
13
13
  hooks:
14
14
  # Run the linter.
15
15
  - id: ruff
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-statemachine
3
- Version: 3.1.0
3
+ Version: 3.1.2
4
4
  Summary: Python Finite State Machines made easy.
5
5
  Project-URL: homepage, https://github.com/fgmacedo/python-statemachine
6
6
  Author-email: Fernando Macedo <fgmacedo@gmail.com>
@@ -0,0 +1,58 @@
1
+ # StateChart 3.1.1
2
+
3
+ *May 15, 2026*
4
+
5
+ ## Bug fixes in 3.1.1
6
+
7
+ ### Thread-safety hardening of the configuration cache
8
+
9
+ Two races in `Configuration` (introduced indirectly by the cache + no-copy
10
+ design in 3.1.0) have been fixed. Both surfaced under concurrent reads of
11
+ `machine.configuration` while another thread is sending events to the same
12
+ state machine instance, a scenario explicitly supported by the sync engine.
13
+
14
+ 1. **Cache read race.** `Configuration.states` checked
15
+ `self._cached is not None` and then returned `self._cached`. Another
16
+ thread invalidating between the check and the return could cause the
17
+ property to return `None`, leading to a `TypeError` in callers that
18
+ iterate the result (e.g., `list(machine.configuration)`). The getter now
19
+ snapshots the cache fields locally before the freshness check.
20
+ [#620](https://github.com/fgmacedo/python-statemachine/pull/620).
21
+
22
+ 2. **In-place mutation race.** `Configuration.add()` and
23
+ `Configuration.discard()` mutated the `OrderedSet` stored on the model
24
+ in place and rewrote the same reference. A concurrent reader iterating
25
+ `.configuration` could observe a partially mutated set (raising
26
+ `RuntimeError: Set changed size during iteration`) or read back a stale
27
+ cached resolution missing the new state. Both methods now use
28
+ copy-on-write, producing a fresh `OrderedSet` per call. This affects
29
+ only `StateChart` (where `atomic_configuration_update=False` is the
30
+ default to support parallel regions). The atomic update path used by
31
+ `StateMachine` was never affected.
32
+ [#620](https://github.com/fgmacedo/python-statemachine/pull/620).
33
+
34
+ Both fixes are covered by new stress tests in
35
+ `tests/test_threading.py::TestThreadSafety`:
36
+ `test_concurrent_send_and_read_configuration` and
37
+ `test_concurrent_parallel_region_send_and_read`, plus a deterministic
38
+ copy-on-write contract test `test_add_discard_produce_fresh_orderedset`.
39
+
40
+ ### Performance impact
41
+
42
+ Copy-on-write in `add()` / `discard()` reintroduces an O(n) shallow copy of
43
+ the active configuration on every state entry and exit. For the typical
44
+ configuration sizes used in practice (1–7 states), this is sub-microsecond.
45
+
46
+ Measured on macOS / Python 3.14, pytest-benchmark median, vs 3.1.0:
47
+
48
+ | Benchmark | 3.1.0 | 3.1.1 | Δ |
49
+ |------------------------------------|-------------|-------------|--------|
50
+ | `test_parallel_region_events` | 175.2 μs | 184.5 μs | +5.3% |
51
+ | `test_many_transitions_reset` | 125.9 μs | 139.5 μs | +10.9% |
52
+ | `test_guarded_transitions` | 70.0 μs | 75.7 μs | +8.2% |
53
+ | `test_history_pause_resume` | 88.4 μs | 91.4 μs | +3.4% |
54
+ | `test_many_transitions_full_cycle` | 156.9 μs | 162.1 μs | +3.3% |
55
+ | `test_flat_self_transition` | 38.7 μs | 39.1 μs | +1.0% |
56
+
57
+ Overall 4.7x–7.7x event throughput improvement vs 3.0.0 (declared in
58
+ [3.1.0 release notes](3.1.0.md)) is unchanged.
@@ -0,0 +1,53 @@
1
+ # StateChart 3.1.2
2
+
3
+ *May 18, 2026*
4
+
5
+ ## Bug fixes in 3.1.2
6
+
7
+ ### `pydot` is optional again
8
+
9
+ Starting in 3.1.0, defining any `StateMachine` or `StateChart` subclass
10
+ implicitly required `pydot` to be installed. The metaclass invokes
11
+ `_expand_docstring()` for every class, and that path eagerly imported the
12
+ diagram formatter, which in turn imported `pydot` at module load time, so
13
+ `import` of a user module failed with `ModuleNotFoundError: No module
14
+ named 'pydot'` even when no diagrams were rendered.
15
+
16
+ Two changes restore the original behavior:
17
+
18
+ - `_expand_docstring` now short-circuits when the class docstring contains
19
+ no `{statechart:FORMAT}` placeholder, skipping the formatter import for
20
+ the common case.
21
+ - `statemachine.contrib.diagram` no longer re-exports renderer classes at
22
+ the package top level, and renderer modules are only imported when
23
+ actually used. The dependency is only resolved when `dot`/`svg`
24
+ rendering is requested. Mermaid and Markdown/RST formats work without
25
+ `pydot`.
26
+
27
+ If your code imports `DotRenderer`, `DotRendererConfig`, `MermaidRenderer`
28
+ or `MermaidRendererConfig` directly from `statemachine.contrib.diagram`,
29
+ import them from the renderer submodule instead:
30
+
31
+ ```python
32
+ from statemachine.contrib.diagram.renderers.dot import DotRenderer
33
+ from statemachine.contrib.diagram.renderers.mermaid import MermaidRenderer
34
+ ```
35
+
36
+ [#622](https://github.com/fgmacedo/python-statemachine/issues/622).
37
+
38
+ ## Other changes in 3.1.2
39
+
40
+ ### Security and dependency bumps
41
+
42
+ Picked up from the dependency refresh applied to `main`:
43
+
44
+ - ruff `>=0.15.13`
45
+ - pytest `>=9.0.3` (CVE-2025, tmpdir handling) for py>=3.10
46
+ - django `>=5.2.14` for py3.10/3.11 (multiple CVEs)
47
+ - pillow `>=12.2.0` for py>=3.10 (multiple CVEs)
48
+ - transitive: urllib3 `2.6.3 -> 2.7.0` (GHSA-qccp-gfcp-xxvc), requests
49
+ `2.33.1 -> 2.34.2`
50
+
51
+ CI workflows: `actions/checkout` v4 → v5, `actions/setup-python` v5 → v6,
52
+ `astral-sh/setup-uv` v3 → v8 (pinned to `v8.1.0`), `codecov/codecov-action`
53
+ v4 → v6.
@@ -16,6 +16,8 @@ Requires Python 3.9+.
16
16
  ```{toctree}
17
17
  :maxdepth: 2
18
18
 
19
+ 3.1.2
20
+ 3.1.1
19
21
  3.1.0
20
22
  3.0.0
21
23
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-statemachine"
3
- version = "3.1.0"
3
+ version = "3.1.2"
4
4
  description = "Python Finite State Machines made easy."
5
5
  authors = [{ name = "Fernando Macedo", email = "fgmacedo@gmail.com" }]
6
6
  maintainers = [{ name = "Fernando Macedo", email = "fgmacedo@gmail.com" }]
@@ -32,10 +32,11 @@ diagrams = ["pydot >= 4.0.1"]
32
32
 
33
33
  [dependency-groups]
34
34
  dev = [
35
- "ruff >=0.15.8",
35
+ "ruff >=0.15.13",
36
36
  "pre-commit",
37
37
  "mypy",
38
- "pytest",
38
+ "pytest >=9.0.3; python_version >='3.10'",
39
+ "pytest >=8.4.2; python_version <'3.10'",
39
40
  "pytest-cov >=7.1.0; python_version >='3.9'",
40
41
  "pytest-cov; python_version <'3.9'",
41
42
  "pytest-sugar >=1.1.1",
@@ -45,12 +46,13 @@ dev = [
45
46
  "pytest-asyncio >=0.25.0; python_version <'3.10'",
46
47
  "pydot",
47
48
  "django >=6.0.3; python_version >='3.12'",
48
- "django >=5.2.12; python_version >='3.10' and python_version <'3.12'",
49
+ "django >=5.2.14; python_version >='3.10' and python_version <'3.12'",
49
50
  "pytest-django >=4.12.0; python_version >='3.10'",
50
51
  "Sphinx; python_version >'3.8'",
51
52
  "sphinx-gallery; python_version >'3.8'",
52
53
  "myst-parser; python_version >'3.8'",
53
- "pillow; python_version >'3.8'",
54
+ "pillow >=12.2.0; python_version >='3.10'",
55
+ "pillow; python_version <'3.10'",
54
56
  "sphinx-autobuild; python_version >'3.8'",
55
57
  "furo >=2025.12.19; python_version >'3.8'",
56
58
  "sphinx-copybutton >=0.5.2; python_version >'3.8'",
@@ -8,7 +8,7 @@ from .statemachine import TModel
8
8
 
9
9
  __author__ = """Fernando Macedo"""
10
10
  __email__ = "fgmacedo@gmail.com"
11
- __version__ = "3.1.0"
11
+ __version__ = "3.1.2"
12
12
 
13
13
  __all__ = [
14
14
  "StateChart",
@@ -73,8 +73,13 @@ class Configuration:
73
73
  def states(self) -> "OrderedSet[State]":
74
74
  """The set of currently active :class:`State` instances (cached)."""
75
75
  raw = self.value
76
- if self._cached is not None and self._cached_value is raw:
77
- return self._cached
76
+ # Snapshot the cache fields locally another thread may call
77
+ # ``_invalidate()`` between the freshness check and the return,
78
+ # so reading ``self._cached`` twice would risk returning ``None``.
79
+ cached = self._cached
80
+ cached_value = self._cached_value
81
+ if cached is not None and cached_value is raw:
82
+ return cached
78
83
  if raw is None:
79
84
  return OrderedSet()
80
85
 
@@ -92,14 +97,17 @@ class Configuration:
92
97
  # -- Incremental mutation (used by the engine) -----------------------------
93
98
 
94
99
  def add(self, state: "State"):
95
- """Add *state* to the configuration."""
96
- values = self._read_from_model()
100
+ """Add *state* to the configuration (copy-on-write for thread safety)."""
101
+ # Copy so we never mutate the OrderedSet still held by concurrent
102
+ # readers or by the cache identity check. ``_read_from_model`` may
103
+ # return the same ref stored on the model.
104
+ values = OrderedSet(self._read_from_model())
97
105
  values.add(state.value)
98
106
  self._write_to_model(values)
99
107
 
100
108
  def discard(self, state: "State"):
101
- """Remove *state* from the configuration."""
102
- values = self._read_from_model()
109
+ """Remove *state* from the configuration (copy-on-write for thread safety)."""
110
+ values = OrderedSet(self._read_from_model())
103
111
  values.discard(state.value)
104
112
  self._write_to_model(values)
105
113
 
@@ -1,13 +1,14 @@
1
1
  import importlib
2
+ from typing import TYPE_CHECKING
2
3
  from urllib.parse import quote
3
4
  from urllib.request import urlopen
4
5
 
5
6
  from .extract import extract
6
7
  from .formatter import formatter as formatter
7
- from .renderers.dot import DotRenderer
8
- from .renderers.dot import DotRendererConfig
9
- from .renderers.mermaid import MermaidRenderer
10
- from .renderers.mermaid import MermaidRendererConfig
8
+
9
+ if TYPE_CHECKING:
10
+ from .renderers.dot import DotRendererConfig
11
+ from .renderers.mermaid import MermaidRendererConfig
11
12
 
12
13
 
13
14
  class DotGraphMachine:
@@ -40,7 +41,9 @@ class DotGraphMachine:
40
41
  def __init__(self, machine):
41
42
  self.machine = machine
42
43
 
43
- def _build_config(self) -> DotRendererConfig:
44
+ def _build_config(self) -> "DotRendererConfig":
45
+ from .renderers.dot import DotRendererConfig
46
+
44
47
  return DotRendererConfig(
45
48
  graph_rankdir=self.graph_rankdir,
46
49
  font_name=self.font_name,
@@ -51,6 +54,8 @@ class DotGraphMachine:
51
54
  )
52
55
 
53
56
  def get_graph(self):
57
+ from .renderers.dot import DotRenderer
58
+
54
59
  ir = extract(self.machine)
55
60
  renderer = DotRenderer(config=self._build_config())
56
61
  return renderer.render(ir)
@@ -69,7 +74,9 @@ class MermaidGraphMachine:
69
74
  def __init__(self, machine):
70
75
  self.machine = machine
71
76
 
72
- def _build_config(self) -> MermaidRendererConfig:
77
+ def _build_config(self) -> "MermaidRendererConfig":
78
+ from .renderers.mermaid import MermaidRendererConfig
79
+
73
80
  return MermaidRendererConfig(
74
81
  direction=self.direction,
75
82
  active_fill=self.active_fill,
@@ -77,6 +84,8 @@ class MermaidGraphMachine:
77
84
  )
78
85
 
79
86
  def get_mermaid(self) -> str:
87
+ from .renderers.mermaid import MermaidRenderer
88
+
80
89
  ir = extract(self.machine)
81
90
  renderer = MermaidRenderer(config=self._build_config())
82
91
  return renderer.render(ir)
@@ -99,7 +99,7 @@ class StateMachineMetaclass(type):
99
99
  def _expand_docstring(cls) -> None:
100
100
  """Replace ``{statechart:FORMAT}`` placeholders in the class docstring."""
101
101
  doc = cls.__doc__
102
- if not doc:
102
+ if not doc or not cls._STATECHART_RE.search(doc):
103
103
  return
104
104
 
105
105
  from .contrib.diagram.formatter import formatter
@@ -3,9 +3,9 @@
3
3
  #
4
4
  msgid ""
5
5
  msgstr ""
6
- "Project-Id-Version: 3.1.0\n"
6
+ "Project-Id-Version: 3.1.1\n"
7
7
  "Report-Msgid-Bugs-To: fgmacedo@gmail.com\n"
8
- "POT-Creation-Date: 2026-05-15 12:08-0300\n"
8
+ "POT-Creation-Date: 2026-05-18 16:16-0300\n"
9
9
  "PO-Revision-Date: 2026-02-24 14:31-0300\n"
10
10
  "Last-Translator: Fernando Macedo <fgmacedo@gmail.com>\n"
11
11
  "Language: en\n"
@@ -21,7 +21,7 @@ msgstr ""
21
21
  msgid "Did not found name '{}' from model or statemachine"
22
22
  msgstr "Did not found name '{}' from model or statemachine"
23
23
 
24
- #: statemachine/configuration.py:121
24
+ #: statemachine/configuration.py:129
25
25
  msgid ""
26
26
  "There's no current state set. In async code, did you activate the initial"
27
27
  " state? (e.g., `await sm.activate_initial_state()`)"
@@ -3,9 +3,9 @@
3
3
  #
4
4
  msgid ""
5
5
  msgstr ""
6
- "Project-Id-Version: 3.1.0\n"
6
+ "Project-Id-Version: 3.1.1\n"
7
7
  "Report-Msgid-Bugs-To: fgmacedo@gmail.com\n"
8
- "POT-Creation-Date: 2026-05-15 12:08-0300\n"
8
+ "POT-Creation-Date: 2026-05-18 16:16-0300\n"
9
9
  "PO-Revision-Date: 2024-06-07 17:41-0300\n"
10
10
  "Last-Translator: Fernando Macedo <fgmacedo@gmail.com>\n"
11
11
  "Language: hi_IN\n"
@@ -21,7 +21,7 @@ msgstr ""
21
21
  msgid "Did not found name '{}' from model or statemachine"
22
22
  msgstr "मॉडल या स्टेटमशीन में नाम '{}' नहीं मिला"
23
23
 
24
- #: statemachine/configuration.py:121
24
+ #: statemachine/configuration.py:129
25
25
  msgid ""
26
26
  "There's no current state set. In async code, did you activate the initial"
27
27
  " state? (e.g., `await sm.activate_initial_state()`)"
@@ -3,9 +3,9 @@
3
3
  #
4
4
  msgid ""
5
5
  msgstr ""
6
- "Project-Id-Version: 3.1.0\n"
6
+ "Project-Id-Version: 3.1.1\n"
7
7
  "Report-Msgid-Bugs-To: fgmacedo@gmail.com\n"
8
- "POT-Creation-Date: 2026-05-15 12:08-0300\n"
8
+ "POT-Creation-Date: 2026-05-18 16:16-0300\n"
9
9
  "PO-Revision-Date: 2024-06-07 17:41-0300\n"
10
10
  "Last-Translator: Fernando Macedo <fgmacedo@gmail.com>\n"
11
11
  "Language: pt_BR\n"
@@ -21,7 +21,7 @@ msgstr ""
21
21
  msgid "Did not found name '{}' from model or statemachine"
22
22
  msgstr "Nome '{}' não encontrado no modelo ou na máquina de estados"
23
23
 
24
- #: statemachine/configuration.py:121
24
+ #: statemachine/configuration.py:129
25
25
  msgid ""
26
26
  "There's no current state set. In async code, did you activate the initial"
27
27
  " state? (e.g., `await sm.activate_initial_state()`)"
@@ -3,9 +3,9 @@
3
3
  #
4
4
  msgid ""
5
5
  msgstr ""
6
- "Project-Id-Version: 3.1.0\n"
6
+ "Project-Id-Version: 3.1.1\n"
7
7
  "Report-Msgid-Bugs-To: fgmacedo@gmail.com\n"
8
- "POT-Creation-Date: 2026-05-15 12:08-0300\n"
8
+ "POT-Creation-Date: 2026-05-18 16:16-0300\n"
9
9
  "PO-Revision-Date: 2024-06-07 17:41-0300\n"
10
10
  "Last-Translator: Fernando Macedo <fgmacedo@gmail.com>\n"
11
11
  "Language: zh_CN\n"
@@ -21,7 +21,7 @@ msgstr ""
21
21
  msgid "Did not found name '{}' from model or statemachine"
22
22
  msgstr "在模型或状态机中未找到名称 '{}'"
23
23
 
24
- #: statemachine/configuration.py:121
24
+ #: statemachine/configuration.py:129
25
25
  msgid ""
26
26
  "There's no current state set. In async code, did you activate the initial"
27
27
  " state? (e.g., `await sm.activate_initial_state()`)"
@@ -37,9 +37,7 @@ msgstr "无法解析布尔表达式 '{}'"
37
37
  msgid ""
38
38
  "Event() received a non-string 'id' ({cls_name}). To combine multiple "
39
39
  "transitions under one event, use the | operator: t1 | t2."
40
- msgstr ""
41
- "Event() 接收到的 'id' 不是字符串 ({cls_name})。要将多个转换组合在同一个事件下,"
42
- "请使用 | 运算符:t1 | t2。"
40
+ msgstr "Event() 接收到的 'id' 不是字符串 ({cls_name})。要将多个转换组合在同一个事件下,请使用 | 运算符:t1 | t2。"
43
41
 
44
42
  #: statemachine/event.py:131
45
43
  #, python-brace-format
@@ -614,8 +614,10 @@ class TestInvokeCancelAlreadyTerminated:
614
614
  done_invoke_loading = loading.to(ready)
615
615
 
616
616
  sm = await sm_runner.start(SM)
617
- await sm_runner.sleep(0.15)
618
- await sm_runner.processing_loop(sm)
617
+ deadline = time.monotonic() + 2.0
618
+ while "ready" not in sm.configuration_values and time.monotonic() < deadline:
619
+ await sm_runner.sleep(0.02)
620
+ await sm_runner.processing_loop(sm)
619
621
 
620
622
  assert "ready" in sm.configuration_values
621
623
  # All invocations should be terminated by now
@@ -0,0 +1,135 @@
1
+ """Regression tests for issue #622: ``pydot`` must remain optional.
2
+
3
+ These tests run in a subprocess so we can install a strict import hook that
4
+ rejects ``pydot`` without contaminating the main test interpreter (where the
5
+ diagram test suite legitimately requires ``pydot``).
6
+ """
7
+
8
+ import subprocess
9
+ import sys
10
+ import textwrap
11
+
12
+
13
+ def _run_without_pydot(script: str) -> subprocess.CompletedProcess:
14
+ """Execute ``script`` in a fresh interpreter where importing ``pydot`` fails."""
15
+ preamble = textwrap.dedent(
16
+ """
17
+ import builtins
18
+ _real_import = builtins.__import__
19
+
20
+ def _guarded(name, globals=None, locals=None, fromlist=(), level=0):
21
+ if name == "pydot" or name.startswith("pydot."):
22
+ raise ModuleNotFoundError("No module named 'pydot'")
23
+ return _real_import(name, globals, locals, fromlist, level)
24
+
25
+ builtins.__import__ = _guarded
26
+ """
27
+ )
28
+ return subprocess.run(
29
+ [sys.executable, "-c", preamble + script],
30
+ capture_output=True,
31
+ text=True,
32
+ check=False,
33
+ )
34
+
35
+
36
+ def test_define_statemachine_without_pydot():
37
+ """Defining a StateMachine subclass must not import ``pydot``."""
38
+ result = _run_without_pydot(
39
+ textwrap.dedent(
40
+ """
41
+ from statemachine import State, StateMachine
42
+
43
+ class TrafficLight(StateMachine):
44
+ 'Light that cycles through colors.'
45
+ green = State(initial=True)
46
+ yellow = State()
47
+ red = State(final=True)
48
+ cycle = green.to(yellow) | yellow.to(red)
49
+
50
+ import sys
51
+ assert "pydot" not in sys.modules, "pydot was imported transitively"
52
+ print("OK")
53
+ """
54
+ )
55
+ )
56
+ assert result.returncode == 0, result.stderr
57
+ assert result.stdout.strip() == "OK"
58
+
59
+
60
+ def test_define_statechart_without_pydot():
61
+ """Defining a StateChart subclass must not import ``pydot`` either."""
62
+ result = _run_without_pydot(
63
+ textwrap.dedent(
64
+ """
65
+ from statemachine import State
66
+ from statemachine.statemachine import StateChart
67
+
68
+ class Workflow(StateChart):
69
+ 'Workflow with a docstring but no statechart placeholder.'
70
+ draft = State(initial=True)
71
+ published = State(final=True)
72
+ publish = draft.to(published)
73
+
74
+ import sys
75
+ assert "pydot" not in sys.modules
76
+ print("OK")
77
+ """
78
+ )
79
+ )
80
+ assert result.returncode == 0, result.stderr
81
+ assert result.stdout.strip() == "OK"
82
+
83
+
84
+ def test_mermaid_format_without_pydot():
85
+ """The ``mermaid`` / ``md`` / ``rst`` formats must work without ``pydot``."""
86
+ result = _run_without_pydot(
87
+ textwrap.dedent(
88
+ """
89
+ from statemachine import State, StateMachine
90
+
91
+ class TrafficLight(StateMachine):
92
+ green = State(initial=True)
93
+ red = State(final=True)
94
+ stop = green.to(red)
95
+
96
+ mermaid = format(TrafficLight, "mermaid")
97
+ assert "stateDiagram-v2" in mermaid, mermaid
98
+
99
+ md = format(TrafficLight, "md")
100
+ assert "| State" in md, md
101
+
102
+ import sys
103
+ assert "pydot" not in sys.modules
104
+ print("OK")
105
+ """
106
+ )
107
+ )
108
+ assert result.returncode == 0, result.stderr
109
+ assert result.stdout.strip() == "OK"
110
+
111
+
112
+ def test_dot_format_requires_pydot_with_clear_error():
113
+ """``dot``/``svg`` formats still need ``pydot``; the error should surface clearly."""
114
+ result = _run_without_pydot(
115
+ textwrap.dedent(
116
+ """
117
+ from statemachine import State, StateMachine
118
+
119
+ class TrafficLight(StateMachine):
120
+ green = State(initial=True)
121
+ red = State(final=True)
122
+ stop = green.to(red)
123
+
124
+ try:
125
+ format(TrafficLight, "dot")
126
+ except ModuleNotFoundError as exc:
127
+ assert "pydot" in str(exc), exc
128
+ print("OK")
129
+ else:
130
+ raise AssertionError("Expected ModuleNotFoundError for dot format")
131
+ """
132
+ )
133
+ )
134
+ assert result.returncode == 0, result.stderr
135
+ assert result.stdout.strip() == "OK"