python-statemachine 3.1.2__tar.gz → 3.2.1__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 (594) hide show
  1. python_statemachine-3.2.1/.github/workflows/pages.yml +51 -0
  2. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/workflows/python-package.yml +1 -1
  3. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.gitignore +5 -0
  4. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.pre-commit-config.yaml +1 -1
  5. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/AGENTS.md +32 -2
  6. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/PKG-INFO +16 -3
  7. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/README.md +7 -0
  8. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/actions.md +7 -4
  9. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/api.md +13 -0
  10. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/behaviour.md +13 -0
  11. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/contributing.md +29 -0
  12. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/events.md +77 -0
  13. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/guards.md +65 -0
  14. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/how-to/coming_from_transitions.md +26 -1
  15. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/index.md +11 -0
  16. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/installation.md +11 -4
  17. python_statemachine-3.2.1/docs/io/formats.md +479 -0
  18. python_statemachine-3.2.1/docs/io/index.md +129 -0
  19. python_statemachine-3.2.1/docs/io/json_schema.md +56 -0
  20. python_statemachine-3.2.1/docs/io/security.md +217 -0
  21. python_statemachine-3.2.1/docs/releases/3.2.0.md +232 -0
  22. python_statemachine-3.2.1/docs/releases/3.2.1.md +228 -0
  23. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/index.md +3 -1
  24. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/states.md +1 -1
  25. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/validations.md +7 -0
  26. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/pyproject.toml +27 -28
  27. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/__init__.py +1 -1
  28. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/callbacks.py +5 -11
  29. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/configuration.py +5 -6
  30. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/extract.py +26 -27
  31. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/formatter.py +5 -7
  32. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/model.py +9 -11
  33. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/dot.py +20 -26
  34. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/mermaid.py +36 -40
  35. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/table.py +7 -9
  36. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/weighted.py +7 -11
  37. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/dispatcher.py +18 -13
  38. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/async_.py +20 -9
  39. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/base.py +26 -17
  40. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/event.py +1 -2
  41. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/exceptions.py +2 -2
  42. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/factory.py +11 -15
  43. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/graph.py +2 -2
  44. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/invoke.py +12 -11
  45. python_statemachine-3.2.1/statemachine/io/__init__.py +52 -0
  46. python_statemachine-3.2.1/statemachine/io/actions.py +627 -0
  47. python_statemachine-3.2.1/statemachine/io/builder.py +195 -0
  48. python_statemachine-3.1.2/statemachine/io/__init__.py → python_statemachine-3.2.1/statemachine/io/class_factory.py +32 -21
  49. python_statemachine-3.2.1/statemachine/io/evaluators.py +303 -0
  50. python_statemachine-3.2.1/statemachine/io/interpreter.py +128 -0
  51. {python_statemachine-3.1.2/statemachine/io/scxml → python_statemachine-3.2.1/statemachine/io}/invoke.py +89 -49
  52. python_statemachine-3.2.1/statemachine/io/json/__init__.py +1 -0
  53. python_statemachine-3.2.1/statemachine/io/json/reader.py +27 -0
  54. python_statemachine-3.2.1/statemachine/io/loader.py +175 -0
  55. python_statemachine-3.2.1/statemachine/io/model.py +268 -0
  56. python_statemachine-3.2.1/statemachine/io/native.py +402 -0
  57. python_statemachine-3.2.1/statemachine/io/ports.py +83 -0
  58. python_statemachine-3.2.1/statemachine/io/schemas/statechart.schema.json +258 -0
  59. python_statemachine-3.2.1/statemachine/io/scxml/__init__.py +15 -0
  60. python_statemachine-3.2.1/statemachine/io/scxml/processor.py +33 -0
  61. python_statemachine-3.1.2/statemachine/io/scxml/parser.py → python_statemachine-3.2.1/statemachine/io/scxml/reader.py +88 -56
  62. python_statemachine-3.2.1/statemachine/io/system_variables.py +199 -0
  63. python_statemachine-3.2.1/statemachine/io/validation.py +44 -0
  64. python_statemachine-3.2.1/statemachine/io/yaml/__init__.py +1 -0
  65. python_statemachine-3.2.1/statemachine/io/yaml/reader.py +65 -0
  66. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/en/LC_MESSAGES/statemachine.po +19 -19
  67. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/hi_IN/LC_MESSAGES/statemachine.po +19 -19
  68. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/pt_BR/LC_MESSAGES/statemachine.po +19 -19
  69. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/zh_CN/LC_MESSAGES/statemachine.po +19 -19
  70. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/orderedset.py +15 -6
  71. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/registry.py +1 -4
  72. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/signature.py +2 -5
  73. python_statemachine-3.2.1/statemachine/spec_parser.py +428 -0
  74. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/state.py +7 -8
  75. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/statemachine.py +18 -20
  76. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/states.py +3 -5
  77. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/transition.py +3 -4
  78. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/transition_list.py +4 -5
  79. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/transition_mixin.py +1 -1
  80. python_statemachine-3.2.1/tests/io/format_parity/guarded_counter.json +37 -0
  81. python_statemachine-3.2.1/tests/io/format_parity/guarded_counter.scxml +16 -0
  82. python_statemachine-3.2.1/tests/io/format_parity/guarded_counter.yaml +16 -0
  83. python_statemachine-3.2.1/tests/io/format_parity/invoke_child.json +37 -0
  84. python_statemachine-3.2.1/tests/io/format_parity/invoke_child.scxml +18 -0
  85. python_statemachine-3.2.1/tests/io/format_parity/invoke_child.yaml +17 -0
  86. python_statemachine-3.2.1/tests/io/format_parity/native/order_pipeline.json +92 -0
  87. python_statemachine-3.2.1/tests/io/format_parity/native/order_pipeline.yaml +47 -0
  88. python_statemachine-3.2.1/tests/io/format_parity/native/telemetry.json +122 -0
  89. python_statemachine-3.2.1/tests/io/format_parity/native/telemetry.yaml +50 -0
  90. python_statemachine-3.2.1/tests/io/format_parity/system_event.json +30 -0
  91. python_statemachine-3.2.1/tests/io/format_parity/system_event.scxml +13 -0
  92. python_statemachine-3.2.1/tests/io/format_parity/system_event.yaml +14 -0
  93. python_statemachine-3.2.1/tests/io/format_parity/w3c_test147_if.json +76 -0
  94. python_statemachine-3.2.1/tests/io/format_parity/w3c_test147_if.scxml +26 -0
  95. python_statemachine-3.2.1/tests/io/format_parity/w3c_test147_if.yaml +29 -0
  96. python_statemachine-3.2.1/tests/io/format_parity/w3c_test155_foreach.json +49 -0
  97. python_statemachine-3.2.1/tests/io/format_parity/w3c_test155_foreach.scxml +20 -0
  98. python_statemachine-3.2.1/tests/io/format_parity/w3c_test155_foreach.yaml +22 -0
  99. python_statemachine-3.2.1/tests/io/test_format_parity.py +59 -0
  100. python_statemachine-3.2.1/tests/io/test_guards_parity.py +145 -0
  101. python_statemachine-3.2.1/tests/io/test_interpreter.py +258 -0
  102. python_statemachine-3.2.1/tests/io/test_loader.py +177 -0
  103. python_statemachine-3.2.1/tests/io/test_model.py +38 -0
  104. python_statemachine-3.2.1/tests/io/test_native.py +336 -0
  105. python_statemachine-3.2.1/tests/io/test_native_behavior.py +64 -0
  106. python_statemachine-3.2.1/tests/io/test_native_invoke.py +128 -0
  107. python_statemachine-3.2.1/tests/io/test_ports.py +70 -0
  108. python_statemachine-3.2.1/tests/io/test_readers.py +58 -0
  109. python_statemachine-3.2.1/tests/io/test_security.py +824 -0
  110. python_statemachine-3.2.1/tests/io/test_validation.py +192 -0
  111. python_statemachine-3.2.1/tests/scxml/_harness.py +58 -0
  112. python_statemachine-3.2.1/tests/scxml/test_scxml_cases.py +53 -0
  113. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_callbacks.py +96 -0
  114. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_conditions_algebra.py +30 -0
  115. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_configuration.py +92 -0
  116. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_copy.py +3 -2
  117. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_invoke.py +59 -0
  118. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_io.py +33 -1
  119. python_statemachine-3.2.1/tests/test_scxml_datamodel.py +165 -0
  120. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_scxml_units.py +162 -79
  121. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_spec_parser.py +29 -0
  122. python_statemachine-3.2.1/tests/test_spec_parser_values.py +168 -0
  123. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_state.py +15 -0
  124. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_compound.py +50 -0
  125. python_statemachine-3.2.1/tests/test_translation_names.py +121 -0
  126. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/uv.lock +512 -1132
  127. python_statemachine-3.1.2/statemachine/io/scxml/actions.py +0 -650
  128. python_statemachine-3.1.2/statemachine/io/scxml/processor.py +0 -263
  129. python_statemachine-3.1.2/statemachine/io/scxml/schema.py +0 -175
  130. python_statemachine-3.1.2/statemachine/spec_parser.py +0 -245
  131. python_statemachine-3.1.2/tests/scxml/test_scxml_cases.py +0 -101
  132. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.git-blame-ignore-revs +0 -0
  133. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/FUNDING.yml +0 -0
  134. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/ISSUE_TEMPLATE.md +0 -0
  135. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/workflows/release.yml +0 -0
  136. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.readthedocs.yaml +0 -0
  137. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/CLAUDE.md +0 -0
  138. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/LICENSE +0 -0
  139. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/conftest.py +0 -0
  140. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/contributing.md +0 -0
  141. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/_static/custom_machine.css +0 -0
  142. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/async.md +0 -0
  143. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/authors.md +0 -0
  144. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/concepts.md +0 -0
  145. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/conf.py +0 -0
  146. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/diagram.md +0 -0
  147. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/error_handling.md +0 -0
  148. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/how-to/coming_from_state_pattern.md +0 -0
  149. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/_oc_machine_processing.svg +0 -0
  150. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/internal_transition_sc.png +0 -0
  151. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/lab_approval_machine_accepted.png +0 -0
  152. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/oc_machine_processing.svg +0 -0
  153. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/python-statemachine.png +0 -0
  154. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/readme_trafficlightmachine.png +0 -0
  155. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/test_state_machine_internal.png +0 -0
  156. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/traffic_light_machine.png +0 -0
  157. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/integrations.md +0 -0
  158. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/invoke.md +0 -0
  159. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/listeners.md +0 -0
  160. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/models.md +0 -0
  161. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/processing_model.md +0 -0
  162. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.1.0.md +0 -0
  163. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.2.0.md +0 -0
  164. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.3.0.md +0 -0
  165. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.4.2.md +0 -0
  166. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.5.0.md +0 -0
  167. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.5.1.md +0 -0
  168. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.6.0.md +0 -0
  169. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.6.1.md +0 -0
  170. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.6.2.md +0 -0
  171. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.7.0.md +0 -0
  172. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.7.1.md +0 -0
  173. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.8.0.md +0 -0
  174. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.9.0.md +0 -0
  175. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.0.md +0 -0
  176. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.1.md +0 -0
  177. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.2.md +0 -0
  178. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.3.md +0 -0
  179. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.0.0.md +0 -0
  180. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.1.0.md +0 -0
  181. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.1.1.md +0 -0
  182. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.1.2.md +0 -0
  183. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.2.0.md +0 -0
  184. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.0.md +0 -0
  185. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.1.md +0 -0
  186. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.2.md +0 -0
  187. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.3.md +0 -0
  188. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.4.md +0 -0
  189. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.5.md +0 -0
  190. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.6.md +0 -0
  191. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.4.0.md +0 -0
  192. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.5.0.md +0 -0
  193. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.6.0.md +0 -0
  194. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.0.0.md +0 -0
  195. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.1.0.md +0 -0
  196. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.1.1.md +0 -0
  197. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.1.2.md +0 -0
  198. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/upgrade_2x_to_3.md +0 -0
  199. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/statechart.md +0 -0
  200. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/timeout.md +0 -0
  201. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/transitions.md +0 -0
  202. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/tutorial.md +0 -0
  203. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/weighted_transitions.md +0 -0
  204. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/__init__.py +0 -0
  205. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/__init__.py +0 -0
  206. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/__main__.py +0 -0
  207. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/__init__.py +0 -0
  208. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/sphinx_ext.py +0 -0
  209. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/timeout.py +0 -0
  210. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/__init__.py +0 -0
  211. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/sync.py +0 -0
  212. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/event_data.py +0 -0
  213. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/events.py +0 -0
  214. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/i18n.py +0 -0
  215. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/mixins.py +0 -0
  216. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/model.py +0 -0
  217. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/py.typed +0 -0
  218. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/utils.py +0 -0
  219. {python_statemachine-3.1.2/statemachine/io/scxml → python_statemachine-3.2.1/tests}/__init__.py +0 -0
  220. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/conftest.py +0 -0
  221. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/app.py +0 -0
  222. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/core/__init__,.py +0 -0
  223. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/core/settings.py +0 -0
  224. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/core/wsgi.py +0 -0
  225. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/manage.py +0 -0
  226. {python_statemachine-3.1.2/tests → python_statemachine-3.2.1/tests/django_project/workflow}/__init__.py +0 -0
  227. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/apps.py +0 -0
  228. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/models.py +0 -0
  229. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/statemachines.py +0 -0
  230. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/tests.py +0 -0
  231. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/README.rst +0 -0
  232. {python_statemachine-3.1.2/tests/django_project/workflow → python_statemachine-3.2.1/tests/examples}/__init__.py +0 -0
  233. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/ai_shell_machine.py +0 -0
  234. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/air_conditioner_machine.py +0 -0
  235. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/all_actions_machine.py +0 -0
  236. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/async_guess_the_number_machine.py +0 -0
  237. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/async_without_loop_machine.py +0 -0
  238. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/enum_campaign_machine.py +0 -0
  239. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/guess_the_number_machine.py +0 -0
  240. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/lor_machine.py +0 -0
  241. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/order_control_machine.py +0 -0
  242. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/order_control_rich_model_machine.py +0 -0
  243. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/persistent_model_machine.py +0 -0
  244. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/recursive_event_machine.py +0 -0
  245. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/reusing_transitions_machine.py +0 -0
  246. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/sqlite_persistent_model_machine.py +0 -0
  247. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_cleanup_machine.py +0 -0
  248. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_compound_machine.py +0 -0
  249. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_delayed_machine.py +0 -0
  250. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_error_handling_machine.py +0 -0
  251. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_eventless_machine.py +0 -0
  252. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_history_machine.py +0 -0
  253. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_in_condition_machine.py +0 -0
  254. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_parallel_machine.py +0 -0
  255. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/traffic_light_machine.py +0 -0
  256. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/user_machine.py +0 -0
  257. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/weighted_idle_machine.py +0 -0
  258. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/helpers.py +0 -0
  259. {python_statemachine-3.1.2/tests/examples → python_statemachine-3.2.1/tests/io}/__init__.py +0 -0
  260. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/__init__.py +0 -0
  261. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/__init__.py +0 -0
  262. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/middle_earth_journey.py +0 -0
  263. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/middle_earth_journey_two_compounds.py +0 -0
  264. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/middle_earth_journey_with_finals.py +0 -0
  265. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/moria_expedition.py +0 -0
  266. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/moria_expedition_with_escape.py +0 -0
  267. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/quest_for_erebor.py +0 -0
  268. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/shire_to_rivendell.py +0 -0
  269. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/__init__.py +0 -0
  270. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/destroy_the_ring.py +0 -0
  271. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/destroy_the_ring_simple.py +0 -0
  272. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/nested_quest_donedata.py +0 -0
  273. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_done_convention.py +0 -0
  274. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_explicit_id.py +0 -0
  275. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_multi_word.py +0 -0
  276. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_with_event.py +0 -0
  277. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/__init__.py +0 -0
  278. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_convention_event.py +0 -0
  279. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_convention_transition_list.py +0 -0
  280. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_action_sc.py +0 -0
  281. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_action_sm_with_flag.py +0 -0
  282. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_after_sc.py +0 -0
  283. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_error_handler_sc.py +0 -0
  284. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_guard_sc.py +0 -0
  285. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_guard_sm.py +0 -0
  286. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_on_enter_sc.py +0 -0
  287. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/__init__.py +0 -0
  288. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/auto_advance.py +0 -0
  289. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/beacon_chain.py +0 -0
  290. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/beacon_chain_lighting.py +0 -0
  291. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/coordinated_advance.py +0 -0
  292. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/ring_corruption.py +0 -0
  293. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/ring_corruption_with_bear_ring.py +0 -0
  294. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/ring_corruption_with_tick.py +0 -0
  295. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/__init__.py +0 -0
  296. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/deep_memory_of_moria.py +0 -0
  297. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/gollum_personality.py +0 -0
  298. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/gollum_personality_default_gollum.py +0 -0
  299. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/gollum_personality_with_default.py +0 -0
  300. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/shallow_moria.py +0 -0
  301. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/__init__.py +0 -0
  302. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/combined_guard.py +0 -0
  303. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/descendant_check.py +0 -0
  304. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/eventless_in.py +0 -0
  305. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/fellowship.py +0 -0
  306. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/fellowship_coordination.py +0 -0
  307. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/gate_of_moria.py +0 -0
  308. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/__init__.py +0 -0
  309. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/session.py +0 -0
  310. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/session_with_done_state.py +0 -0
  311. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/two_towers.py +0 -0
  312. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/war_of_the_ring.py +0 -0
  313. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/war_with_exit.py +0 -0
  314. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_actions.py +0 -0
  315. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_compound.py +0 -0
  316. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_deep_history.py +0 -0
  317. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_guards.py +0 -0
  318. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_history.py +0 -0
  319. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_internal.py +0 -0
  320. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_parallel.py +0 -0
  321. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_parallel_compound.py +0 -0
  322. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_self_transition.py +0 -0
  323. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_simple.py +0 -0
  324. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/transition_from_any.py +0 -0
  325. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/tutorial_coffee_order.py +0 -0
  326. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/__init__.py +0 -0
  327. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/multi_validator.py +0 -0
  328. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/order_validation.py +0 -0
  329. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/order_validation_no_error_events.py +0 -0
  330. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/validator_fallthrough.py +0 -0
  331. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/validator_with_cond.py +0 -0
  332. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/validator_with_error_transition.py +0 -0
  333. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/__init__.py +0 -0
  334. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/campaign_machine.py +0 -0
  335. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/campaign_machine_with_validator.py +0 -0
  336. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/campaign_machine_with_values.py +0 -0
  337. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/reverse_traffic_light.py +0 -0
  338. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/models.py +0 -0
  339. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scrape_images.py +0 -0
  340. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/__init__.py +0 -0
  341. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/conftest.py +0 -0
  342. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/test_microwave.py +0 -0
  343. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/LICENSE +0 -0
  344. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test144.scxml +0 -0
  345. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test145.scxml +0 -0
  346. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test147.scxml +0 -0
  347. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test148.scxml +0 -0
  348. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test149.scxml +0 -0
  349. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test150.scxml +0 -0
  350. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test151.scxml +0 -0
  351. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test152.scxml +0 -0
  352. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test153.scxml +0 -0
  353. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test155.scxml +0 -0
  354. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test156.scxml +0 -0
  355. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test158.scxml +0 -0
  356. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test159.scxml +0 -0
  357. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test172.scxml +0 -0
  358. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test173.scxml +0 -0
  359. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test174.scxml +0 -0
  360. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test175.scxml +0 -0
  361. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test176.scxml +0 -0
  362. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test179.scxml +0 -0
  363. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test183.scxml +0 -0
  364. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test185.scxml +0 -0
  365. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test186.scxml +0 -0
  366. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test187.scxml +0 -0
  367. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test189.scxml +0 -0
  368. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test190.scxml +0 -0
  369. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test191.scxml +0 -0
  370. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test192.scxml +0 -0
  371. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test194.scxml +0 -0
  372. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test198.scxml +0 -0
  373. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test199.scxml +0 -0
  374. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test200.scxml +0 -0
  375. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test205.scxml +0 -0
  376. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test207.scxml +0 -0
  377. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test208.scxml +0 -0
  378. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test210.scxml +0 -0
  379. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test215.scxml +0 -0
  380. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test216.scxml +0 -0
  381. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test216sub1.scxml +0 -0
  382. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test220.scxml +0 -0
  383. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test223.scxml +0 -0
  384. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test224.scxml +0 -0
  385. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test225.scxml +0 -0
  386. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test226.scxml +0 -0
  387. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test226sub1.scxml +0 -0
  388. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test228.scxml +0 -0
  389. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test229.scxml +0 -0
  390. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test232.scxml +0 -0
  391. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test233.scxml +0 -0
  392. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test234.scxml +0 -0
  393. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test235.scxml +0 -0
  394. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test236.scxml +0 -0
  395. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test237.scxml +0 -0
  396. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test239.scxml +0 -0
  397. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test239sub1.scxml +0 -0
  398. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test240.scxml +0 -0
  399. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test241.scxml +0 -0
  400. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test242.scxml +0 -0
  401. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test242sub1.scxml +0 -0
  402. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test243.scxml +0 -0
  403. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test244.scxml +0 -0
  404. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test245.scxml +0 -0
  405. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test247.scxml +0 -0
  406. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test252.scxml +0 -0
  407. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test253.scxml +0 -0
  408. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test276.scxml +0 -0
  409. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test276sub1.scxml +0 -0
  410. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test277.scxml +0 -0
  411. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test279.scxml +0 -0
  412. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test280.scxml +0 -0
  413. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test286.scxml +0 -0
  414. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test287.scxml +0 -0
  415. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test294.scxml +0 -0
  416. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test298.scxml +0 -0
  417. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test302.scxml +0 -0
  418. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test303.scxml +0 -0
  419. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test304.scxml +0 -0
  420. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test309.scxml +0 -0
  421. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test310.scxml +0 -0
  422. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test311.scxml +0 -0
  423. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test312.scxml +0 -0
  424. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test318.scxml +0 -0
  425. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test319.scxml +0 -0
  426. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test321.scxml +0 -0
  427. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test322.scxml +0 -0
  428. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test323.scxml +0 -0
  429. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test324.scxml +0 -0
  430. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test325.scxml +0 -0
  431. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test326.scxml +0 -0
  432. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test329.scxml +0 -0
  433. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test330.scxml +0 -0
  434. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test331.scxml +0 -0
  435. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test332.scxml +0 -0
  436. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test333.scxml +0 -0
  437. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test335.scxml +0 -0
  438. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test336.scxml +0 -0
  439. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test337.scxml +0 -0
  440. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test338.scxml +0 -0
  441. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test339.scxml +0 -0
  442. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test342.scxml +0 -0
  443. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test343.scxml +0 -0
  444. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test344.scxml +0 -0
  445. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test346.scxml +0 -0
  446. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test347.scxml +0 -0
  447. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test348.scxml +0 -0
  448. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test349.scxml +0 -0
  449. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test350.scxml +0 -0
  450. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test351.scxml +0 -0
  451. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test352.scxml +0 -0
  452. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test354.scxml +0 -0
  453. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test355.scxml +0 -0
  454. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test364.scxml +0 -0
  455. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test372.scxml +0 -0
  456. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test375.scxml +0 -0
  457. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test376.scxml +0 -0
  458. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test377.scxml +0 -0
  459. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test378.scxml +0 -0
  460. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test387.scxml +0 -0
  461. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test388.scxml +0 -0
  462. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test396.scxml +0 -0
  463. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test399.scxml +0 -0
  464. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test401.scxml +0 -0
  465. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test402.scxml +0 -0
  466. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test403a.scxml +0 -0
  467. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test403b.scxml +0 -0
  468. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test403c.scxml +0 -0
  469. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test404.scxml +0 -0
  470. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test405.scxml +0 -0
  471. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test406.scxml +0 -0
  472. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test407.scxml +0 -0
  473. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test409.scxml +0 -0
  474. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test411.scxml +0 -0
  475. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test412.scxml +0 -0
  476. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test413.scxml +0 -0
  477. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test416.scxml +0 -0
  478. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test417.scxml +0 -0
  479. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test419.scxml +0 -0
  480. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test421.scxml +0 -0
  481. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test422.scxml +0 -0
  482. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test423.scxml +0 -0
  483. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test487.scxml +0 -0
  484. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test488.scxml +0 -0
  485. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test495.scxml +0 -0
  486. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test496.scxml +0 -0
  487. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test500.scxml +0 -0
  488. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test501.scxml +0 -0
  489. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test503.scxml +0 -0
  490. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test504.scxml +0 -0
  491. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test505.scxml +0 -0
  492. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test506.scxml +0 -0
  493. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test521.scxml +0 -0
  494. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test525.scxml +0 -0
  495. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test527.scxml +0 -0
  496. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test528.scxml +0 -0
  497. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test529.scxml +0 -0
  498. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test530.scxml +0 -0
  499. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test533.scxml +0 -0
  500. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test550.scxml +0 -0
  501. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test551.scxml +0 -0
  502. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test552.scxml +0 -0
  503. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test552.txt +0 -0
  504. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test553.scxml +0 -0
  505. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test554.scxml +0 -0
  506. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test570.scxml +0 -0
  507. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test576.scxml +0 -0
  508. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test579.scxml +0 -0
  509. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test580.scxml +0 -0
  510. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test193.scxml +0 -0
  511. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test201.scxml +0 -0
  512. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test278.scxml +0 -0
  513. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test444.scxml +0 -0
  514. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test445.scxml +0 -0
  515. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test446.scxml +0 -0
  516. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test446.txt +0 -0
  517. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test448.scxml +0 -0
  518. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test449.scxml +0 -0
  519. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test451.scxml +0 -0
  520. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test452.scxml +0 -0
  521. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test453.scxml +0 -0
  522. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test456.scxml +0 -0
  523. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test457.scxml +0 -0
  524. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test459.scxml +0 -0
  525. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test460.scxml +0 -0
  526. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test509.scxml +0 -0
  527. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test510.scxml +0 -0
  528. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test518.scxml +0 -0
  529. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test519.scxml +0 -0
  530. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test520.scxml +0 -0
  531. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test522.scxml +0 -0
  532. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test531.scxml +0 -0
  533. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test532.scxml +0 -0
  534. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test534.scxml +0 -0
  535. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test557.scxml +0 -0
  536. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test557.txt +0 -0
  537. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test558.scxml +0 -0
  538. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test558.txt +0 -0
  539. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test560.scxml +0 -0
  540. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test561.scxml +0 -0
  541. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test562.scxml +0 -0
  542. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test567.scxml +0 -0
  543. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test569.scxml +0 -0
  544. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test577.scxml +0 -0
  545. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test578.scxml +0 -0
  546. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_actions.py +0 -0
  547. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_api_contract.py +0 -0
  548. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_async.py +0 -0
  549. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_async_futures.py +0 -0
  550. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_callbacks_isolation.py +0 -0
  551. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_class_listeners.py +0 -0
  552. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_contrib_diagram.py +0 -0
  553. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_contrib_timeout.py +0 -0
  554. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_dispatcher.py +0 -0
  555. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_error_execution.py +0 -0
  556. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_events.py +0 -0
  557. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_examples.py +0 -0
  558. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_fellowship_quest.py +0 -0
  559. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_listener.py +0 -0
  560. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_mermaid_renderer.py +0 -0
  561. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_mixins.py +0 -0
  562. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_mock_compatibility.py +0 -0
  563. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_multiple_destinations.py +0 -0
  564. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_optional_pydot.py +0 -0
  565. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_profiling.py +0 -0
  566. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_registry.py +0 -0
  567. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_rtc.py +0 -0
  568. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_signature.py +0 -0
  569. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_signature_positional_only.py +0 -0
  570. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_state_callbacks.py +0 -0
  571. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_delayed.py +0 -0
  572. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_donedata.py +0 -0
  573. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_error.py +0 -0
  574. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_eventless.py +0 -0
  575. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_history.py +0 -0
  576. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_in_condition.py +0 -0
  577. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_parallel.py +0 -0
  578. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine.py +0 -0
  579. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine_bounded_transitions.py +0 -0
  580. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine_compat.py +0 -0
  581. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine_inheritance.py +0 -0
  582. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_threading.py +0 -0
  583. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_transition_list.py +0 -0
  584. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_transition_table.py +0 -0
  585. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_transitions.py +0 -0
  586. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_validators.py +0 -0
  587. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_weighted_transitions.py +0 -0
  588. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/__init__.py +0 -0
  589. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/issue308.md +0 -0
  590. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/issue384_multiple_observers.md +0 -0
  591. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/issue449.md +0 -0
  592. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/test_issue434.py +0 -0
  593. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/test_issue480.py +0 -0
  594. {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/test_issue509.py +0 -0
@@ -0,0 +1,51 @@
1
+ name: pages
2
+
3
+ # Publishes the static assets served at https://fgmacedo.github.io/python-statemachine/
4
+ # Currently: the native statechart JSON Schema, at the canonical URL used as its `$id`
5
+ # (statemachine/io/schemas/statechart.schema.json -> /schemas/statechart/v1.json).
6
+
7
+ on:
8
+ push:
9
+ branches: [develop]
10
+ paths:
11
+ - statemachine/io/schemas/statechart.schema.json
12
+ - .github/workflows/pages.yml
13
+ release:
14
+ types: [published]
15
+ workflow_dispatch:
16
+
17
+ permissions:
18
+ contents: read
19
+ pages: write
20
+ id-token: write
21
+
22
+ # Allow one concurrent deployment; don't cancel an in-progress publish.
23
+ concurrency:
24
+ group: pages
25
+ cancel-in-progress: false
26
+
27
+ jobs:
28
+ deploy:
29
+ runs-on: ubuntu-latest
30
+ environment:
31
+ name: github-pages
32
+ url: ${{ steps.deployment.outputs.page_url }}
33
+ steps:
34
+ - uses: actions/checkout@v5
35
+ - name: Assemble site
36
+ run: |
37
+ mkdir -p _site/schemas/statechart
38
+ cp statemachine/io/schemas/statechart.schema.json _site/schemas/statechart/v1.json
39
+ cat > _site/index.html <<'HTML'
40
+ <!doctype html>
41
+ <meta charset="utf-8">
42
+ <title>python-statemachine</title>
43
+ <meta http-equiv="refresh" content="0; url=https://python-statemachine.readthedocs.io/">
44
+ <p>See the <a href="schemas/statechart/v1.json">statechart JSON Schema</a> or the
45
+ <a href="https://python-statemachine.readthedocs.io/">documentation</a>.</p>
46
+ HTML
47
+ - uses: actions/upload-pages-artifact@v3
48
+ with:
49
+ path: _site
50
+ - id: deployment
51
+ uses: actions/deploy-pages@v4
@@ -18,7 +18,7 @@ jobs:
18
18
  strategy:
19
19
  fail-fast: false
20
20
  matrix:
21
- python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
21
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
22
22
 
23
23
  steps:
24
24
  - uses: actions/checkout@v5
@@ -85,3 +85,8 @@ tmp/
85
85
 
86
86
  # Local specs
87
87
  specs/
88
+
89
+ # Environment files (secrets)
90
+ .env
91
+ .env.*
92
+ !.env.example
@@ -9,7 +9,7 @@ repos:
9
9
  exclude: docs/auto_examples
10
10
  - repo: https://github.com/astral-sh/ruff-pre-commit
11
11
  # Ruff version.
12
- rev: v0.15.13
12
+ rev: v0.15.17
13
13
  hooks:
14
14
  # Run the linter.
15
15
  - id: ruff
@@ -218,11 +218,19 @@ uv run mypy statemachine/ tests/
218
218
 
219
219
  ## Code style
220
220
 
221
- - **Formatter/Linter:** ruff (line length 99, target Python 3.9)
221
+ - **Formatter/Linter:** ruff (line length 99, target Python 3.10)
222
222
  - **Rules:** pycodestyle, pyflakes, isort, pyupgrade, flake8-comprehensions, flake8-bugbear, flake8-pytest-style
223
223
  - **Imports:** single-line, sorted by isort. **Always prefer top-level imports** — only use
224
224
  lazy (in-function) imports when strictly necessary to break circular dependencies
225
- - **Docstrings:** Google convention
225
+ - **Docstrings:** Google convention. Document only what isn't obvious from the
226
+ name/type (hidden conventions, non-obvious semantics), not trivial fields.
227
+ - **Attribute docs:** use an attribute *docstring* (a string literal on the line
228
+ **below** the attribute), not an inline `#` comment, so Sphinx autodoc captures it.
229
+ Reserve `#` for explaining logic. Example:
230
+ ```python
231
+ unless: "str | None" = None
232
+ """Negated guard expression; the transition is allowed only if it is falsy."""
233
+ ```
226
234
  - **Naming:** PascalCase for classes, snake_case for functions/methods, UPPER_SNAKE_CASE for constants
227
235
  - **Type hints:** used throughout; `TYPE_CHECKING` for circular imports
228
236
  - Pre-commit hooks enforce ruff + mypy + pytest
@@ -268,6 +276,24 @@ All code examples in `docs/*.md` **must** be testable doctests (using ```` ```py
268
276
  `--doctest-glob=*.md`. If an example cannot be expressed as a doctest (e.g., it requires
269
277
  real concurrency), write it as a unit test in `tests/` and reference it from the docs instead.
270
278
 
279
+ ### Declarative IO: keep the JSON Schema and the parser in sync
280
+
281
+ The native JSON/YAML format has three artifacts that must agree: the parser
282
+ (`statemachine/io/native.py`), the runtime, and the published JSON Schema
283
+ (`statemachine/io/schemas/statechart.schema.json`). They drift apart silently unless
284
+ enforced, so when you add or change native vocabulary:
285
+
286
+ - Update the **schema** alongside the parser/runtime change, never after.
287
+ - The parser is the source of truth for accepted keys: `_ACTION_KEYS` and the
288
+ `_DOCUMENT_KEYS`/`_STATE_KEYS`/`_TRANSITION_KEYS`/`_INVOKE_KEYS` frozensets. The parser
289
+ **rejects unknown keys** using them, and `tests/io/test_validation.py` asserts each set
290
+ equals the matching schema node's properties, so a change on one side without the other
291
+ fails CI.
292
+ - **Every native example is schema-validated.** Test fixtures load with `validate=True` (and
293
+ a corpus test validates every `.yaml`/`.json` under `tests/io/`); docs examples pass
294
+ `validate=True` too. A feature exercised by an example but missing from the schema breaks a
295
+ test.
296
+
271
297
  ## Git workflow
272
298
 
273
299
  - Main branch: `develop`
@@ -276,6 +302,10 @@ real concurrency), write it as a unit test in `tests/` and reference it from the
276
302
  - Signed commits preferred (`git commit -s`)
277
303
  - Use [Conventional Commits](https://www.conventionalcommits.org/) messages
278
304
  (e.g., `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`, `perf:`)
305
+ - **NEVER bypass pre-commit hooks** (`--no-verify`, `-n`, or disabling hooks). The hooks
306
+ inspect every commit to keep regressions out; only the maintainer may decide to skip them.
307
+ If a hook modifies files (e.g. `generate-images` regenerating a diagram PNG), stage the
308
+ generated changes and commit again until the hooks pass — do not skip them.
279
309
 
280
310
  ## Security
281
311
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-statemachine
3
- Version: 3.1.2
3
+ Version: 3.2.1
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>
@@ -13,7 +13,6 @@ Classifier: Framework :: Django
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Natural Language :: English
16
- Classifier: Programming Language :: Python :: 3.9
17
16
  Classifier: Programming Language :: Python :: 3.10
18
17
  Classifier: Programming Language :: Python :: 3.11
19
18
  Classifier: Programming Language :: Python :: 3.12
@@ -21,9 +20,16 @@ Classifier: Programming Language :: Python :: 3.13
21
20
  Classifier: Programming Language :: Python :: 3.14
22
21
  Classifier: Topic :: Home Automation
23
22
  Classifier: Topic :: Software Development :: Libraries
24
- Requires-Python: >=3.9
23
+ Requires-Python: >=3.10
25
24
  Provides-Extra: diagrams
26
25
  Requires-Dist: pydot>=4.0.1; extra == 'diagrams'
26
+ Provides-Extra: io
27
+ Requires-Dist: jsonschema>=4.18; extra == 'io'
28
+ Requires-Dist: pyyaml>=6.0; extra == 'io'
29
+ Provides-Extra: validation
30
+ Requires-Dist: jsonschema>=4.18; extra == 'validation'
31
+ Provides-Extra: yaml
32
+ Requires-Dist: pyyaml>=6.0; extra == 'yaml'
27
33
  Description-Content-Type: text/markdown
28
34
 
29
35
  # Python StateMachine
@@ -400,6 +406,13 @@ To generate diagrams, install with the `diagrams` extra (requires
400
406
  pip install python-statemachine[diagrams]
401
407
  ```
402
408
 
409
+ To load statecharts from declarative documents, install the IO extras
410
+ (`yaml` for YAML, `validation` for `validate=True`, or `io` for both):
411
+
412
+ ```
413
+ pip install python-statemachine[io]
414
+ ```
415
+
403
416
 
404
417
  ## Contributing
405
418
 
@@ -372,6 +372,13 @@ To generate diagrams, install with the `diagrams` extra (requires
372
372
  pip install python-statemachine[diagrams]
373
373
  ```
374
374
 
375
+ To load statecharts from declarative documents, install the IO extras
376
+ (`yaml` for YAML, `validation` for `validate=True`, or `io` for both):
377
+
378
+ ```
379
+ pip install python-statemachine[io]
380
+ ```
381
+
375
382
 
376
383
  ## Contributing
377
384
 
@@ -145,10 +145,13 @@ levels of the hierarchy.
145
145
 
146
146
  ```{note}
147
147
  The generic `on_exit_state()` and `on_enter_state()` callbacks also fire
148
- once per state in the set, but the `state` parameter is bound to the
149
- transition's `source` or `target` — not the individual state being
150
- exited/entered. Use `event_data` if you need the full context, or prefer
151
- state-specific callbacks for clarity.
148
+ once per state in the set, and the `state` parameter is bound to the
149
+ individual state being exited or entered, so you can tell each level of a
150
+ compound apart. On entry, `target` matches `state`; on exit, `source`
151
+ matches `state`. The opposite endpoint stays fixed at the transition's
152
+ `source` (on entry) or `target` (on exit). Prefer state-specific callbacks
153
+ (`on_exit_<state>`, `on_enter_<state>`) when you want to target one level
154
+ directly.
152
155
  ```
153
156
 
154
157
  ```{seealso}
@@ -147,6 +147,19 @@ class MyMachine(StateChart):
147
147
  .. autofunction:: statemachine.io.create_machine_class_from_definition
148
148
  ```
149
149
 
150
+ ## io.load
151
+
152
+ ```{versionadded} 3.2.0
153
+ ```
154
+
155
+ See [](io/index.md) for the guide.
156
+
157
+ ```{eval-rst}
158
+ .. autofunction:: statemachine.io.load
159
+
160
+ .. autofunction:: statemachine.io.build_processor
161
+ ```
162
+
150
163
  ## timeout
151
164
 
152
165
  ```{versionadded} 3.0.0
@@ -25,6 +25,15 @@ Existing projects should consider migrating when possible, as the
25
25
  SCXML-compliant behavior provides more predictable semantics.
26
26
  ```
27
27
 
28
+ ```{warning}
29
+ This page describes runtime *semantics*. If you **load SCXML documents** via
30
+ `SCXMLProcessor`, note that SCXML is executable content: by default the
31
+ datamodel is evaluated with a restricted AST allowlist and `<script>` is
32
+ rejected, so untrusted documents cannot execute arbitrary code. Pass
33
+ `trusted=True` only for SCXML you control. See the 3.2.0 release notes and
34
+ GHSA-v4jc-pm6r-3vj8.
35
+ ```
36
+
28
37
 
29
38
  ## Comparison table
30
39
 
@@ -149,6 +158,10 @@ When `True` (SCXML default), runtime exceptions in action callbacks
149
158
  internal `error.execution` events. When `False` (legacy default), exceptions
150
159
  propagate normally to the caller.
151
160
 
161
+ This flag only governs exceptions raised **inside** an action callback. An event
162
+ that doesn't match any enabled transition is a different case, controlled by
163
+ {ref}`allow_event_without_transition <behaviour>` instead.
164
+
152
165
  ```{note}
153
166
  {ref}`Validators <validators>` are **not** affected by this flag — they
154
167
  always propagate exceptions to the caller, regardless of the
@@ -289,3 +289,32 @@ which will:
289
289
 
290
290
  Monitor the workflow run at `https://github.com/fgmacedo/python-statemachine/actions` to
291
291
  confirm the release was published successfully.
292
+
293
+ #### 10. Publish the GitHub release
294
+
295
+ Create the GitHub release from the freshly pushed tag using the release notes file as the
296
+ body. Two adjustments are needed when going from MyST/Sphinx markdown to GitHub-flavored
297
+ markdown:
298
+
299
+ - Convert MyST directives (`` ```{note} ``, `` ```{warning} ``, etc.) to GitHub's
300
+ [alert syntax](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts)
301
+ (`> [!NOTE]`, `> [!WARNING]`) or to plain blockquotes.
302
+ - Rewrite intra-docs links. Relative links like `[3.1.0 release notes](3.1.0.md)` resolve
303
+ on ReadTheDocs but not on github.com. Replace them with absolute URLs against the
304
+ matching tag, e.g.
305
+ `https://github.com/fgmacedo/python-statemachine/blob/vX.Y.Z/docs/releases/X.Y.Z.md`.
306
+ Avoid linking to `https://python-statemachine.readthedocs.io/en/vX.Y.Z/` immediately
307
+ after publishing because the ReadTheDocs build for the new tag may still be in progress.
308
+
309
+ Then create the release. Use the converted notes as the body:
310
+
311
+ ```shell
312
+ gh release create vX.Y.Z \
313
+ --title "vX.Y.Z" \
314
+ --notes-file /tmp/release-X.Y.Z-notes.md \
315
+ --target main \
316
+ --verify-tag
317
+ ```
318
+
319
+ Confirm the rendered release at
320
+ `https://github.com/fgmacedo/python-statemachine/releases/tag/vX.Y.Z`.
@@ -131,6 +131,83 @@ delayed events, and cancellation.
131
131
  ```
132
132
 
133
133
 
134
+ (events-as-method-protocol)=
135
+
136
+ ## Events as a method-call protocol
137
+
138
+ Because every event is a callable method, a state machine can act as a guard
139
+ for the **order** in which your object's methods may be called. Set
140
+ `allow_event_without_transition = False` so that any call that doesn't match an
141
+ enabled transition raises `TransitionNotAllowed` instead of being silently
142
+ ignored. The transitions then describe the legal
143
+ sequence, and the machine enforces it for you:
144
+
145
+ ```py
146
+ >>> from statemachine import State, StateChart
147
+
148
+ >>> class Connection(StateChart):
149
+ ... "A client whose methods can only be called in a valid order."
150
+ ... allow_event_without_transition = False # reject any unexpected call
151
+ ...
152
+ ... disconnected = State(initial=True)
153
+ ... connected = State()
154
+ ... authenticated = State()
155
+ ...
156
+ ... connect = disconnected.to(connected)
157
+ ... authenticate = connected.to(authenticated)
158
+ ... disconnect = connected.to(disconnected) | authenticated.to(disconnected)
159
+ ...
160
+ ... def on_connect(self):
161
+ ... print("socket opened")
162
+ ...
163
+ ... def on_authenticate(self):
164
+ ... print("credentials accepted")
165
+
166
+ ```
167
+
168
+ Calling the methods in a valid order works:
169
+
170
+ ```py
171
+ >>> conn = Connection()
172
+ >>> conn.connect()
173
+ socket opened
174
+ >>> conn.authenticate()
175
+ credentials accepted
176
+ >>> "authenticated" in conn.configuration_values
177
+ True
178
+
179
+ ```
180
+
181
+ A call that isn't valid in the current state raises, so an out-of-order method
182
+ call fails loudly instead of doing nothing:
183
+
184
+ ```py
185
+ >>> fresh = Connection()
186
+
187
+ >>> fresh.authenticate() # must connect first
188
+ Traceback (most recent call last):
189
+ ...
190
+ statemachine.exceptions.TransitionNotAllowed: Can't Authenticate when in Disconnected.
191
+
192
+ ```
193
+
194
+ The same protection applies to unknown event names sent dynamically:
195
+
196
+ ```py
197
+ >>> fresh.send("teleport")
198
+ Traceback (most recent call last):
199
+ ...
200
+ statemachine.exceptions.TransitionNotAllowed: Can't teleport when in Disconnected.
201
+
202
+ ```
203
+
204
+ ```{seealso}
205
+ {ref}`behaviour` explains `allow_event_without_transition` and the other
206
+ class-level flags that switch between this strict mode and the tolerant,
207
+ event-driven default.
208
+ ```
209
+
210
+
134
211
  (event-parameter)=
135
212
 
136
213
  ## The `event` parameter on transitions
@@ -132,6 +132,71 @@ example combining multiple transitions on the same event.
132
132
  ```
133
133
 
134
134
 
135
+ (callable conditions)=
136
+
137
+ ### Callable conditions
138
+
139
+ Besides strings, `cond` and `unless` also accept callables directly, including
140
+ lambdas, allowing simple guards to be defined inline:
141
+
142
+ ```py
143
+ >>> class Turnstile(StateChart):
144
+ ... locked = State(initial=True)
145
+ ... unlocked = State(final=True)
146
+ ...
147
+ ... coin = locked.to(unlocked, cond=lambda machine: machine.credits > 0)
148
+ ...
149
+ ... credits = 0
150
+
151
+ >>> sm = Turnstile()
152
+ >>> sm.send("coin")
153
+ >>> "locked" in sm.configuration_values
154
+ True
155
+
156
+ >>> sm.credits = 1
157
+ >>> sm.send("coin")
158
+ >>> "unlocked" in sm.configuration_values
159
+ True
160
+
161
+ ```
162
+
163
+ Like any callback, a callable condition receives its arguments via
164
+ {ref}`dependency injection <dependency-injection>`: declare only the
165
+ parameters you need, using the injectable names (`machine`, `event`,
166
+ `source`, `target`, `model`, ...) or the arguments passed when triggering
167
+ the event:
168
+
169
+ ```py
170
+ >>> class Dispatcher(StateChart):
171
+ ... idle = State(initial=True)
172
+ ... dispatched = State(final=True)
173
+ ...
174
+ ... dispatch = idle.to(dispatched, cond=lambda priority=0: priority > 5)
175
+
176
+ >>> sm = Dispatcher()
177
+ >>> sm.send("dispatch", priority=1)
178
+ >>> "idle" in sm.configuration_values
179
+ True
180
+
181
+ >>> sm.send("dispatch", priority=9)
182
+ >>> "dispatched" in sm.configuration_values
183
+ True
184
+
185
+ ```
186
+
187
+ ```{warning}
188
+ Plain callables, like lambdas and functions defined outside the class body,
189
+ are called **unbound**, so `self` is not injected. A guard declared as
190
+ `cond=lambda self: ...` fails with a `TypeError` when evaluated. Use
191
+ `machine` instead of `self` to receive the state machine instance.
192
+
193
+ `self` is only available when the callable resolves to a bound method,
194
+ which happens when it is an attribute of the state machine class: either
195
+ referenced by name (`cond="my_condition"`) or defined in the class body
196
+ and passed by reference (`cond=my_condition`).
197
+ ```
198
+
199
+
135
200
  (condition expressions)=
136
201
 
137
202
  ### Condition expressions
@@ -28,6 +28,7 @@ shown side by side where possible. For a quick overview, jump to the
28
28
  | Error handling | Exceptions propagate | Optional {ref}`catch_errors_as_events <error-execution>` (`error.execution`) |
29
29
  | Validations | None | {ref}`Structural + callback checks <validations>` at definition and creation time |
30
30
  | SCXML compliance | [Not a goal](https://github.com/pytransitions/transitions/issues/446#issuecomment-646837282) | {ref}`W3C conformant <processing-model>` with automated test suite |
31
+ | Serialization / loading | `markup` dict round-trip (persist as JSON/YAML yourself; no SCXML) | [Secure `io.load()`](../io/index.md) from SCXML, JSON and YAML |
31
32
  | Processing model | Immediate or queued | Always queued ({ref}`run-to-completion <rtc-model>`) |
32
33
 
33
34
 
@@ -178,7 +179,7 @@ python-statemachine also supports hierarchical features not available in *transi
178
179
  See {ref}`compound-states` and {ref}`parallel-states` for the full reference.
179
180
 
180
181
 
181
- ### Creating machines from dicts
182
+ ### Creating machines from dicts and documents
182
183
 
183
184
  If you prefer the dict-based definition style familiar from *transitions*, you can
184
185
  use {func}`~statemachine.io.create_machine_class_from_definition` to build a
@@ -218,6 +219,28 @@ The result is a regular `StateChart` subclass — all features (validations, dia
218
219
  listeners, async) work exactly the same way. See
219
220
  {func}`~statemachine.io.create_machine_class_from_definition` for the full API.
220
221
 
222
+ #### Loading from SCXML, JSON or YAML documents
223
+
224
+ *transitions* can serialize a built machine to a Python dict with `MarkupMachine`
225
+ (`machine.markup`) and rebuild it via `Machine(markup=...)`. That dict isn't tied to a file
226
+ format — you persist it as JSON/YAML yourself — and callbacks and conditions are method-name
227
+ strings resolved against the model by import at build time, so it isn't designed to load
228
+ untrusted definitions, has no published schema, and doesn't cover SCXML.
229
+
230
+ python-statemachine provides a first-class, secure loader, {func}`~statemachine.io.load`,
231
+ that reads SCXML, JSON and YAML *documents* straight into a `StateChart`:
232
+
233
+ ```python
234
+ from statemachine.io import load
235
+
236
+ Machine = load("traffic_light.scxml") # or .json / .yaml; format detected from the extension
237
+ ```
238
+
239
+ Expressions in the document (guards, datamodel) are evaluated by a restricted allowlist —
240
+ never `eval` — so documents from untrusted sources are safe to load; the native JSON/YAML
241
+ format has a published JSON Schema (`validate=True`), and SCXML follows the W3C execution
242
+ model. See [](../io/index.md) for the full guide.
243
+
221
244
 
222
245
  ## Defining transitions
223
246
 
@@ -952,6 +975,8 @@ See {ref}`validations` for the full list.
952
975
  | {ref}`Listener/observer pattern <listeners>` | No | **Yes** |
953
976
  | {ref}`Definition-time validations <validations>` | No | **Yes** |
954
977
  | {ref}`SCXML conformance <processing-model>` | No | **Yes** |
978
+ | [Load from SCXML/JSON/YAML documents](../io/index.md) | No | **Yes** |
979
+ | Serialize a built machine to a portable definition | Yes (`markup`) | Partial (load only) |
955
980
  | {ref}`Diagrams <diagrams>` | Yes | Yes |
956
981
  | {ref}`Django integration <machinemixin>` | Community | Built-in |
957
982
  | {ref}`Model binding <models>` | Yes | Yes |
@@ -58,6 +58,17 @@ weighted_transitions
58
58
  timeout
59
59
  ```
60
60
 
61
+ ```{toctree}
62
+ :caption: IO and formats
63
+ :maxdepth: 2
64
+ :hidden:
65
+
66
+ io/index
67
+ io/formats
68
+ io/json_schema
69
+ io/security
70
+ ```
71
+
61
72
  ```{toctree}
62
73
  :caption: How to
63
74
  :maxdepth: 2
@@ -21,14 +21,21 @@ Alternatively, if you prefer using [pip](https://pip.pypa.io):
21
21
  python3 -m pip install python-statemachine
22
22
  ```
23
23
 
24
- For those looking to generate diagrams from your state machines, [pydot](https://github.com/pydot/pydot) and [Graphviz](https://graphviz.org/) are required.
25
- Conveniently, you can install python-statemachine along with the `pydot` dependency using the extras option.
26
- For more information, please refer to our documentation.
24
+ ## Optional extras
25
+
26
+ Some features require extra dependencies, available as pip extras:
27
27
 
28
28
  ```shell
29
- python3 -m pip install "python-statemachine[diagrams]"
29
+ python3 -m pip install "python-statemachine[diagrams]" # pydot, to generate diagrams from your machines
30
+ python3 -m pip install "python-statemachine[yaml]" # PyYAML, to load YAML statechart documents
31
+ python3 -m pip install "python-statemachine[validation]" # jsonschema, to validate documents (validate=True)
32
+ python3 -m pip install "python-statemachine[io]" # PyYAML + jsonschema, the full JSON/YAML IO stack
30
33
  ```
31
34
 
35
+ Diagram generation also requires the [Graphviz](https://graphviz.org/) system package (see
36
+ [](diagram.md)). The `[yaml]`, `[validation]` and `[io]` extras back the declarative loaders
37
+ documented in [](io/index.md); loading JSON needs no extra, as it uses only the standard library.
38
+
32
39
 
33
40
 
34
41
  ## From sources