StateChart 3.1.2

May 18, 2026

Bug fixes in 3.1.2

pydot is optional again

Starting in 3.1.0, defining any StateMachine or StateChart subclass implicitly required pydot to be installed. The metaclass invokes _expand_docstring() for every class, and that path eagerly imported the diagram formatter, which in turn imported pydot at module load time, so import of a user module failed with ModuleNotFoundError: No module named 'pydot' even when no diagrams were rendered.

Two changes restore the original behavior:

  • _expand_docstring now short-circuits when the class docstring contains no {statechart:FORMAT} placeholder, skipping the formatter import for the common case.

  • statemachine.contrib.diagram no longer re-exports renderer classes at the package top level, and renderer modules are only imported when actually used. The dependency is only resolved when dot/svg rendering is requested. Mermaid and Markdown/RST formats work without pydot.

If your code imports DotRenderer, DotRendererConfig, MermaidRenderer or MermaidRendererConfig directly from statemachine.contrib.diagram, import them from the renderer submodule instead:

from statemachine.contrib.diagram.renderers.dot import DotRenderer
from statemachine.contrib.diagram.renderers.mermaid import MermaidRenderer

#622.

Other changes in 3.1.2

Security and dependency bumps

Picked up from the dependency refresh applied to main:

  • ruff >=0.15.13

  • pytest >=9.0.3 (CVE-2025, tmpdir handling) for py>=3.10

  • django >=5.2.14 for py3.10/3.11 (multiple CVEs)

  • pillow >=12.2.0 for py>=3.10 (multiple CVEs)

  • transitive: urllib3 2.6.3 -> 2.7.0 (GHSA-qccp-gfcp-xxvc), requests 2.33.1 -> 2.34.2

CI workflows: actions/checkout v4 → v5, actions/setup-python v5 → v6, astral-sh/setup-uv v3 → v8 (pinned to v8.1.0), codecov/codecov-action v4 → v6.