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_docstringnow short-circuits when the class docstring contains
no{statechart:FORMAT}placeholder, skipping the formatter import for
the common case.statemachine.contrib.diagramno longer re-exports renderer classes at
the package top level, and renderer modules are only imported when
actually used. The dependency is only resolved whendot/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.14for py3.10/3.11 (multiple CVEs) - pillow
>=12.2.0for 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.