This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v3-0-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-0-test by this push:
new 83e579a7112 [v3-0-test] Update diagrams generated in our code:
(#51996) (#54129)
83e579a7112 is described below
commit 83e579a711236e49e43511f62af8c0ea37e9bd15
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Aug 5 14:15:29 2025 +0200
[v3-0-test] Update diagrams generated in our code: (#51996) (#54129)
The diagram generation was slightly broken after we moved the docs
to devel-common. This PR fixes it by adding proper paths to common
diagramming .png files but also add inline pyproject.toml definitions
so that the diagram generating scripts can be run as "standalone"
scripts with `uv run`.
Also multi-team diagram was simplified following recent AIP-67 proposal.
(cherry picked from commit e7c35aff298f5b83f69f5949bdf96619cee7c31c)
---
...iagram_auth_manager_airflow_architecture.md5sum | 2 +-
.../diagram_auth_manager_airflow_architecture.png | Bin 54220 -> 50671 bytes
.../diagram_auth_manager_airflow_architecture.py | 15 ++++++-
.../img/diagram_basic_airflow_architecture.md5sum | 2 +-
.../img/diagram_basic_airflow_architecture.png | Bin 74154 -> 116194 bytes
.../docs/img/diagram_basic_airflow_architecture.py | 17 ++++++--
...agram_dag_processor_airflow_architecture.md5sum | 2 +-
.../diagram_dag_processor_airflow_architecture.png | Bin 164778 -> 237657 bytes
.../diagram_dag_processor_airflow_architecture.py | 18 ++++++--
...diagram_distributed_airflow_architecture.md5sum | 2 +-
.../diagram_distributed_airflow_architecture.png | Bin 126505 -> 192497 bytes
.../diagram_distributed_airflow_architecture.py | 18 ++++++--
.../diagram_multi_team_airflow_architecture.md5sum | 2 +-
.../diagram_multi_team_airflow_architecture.png | Bin 398313 -> 574248 bytes
.../img/diagram_multi_team_airflow_architecture.py | 48 ++++++++-------------
.../docs/img/diagram_task_lifecycle.md5sum | 2 +-
airflow-core/docs/img/diagram_task_lifecycle.png | Bin 529144 -> 604573 bytes
airflow-core/docs/img/diagram_task_lifecycle.py | 28 +++++++++---
18 files changed, 101 insertions(+), 55 deletions(-)
diff --git
a/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.md5sum
b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.md5sum
index ac3e24d8483..d108e6b94b9 100644
--- a/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.md5sum
+++ b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.md5sum
@@ -1 +1 @@
-5b82cba489898a46dcfe5f458eeee33b
+cdcfa104c489e0e679894e344084c061
diff --git
a/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.png
b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.png
index 35f3f418f2d..2a677c0dc9b 100644
Binary files
a/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.png and
b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.png differ
diff --git a/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.py
b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.py
index 453d17267c8..b38c633cfde 100644
--- a/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.py
+++ b/airflow-core/docs/img/diagram_auth_manager_airflow_architecture.py
@@ -14,6 +14,13 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+# "rich>=12.4.4",
+# "diagrams>=0.23.4",
+# ]
+# ///
from __future__ import annotations
from pathlib import Path
@@ -25,7 +32,13 @@ from rich.console import Console
MY_DIR = Path(__file__).parent
MY_FILENAME = Path(__file__).with_suffix("").name
-PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" /
"python_multiprocess_logo.png"
+AIRFLOW_SOURCES_ROOT = MY_DIR.parents[2]
+DIAGRAMS_DIR = AIRFLOW_SOURCES_ROOT / "devel-common" / "src" / "docs" /
"diagrams"
+PYTHON_MULTIPROCESS_LOGO = DIAGRAMS_DIR / "python_multiprocess_logo.png"
+PACKAGES_IMAGE = DIAGRAMS_DIR / "packages.png"
+DATABASE_IMAGE = DIAGRAMS_DIR / "database.png"
+MULTIPLE_FILES_IMAGE = DIAGRAMS_DIR / "multiple_files.png"
+CONFIG_FILE = DIAGRAMS_DIR / "config_file.png"
console = Console(width=400, color_system="standard")
diff --git a/airflow-core/docs/img/diagram_basic_airflow_architecture.md5sum
b/airflow-core/docs/img/diagram_basic_airflow_architecture.md5sum
index a39735d9016..7e45d83de2a 100644
--- a/airflow-core/docs/img/diagram_basic_airflow_architecture.md5sum
+++ b/airflow-core/docs/img/diagram_basic_airflow_architecture.md5sum
@@ -1 +1 @@
-ab985b928d9e65c5889cf612dcac4506
+77f976811a58e56d80a27df345b0d94c
diff --git a/airflow-core/docs/img/diagram_basic_airflow_architecture.png
b/airflow-core/docs/img/diagram_basic_airflow_architecture.png
index 0a3d8cbf7f8..ffef80a834c 100644
Binary files a/airflow-core/docs/img/diagram_basic_airflow_architecture.png and
b/airflow-core/docs/img/diagram_basic_airflow_architecture.png differ
diff --git a/airflow-core/docs/img/diagram_basic_airflow_architecture.py
b/airflow-core/docs/img/diagram_basic_airflow_architecture.py
index c6605c3c2d7..a5185fcca9b 100644
--- a/airflow-core/docs/img/diagram_basic_airflow_architecture.py
+++ b/airflow-core/docs/img/diagram_basic_airflow_architecture.py
@@ -14,6 +14,13 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+# "rich>=12.4.4",
+# "diagrams>=0.23.4",
+# ]
+# ///
from __future__ import annotations
from pathlib import Path
@@ -26,9 +33,13 @@ from rich.console import Console
MY_DIR = Path(__file__).parent
MY_FILENAME = Path(__file__).with_suffix("").name
-PACKAGES_IMAGE = MY_DIR.parents[1] / "diagrams" / "packages.png"
-DATABASE_IMAGE = MY_DIR.parents[1] / "diagrams" / "database.png"
-MULTIPLE_FILES_IMAGE = MY_DIR.parents[1] / "diagrams" / "multiple_files.png"
+AIRFLOW_SOURCES_ROOT = MY_DIR.parents[2]
+DIAGRAMS_DIR = AIRFLOW_SOURCES_ROOT / "devel-common" / "src" / "docs" /
"diagrams"
+PYTHON_MULTIPROCESS_LOGO = DIAGRAMS_DIR / "python_multiprocess_logo.png"
+PACKAGES_IMAGE = DIAGRAMS_DIR / "packages.png"
+DATABASE_IMAGE = DIAGRAMS_DIR / "database.png"
+MULTIPLE_FILES_IMAGE = DIAGRAMS_DIR / "multiple_files.png"
+CONFIG_FILE = DIAGRAMS_DIR / "config_file.png"
console = Console(width=400, color_system="standard")
diff --git
a/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.md5sum
b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.md5sum
index b5e571b9bb2..9a2e8b5175b 100644
--- a/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.md5sum
+++ b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.md5sum
@@ -1 +1 @@
-fca4937b28cd30033663dd8253332f14
+45f71f4dbb89f345bc5fe1fd8cf5c152
diff --git
a/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.png
b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.png
index b1379af9b01..c793e4f801b 100644
Binary files
a/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.png and
b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.png differ
diff --git
a/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.py
b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.py
index 3690b72bd83..9d6ce60078b 100644
--- a/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.py
+++ b/airflow-core/docs/img/diagram_dag_processor_airflow_architecture.py
@@ -14,6 +14,13 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+# "rich>=12.4.4",
+# "diagrams>=0.23.4",
+# ]
+# ///
from __future__ import annotations
from pathlib import Path
@@ -25,10 +32,13 @@ from rich.console import Console
MY_DIR = Path(__file__).parent
MY_FILENAME = Path(__file__).with_suffix("").name
-PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" /
"python_multiprocess_logo.png"
-PACKAGES_IMAGE = MY_DIR.parents[1] / "diagrams" / "packages.png"
-DATABASE_IMAGE = MY_DIR.parents[1] / "diagrams" / "database.png"
-MULTIPLE_FILES_IMAGE = MY_DIR.parents[1] / "diagrams" / "multiple_files.png"
+AIRFLOW_SOURCES_ROOT = MY_DIR.parents[2]
+DIAGRAMS_DIR = AIRFLOW_SOURCES_ROOT / "devel-common" / "src" / "docs" /
"diagrams"
+PYTHON_MULTIPROCESS_LOGO = DIAGRAMS_DIR / "python_multiprocess_logo.png"
+PACKAGES_IMAGE = DIAGRAMS_DIR / "packages.png"
+DATABASE_IMAGE = DIAGRAMS_DIR / "database.png"
+MULTIPLE_FILES_IMAGE = DIAGRAMS_DIR / "multiple_files.png"
+CONFIG_FILE = DIAGRAMS_DIR / "config_file.png"
console = Console(width=400, color_system="standard")
diff --git
a/airflow-core/docs/img/diagram_distributed_airflow_architecture.md5sum
b/airflow-core/docs/img/diagram_distributed_airflow_architecture.md5sum
index 2c4f6490c9b..bdb6dfd7b2d 100644
--- a/airflow-core/docs/img/diagram_distributed_airflow_architecture.md5sum
+++ b/airflow-core/docs/img/diagram_distributed_airflow_architecture.md5sum
@@ -1 +1 @@
-12aba2b822821929aa8c5099c82399de
+e702f41492ce4856db9a092f4a01c89b
diff --git a/airflow-core/docs/img/diagram_distributed_airflow_architecture.png
b/airflow-core/docs/img/diagram_distributed_airflow_architecture.png
index 798bd81b4c8..66117d74e0b 100644
Binary files
a/airflow-core/docs/img/diagram_distributed_airflow_architecture.png and
b/airflow-core/docs/img/diagram_distributed_airflow_architecture.png differ
diff --git a/airflow-core/docs/img/diagram_distributed_airflow_architecture.py
b/airflow-core/docs/img/diagram_distributed_airflow_architecture.py
index 7362b2bb19d..264fc67e7fb 100644
--- a/airflow-core/docs/img/diagram_distributed_airflow_architecture.py
+++ b/airflow-core/docs/img/diagram_distributed_airflow_architecture.py
@@ -14,6 +14,13 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+# "rich>=12.4.4",
+# "diagrams>=0.23.4",
+# ]
+# ///
from __future__ import annotations
from pathlib import Path
@@ -25,10 +32,13 @@ from rich.console import Console
MY_DIR = Path(__file__).parent
MY_FILENAME = Path(__file__).with_suffix("").name
-PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" /
"python_multiprocess_logo.png"
-PACKAGES_IMAGE = MY_DIR.parents[1] / "diagrams" / "packages.png"
-DATABASE_IMAGE = MY_DIR.parents[1] / "diagrams" / "database.png"
-MULTIPLE_FILES_IMAGE = MY_DIR.parents[1] / "diagrams" / "multiple_files.png"
+AIRFLOW_SOURCES_ROOT = MY_DIR.parents[2]
+DIAGRAMS_DIR = AIRFLOW_SOURCES_ROOT / "devel-common" / "src" / "docs" /
"diagrams"
+PYTHON_MULTIPROCESS_LOGO = DIAGRAMS_DIR / "python_multiprocess_logo.png"
+PACKAGES_IMAGE = DIAGRAMS_DIR / "packages.png"
+DATABASE_IMAGE = DIAGRAMS_DIR / "database.png"
+MULTIPLE_FILES_IMAGE = DIAGRAMS_DIR / "multiple_files.png"
+CONFIG_FILE = DIAGRAMS_DIR / "config_file.png"
console = Console(width=400, color_system="standard")
diff --git
a/airflow-core/docs/img/diagram_multi_team_airflow_architecture.md5sum
b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.md5sum
index f66f7a9eeee..112c4c3144c 100644
--- a/airflow-core/docs/img/diagram_multi_team_airflow_architecture.md5sum
+++ b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.md5sum
@@ -1 +1 @@
-3c71f362a4a78d3f979ccab101ef662b
+5d7f15fe6684789fde4c8b4ee5ae058d
diff --git a/airflow-core/docs/img/diagram_multi_team_airflow_architecture.png
b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.png
index 3aa1cfa4fe5..70e667207c9 100644
Binary files
a/airflow-core/docs/img/diagram_multi_team_airflow_architecture.png and
b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.png differ
diff --git a/airflow-core/docs/img/diagram_multi_team_airflow_architecture.py
b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.py
index 08f2e2841d0..d6475bf92a5 100644
--- a/airflow-core/docs/img/diagram_multi_team_airflow_architecture.py
+++ b/airflow-core/docs/img/diagram_multi_team_airflow_architecture.py
@@ -14,6 +14,13 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+# "rich>=12.4.4",
+# "diagrams>=0.23.4",
+# ]
+# ///
from __future__ import annotations
from pathlib import Path
@@ -26,11 +33,13 @@ from rich.console import Console
MY_DIR = Path(__file__).parent
MY_FILENAME = Path(__file__).with_suffix("").name
-PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" /
"python_multiprocess_logo.png"
-PACKAGES_IMAGE = MY_DIR.parents[1] / "diagrams" / "packages.png"
-DATABASE_IMAGE = MY_DIR.parents[1] / "diagrams" / "database.png"
-MULTIPLE_FILES_IMAGE = MY_DIR.parents[1] / "diagrams" / "multiple_files.png"
-CONFIG_FILE = MY_DIR.parents[1] / "diagrams" / "config_file.png"
+AIRFLOW_SOURCES_ROOT = MY_DIR.parents[2]
+DIAGRAMS_DIR = AIRFLOW_SOURCES_ROOT / "devel-common" / "src" / "docs" /
"diagrams"
+PYTHON_MULTIPROCESS_LOGO = DIAGRAMS_DIR / "python_multiprocess_logo.png"
+PACKAGES_IMAGE = DIAGRAMS_DIR / "packages.png"
+DATABASE_IMAGE = DIAGRAMS_DIR / "database.png"
+MULTIPLE_FILES_IMAGE = DIAGRAMS_DIR / "multiple_files.png"
+CONFIG_FILE = DIAGRAMS_DIR / "config_file.png"
console = Console(width=400, color_system="standard")
@@ -77,8 +86,6 @@ def generate_dag_processor_airflow_diagram():
"Common\nOrganization\nPlugins &\nPackages",
PACKAGES_IMAGE.as_posix()
)
- organization_config_file =
Custom("Config\nFile\nCommon\nOrganization", CONFIG_FILE.as_posix())
-
internal_api = Custom("Task SDK\nGRPC API",
PYTHON_MULTIPROCESS_LOGO.as_posix())
(
internal_api
@@ -104,7 +111,7 @@ def generate_dag_processor_airflow_diagram():
)
deployment_manager_1 = User("Deployment\nManager\nTeam 1")
- dag_author_1 = User("DAG Author\nTeamt 1")
+ dag_author_1 = User("DAG Author\nTeam 1")
with Cluster("Team 1 Airflow Deployment", graph_attr={"bgcolor":
"#AAAABB", "fontsize": "22"}):
with Cluster("No DB access"):
@@ -113,9 +120,8 @@ def generate_dag_processor_airflow_diagram():
triggerer_1 = Custom("Triggerer(s)",
PYTHON_MULTIPROCESS_LOGO.as_posix())
with Cluster("Parsing"):
dag_processors_1 = Custom("DAG\nProcessor(s)",
PYTHON_MULTIPROCESS_LOGO.as_posix())
- dag_files_1 = Custom("DAGS/Team 1",
MULTIPLE_FILES_IMAGE.as_posix())
+ dag_files_1 = Custom("DAG Bundles\nTeam 1",
MULTIPLE_FILES_IMAGE.as_posix())
plugins_and_packages_1 = Custom("Plugins\n& Packages\nTenant
1", PACKAGES_IMAGE.as_posix())
- config_file_1 = Custom("Config\nFile\nTeam 1",
CONFIG_FILE.as_posix())
operations_user_1 = User("Operations User\nTeam 1")
deployment_manager_2 = User("Deployment\nManager\nTeam 2")
@@ -128,9 +134,8 @@ def generate_dag_processor_airflow_diagram():
triggerer_2 = Custom("Triggerer(s)",
PYTHON_MULTIPROCESS_LOGO.as_posix())
with Cluster("Parsing"):
dag_processors_2 = Custom("DAG\nProcessor(s)",
PYTHON_MULTIPROCESS_LOGO.as_posix())
- dag_files_2 = Custom("DAGS/Team 2",
MULTIPLE_FILES_IMAGE.as_posix())
+ dag_files_2 = Custom("DAG Bundles\nTeam 2",
MULTIPLE_FILES_IMAGE.as_posix())
plugins_and_packages_2 = Custom("Plugins\n& Packages\nTeam 2",
PACKAGES_IMAGE.as_posix())
- config_file_2 = Custom("Config\nFile\nTeam 2",
CONFIG_FILE.as_posix())
operations_user_2 = User("Operations User\nTeam 2")
(
@@ -154,12 +159,6 @@ def generate_dag_processor_airflow_diagram():
>> plugins_and_packages_1
)
- (
- deployment_manager_1
- >> Edge(color="blue", style="dashed", reverse=False,
label="configure\n\n")
- >> config_file_1
- )
-
dag_author_2 >> Edge(color="brown", style="dashed", reverse=False,
label="author\n\n") >> dag_files_2
(
deployment_manager_2
@@ -167,24 +166,12 @@ def generate_dag_processor_airflow_diagram():
>> plugins_and_packages_2
)
- (
- deployment_manager_2
- >> Edge(color="blue", style="solid", reverse=False,
label="configure\n\n")
- >> config_file_2
- )
-
(
organization_plugins_and_packages
- Edge(color="blue", style="solid", reverse=True,
label="install\n\n")
- organization_deployment_manager
)
- (
- organization_config_file
- - Edge(color="blue", style="solid", reverse=True,
label="configure\n\n")
- - organization_deployment_manager
- )
-
plugins_and_packages_1 >> Edge(style="invis") >> workers_1
plugins_and_packages_1 >> Edge(style="invis") >> dag_processors_1
plugins_and_packages_1 >> Edge(style="invis") >> triggerer_1
@@ -237,7 +224,6 @@ def generate_dag_processor_airflow_diagram():
dag_files_2 >> Edge(color="brown", style="solid", label="sync\n\n") >>
triggerer_2
# This is for better layout. Invisible edges are used to align the
nodes better
- schedulers - Edge(style="invis") - organization_config_file
schedulers - Edge(style="invis") - organization_plugins_and_packages
metadata_db - Edge(style="invis") - executor_1
metadata_db - Edge(style="invis") - executor_2
diff --git a/airflow-core/docs/img/diagram_task_lifecycle.md5sum
b/airflow-core/docs/img/diagram_task_lifecycle.md5sum
index 5b00beaa9d8..a19ff4c1e4d 100644
--- a/airflow-core/docs/img/diagram_task_lifecycle.md5sum
+++ b/airflow-core/docs/img/diagram_task_lifecycle.md5sum
@@ -1 +1 @@
-ef689d2a19fcef658dca32076bb0bfd4
+2f0f0308c52315026f2ac50939247857
diff --git a/airflow-core/docs/img/diagram_task_lifecycle.png
b/airflow-core/docs/img/diagram_task_lifecycle.png
index 6f5f4e25a30..837a9a7a066 100644
Binary files a/airflow-core/docs/img/diagram_task_lifecycle.png and
b/airflow-core/docs/img/diagram_task_lifecycle.png differ
diff --git a/airflow-core/docs/img/diagram_task_lifecycle.py
b/airflow-core/docs/img/diagram_task_lifecycle.py
index 969a4fee324..3dc66c1635c 100644
--- a/airflow-core/docs/img/diagram_task_lifecycle.py
+++ b/airflow-core/docs/img/diagram_task_lifecycle.py
@@ -14,6 +14,13 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+# "rich>=12.4.4",
+# "diagrams>=0.23.4",
+# ]
+# ///
from __future__ import annotations
from pathlib import Path
@@ -25,12 +32,21 @@ from rich.console import Console
MY_DIR = Path(__file__).parent
MY_FILENAME = Path(__file__).with_suffix("").name
-COMPONENT_IMG = (MY_DIR.parents[1] / "diagrams" / "task_lifecycle" /
"component.png").as_posix()
-CONDITION_IMG = (MY_DIR.parents[1] / "diagrams" / "task_lifecycle" /
"condition.png").as_posix()
-SHARED_STATE_IMG = (MY_DIR.parents[1] / "diagrams" / "task_lifecycle" /
"shared_state.png").as_posix()
-TERMINAL_STATE_IMG = (MY_DIR.parents[1] / "diagrams" / "task_lifecycle" /
"terminal_state.png").as_posix()
-SENSOR_STATE_IMG = (MY_DIR.parents[1] / "diagrams" / "task_lifecycle" /
"sensor_state.png").as_posix()
-DEFERRABLE_STATE_IMG = (MY_DIR.parents[1] / "diagrams" / "task_lifecycle" /
"deferrable_state.png").as_posix()
+MY_DIR = Path(__file__).parent
+MY_FILENAME = Path(__file__).with_suffix("").name
+AIRFLOW_SOURCES_ROOT = MY_DIR.parents[2]
+DIAGRAMS_DIR = AIRFLOW_SOURCES_ROOT / "devel-common" / "src" / "docs" /
"diagrams"
+PYTHON_MULTIPROCESS_LOGO = DIAGRAMS_DIR / "python_multiprocess_logo.png"
+PACKAGES_IMAGE = DIAGRAMS_DIR / "packages.png"
+DATABASE_IMAGE = DIAGRAMS_DIR / "database.png"
+MULTIPLE_FILES_IMAGE = DIAGRAMS_DIR / "multiple_files.png"
+CONFIG_FILE = DIAGRAMS_DIR / "config_file.png"
+COMPONENT_IMG = (DIAGRAMS_DIR / "task_lifecycle" / "component.png").as_posix()
+CONDITION_IMG = (DIAGRAMS_DIR / "task_lifecycle" / "condition.png").as_posix()
+SHARED_STATE_IMG = (DIAGRAMS_DIR / "task_lifecycle" /
"shared_state.png").as_posix()
+TERMINAL_STATE_IMG = (DIAGRAMS_DIR / "task_lifecycle" /
"terminal_state.png").as_posix()
+SENSOR_STATE_IMG = (DIAGRAMS_DIR / "task_lifecycle" /
"sensor_state.png").as_posix()
+DEFERRABLE_STATE_IMG = (DIAGRAMS_DIR / "task_lifecycle" /
"deferrable_state.png").as_posix()
STATE_NODE_ATTRS = {"width": "4.16", "height": "1", "fontname": "Monospace",
"fontsize": "20"}
COMPONENT_NODE_ATTRS = {