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.
- python_statemachine-3.2.1/.github/workflows/pages.yml +51 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/workflows/python-package.yml +1 -1
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.gitignore +5 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.pre-commit-config.yaml +1 -1
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/AGENTS.md +32 -2
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/PKG-INFO +16 -3
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/README.md +7 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/actions.md +7 -4
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/api.md +13 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/behaviour.md +13 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/contributing.md +29 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/events.md +77 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/guards.md +65 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/how-to/coming_from_transitions.md +26 -1
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/index.md +11 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/installation.md +11 -4
- python_statemachine-3.2.1/docs/io/formats.md +479 -0
- python_statemachine-3.2.1/docs/io/index.md +129 -0
- python_statemachine-3.2.1/docs/io/json_schema.md +56 -0
- python_statemachine-3.2.1/docs/io/security.md +217 -0
- python_statemachine-3.2.1/docs/releases/3.2.0.md +232 -0
- python_statemachine-3.2.1/docs/releases/3.2.1.md +228 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/index.md +3 -1
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/states.md +1 -1
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/validations.md +7 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/pyproject.toml +27 -28
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/__init__.py +1 -1
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/callbacks.py +5 -11
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/configuration.py +5 -6
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/extract.py +26 -27
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/formatter.py +5 -7
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/model.py +9 -11
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/dot.py +20 -26
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/mermaid.py +36 -40
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/table.py +7 -9
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/weighted.py +7 -11
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/dispatcher.py +18 -13
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/async_.py +20 -9
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/base.py +26 -17
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/event.py +1 -2
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/exceptions.py +2 -2
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/factory.py +11 -15
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/graph.py +2 -2
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/invoke.py +12 -11
- python_statemachine-3.2.1/statemachine/io/__init__.py +52 -0
- python_statemachine-3.2.1/statemachine/io/actions.py +627 -0
- python_statemachine-3.2.1/statemachine/io/builder.py +195 -0
- python_statemachine-3.1.2/statemachine/io/__init__.py → python_statemachine-3.2.1/statemachine/io/class_factory.py +32 -21
- python_statemachine-3.2.1/statemachine/io/evaluators.py +303 -0
- python_statemachine-3.2.1/statemachine/io/interpreter.py +128 -0
- {python_statemachine-3.1.2/statemachine/io/scxml → python_statemachine-3.2.1/statemachine/io}/invoke.py +89 -49
- python_statemachine-3.2.1/statemachine/io/json/__init__.py +1 -0
- python_statemachine-3.2.1/statemachine/io/json/reader.py +27 -0
- python_statemachine-3.2.1/statemachine/io/loader.py +175 -0
- python_statemachine-3.2.1/statemachine/io/model.py +268 -0
- python_statemachine-3.2.1/statemachine/io/native.py +402 -0
- python_statemachine-3.2.1/statemachine/io/ports.py +83 -0
- python_statemachine-3.2.1/statemachine/io/schemas/statechart.schema.json +258 -0
- python_statemachine-3.2.1/statemachine/io/scxml/__init__.py +15 -0
- python_statemachine-3.2.1/statemachine/io/scxml/processor.py +33 -0
- python_statemachine-3.1.2/statemachine/io/scxml/parser.py → python_statemachine-3.2.1/statemachine/io/scxml/reader.py +88 -56
- python_statemachine-3.2.1/statemachine/io/system_variables.py +199 -0
- python_statemachine-3.2.1/statemachine/io/validation.py +44 -0
- python_statemachine-3.2.1/statemachine/io/yaml/__init__.py +1 -0
- python_statemachine-3.2.1/statemachine/io/yaml/reader.py +65 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/en/LC_MESSAGES/statemachine.po +19 -19
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/hi_IN/LC_MESSAGES/statemachine.po +19 -19
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/pt_BR/LC_MESSAGES/statemachine.po +19 -19
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/locale/zh_CN/LC_MESSAGES/statemachine.po +19 -19
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/orderedset.py +15 -6
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/registry.py +1 -4
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/signature.py +2 -5
- python_statemachine-3.2.1/statemachine/spec_parser.py +428 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/state.py +7 -8
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/statemachine.py +18 -20
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/states.py +3 -5
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/transition.py +3 -4
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/transition_list.py +4 -5
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/transition_mixin.py +1 -1
- python_statemachine-3.2.1/tests/io/format_parity/guarded_counter.json +37 -0
- python_statemachine-3.2.1/tests/io/format_parity/guarded_counter.scxml +16 -0
- python_statemachine-3.2.1/tests/io/format_parity/guarded_counter.yaml +16 -0
- python_statemachine-3.2.1/tests/io/format_parity/invoke_child.json +37 -0
- python_statemachine-3.2.1/tests/io/format_parity/invoke_child.scxml +18 -0
- python_statemachine-3.2.1/tests/io/format_parity/invoke_child.yaml +17 -0
- python_statemachine-3.2.1/tests/io/format_parity/native/order_pipeline.json +92 -0
- python_statemachine-3.2.1/tests/io/format_parity/native/order_pipeline.yaml +47 -0
- python_statemachine-3.2.1/tests/io/format_parity/native/telemetry.json +122 -0
- python_statemachine-3.2.1/tests/io/format_parity/native/telemetry.yaml +50 -0
- python_statemachine-3.2.1/tests/io/format_parity/system_event.json +30 -0
- python_statemachine-3.2.1/tests/io/format_parity/system_event.scxml +13 -0
- python_statemachine-3.2.1/tests/io/format_parity/system_event.yaml +14 -0
- python_statemachine-3.2.1/tests/io/format_parity/w3c_test147_if.json +76 -0
- python_statemachine-3.2.1/tests/io/format_parity/w3c_test147_if.scxml +26 -0
- python_statemachine-3.2.1/tests/io/format_parity/w3c_test147_if.yaml +29 -0
- python_statemachine-3.2.1/tests/io/format_parity/w3c_test155_foreach.json +49 -0
- python_statemachine-3.2.1/tests/io/format_parity/w3c_test155_foreach.scxml +20 -0
- python_statemachine-3.2.1/tests/io/format_parity/w3c_test155_foreach.yaml +22 -0
- python_statemachine-3.2.1/tests/io/test_format_parity.py +59 -0
- python_statemachine-3.2.1/tests/io/test_guards_parity.py +145 -0
- python_statemachine-3.2.1/tests/io/test_interpreter.py +258 -0
- python_statemachine-3.2.1/tests/io/test_loader.py +177 -0
- python_statemachine-3.2.1/tests/io/test_model.py +38 -0
- python_statemachine-3.2.1/tests/io/test_native.py +336 -0
- python_statemachine-3.2.1/tests/io/test_native_behavior.py +64 -0
- python_statemachine-3.2.1/tests/io/test_native_invoke.py +128 -0
- python_statemachine-3.2.1/tests/io/test_ports.py +70 -0
- python_statemachine-3.2.1/tests/io/test_readers.py +58 -0
- python_statemachine-3.2.1/tests/io/test_security.py +824 -0
- python_statemachine-3.2.1/tests/io/test_validation.py +192 -0
- python_statemachine-3.2.1/tests/scxml/_harness.py +58 -0
- python_statemachine-3.2.1/tests/scxml/test_scxml_cases.py +53 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_callbacks.py +96 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_conditions_algebra.py +30 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_configuration.py +92 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_copy.py +3 -2
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_invoke.py +59 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_io.py +33 -1
- python_statemachine-3.2.1/tests/test_scxml_datamodel.py +165 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_scxml_units.py +162 -79
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_spec_parser.py +29 -0
- python_statemachine-3.2.1/tests/test_spec_parser_values.py +168 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_state.py +15 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_compound.py +50 -0
- python_statemachine-3.2.1/tests/test_translation_names.py +121 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/uv.lock +512 -1132
- python_statemachine-3.1.2/statemachine/io/scxml/actions.py +0 -650
- python_statemachine-3.1.2/statemachine/io/scxml/processor.py +0 -263
- python_statemachine-3.1.2/statemachine/io/scxml/schema.py +0 -175
- python_statemachine-3.1.2/statemachine/spec_parser.py +0 -245
- python_statemachine-3.1.2/tests/scxml/test_scxml_cases.py +0 -101
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.git-blame-ignore-revs +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/FUNDING.yml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/ISSUE_TEMPLATE.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.github/workflows/release.yml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/.readthedocs.yaml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/CLAUDE.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/LICENSE +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/conftest.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/contributing.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/_static/custom_machine.css +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/async.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/authors.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/concepts.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/conf.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/diagram.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/error_handling.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/how-to/coming_from_state_pattern.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/_oc_machine_processing.svg +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/internal_transition_sc.png +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/lab_approval_machine_accepted.png +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/oc_machine_processing.svg +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/python-statemachine.png +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/readme_trafficlightmachine.png +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/test_state_machine_internal.png +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/images/traffic_light_machine.png +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/integrations.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/invoke.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/listeners.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/models.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/processing_model.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.1.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.2.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.3.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.4.2.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.5.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.5.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.6.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.6.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.6.2.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.7.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.7.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.8.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/0.9.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.2.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/1.0.3.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.0.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.1.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.1.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.1.2.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.2.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.2.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.3.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.4.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.5.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.3.6.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.4.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.5.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/2.6.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.0.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.1.0.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.1.1.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/3.1.2.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/releases/upgrade_2x_to_3.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/statechart.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/timeout.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/transitions.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/tutorial.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/weighted_transitions.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/__main__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/renderers/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/diagram/sphinx_ext.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/contrib/timeout.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/engines/sync.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/event_data.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/events.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/i18n.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/mixins.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/model.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/py.typed +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/statemachine/utils.py +0 -0
- {python_statemachine-3.1.2/statemachine/io/scxml → python_statemachine-3.2.1/tests}/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/conftest.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/app.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/core/__init__,.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/core/settings.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/core/wsgi.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/manage.py +0 -0
- {python_statemachine-3.1.2/tests → python_statemachine-3.2.1/tests/django_project/workflow}/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/apps.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/models.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/statemachines.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/django_project/workflow/tests.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/README.rst +0 -0
- {python_statemachine-3.1.2/tests/django_project/workflow → python_statemachine-3.2.1/tests/examples}/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/ai_shell_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/air_conditioner_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/all_actions_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/async_guess_the_number_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/async_without_loop_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/enum_campaign_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/guess_the_number_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/lor_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/order_control_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/order_control_rich_model_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/persistent_model_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/recursive_event_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/reusing_transitions_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/sqlite_persistent_model_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_cleanup_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_compound_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_delayed_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_error_handling_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_eventless_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_history_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_in_condition_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/statechart_parallel_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/traffic_light_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/user_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/examples/weighted_idle_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/helpers.py +0 -0
- {python_statemachine-3.1.2/tests/examples → python_statemachine-3.2.1/tests/io}/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/middle_earth_journey.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/middle_earth_journey_two_compounds.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/middle_earth_journey_with_finals.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/moria_expedition.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/moria_expedition_with_escape.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/quest_for_erebor.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/compound/shire_to_rivendell.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/destroy_the_ring.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/destroy_the_ring_simple.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/nested_quest_donedata.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_done_convention.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_explicit_id.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_multi_word.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/donedata/quest_for_erebor_with_event.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_convention_event.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_convention_transition_list.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_action_sc.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_action_sm_with_flag.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_after_sc.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_error_handler_sc.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_guard_sc.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_guard_sm.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/error/error_in_on_enter_sc.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/auto_advance.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/beacon_chain.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/beacon_chain_lighting.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/coordinated_advance.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/ring_corruption.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/ring_corruption_with_bear_ring.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/eventless/ring_corruption_with_tick.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/deep_memory_of_moria.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/gollum_personality.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/gollum_personality_default_gollum.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/gollum_personality_with_default.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/history/shallow_moria.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/combined_guard.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/descendant_check.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/eventless_in.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/fellowship.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/fellowship_coordination.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/in_condition/gate_of_moria.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/session.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/session_with_done_state.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/two_towers.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/war_of_the_ring.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/parallel/war_with_exit.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_actions.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_compound.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_deep_history.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_guards.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_history.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_internal.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_parallel.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_parallel_compound.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_self_transition.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/showcase_simple.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/transition_from_any.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/tutorial_coffee_order.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/multi_validator.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/order_validation.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/order_validation_no_error_events.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/validator_fallthrough.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/validator_with_cond.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/validators/validator_with_error_transition.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/campaign_machine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/campaign_machine_with_validator.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/campaign_machine_with_values.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/machines/workflow/reverse_traffic_light.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/models.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scrape_images.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/conftest.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/test_microwave.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/LICENSE +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test144.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test145.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test147.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test148.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test149.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test150.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test151.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test152.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test153.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test155.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test156.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test158.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test159.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test172.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test173.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test174.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test175.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test176.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test179.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test183.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test185.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test186.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test187.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test189.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test190.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test191.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test192.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test194.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test198.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test199.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test200.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test205.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test207.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test208.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test210.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test215.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test216.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test216sub1.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test220.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test223.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test224.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test225.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test226.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test226sub1.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test228.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test229.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test232.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test233.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test234.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test235.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test236.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test237.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test239.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test239sub1.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test240.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test241.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test242.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test242sub1.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test243.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test244.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test245.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test247.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test252.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test253.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test276.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test276sub1.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test277.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test279.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test280.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test286.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test287.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test294.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test298.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test302.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test303.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test304.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test309.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test310.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test311.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test312.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test318.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test319.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test321.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test322.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test323.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test324.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test325.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test326.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test329.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test330.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test331.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test332.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test333.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test335.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test336.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test337.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test338.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test339.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test342.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test343.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test344.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test346.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test347.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test348.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test349.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test350.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test351.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test352.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test354.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test355.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test364.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test372.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test375.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test376.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test377.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test378.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test387.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test388.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test396.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test399.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test401.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test402.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test403a.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test403b.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test403c.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test404.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test405.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test406.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test407.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test409.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test411.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test412.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test413.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test416.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test417.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test419.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test421.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test422.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test423.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test487.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test488.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test495.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test496.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test500.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test501.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test503.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test504.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test505.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test506.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test521.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test525.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test527.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test528.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test529.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test530.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test533.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test550.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test551.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test552.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test552.txt +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test553.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test554.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test570.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test576.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test579.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/mandatory/test580.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test193.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test201.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test278.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test444.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test445.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test446.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test446.txt +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test448.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test449.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test451.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test452.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test453.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test456.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test457.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test459.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test460.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test509.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test510.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test518.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test519.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test520.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test522.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test531.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test532.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test534.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test557.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test557.txt +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test558.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test558.txt +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test560.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test561.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test562.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test567.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test569.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test577.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/scxml/w3c/optional/test578.scxml +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_actions.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_api_contract.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_async.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_async_futures.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_callbacks_isolation.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_class_listeners.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_contrib_diagram.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_contrib_timeout.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_dispatcher.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_error_execution.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_events.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_examples.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_fellowship_quest.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_listener.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_mermaid_renderer.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_mixins.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_mock_compatibility.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_multiple_destinations.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_optional_pydot.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_profiling.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_registry.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_rtc.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_signature.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_signature_positional_only.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_state_callbacks.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_delayed.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_donedata.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_error.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_eventless.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_history.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_in_condition.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statechart_parallel.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine_bounded_transitions.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine_compat.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_statemachine_inheritance.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_threading.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_transition_list.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_transition_table.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_transitions.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_validators.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/test_weighted_transitions.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/__init__.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/issue308.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/issue384_multiple_observers.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/issue449.md +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/test_issue434.py +0 -0
- {python_statemachine-3.1.2 → python_statemachine-3.2.1}/tests/testcases/test_issue480.py +0 -0
- {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
|
|
@@ -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.
|
|
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
|
|
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.
|
|
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,
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
state
|
|
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
|
{python_statemachine-3.1.2 → python_statemachine-3.2.1}/docs/how-to/coming_from_transitions.md
RENAMED
|
@@ -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 |
|
|
@@ -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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|