Skip to content

Commit

Permalink
Merge pull request #12 from skonik/feature/automatic-import-all-diagr…
Browse files Browse the repository at this point in the history
…ams-icons

feat: add autoimport of diagrams.onprem classes
  • Loading branch information
skonik committed Oct 22, 2023
2 parents b9a08ef + fed4606 commit eb6902a
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 3 deletions.
75 changes: 75 additions & 0 deletions docker_compose_diagram/docker_images/auto_import_diagrams.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from typing import Any, Type

from diagrams import Node
from diagrams.onprem import _OnPrem


def import_on_prem_parent_nodes() -> list[Type[_OnPrem]]:
from diagrams.onprem.aggregator import _Aggregator
from diagrams.onprem.analytics import _Analytics
from diagrams.onprem.auth import _Auth
from diagrams.onprem.cd import _Cd
from diagrams.onprem.certificates import _Certificates
from diagrams.onprem.ci import _Ci
from diagrams.onprem.client import _Client
from diagrams.onprem.compute import _Compute
from diagrams.onprem.database import _Database
from diagrams.onprem.dns import _Dns
from diagrams.onprem.etl import _Etl
from diagrams.onprem.gitops import _Gitops
from diagrams.onprem.inmemory import _Inmemory
from diagrams.onprem.logging import _Logging
from diagrams.onprem.network import _Network
from diagrams.onprem.queue import _Queue
from diagrams.onprem.storage import _Storage

return [
_Database,
_Queue,
_Network,
_Inmemory,
_Storage,
_Logging,
_Auth,
_Client,
_Analytics,
_Aggregator,
_Certificates,
_Cd,
_Ci,
_Compute,
_Dns,
_Etl,
_Gitops,
]


def _collect_subclasses(
diagrams_parent_class: Type[Node], base_class: Type[Any]
) -> list[Type[Any]]:
new_classes = []
for diagram_child_class in diagrams_parent_class.__subclasses__():
new_class = type(
f"{diagram_child_class.__name__}Image",
(base_class,),
{
"pattern": str(diagram_child_class.__name__).lower(),
"diagram_render_class": diagram_child_class,
},
)
new_classes.append(new_class)

return new_classes


def register_all_icons_from_diagrams(base_class: Type[Any]) -> list[Type[Any]]:
"""Collect"""
new_classes = []

for on_prem_diagrams_parent in import_on_prem_parent_nodes():
database_classes = _collect_subclasses(
diagrams_parent_class=on_prem_diagrams_parent, base_class=base_class
)
new_classes.extend(database_classes)

return new_classes
11 changes: 10 additions & 1 deletion docker_compose_diagram/docker_images/patterns.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import abc

from diagrams.aws.database import Dynamodb
from diagrams.aws.integration import SNS, SQS
from diagrams.aws.storage import S3, Storage
Expand Down Expand Up @@ -52,11 +54,15 @@
Typescript,
)

from docker_compose_diagram.docker_images.auto_import_diagrams import (
register_all_icons_from_diagrams,
)


DEFAULT_ICON_CLASS = Rack


class DockerImagePattern:
class DockerImagePattern(abc.ABC):
pattern = r""
diagram_render_class = None

Expand Down Expand Up @@ -352,3 +358,6 @@ class CertificateImage(DockerImagePattern):
class LoadBalancerImage(DockerImagePattern):
pattern = r"^loadbalancer$"
diagram_render_class = LoadBalancer


diagrams_classes = register_all_icons_from_diagrams(base_class=DockerImagePattern)
4 changes: 3 additions & 1 deletion embed_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,6 @@ def embed_images(svg_file, svg_file_out=None):

if __name__ == "__main__":
svg_file = sys.argv[1] if len(sys.argv) == 2 else "docker-compose.svg"
embed_images(svg_file) # outputs my_diagram_out.svg with base64 encoded data URLs for the images
embed_images(
svg_file
) # outputs my_diagram_out.svg with base64 encoded data URLs for the images
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "docker-compose-diagram"
version = "0.4.0"
version = "0.5.0"
description = ""
authors = ["Sergei Konik <s.konik.dev@gmail.com>"]

Expand Down

0 comments on commit eb6902a

Please sign in to comment.