@@ -0,0 +1,21 @@ | |||||
# ide & editor | |||||
.idea/ | |||||
.vscode/ | |||||
# compiled & binary | |||||
*.egg-info/ | |||||
__pycache__/ | |||||
*.pyc | |||||
*.egg-info | |||||
# graphviz | |||||
*.gv* | |||||
# dist | |||||
dist | |||||
# node modules | |||||
node_modules | |||||
# trash | |||||
.DS_Store |
@@ -0,0 +1,33 @@ | |||||
# Contributiton Guide | |||||
You shouldn't edit the node class files (all files under `diagram` directory) by yourself. | |||||
## Resources | |||||
### Update nodes | |||||
All node classes was auto-generated from image resource files. For example, the `diagram.aws.compute.EC2` class was auto-generated based on `resources/aws/compute/ec2.png` image resource file. | |||||
So, if you want to add new node resources or update existing node resources, you can just add or update the image files in `resources/<provider>/<type>/<image>`. | |||||
Then just run the `./autogen.sh` to generate the added or updated node classes. | |||||
> IMPORTANT NOTE: To run `autogen.sh`, you need [round](https://github.com/mingrammer/round) and [inkscape](https://inkscape.org/ko/release) command lines that are used for clearning the image resource filenames. | |||||
> | |||||
> macOS users can download the inkscape via Homebrew. | |||||
### Update Aliases | |||||
Some node classes have alias. For example, `aws.compute.ECS` class is an alias of `aws.compute.ElasticContainerService` class. Aliases also were auto-generated from `ALIASES` map in [config.py](config.py). | |||||
So, if you want to add new aliases or update existing aliases, you can just add or update the `ALIASES` map in [config.py](config.py). | |||||
Then just run the `./autogen.sh` to generate the added or updated aliases. | |||||
> IMPORTANT NOTE: To run `autogen.sh`, you need [round](https://github.com/mingrammer/round) and [inkscape](https://inkscape.org/ko/release) command lines that are used for clearning the image resource filenames. | |||||
## Run Tests | |||||
```shell | |||||
$ python -m unittest tests/*.py -v | |||||
``` |
@@ -0,0 +1,40 @@ | |||||
<p align="center"> | |||||
<img src="assets/img/diagrams.png"/> | |||||
</p> | |||||
<h1 align="center">Diagrams</h1> | |||||
<p align="center"> | |||||
Diagram as Code | |||||
</p> | |||||
Diagrams lets you to draw the cloud system architectures in Python code. | |||||
It was born for prototyping a new system architecture without any design tools. You can also describe or visualize the existing system architecture as well. | |||||
> NOTE: It does not control the actual cloud resources like cloudformation or terraform, but just for drawing the system architecutrre. | |||||
`Diagram as Code` allows you to track the architecture diagram changes on any version control system (same as source code tracking) | |||||
Diagrams currently supports three major cloud providers: `AWS`, `Azure`, `GCP`. | |||||
> Let me know if you are using diagram! I'll add you in showcase page. (I'm working on it!) :) | |||||
## Getting Started | |||||
It uses [Graphviz](https://www.graphviz.org/) to render the diagram, so you need to [install Graphviz](https://graphviz.gitlab.io/download/) to use **diagrams**. After installing graphviz (or already have it), install the **diagrams**. | |||||
```shell | |||||
$ pip install diagrams | |||||
``` | |||||
You can start with [quick start](https://diagram.mingrammer.com/docs/installattion/#quick-start). And you can find [guides](https://diagram.mingrammer.com/diagram) for more details. | |||||
## Examples | |||||
## ContributingF | |||||
To contribute to diagram, check out [CONTRIBUTING](CONTRIBUTING.md). | |||||
## License | |||||
[MIT](LICENSE.md) |
@@ -0,0 +1,39 @@ | |||||
#!/bin/bash | |||||
app_root_dir="diagrams" | |||||
# NOTE: azure icon set is not latest version | |||||
providers=("aws" "azure" "gcp") | |||||
if ! [ -x "$(command -v round)" ]; then | |||||
echo 'round is not installed' | |||||
fi | |||||
if ! [ -x "$(command -v inkscape)" ]; then | |||||
echo 'inkscape is not installed' | |||||
fi | |||||
# preprocess the resources | |||||
for pvd in "${providers[@]}"; do | |||||
# convert the svg to png for azure provider | |||||
if [ "$pvd" = "azure" ]; then | |||||
echo "converting the svg to png for provider '$pvd'" | |||||
python -m scripts.resource svg2png "$pvd" | |||||
fi | |||||
echo "cleaning the resource names for provider '$pvd'" | |||||
python -m scripts.resource clean "$pvd" | |||||
# round the all png images for aws provider | |||||
if [ "$pvd" = "aws" ]; then | |||||
echo "rounding the resources for provider '$pvd'" | |||||
python -m scripts.resource round "$pvd" | |||||
fi | |||||
done | |||||
# generate the module classes | |||||
for pvd in "${providers[@]}"; do | |||||
echo "generating the modules for provider '$pvd'" | |||||
python -m scripts.generate "$pvd" | |||||
done | |||||
# run black | |||||
echo "linting the all the diagram modules" | |||||
black "$app_root_dir"/**/*.py |
@@ -0,0 +1,148 @@ | |||||
# fmt: off | |||||
######################### | |||||
# Application # | |||||
######################### | |||||
APP_NAME = "diagrams" | |||||
DIR_APP_ROOT = "diagrams" | |||||
DIR_RESOURCE = "resources" | |||||
DIR_TEMPLATE = "templates" | |||||
PROVIDERS = ("base", "aws", "azure", "gcp") | |||||
######################### | |||||
# Resource Processing # | |||||
######################### | |||||
CMD_ROUND = "round" | |||||
CMD_ROUND_OPTS = ("-w",) | |||||
CMD_SVG2PNG = "inkscape" | |||||
CMD_SVG2PNG_OPTS = ("-z", "-w", "256", "-h", "256", "--export-type", "png") | |||||
FILE_PREFIXES = { | |||||
"aws": ("amazon-", "aws-"), | |||||
"azure": ("azure-",), | |||||
"gcp": ("cloud-",) | |||||
} | |||||
######################### | |||||
# Class Auto Generation # | |||||
######################### | |||||
TMPL_MODULE = "module.tmpl" | |||||
UPPER_WORDS = { | |||||
"aws": ("aws", "api", "ebs", "ec2", "efs", "emr", "rds", "ml", "mq", "vpc", "waf"), | |||||
"azure": ("ad", "b2c", "ai", "api", "cdn", "ddos", "dns", "fxt", "hana", "hd", "id", "sap", "sql", "vm"), | |||||
"gcp": ("gcp", "ai", "api", "cdn", "dns", "gke", "gpu", "ml", "nat", "os", "sdk", "sql", "tpu", "vpn"), | |||||
} | |||||
# TODO: check if the classname exists | |||||
ALIASES = { | |||||
"aws": { | |||||
"analytics": { | |||||
"ElasticsearchService": "ES", | |||||
}, | |||||
"compute": { | |||||
"ApplicationAutoScaling": "AutoScaling", | |||||
"EC2ContainerRegistry": "ECR", | |||||
"ElasticBeanstalk": "EB", | |||||
"ElasticContainerService": "ECS", | |||||
"ElasticKubernetesService": "EKS", | |||||
"ServerlessApplicationRepository": "SAR", | |||||
}, | |||||
"database": { | |||||
"DatabaseMigrationService": "DMS", | |||||
"DocumentdbMongodbCompatibility": "DocumentDB", | |||||
"Database": "DB", | |||||
"Dynamodb": "DDB", | |||||
"Elasticache": "ElastiCache", | |||||
"QuantumLedgerDatabaseQldb": "QLDB", | |||||
}, | |||||
"devtools": { | |||||
"CommandLineInterface": "CLI", | |||||
"DeveloperTools": "DevTools", | |||||
}, | |||||
"integration": { | |||||
"SimpleNotificationServiceSns": "SNS", | |||||
"SimpleQueueServiceSqs": "SQS", | |||||
"StepFunctions": "SF", | |||||
}, | |||||
"iot": { | |||||
"Freertos": "FreeRTOS", | |||||
}, | |||||
"migration": { | |||||
"ApplicationDiscoveryService": "ADS", | |||||
"CloudendureMigration": "CEM", | |||||
"DatabaseMigrationService": "DMS", | |||||
"MigrationAndTransfer": "MAT", | |||||
"ServerMigrationService": "SMS", | |||||
}, | |||||
"ml": { | |||||
"DeepLearningContainers": "DLC", | |||||
}, | |||||
"network": { | |||||
"Cloudfront": "CF", | |||||
"ElasticLoadBalancing": "ELB", | |||||
"GlobalAccelerator": "GAX", | |||||
}, | |||||
"security": { | |||||
"CertificateManager": "ACM", | |||||
"Cloudhsm": "CloudHSM", | |||||
"DirectoryService": "DS", | |||||
"FirewallManager": "FMS", | |||||
"IdentityAndAccessManagementIam": "IAM", | |||||
"KeyManagementService": "KMS", | |||||
"ResourceAccessManager": "RAM", | |||||
}, | |||||
"storage": { | |||||
"CloudendureDisasterRecovery": "CDR", | |||||
"ElasticBlockStoreEBS": "EBS", | |||||
"ElasticFileSystemEFS": "EFS", | |||||
"Fsx": "FSx", | |||||
"SimpleStorageServiceS3": "S3", | |||||
}, | |||||
}, | |||||
"azure": { | |||||
"compute": { | |||||
"ContainerRegistries": "ACR", | |||||
"KubernetesServices": "AKS", | |||||
}, | |||||
}, | |||||
"gcp": { | |||||
"analytics": { | |||||
"Bigquery": "BigQuery", | |||||
"Pubsub": "PubSub", | |||||
}, | |||||
"compute": { | |||||
"AppEngine": "GAE", | |||||
"Functions": "GCF", | |||||
"ComputeEngine": "GCE", | |||||
"KubernetesEngine": "GKE", | |||||
}, | |||||
"database": { | |||||
"Bigtable": "BigTable", | |||||
}, | |||||
"devtools": { | |||||
"ContainerRegistry": "GCR", | |||||
}, | |||||
"ml": { | |||||
"Automl": "AutoML", | |||||
"NaturalLanguageAPI": "NLAPI", | |||||
"SpeechToText": "STT", | |||||
"TextToSpeech": "TTS", | |||||
}, | |||||
"network": { | |||||
"VirtualPrivateCloud": "VPC" | |||||
}, | |||||
"security": { | |||||
"KeyManagementService": "KMS", | |||||
"SecurityCommandCenter": "SCC", | |||||
}, | |||||
"storage": { | |||||
"Storage": "GCS", | |||||
}, | |||||
}, | |||||
} |
@@ -0,0 +1,366 @@ | |||||
import contextvars | |||||
import os | |||||
from hashlib import md5 | |||||
from pathlib import Path | |||||
from random import getrandbits | |||||
from typing import List, Union | |||||
from graphviz import Digraph | |||||
__version__ = "0.1.0" | |||||
# Global context for a diagrams and a cluster. | |||||
# | |||||
# Theses global contexts are for letting the clusters and nodes know | |||||
# where context they are belong to. So the all clusters and nodes does | |||||
# not need to specify the current diagrams or cluster via parameters. | |||||
__diagram = contextvars.ContextVar("diagrams") | |||||
__cluster = contextvars.ContextVar("cluster") | |||||
def getdiagram(): | |||||
try: | |||||
return __diagram.get() | |||||
except LookupError: | |||||
return None | |||||
def setdiagram(diagram): | |||||
__diagram.set(diagram) | |||||
def getcluster(): | |||||
try: | |||||
return __cluster.get() | |||||
except LookupError: | |||||
return None | |||||
def setcluster(cluster): | |||||
__cluster.set(cluster) | |||||
class Diagram: | |||||
__directions = ("TB", "BT", "LR", "RL") | |||||
__outformats = ("png", "jpg", "svg", "pdf") | |||||
# fmt: off | |||||
_default_graph_attrs = { | |||||
"pad": "2.0", | |||||
"splines": "ortho", | |||||
"nodesep": "0.60", | |||||
"ranksep": "0.75", | |||||
"fontname": "Sans-Serif", | |||||
"fontsize": "15", | |||||
"fontcolor": "#2D3436", | |||||
} | |||||
_default_node_attrs = { | |||||
"shape": "box", | |||||
"style": "rounded", | |||||
"fixedsize": "true", | |||||
"width": "1.4", | |||||
"height": "1.4", | |||||
"labelloc": "b", | |||||
"imagepos": "tc", | |||||
"imagescale": "true", | |||||
"fontname": "Sans-Serif", | |||||
"fontsize": "13", | |||||
"fontcolor": "#2D3436", | |||||
} | |||||
_default_edge_attrs = { | |||||
"color": "#7B8894", | |||||
} | |||||
# fmt: on | |||||
# TODO: Label position option | |||||
# TODO: Save directory option (filename + directory?) | |||||
def __init__(self, name: str = "", direction: str = "LR", outformat: str = "png", show: bool = True): | |||||
"""Diagram represents a global diagrams context. | |||||
:param name: Diagram name. It will be used for output filename. | |||||
:param direction: Data flow direction. Default is 'left to right'. | |||||
:param outformat: Output file format. Default is 'png'. | |||||
:param show: Open generated image after save if true, just only save otherwise. | |||||
""" | |||||
self.name = name | |||||
self.filename = "_".join(self.name.split()).lower() | |||||
self.dot = Digraph(self.name, filename=self.filename) | |||||
# Set attributes. | |||||
for k, v in self._default_graph_attrs.items(): | |||||
self.dot.graph_attr[k] = v | |||||
self.dot.graph_attr["label"] = self.name | |||||
for k, v in self._default_node_attrs.items(): | |||||
self.dot.node_attr[k] = v | |||||
for k, v in self._default_edge_attrs.items(): | |||||
self.dot.edge_attr[k] = v | |||||
if not self._validate_direction(direction): | |||||
raise ValueError(f'"{direction}" is not a valid direction') | |||||
self.dot.graph_attr["rankdir"] = direction | |||||
if not self._validate_outformat(outformat): | |||||
raise ValueError(f'"{outformat}" is not a valid output format') | |||||
self.outformat = outformat | |||||
self.show = show | |||||
def __enter__(self): | |||||
setdiagram(self) | |||||
return self | |||||
def __exit__(self, exc_type, exc_value, traceback): | |||||
self.render() | |||||
# Remove the graphviz file leaving only the image. | |||||
os.remove(self.filename) | |||||
setdiagram(None) | |||||
def _validate_direction(self, direction: str) -> bool: | |||||
direction = direction.upper() | |||||
for v in self.__directions: | |||||
if v == direction: | |||||
return True | |||||
return False | |||||
def _validate_outformat(self, outformat: str) -> bool: | |||||
outformat = outformat.lower() | |||||
for v in self.__outformats: | |||||
if v == outformat: | |||||
return True | |||||
return False | |||||
def node(self, hashid: str, label: str, **attrs) -> None: | |||||
"""Create a new node.""" | |||||
self.dot.node(hashid, label=label, **attrs) | |||||
def connect(self, node: "Node", node2: "Node", directed=True) -> None: | |||||
"""Connect the two Nodes.""" | |||||
attrs = {"dir": "none"} if not directed else {} | |||||
self.dot.edge(node.hashid, node2.hashid, **attrs) | |||||
def reverse(self, node: "Node", node2: "Node", directed=True) -> None: | |||||
"""Connect the two Nodes in reverse direction.""" | |||||
attrs = {"dir": "none"} if not directed else {"dir": "back"} | |||||
self.dot.edge(node.hashid, node2.hashid, **attrs) | |||||
def subgraph(self, dot: Digraph) -> None: | |||||
"""Create a subgraph for clustering""" | |||||
self.dot.subgraph(dot) | |||||
def render(self) -> None: | |||||
self.dot.render(format=self.outformat, view=self.show) | |||||
class Cluster: | |||||
__directions = ("TB", "BT", "LR", "RL") | |||||
__bgcolors = ("#E5F5FD", "#EBF3E7", "#ECE8F6", "#FDF7E3") | |||||
# fmt: off | |||||
_default_graph_attrs = { | |||||
"shape": "box", | |||||
"style": "rounded", | |||||
"labeljust": "l", | |||||
"pencolor": "#AEB6BE", | |||||
"fontname": "Sans-Serif", | |||||
"fontsize": "12", | |||||
} | |||||
# fmt: on | |||||
# FIXME: | |||||
# Cluster direction does not work now. Graphviz couldn't render | |||||
# correctly for a subgraph that has a different rank direction. | |||||
def __init__(self, label: str = "cluster", direction: str = "LR"): | |||||
"""Cluster represents a cluster context. | |||||
:param label: Cluster label. | |||||
:param direction: Data flow direction. Default is 'left to right'. | |||||
""" | |||||
self.label = label | |||||
self.name = "cluster_" + self.label | |||||
self.dot = Digraph(self.name) | |||||
# Set attributes. | |||||
for k, v in self._default_graph_attrs.items(): | |||||
self.dot.graph_attr[k] = v | |||||
self.dot.graph_attr["label"] = self.label | |||||
if not self._validate_direction(direction): | |||||
raise ValueError(f'"{direction}" is not a valid direction') | |||||
self.dot.graph_attr["rankdir"] = direction | |||||
# Node must be belong to a diagrams. | |||||
self._diagram = getdiagram() | |||||
if self._diagram is None: | |||||
raise EnvironmentError("Global diagrams context not set up") | |||||
self._parent = getcluster() | |||||
# Set cluster depth for distinguishing the background color | |||||
self.depth = self._parent.depth + 1 if self._parent else 0 | |||||
coloridx = self.depth % len(self.__bgcolors) | |||||
self.dot.graph_attr["bgcolor"] = self.__bgcolors[coloridx] | |||||
def __enter__(self): | |||||
setcluster(self) | |||||
return self | |||||
def __exit__(self, exc_type, exc_value, traceback): | |||||
if self._parent: | |||||
self._parent.subgraph(self.dot) | |||||
else: | |||||
self._diagram.subgraph(self.dot) | |||||
setcluster(self._parent) | |||||
def _validate_direction(self, direction: str): | |||||
direction = direction.upper() | |||||
for v in self.__directions: | |||||
if v == direction: | |||||
return True | |||||
return False | |||||
def node(self, hashid: str, label: str, **attrs) -> None: | |||||
"""Create a new node in the cluster.""" | |||||
self.dot.node(hashid, label=label, **attrs) | |||||
def subgraph(self, dot: Digraph) -> None: | |||||
self.dot.subgraph(dot) | |||||
class Node: | |||||
"""Node represents a node for a specific backend service.""" | |||||
_provider = None | |||||
_type = None | |||||
_icon_dir = None | |||||
_icon = None | |||||
def __init__(self, label: str = ""): | |||||
"""Node represents a system component. | |||||
:param label: Node label. | |||||
""" | |||||
# Generates a hash for identifying a node. | |||||
self._hash = self._rand_hash() | |||||
self.label = label | |||||
# fmt: off | |||||
# If a node has an icon, increase the height slightly to avoid | |||||
# that label being spanned between icon image and white space. | |||||
self.attrs = { | |||||
"shape": "none", | |||||
"height": "1.6", | |||||
"image": self._load_icon(), | |||||
} if self._icon else {} | |||||
# fmt: on | |||||
# Node must be belong to a diagrams. | |||||
self._diagram = getdiagram() | |||||
if self._diagram is None: | |||||
raise EnvironmentError("Global diagrams context not set up") | |||||
self._cluster = getcluster() | |||||
# If a node is in the cluster context, add it to cluster. | |||||
if self._cluster: | |||||
self._cluster.node(self._hash, self.label, **self.attrs) | |||||
else: | |||||
self._diagram.node(self._hash, self.label, **self.attrs) | |||||
def __repr__(self): | |||||
_name = self.__class__.__name__ | |||||
return f"<{self._provider}.{self._type}.{_name}>" | |||||
def __sub__(self, other: Union["Node", List["Node"]]): | |||||
"""Implement Self - Node and Self - [Nodes]""" | |||||
if not isinstance(other, list): | |||||
return self.connect(other, directed=False) | |||||
for node in other: | |||||
self.connect(node, directed=False) | |||||
return other | |||||
def __rsub__(self, other: List["Node"]): | |||||
""" | |||||
Called for [Nodes] - Self because list of Nodes don't have | |||||
__sub__ operators. | |||||
""" | |||||
self.__sub__(other) | |||||
return self | |||||
def __rshift__(self, other: Union["Node", List["Node"]]): | |||||
"""Implements Self >> Node and Self >> [Nodes].""" | |||||
if not isinstance(other, list): | |||||
return self.connect(other) | |||||
for node in other: | |||||
self.connect(node) | |||||
return other | |||||
def __lshift__(self, other: Union["Node", List["Node"]]): | |||||
"""Implements Self << Node and Self << [Nodes].""" | |||||
if not isinstance(other, list): | |||||
return self.reverse(other) | |||||
for node in other: | |||||
self.reverse(node) | |||||
return other | |||||
def __rrshift__(self, other: List["Node"]): | |||||
""" | |||||
Called for [Nodes] >> Self because list of Nodes don't have | |||||
__rshift__ operators. | |||||
""" | |||||
for node in other: | |||||
node.connect(self) | |||||
return self | |||||
def __rlshift__(self, other: List["Node"]): | |||||
""" | |||||
Called for [Nodes] << Self because list of Nodes don't have | |||||
__lshift__ operators. | |||||
""" | |||||
for node in other: | |||||
node.reverse(self) | |||||
return self | |||||
@property | |||||
def hashid(self): | |||||
return self._hash | |||||
# TODO: option for adding flow description to the connection edge | |||||
def connect(self, node: "Node", directed=True): | |||||
"""Connect to other node. | |||||
:param node: Other node instance. | |||||
:param directed: Whether the flow is directed or not. | |||||
:return: Connected node. | |||||
""" | |||||
if not isinstance(node, Node): | |||||
ValueError(f"{node} is not a valid Node") | |||||
# An edge must be added on the global diagrams, not a cluster. | |||||
self._diagram.connect(self, node, directed) | |||||
return node | |||||
def reverse(self, node: "Node", directed=True): | |||||
"""Connect to other node in reverse direction. | |||||
:param node: Other node instance. | |||||
:param directed: Whether the flow is directed or not. | |||||
:return: Connected node. | |||||
""" | |||||
if not isinstance(node, Node): | |||||
ValueError(f"{node} is not a valid Node") | |||||
# An edge must be added on the global diagrams, not a cluster. | |||||
self._diagram.reverse(self, node, directed) | |||||
return node | |||||
@staticmethod | |||||
def _rand_hash(): | |||||
return md5(getrandbits(64).to_bytes(64, "big")).hexdigest() | |||||
def _load_icon(self): | |||||
basedir = Path(os.path.abspath(os.path.dirname(__file__))) | |||||
return os.path.join(basedir.parent, self._icon_dir, self._icon) | |||||
Group = Cluster |
@@ -0,0 +1,12 @@ | |||||
""" | |||||
AWS provides a set of services for Amazon Web Service provider. | |||||
""" | |||||
from diagrams import Node | |||||
class _AWS(Node): | |||||
_provider = "aws" | |||||
_icon_dir = "resources/aws" | |||||
fontcolor = "#ffffff" |
@@ -0,0 +1,77 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Analytics(_AWS): | |||||
_type = "analytics" | |||||
_icon_dir = "resources/aws/analytics" | |||||
class Analytics(_Analytics): | |||||
_icon = "analytics.png" | |||||
class Athena(_Analytics): | |||||
_icon = "athena.png" | |||||
class Cloudsearch(_Analytics): | |||||
_icon = "cloudsearch.png" | |||||
class DataPipeline(_Analytics): | |||||
_icon = "data-pipeline.png" | |||||
class ElasticsearchService(_Analytics): | |||||
_icon = "elasticsearch-service.png" | |||||
class EMR(_Analytics): | |||||
_icon = "emr.png" | |||||
class Glue(_Analytics): | |||||
_icon = "glue.png" | |||||
class KinesisDataAnalytics(_Analytics): | |||||
_icon = "kinesis-data-analytics.png" | |||||
class KinesisDataFirehose(_Analytics): | |||||
_icon = "kinesis-data-firehose.png" | |||||
class KinesisDataStreams(_Analytics): | |||||
_icon = "kinesis-data-streams.png" | |||||
class KinesisVideoStreams(_Analytics): | |||||
_icon = "kinesis-video-streams.png" | |||||
class Kinesis(_Analytics): | |||||
_icon = "kinesis.png" | |||||
class LakeFormation(_Analytics): | |||||
_icon = "lake-formation.png" | |||||
class ManagedStreamingForKafka(_Analytics): | |||||
_icon = "managed-streaming-for-kafka.png" | |||||
class Quicksight(_Analytics): | |||||
_icon = "quicksight.png" | |||||
class Redshift(_Analytics): | |||||
_icon = "redshift.png" | |||||
# Aliases | |||||
ES = ElasticsearchService |
@@ -0,0 +1,102 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Compute(_AWS): | |||||
_type = "compute" | |||||
_icon_dir = "resources/aws/compute" | |||||
class ApplicationAutoScaling(_Compute): | |||||
_icon = "application-auto-scaling.png" | |||||
class Batch(_Compute): | |||||
_icon = "batch.png" | |||||
class Compute(_Compute): | |||||
_icon = "compute.png" | |||||
class EC2ContainerRegistry(_Compute): | |||||
_icon = "ec2-container-registry.png" | |||||
class EC2(_Compute): | |||||
_icon = "ec2.png" | |||||
class ElasticBeanstalk(_Compute): | |||||
_icon = "elastic-beanstalk.png" | |||||
class ElasticContainerService(_Compute): | |||||
_icon = "elastic-container-service.png" | |||||
class ElasticKubernetesService(_Compute): | |||||
_icon = "elastic-kubernetes-service.png" | |||||
class Fargate(_Compute): | |||||
_icon = "fargate.png" | |||||
class Lambda(_Compute): | |||||
_icon = "lambda.png" | |||||
class Lightsail(_Compute): | |||||
_icon = "lightsail.png" | |||||
class Outposts(_Compute): | |||||
_icon = "outposts.png" | |||||
class ServerlessApplicationRepository(_Compute): | |||||
_icon = "serverless-application-repository.png" | |||||
class ThinkboxDeadline(_Compute): | |||||
_icon = "thinkbox-deadline.png" | |||||
class ThinkboxDraft(_Compute): | |||||
_icon = "thinkbox-draft.png" | |||||
class ThinkboxFrost(_Compute): | |||||
_icon = "thinkbox-frost.png" | |||||
class ThinkboxKrakatoa(_Compute): | |||||
_icon = "thinkbox-krakatoa.png" | |||||
class ThinkboxSequoia(_Compute): | |||||
_icon = "thinkbox-sequoia.png" | |||||
class ThinkboxStoke(_Compute): | |||||
_icon = "thinkbox-stoke.png" | |||||
class ThinkboxXmesh(_Compute): | |||||
_icon = "thinkbox-xmesh.png" | |||||
class VmwareCloudOnAWS(_Compute): | |||||
_icon = "vmware-cloud-on-aws.png" | |||||
# Aliases | |||||
AutoScaling = ApplicationAutoScaling | |||||
ECR = EC2ContainerRegistry | |||||
EB = ElasticBeanstalk | |||||
ECS = ElasticContainerService | |||||
EKS = ElasticKubernetesService | |||||
SAR = ServerlessApplicationRepository |
@@ -0,0 +1,66 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Database(_AWS): | |||||
_type = "database" | |||||
_icon_dir = "resources/aws/database" | |||||
class Aurora(_Database): | |||||
_icon = "aurora.png" | |||||
class DatabaseMigrationService(_Database): | |||||
_icon = "database-migration-service.png" | |||||
class Database(_Database): | |||||
_icon = "database.png" | |||||
class DocumentdbMongodbCompatibility(_Database): | |||||
_icon = "documentdb-mongodb-compatibility.png" | |||||
class Dynamodb(_Database): | |||||
_icon = "dynamodb.png" | |||||
class Elasticache(_Database): | |||||
_icon = "elasticache.png" | |||||
class Neptune(_Database): | |||||
_icon = "neptune.png" | |||||
class QuantumLedgerDatabaseQldb(_Database): | |||||
_icon = "quantum-ledger-database-qldb.png" | |||||
class RDSOnVmware(_Database): | |||||
_icon = "rds-on-vmware.png" | |||||
class RDS(_Database): | |||||
_icon = "rds.png" | |||||
class Redshift(_Database): | |||||
_icon = "redshift.png" | |||||
class Timestream(_Database): | |||||
_icon = "timestream.png" | |||||
# Aliases | |||||
DMS = DatabaseMigrationService | |||||
DocumentDB = DocumentdbMongodbCompatibility | |||||
DB = Database | |||||
DDB = Dynamodb | |||||
ElastiCache = Elasticache | |||||
QLDB = QuantumLedgerDatabaseQldb |
@@ -0,0 +1,58 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Devtools(_AWS): | |||||
_type = "devtools" | |||||
_icon_dir = "resources/aws/devtools" | |||||
class CloudDevelopmentKit(_Devtools): | |||||
_icon = "cloud-development-kit.png" | |||||
class Cloud9(_Devtools): | |||||
_icon = "cloud9.png" | |||||
class Codebuild(_Devtools): | |||||
_icon = "codebuild.png" | |||||
class Codecommit(_Devtools): | |||||
_icon = "codecommit.png" | |||||
class Codedeploy(_Devtools): | |||||
_icon = "codedeploy.png" | |||||
class Codepipeline(_Devtools): | |||||
_icon = "codepipeline.png" | |||||
class Codestar(_Devtools): | |||||
_icon = "codestar.png" | |||||
class CommandLineInterface(_Devtools): | |||||
_icon = "command-line-interface.png" | |||||
class DeveloperTools(_Devtools): | |||||
_icon = "developer-tools.png" | |||||
class ToolsAndSdks(_Devtools): | |||||
_icon = "tools-and-sdks.png" | |||||
class XRay(_Devtools): | |||||
_icon = "x-ray.png" | |||||
# Aliases | |||||
CLI = CommandLineInterface | |||||
DevTools = DeveloperTools |
@@ -0,0 +1,47 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Integration(_AWS): | |||||
_type = "integration" | |||||
_icon_dir = "resources/aws/integration" | |||||
class ApplicationIntegration(_Integration): | |||||
_icon = "application-integration.png" | |||||
class Appsync(_Integration): | |||||
_icon = "appsync.png" | |||||
class ConsoleMobileApplication(_Integration): | |||||
_icon = "console-mobile-application.png" | |||||
class Eventbridge(_Integration): | |||||
_icon = "eventbridge.png" | |||||
class MQ(_Integration): | |||||
_icon = "mq.png" | |||||
class SimpleNotificationServiceSns(_Integration): | |||||
_icon = "simple-notification-service-sns.png" | |||||
class SimpleQueueServiceSqs(_Integration): | |||||
_icon = "simple-queue-service-sqs.png" | |||||
class StepFunctions(_Integration): | |||||
_icon = "step-functions.png" | |||||
# Aliases | |||||
SNS = SimpleNotificationServiceSns | |||||
SQS = SimpleQueueServiceSqs | |||||
SF = StepFunctions |
@@ -0,0 +1,61 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Iot(_AWS): | |||||
_type = "iot" | |||||
_icon_dir = "resources/aws/iot" | |||||
class Freertos(_Iot): | |||||
_icon = "freertos.png" | |||||
class InternetOfThings(_Iot): | |||||
_icon = "internet-of-things.png" | |||||
class Iot1Click(_Iot): | |||||
_icon = "iot-1-click.png" | |||||
class IotAnalytics(_Iot): | |||||
_icon = "iot-analytics.png" | |||||
class IotButton(_Iot): | |||||
_icon = "iot-button.png" | |||||
class IotCore(_Iot): | |||||
_icon = "iot-core.png" | |||||
class IotDeviceDefender(_Iot): | |||||
_icon = "iot-device-defender.png" | |||||
class IotDeviceManagement(_Iot): | |||||
_icon = "iot-device-management.png" | |||||
class IotEvents(_Iot): | |||||
_icon = "iot-events.png" | |||||
class IotGreengrass(_Iot): | |||||
_icon = "iot-greengrass.png" | |||||
class IotSitewise(_Iot): | |||||
_icon = "iot-sitewise.png" | |||||
class IotThingsGraph(_Iot): | |||||
_icon = "iot-things-graph.png" | |||||
# Aliases | |||||
FreeRTOS = Freertos |
@@ -0,0 +1,61 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Migration(_AWS): | |||||
_type = "migration" | |||||
_icon_dir = "resources/aws/migration" | |||||
class ApplicationDiscoveryService(_Migration): | |||||
_icon = "application-discovery-service.png" | |||||
class CloudendureMigration(_Migration): | |||||
_icon = "cloudendure-migration.png" | |||||
class DatabaseMigrationService(_Migration): | |||||
_icon = "database-migration-service.png" | |||||
class Datasync(_Migration): | |||||
_icon = "datasync.png" | |||||
class MigrationAndTransfer(_Migration): | |||||
_icon = "migration-and-transfer.png" | |||||
class MigrationHub(_Migration): | |||||
_icon = "migration-hub.png" | |||||
class ServerMigrationService(_Migration): | |||||
_icon = "server-migration-service.png" | |||||
class SnowballEdge(_Migration): | |||||
_icon = "snowball-edge.png" | |||||
class Snowball(_Migration): | |||||
_icon = "snowball.png" | |||||
class Snowmobile(_Migration): | |||||
_icon = "snowmobile.png" | |||||
class TransferForSftp(_Migration): | |||||
_icon = "transfer-for-sftp.png" | |||||
# Aliases | |||||
ADS = ApplicationDiscoveryService | |||||
CEM = CloudendureMigration | |||||
DMS = DatabaseMigrationService | |||||
MAT = MigrationAndTransfer | |||||
SMS = ServerMigrationService |
@@ -0,0 +1,89 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _ML(_AWS): | |||||
_type = "ml" | |||||
_icon_dir = "resources/aws/ml" | |||||
class ApacheMxnetOnAWS(_ML): | |||||
_icon = "apache-mxnet-on-aws.png" | |||||
class Comprehend(_ML): | |||||
_icon = "comprehend.png" | |||||
class DeepLearningAmis(_ML): | |||||
_icon = "deep-learning-amis.png" | |||||
class DeepLearningContainers(_ML): | |||||
_icon = "deep-learning-containers.png" | |||||
class Deeplens(_ML): | |||||
_icon = "deeplens.png" | |||||
class Deepracer(_ML): | |||||
_icon = "deepracer.png" | |||||
class ElasticInference(_ML): | |||||
_icon = "elastic-inference.png" | |||||
class Forecast(_ML): | |||||
_icon = "forecast.png" | |||||
class Lex(_ML): | |||||
_icon = "lex.png" | |||||
class MachineLearning(_ML): | |||||
_icon = "machine-learning.png" | |||||
class Personalize(_ML): | |||||
_icon = "personalize.png" | |||||
class Polly(_ML): | |||||
_icon = "polly.png" | |||||
class Rekognition(_ML): | |||||
_icon = "rekognition.png" | |||||
class SagemakerGroundTruth(_ML): | |||||
_icon = "sagemaker-ground-truth.png" | |||||
class Sagemaker(_ML): | |||||
_icon = "sagemaker.png" | |||||
class TensorflowOnAWS(_ML): | |||||
_icon = "tensorflow-on-aws.png" | |||||
class Textract(_ML): | |||||
_icon = "textract.png" | |||||
class Transcribe(_ML): | |||||
_icon = "transcribe.png" | |||||
class Translate(_ML): | |||||
_icon = "translate.png" | |||||
# Aliases | |||||
DLC = DeepLearningContainers |
@@ -0,0 +1,71 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Network(_AWS): | |||||
_type = "network" | |||||
_icon_dir = "resources/aws/network" | |||||
class APIGateway(_Network): | |||||
_icon = "api-gateway.png" | |||||
class AppMesh(_Network): | |||||
_icon = "app-mesh.png" | |||||
class ClientVpn(_Network): | |||||
_icon = "client-vpn.png" | |||||
class CloudMap(_Network): | |||||
_icon = "cloud-map.png" | |||||
class Cloudfront(_Network): | |||||
_icon = "cloudfront.png" | |||||
class DirectConnect(_Network): | |||||
_icon = "direct-connect.png" | |||||
class ElasticLoadBalancing(_Network): | |||||
_icon = "elastic-load-balancing.png" | |||||
class GlobalAccelerator(_Network): | |||||
_icon = "global-accelerator.png" | |||||
class NetworkingAndContentDelivery(_Network): | |||||
_icon = "networking-and-content-delivery.png" | |||||
class Privatelink(_Network): | |||||
_icon = "privatelink.png" | |||||
class Route53(_Network): | |||||
_icon = "route-53.png" | |||||
class SiteToSiteVpn(_Network): | |||||
_icon = "site-to-site-vpn.png" | |||||
class TransitGateway(_Network): | |||||
_icon = "transit-gateway.png" | |||||
class VPC(_Network): | |||||
_icon = "vpc.png" | |||||
# Aliases | |||||
CF = Cloudfront | |||||
ELB = ElasticLoadBalancing | |||||
GAX = GlobalAccelerator |
@@ -0,0 +1,95 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Security(_AWS): | |||||
_type = "security" | |||||
_icon_dir = "resources/aws/security" | |||||
class Artifact(_Security): | |||||
_icon = "artifact.png" | |||||
class CertificateManager(_Security): | |||||
_icon = "certificate-manager.png" | |||||
class CloudDirectory(_Security): | |||||
_icon = "cloud-directory.png" | |||||
class Cloudhsm(_Security): | |||||
_icon = "cloudhsm.png" | |||||
class Cognito(_Security): | |||||
_icon = "cognito.png" | |||||
class DirectoryService(_Security): | |||||
_icon = "directory-service.png" | |||||
class FirewallManager(_Security): | |||||
_icon = "firewall-manager.png" | |||||
class Guardduty(_Security): | |||||
_icon = "guardduty.png" | |||||
class IdentityAndAccessManagementIam(_Security): | |||||
_icon = "identity-and-access-management-iam.png" | |||||
class Inspector(_Security): | |||||
_icon = "inspector.png" | |||||
class KeyManagementService(_Security): | |||||
_icon = "key-management-service.png" | |||||
class Macie(_Security): | |||||
_icon = "macie.png" | |||||
class ResourceAccessManager(_Security): | |||||
_icon = "resource-access-manager.png" | |||||
class SecretsManager(_Security): | |||||
_icon = "secrets-manager.png" | |||||
class SecurityHub(_Security): | |||||
_icon = "security-hub.png" | |||||
class SecurityIdentityAndCompliance(_Security): | |||||
_icon = "security-identity-and-compliance.png" | |||||
class Shield(_Security): | |||||
_icon = "shield.png" | |||||
class SingleSignOn(_Security): | |||||
_icon = "single-sign-on.png" | |||||
class WAF(_Security): | |||||
_icon = "waf.png" | |||||
# Aliases | |||||
ACM = CertificateManager | |||||
CloudHSM = Cloudhsm | |||||
DS = DirectoryService | |||||
FMS = FirewallManager | |||||
IAM = IdentityAndAccessManagementIam | |||||
KMS = KeyManagementService | |||||
RAM = ResourceAccessManager |
@@ -0,0 +1,81 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _AWS | |||||
class _Storage(_AWS): | |||||
_type = "storage" | |||||
_icon_dir = "resources/aws/storage" | |||||
class Backup(_Storage): | |||||
_icon = "backup.png" | |||||
class CloudendureDisasterRecovery(_Storage): | |||||
_icon = "cloudendure-disaster-recovery.png" | |||||
class EFSInfrequentaccessPrimaryBg(_Storage): | |||||
_icon = "efs-infrequentaccess-primary-bg.png" | |||||
class EFSStandardPrimaryBg(_Storage): | |||||
_icon = "efs-standard-primary-bg.png" | |||||
class ElasticBlockStoreEBS(_Storage): | |||||
_icon = "elastic-block-store-ebs.png" | |||||
class ElasticFileSystemEFS(_Storage): | |||||
_icon = "elastic-file-system-efs.png" | |||||
class FsxForLustre(_Storage): | |||||
_icon = "fsx-for-lustre.png" | |||||
class FsxForWindowsFileServer(_Storage): | |||||
_icon = "fsx-for-windows-file-server.png" | |||||
class Fsx(_Storage): | |||||
_icon = "fsx.png" | |||||
class S3Glacier(_Storage): | |||||
_icon = "s3-glacier.png" | |||||
class SimpleStorageServiceS3(_Storage): | |||||
_icon = "simple-storage-service-s3.png" | |||||
class SnowballEdge(_Storage): | |||||
_icon = "snowball-edge.png" | |||||
class Snowball(_Storage): | |||||
_icon = "snowball.png" | |||||
class Snowmobile(_Storage): | |||||
_icon = "snowmobile.png" | |||||
class StorageGateway(_Storage): | |||||
_icon = "storage-gateway.png" | |||||
class Storage(_Storage): | |||||
_icon = "storage.png" | |||||
# Aliases | |||||
CDR = CloudendureDisasterRecovery | |||||
EBS = ElasticBlockStoreEBS | |||||
EFS = ElasticFileSystemEFS | |||||
FSx = Fsx | |||||
S3 = SimpleStorageServiceS3 |
@@ -0,0 +1,12 @@ | |||||
""" | |||||
Azure provides a set of services for Microsoft Azure provider. | |||||
""" | |||||
from diagrams import Node | |||||
class _Azure(Node): | |||||
_provider = "azure" | |||||
_icon_dir = "resources/azure" | |||||
fontcolor = "#ffffff" |
@@ -0,0 +1,55 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Analytics(_Azure): | |||||
_type = "analytics" | |||||
_icon_dir = "resources/azure/analytics" | |||||
class AnalysisServices(_Analytics): | |||||
_icon = "analysis-services.png" | |||||
class DataExplorerClusters(_Analytics): | |||||
_icon = "data-explorer-clusters.png" | |||||
class DataFactories(_Analytics): | |||||
_icon = "data-factories.png" | |||||
class DataLakeAnalytics(_Analytics): | |||||
_icon = "data-lake-analytics.png" | |||||
class DataLakeStoreGen1(_Analytics): | |||||
_icon = "data-lake-store-gen1.png" | |||||
class Databricks(_Analytics): | |||||
_icon = "databricks.png" | |||||
class EventHubClusters(_Analytics): | |||||
_icon = "event-hub-clusters.png" | |||||
class EventHubs(_Analytics): | |||||
_icon = "event-hubs.png" | |||||
class Hdinsightclusters(_Analytics): | |||||
_icon = "hdinsightclusters.png" | |||||
class LogAnalyticsWorkspaces(_Analytics): | |||||
_icon = "log-analytics-workspaces.png" | |||||
class StreamAnalyticsJobs(_Analytics): | |||||
_icon = "stream-analytics-jobs.png" | |||||
# Aliases |
@@ -0,0 +1,94 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Compute(_Azure): | |||||
_type = "compute" | |||||
_icon_dir = "resources/azure/compute" | |||||
class AvailabilitySets(_Compute): | |||||
_icon = "availability-sets.png" | |||||
class BatchAccounts(_Compute): | |||||
_icon = "batch-accounts.png" | |||||
class CitrixVirtualDesktopsEssentials(_Compute): | |||||
_icon = "citrix-virtual-desktops-essentials.png" | |||||
class CloudServicesClassic(_Compute): | |||||
_icon = "cloud-services-classic.png" | |||||
class CloudServices(_Compute): | |||||
_icon = "cloud-services.png" | |||||
class CloudsimpleVirtualMachines(_Compute): | |||||
_icon = "cloudsimple-virtual-machines.png" | |||||
class ContainerInstances(_Compute): | |||||
_icon = "container-instances.png" | |||||
class ContainerRegistries(_Compute): | |||||
_icon = "container-registries.png" | |||||
class DiskSnapshots(_Compute): | |||||
_icon = "disk-snapshots.png" | |||||
class Disks(_Compute): | |||||
_icon = "disks.png" | |||||
class FunctionApps(_Compute): | |||||
_icon = "function-apps.png" | |||||
class KubernetesServices(_Compute): | |||||
_icon = "kubernetes-services.png" | |||||
class MeshApplications(_Compute): | |||||
_icon = "mesh-applications.png" | |||||
class SAPHANAOnAzure(_Compute): | |||||
_icon = "sap-hana-on-azure.png" | |||||
class ServiceFabricClusters(_Compute): | |||||
_icon = "service-fabric-clusters.png" | |||||
class VMClassic(_Compute): | |||||
_icon = "vm-classic.png" | |||||
class VMImages(_Compute): | |||||
_icon = "vm-images.png" | |||||
class VMLinux(_Compute): | |||||
_icon = "vm-linux.png" | |||||
class VMWindows(_Compute): | |||||
_icon = "vm-windows.png" | |||||
class VM(_Compute): | |||||
_icon = "vm.png" | |||||
# Aliases | |||||
ACR = ContainerRegistries | |||||
AKS = KubernetesServices |
@@ -0,0 +1,79 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Database(_Azure): | |||||
_type = "database" | |||||
_icon_dir = "resources/azure/database" | |||||
class BlobStorage(_Database): | |||||
_icon = "blob-storage.png" | |||||
class CacheForRedis(_Database): | |||||
_icon = "cache-for-redis.png" | |||||
class CosmosDb(_Database): | |||||
_icon = "cosmos-db.png" | |||||
class DataLake(_Database): | |||||
_icon = "data-lake.png" | |||||
class DatabaseForMariadbServers(_Database): | |||||
_icon = "database-for-mariadb-servers.png" | |||||
class DatabaseForMysqlServers(_Database): | |||||
_icon = "database-for-mysql-servers.png" | |||||
class DatabaseForPostgresqlServers(_Database): | |||||
_icon = "database-for-postgresql-servers.png" | |||||
class ElasticDatabasePools(_Database): | |||||
_icon = "elastic-database-pools.png" | |||||
class ElasticJobAgents(_Database): | |||||
_icon = "elastic-job-agents.png" | |||||
class ManagedDatabases(_Database): | |||||
_icon = "managed-databases.png" | |||||
class SQLDatabases(_Database): | |||||
_icon = "sql-databases.png" | |||||
class SQLDatawarehouse(_Database): | |||||
_icon = "sql-datawarehouse.png" | |||||
class SQLManagedInstances(_Database): | |||||
_icon = "sql-managed-instances.png" | |||||
class SQLServerStretchDatabases(_Database): | |||||
_icon = "sql-server-stretch-databases.png" | |||||
class SQLServers(_Database): | |||||
_icon = "sql-servers.png" | |||||
class VirtualClusters(_Database): | |||||
_icon = "virtual-clusters.png" | |||||
class VirtualDatacenter(_Database): | |||||
_icon = "virtual-datacenter.png" | |||||
# Aliases |
@@ -0,0 +1,43 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Devops(_Azure): | |||||
_type = "devops" | |||||
_icon_dir = "resources/azure/devops" | |||||
class ApplicationInsights(_Devops): | |||||
_icon = "application-insights.png" | |||||
class Artifacts(_Devops): | |||||
_icon = "artifacts.png" | |||||
class Boards(_Devops): | |||||
_icon = "boards.png" | |||||
class Devops(_Devops): | |||||
_icon = "devops.png" | |||||
class DevtestLabs(_Devops): | |||||
_icon = "devtest-labs.png" | |||||
class Pipelines(_Devops): | |||||
_icon = "pipelines.png" | |||||
class Repos(_Devops): | |||||
_icon = "repos.png" | |||||
class TestPlans(_Devops): | |||||
_icon = "test-plans.png" | |||||
# Aliases |
@@ -0,0 +1,63 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Identity(_Azure): | |||||
_type = "identity" | |||||
_icon_dir = "resources/azure/identity" | |||||
class AccessReview(_Identity): | |||||
_icon = "access-review.png" | |||||
class ActiveDirectoryConnectHealth(_Identity): | |||||
_icon = "active-directory-connect-health.png" | |||||
class ActiveDirectory(_Identity): | |||||
_icon = "active-directory.png" | |||||
class ADB2C(_Identity): | |||||
_icon = "ad-b2c.png" | |||||
class ADDomainServices(_Identity): | |||||
_icon = "ad-domain-services.png" | |||||
class ADIdentityProtection(_Identity): | |||||
_icon = "ad-identity-protection.png" | |||||
class ADPrivilegedIdentityManagement(_Identity): | |||||
_icon = "ad-privileged-identity-management.png" | |||||
class AppRegistrations(_Identity): | |||||
_icon = "app-registrations.png" | |||||
class ConditionalAccess(_Identity): | |||||
_icon = "conditional-access.png" | |||||
class EnterpriseApplications(_Identity): | |||||
_icon = "enterprise-applications.png" | |||||
class IdentityGovernance(_Identity): | |||||
_icon = "identity-governance.png" | |||||
class InformationProtection(_Identity): | |||||
_icon = "information-protection.png" | |||||
class ManagedIdentities(_Identity): | |||||
_icon = "managed-identities.png" | |||||
# Aliases |
@@ -0,0 +1,51 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Iot(_Azure): | |||||
_type = "iot" | |||||
_icon_dir = "resources/azure/iot" | |||||
class DeviceProvisioningServices(_Iot): | |||||
_icon = "device-provisioning-services.png" | |||||
class DigitalTwins(_Iot): | |||||
_icon = "digital-twins.png" | |||||
class IotCentralApplications(_Iot): | |||||
_icon = "iot-central-applications.png" | |||||
class IotHubSecurity(_Iot): | |||||
_icon = "iot-hub-security.png" | |||||
class IotHub(_Iot): | |||||
_icon = "iot-hub.png" | |||||
class Maps(_Iot): | |||||
_icon = "maps.png" | |||||
class Sphere(_Iot): | |||||
_icon = "sphere.png" | |||||
class TimeSeriesInsightsEnvironments(_Iot): | |||||
_icon = "time-series-insights-environments.png" | |||||
class TimeSeriesInsightsEventsSources(_Iot): | |||||
_icon = "time-series-insights-events-sources.png" | |||||
class Windows10IotCoreServices(_Iot): | |||||
_icon = "windows-10-iot-core-services.png" | |||||
# Aliases |
@@ -0,0 +1,23 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Migration(_Azure): | |||||
_type = "migration" | |||||
_icon_dir = "resources/azure/migration" | |||||
class DatabaseMigrationServices(_Migration): | |||||
_icon = "database-migration-services.png" | |||||
class MigrationProjects(_Migration): | |||||
_icon = "migration-projects.png" | |||||
class RecoveryServicesVaults(_Migration): | |||||
_icon = "recovery-services-vaults.png" | |||||
# Aliases |
@@ -0,0 +1,43 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Ml(_Azure): | |||||
_type = "ml" | |||||
_icon_dir = "resources/azure/ml" | |||||
class BatchAI(_Ml): | |||||
_icon = "batch-ai.png" | |||||
class BotServices(_Ml): | |||||
_icon = "bot-services.png" | |||||
class CognitiveServices(_Ml): | |||||
_icon = "cognitive-services.png" | |||||
class GenomicsAccounts(_Ml): | |||||
_icon = "genomics-accounts.png" | |||||
class MachineLearningServiceWorkspaces(_Ml): | |||||
_icon = "machine-learning-service-workspaces.png" | |||||
class MachineLearningStudioWebServicePlans(_Ml): | |||||
_icon = "machine-learning-studio-web-service-plans.png" | |||||
class MachineLearningStudioWebServices(_Ml): | |||||
_icon = "machine-learning-studio-web-services.png" | |||||
class MachineLearningStudioWorkspaces(_Ml): | |||||
_icon = "machine-learning-studio-workspaces.png" | |||||
# Aliases |
@@ -0,0 +1,23 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Mobile(_Azure): | |||||
_type = "mobile" | |||||
_icon_dir = "resources/azure/mobile" | |||||
class AppServiceMobile(_Mobile): | |||||
_icon = "app-service---mobile.png" | |||||
class MobileEngagement(_Mobile): | |||||
_icon = "mobile-engagement.png" | |||||
class NotificationHubs(_Mobile): | |||||
_icon = "notification-hubs.png" | |||||
# Aliases |
@@ -0,0 +1,115 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Network(_Azure): | |||||
_type = "network" | |||||
_icon_dir = "resources/azure/network" | |||||
class ApplicationGateway(_Network): | |||||
_icon = "application-gateway.png" | |||||
class ApplicationSecurityGroups(_Network): | |||||
_icon = "application-security-groups.png" | |||||
class CDNProfiles(_Network): | |||||
_icon = "cdn-profiles.png" | |||||
class Connections(_Network): | |||||
_icon = "connections.png" | |||||
class DDOSProtectionPlans(_Network): | |||||
_icon = "ddos-protection-plans.png" | |||||
class DNSPrivateZones(_Network): | |||||
_icon = "dns-private-zones.png" | |||||
class DNSZones(_Network): | |||||
_icon = "dns-zones.png" | |||||
class ExpressrouteCircuits(_Network): | |||||
_icon = "expressroute-circuits.png" | |||||
class Firewall(_Network): | |||||
_icon = "firewall.png" | |||||
class FrontDoors(_Network): | |||||
_icon = "front-doors.png" | |||||
class LoadBalancers(_Network): | |||||
_icon = "load-balancers.png" | |||||
class LocalNetworkGateways(_Network): | |||||
_icon = "local-network-gateways.png" | |||||
class NetworkInterfaces(_Network): | |||||
_icon = "network-interfaces.png" | |||||
class NetworkSecurityGroupsClassic(_Network): | |||||
_icon = "network-security-groups-classic.png" | |||||
class NetworkWatcher(_Network): | |||||
_icon = "network-watcher.png" | |||||
class OnPremisesDataGateways(_Network): | |||||
_icon = "on-premises-data-gateways.png" | |||||
class PublicIpAddresses(_Network): | |||||
_icon = "public-ip-addresses.png" | |||||
class ReservedIpAddressesClassic(_Network): | |||||
_icon = "reserved-ip-addresses-classic.png" | |||||
class RouteFilters(_Network): | |||||
_icon = "route-filters.png" | |||||
class RouteTables(_Network): | |||||
_icon = "route-tables.png" | |||||
class ServiceEndpointPolicies(_Network): | |||||
_icon = "service-endpoint-policies.png" | |||||
class TrafficManagerProfiles(_Network): | |||||
_icon = "traffic-manager-profiles.png" | |||||
class VirtualNetworkClassic(_Network): | |||||
_icon = "virtual-network-classic.png" | |||||
class VirtualNetworkGateways(_Network): | |||||
_icon = "virtual-network-gateways.png" | |||||
class VirtualNetworks(_Network): | |||||
_icon = "virtual-networks.png" | |||||
class VirtualWans(_Network): | |||||
_icon = "virtual-wans.png" | |||||
# Aliases |
@@ -0,0 +1,23 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Security(_Azure): | |||||
_type = "security" | |||||
_icon_dir = "resources/azure/security" | |||||
class KeyVaults(_Security): | |||||
_icon = "key-vaults.png" | |||||
class SecurityCenter(_Security): | |||||
_icon = "security-center.png" | |||||
class Sentinel(_Security): | |||||
_icon = "sentinel.png" | |||||
# Aliases |
@@ -0,0 +1,75 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Storage(_Azure): | |||||
_type = "storage" | |||||
_icon_dir = "resources/azure/storage" | |||||
class ArchiveStorage(_Storage): | |||||
_icon = "archive-storage.png" | |||||
class Azurefxtedgefiler(_Storage): | |||||
_icon = "azurefxtedgefiler.png" | |||||
class BlobStorage(_Storage): | |||||
_icon = "blob-storage.png" | |||||
class DataBoxEdgeDataBoxGateway(_Storage): | |||||
_icon = "data-box-edge---data-box-gateway.png" | |||||
class DataBox(_Storage): | |||||
_icon = "data-box.png" | |||||
class DataLakeStorage(_Storage): | |||||
_icon = "data-lake-storage.png" | |||||
class GeneralStorage(_Storage): | |||||
_icon = "general-storage.png" | |||||
class NetappFiles(_Storage): | |||||
_icon = "netapp-files.png" | |||||
class QueuesStorage(_Storage): | |||||
_icon = "queues-storage.png" | |||||
class StorageAccountsClassic(_Storage): | |||||
_icon = "storage-accounts-classic.png" | |||||
class StorageAccounts(_Storage): | |||||
_icon = "storage-accounts.png" | |||||
class StorageExplorer(_Storage): | |||||
_icon = "storage-explorer.png" | |||||
class StorageSyncServices(_Storage): | |||||
_icon = "storage-sync-services.png" | |||||
class StorsimpleDataManagers(_Storage): | |||||
_icon = "storsimple-data-managers.png" | |||||
class StorsimpleDeviceManagers(_Storage): | |||||
_icon = "storsimple-device-managers.png" | |||||
class TableStorage(_Storage): | |||||
_icon = "table-storage.png" | |||||
# Aliases |
@@ -0,0 +1,51 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _Azure | |||||
class _Web(_Azure): | |||||
_type = "web" | |||||
_icon_dir = "resources/azure/web" | |||||
class APIConnections(_Web): | |||||
_icon = "api-connections.png" | |||||
class AppServiceCertificates(_Web): | |||||
_icon = "app-service-certificates.png" | |||||
class AppServiceDomains(_Web): | |||||
_icon = "app-service-domains.png" | |||||
class AppServiceEnvironments(_Web): | |||||
_icon = "app-service-environments.png" | |||||
class AppServicePlans(_Web): | |||||
_icon = "app-service-plans.png" | |||||
class AppServices(_Web): | |||||
_icon = "app-services.png" | |||||
class MediaServices(_Web): | |||||
_icon = "media-services.png" | |||||
class NotificationHubNamespaces(_Web): | |||||
_icon = "notification-hub-namespaces.png" | |||||
class Search(_Web): | |||||
_icon = "search.png" | |||||
class Signalr(_Web): | |||||
_icon = "signalr.png" | |||||
# Aliases |
@@ -0,0 +1,12 @@ | |||||
""" | |||||
Base provides a set of general services for backend infrastructure. | |||||
""" | |||||
from diagrams import Node | |||||
class _Base(Node): | |||||
_provider = "base" | |||||
_icon_dir = "resources/base" | |||||
fontcolor = "#ffffff" |
@@ -0,0 +1,12 @@ | |||||
""" | |||||
GCP provides a set of services for Google Cloud Platform provider. | |||||
""" | |||||
from diagrams import Node | |||||
class _GCP(Node): | |||||
_provider = "gcp" | |||||
_icon_dir = "resources/gcp" | |||||
fontcolor = "#2d3436" |
@@ -0,0 +1,54 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Analytics(_GCP): | |||||
_type = "analytics" | |||||
_icon_dir = "resources/gcp/analytics" | |||||
class Bigquery(_Analytics): | |||||
_icon = "bigquery.png" | |||||
class Composer(_Analytics): | |||||
_icon = "composer.png" | |||||
class DataCatalog(_Analytics): | |||||
_icon = "data-catalog.png" | |||||
class DataFusion(_Analytics): | |||||
_icon = "data-fusion.png" | |||||
class Dataflow(_Analytics): | |||||
_icon = "dataflow.png" | |||||
class Datalab(_Analytics): | |||||
_icon = "datalab.png" | |||||
class Dataprep(_Analytics): | |||||
_icon = "dataprep.png" | |||||
class Dataproc(_Analytics): | |||||
_icon = "dataproc.png" | |||||
class Genomics(_Analytics): | |||||
_icon = "genomics.png" | |||||
class Pubsub(_Analytics): | |||||
_icon = "pubsub.png" | |||||
# Aliases | |||||
BigQuery = Bigquery | |||||
PubSub = Pubsub |
@@ -0,0 +1,48 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Compute(_GCP): | |||||
_type = "compute" | |||||
_icon_dir = "resources/gcp/compute" | |||||
class AppEngine(_Compute): | |||||
_icon = "app-engine.png" | |||||
class ComputeEngine(_Compute): | |||||
_icon = "compute-engine.png" | |||||
class ContainerOptimizedOS(_Compute): | |||||
_icon = "container-optimized-os.png" | |||||
class Functions(_Compute): | |||||
_icon = "functions.png" | |||||
class GKEOnPrem(_Compute): | |||||
_icon = "gke-on-prem.png" | |||||
class GPU(_Compute): | |||||
_icon = "gpu.png" | |||||
class KubernetesEngine(_Compute): | |||||
_icon = "kubernetes-engine.png" | |||||
class Run(_Compute): | |||||
_icon = "run.png" | |||||
# Aliases | |||||
GAE = AppEngine | |||||
GCF = Functions | |||||
GCE = ComputeEngine | |||||
GKE = KubernetesEngine |
@@ -0,0 +1,37 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Database(_GCP): | |||||
_type = "database" | |||||
_icon_dir = "resources/gcp/database" | |||||
class Bigtable(_Database): | |||||
_icon = "bigtable.png" | |||||
class Datastore(_Database): | |||||
_icon = "datastore.png" | |||||
class Firestore(_Database): | |||||
_icon = "firestore.png" | |||||
class Memorystore(_Database): | |||||
_icon = "memorystore.png" | |||||
class Spanner(_Database): | |||||
_icon = "spanner.png" | |||||
class SQL(_Database): | |||||
_icon = "sql.png" | |||||
# Aliases | |||||
BigTable = Bigtable |
@@ -0,0 +1,73 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Devtools(_GCP): | |||||
_type = "devtools" | |||||
_icon_dir = "resources/gcp/devtools" | |||||
class Build(_Devtools): | |||||
_icon = "build.png" | |||||
class CodeForIntellij(_Devtools): | |||||
_icon = "code-for-intellij.png" | |||||
class Code(_Devtools): | |||||
_icon = "code.png" | |||||
class ContainerRegistry(_Devtools): | |||||
_icon = "container-registry.png" | |||||
class GradleAppEnginePlugin(_Devtools): | |||||
_icon = "gradle-app-engine-plugin.png" | |||||
class IdePlugins(_Devtools): | |||||
_icon = "ide-plugins.png" | |||||
class MavenAppEnginePlugin(_Devtools): | |||||
_icon = "maven-app-engine-plugin.png" | |||||
class Scheduler(_Devtools): | |||||
_icon = "scheduler.png" | |||||
class SDK(_Devtools): | |||||
_icon = "sdk.png" | |||||
class SourceRepositories(_Devtools): | |||||
_icon = "source-repositories.png" | |||||
class Tasks(_Devtools): | |||||
_icon = "tasks.png" | |||||
class TestLab(_Devtools): | |||||
_icon = "test-lab.png" | |||||
class ToolsForEclipse(_Devtools): | |||||
_icon = "tools-for-eclipse.png" | |||||
class ToolsForPowershell(_Devtools): | |||||
_icon = "tools-for-powershell.png" | |||||
class ToolsForVisualStudio(_Devtools): | |||||
_icon = "tools-for-visual-studio.png" | |||||
# Aliases | |||||
GCR = ContainerRegistry |
@@ -0,0 +1,15 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Iot(_GCP): | |||||
_type = "iot" | |||||
_icon_dir = "resources/gcp/iot" | |||||
class IotCore(_Iot): | |||||
_icon = "iot-core.png" | |||||
# Aliases |
@@ -0,0 +1,15 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Migration(_GCP): | |||||
_type = "migration" | |||||
_icon_dir = "resources/gcp/migration" | |||||
class TransferAppliance(_Migration): | |||||
_icon = "transfer-appliance.png" | |||||
# Aliases |
@@ -0,0 +1,100 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _ML(_GCP): | |||||
_type = "ml" | |||||
_icon_dir = "resources/gcp/ml" | |||||
class AdvancedSolutionsLab(_ML): | |||||
_icon = "advanced-solutions-lab.png" | |||||
class AIHub(_ML): | |||||
_icon = "ai-hub.png" | |||||
class AIPlatformDataLabelingService(_ML): | |||||
_icon = "ai-platform-data-labeling-service.png" | |||||
class AIPlatform(_ML): | |||||
_icon = "ai-platform.png" | |||||
class AutomlNaturalLanguage(_ML): | |||||
_icon = "automl-natural-language.png" | |||||
class AutomlTables(_ML): | |||||
_icon = "automl-tables.png" | |||||
class AutomlTranslation(_ML): | |||||
_icon = "automl-translation.png" | |||||
class AutomlVideoIntelligence(_ML): | |||||
_icon = "automl-video-intelligence.png" | |||||
class AutomlVision(_ML): | |||||
_icon = "automl-vision.png" | |||||
class Automl(_ML): | |||||
_icon = "automl.png" | |||||
class DialogFlowEnterpriseEdition(_ML): | |||||
_icon = "dialog-flow-enterprise-edition.png" | |||||
class InferenceAPI(_ML): | |||||
_icon = "inference-api.png" | |||||
class JobsAPI(_ML): | |||||
_icon = "jobs-api.png" | |||||
class NaturalLanguageAPI(_ML): | |||||
_icon = "natural-language-api.png" | |||||
class RecommendationsAI(_ML): | |||||
_icon = "recommendations-ai.png" | |||||
class SpeechToText(_ML): | |||||
_icon = "speech-to-text.png" | |||||
class TextToSpeech(_ML): | |||||
_icon = "text-to-speech.png" | |||||
class TPU(_ML): | |||||
_icon = "tpu.png" | |||||
class TranslationAPI(_ML): | |||||
_icon = "translation-api.png" | |||||
class VideoIntelligenceAPI(_ML): | |||||
_icon = "video-intelligence-api.png" | |||||
class VisionAPI(_ML): | |||||
_icon = "vision-api.png" | |||||
# Aliases | |||||
AutoML = Automl | |||||
NLAPI = NaturalLanguageAPI | |||||
STT = SpeechToText | |||||
TTS = TextToSpeech |
@@ -0,0 +1,81 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Network(_GCP): | |||||
_type = "network" | |||||
_icon_dir = "resources/gcp/network" | |||||
class Armor(_Network): | |||||
_icon = "armor.png" | |||||
class CDN(_Network): | |||||
_icon = "cdn.png" | |||||
class DedicatedInterconnect(_Network): | |||||
_icon = "dedicated-interconnect.png" | |||||
class DNS(_Network): | |||||
_icon = "dns.png" | |||||
class ExternalIpAddresses(_Network): | |||||
_icon = "external-ip-addresses.png" | |||||
class FirewallRules(_Network): | |||||
_icon = "firewall-rules.png" | |||||
class LoadBalancing(_Network): | |||||
_icon = "load-balancing.png" | |||||
class NAT(_Network): | |||||
_icon = "nat.png" | |||||
class Network(_Network): | |||||
_icon = "network.png" | |||||
class PartnerInterconnect(_Network): | |||||
_icon = "partner-interconnect.png" | |||||
class PremiumNetworkTier(_Network): | |||||
_icon = "premium-network-tier.png" | |||||
class Router(_Network): | |||||
_icon = "router.png" | |||||
class Routes(_Network): | |||||
_icon = "routes.png" | |||||
class StandardNetworkTier(_Network): | |||||
_icon = "standard-network-tier.png" | |||||
class TrafficDirector(_Network): | |||||
_icon = "traffic-director.png" | |||||
class VirtualPrivateCloud(_Network): | |||||
_icon = "virtual-private-cloud.png" | |||||
class VPN(_Network): | |||||
_icon = "vpn.png" | |||||
# Aliases | |||||
VPC = VirtualPrivateCloud |
@@ -0,0 +1,34 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Security(_GCP): | |||||
_type = "security" | |||||
_icon_dir = "resources/gcp/security" | |||||
class Iam(_Security): | |||||
_icon = "iam.png" | |||||
class KeyManagementService(_Security): | |||||
_icon = "key-management-service.png" | |||||
class ResourceManager(_Security): | |||||
_icon = "resource-manager.png" | |||||
class SecurityCommandCenter(_Security): | |||||
_icon = "security-command-center.png" | |||||
class SecurityScanner(_Security): | |||||
_icon = "security-scanner.png" | |||||
# Aliases | |||||
KMS = KeyManagementService | |||||
SCC = SecurityCommandCenter |
@@ -0,0 +1,25 @@ | |||||
# This module is automatically generated by autogen.sh. DO NOT EDIT. | |||||
from . import _GCP | |||||
class _Storage(_GCP): | |||||
_type = "storage" | |||||
_icon_dir = "resources/gcp/storage" | |||||
class Filestore(_Storage): | |||||
_icon = "filestore.png" | |||||
class PersistentDisk(_Storage): | |||||
_icon = "persistent-disk.png" | |||||
class Storage(_Storage): | |||||
_icon = "storage.png" | |||||
# Aliases | |||||
GCS = Storage |
@@ -0,0 +1,71 @@ | |||||
--- | |||||
id: cluster | |||||
title: Clusters | |||||
--- | |||||
Cluster allows you group (or clustering) the nodes in an isolated group. | |||||
## Basic | |||||
Cluster represents a local cluster context. | |||||
You can create a cluster context with Cluster class. And you can also connect the nodes in a cluster to other nodes outside a cluster. | |||||
```python | |||||
from diagrams import Cluster, Diagram | |||||
from diagrams.aws.compute import ECS | |||||
from diagrams.aws.database import RDS | |||||
from diagrams.aws.network import Route53 | |||||
with Diagram("Simple Web Service with DB Cluster", show=False): | |||||
dns = Route53("dns") | |||||
web = ECS("service") | |||||
with Cluster("DB Cluster"): | |||||
db_master = RDS("master") | |||||
db_master - [RDS("slave1"), | |||||
RDS("slave2")] | |||||
dns >> web >> db_master | |||||
``` | |||||
![simple web service with db cluster diagram](/img/simple_web_service_with_db_cluster_diagram.png) | |||||
## Nested Clusters | |||||
Nested clustering is also possible. | |||||
```python | |||||
from diagrams import Cluster, Diagram | |||||
from diagrams.aws.compute import ECS, EKS, Lambda | |||||
from diagrams.aws.database import Redshift | |||||
from diagrams.aws.integration import SQS | |||||
from diagrams.aws.storage import S3 | |||||
with Diagram("Event Processing", show=False): | |||||
source = EKS("k8s source") | |||||
with Cluster("Event Flows"): | |||||
with Cluster("Event Workers"): | |||||
workers = [ECS("worker1"), | |||||
ECS("worker2"), | |||||
ECS("worker3")] | |||||
queue = SQS("event queue") | |||||
with Cluster("Processing"): | |||||
handlers = [Lambda("proc1"), | |||||
Lambda("proc2"), | |||||
Lambda("proc3")] | |||||
store = S3("events store") | |||||
dw = Redshift("analytics") | |||||
source >> workers >> queue >> handlers | |||||
handlers >> store | |||||
handlers >> dw | |||||
``` | |||||
![event processing diagram](/img/event_processing_diagram.png) | |||||
> There is no depth limit of nesting. Feel free to create nested clusters as deep as you want. |
@@ -0,0 +1,53 @@ | |||||
--- | |||||
id: diagram | |||||
title: Diagrams | |||||
--- | |||||
Diagram is a primary object representing a diagram. | |||||
## Basic | |||||
Diagram represents a global diagram context. | |||||
You can create a diagram context with Diagram class. The first parameter of Diagram constructor will be used for output filename. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
with Diagram("Simple Diagram"): | |||||
EC2("web") | |||||
``` | |||||
And if you run the above script with below command, | |||||
```shell | |||||
$ python diagram.py | |||||
``` | |||||
It will generate an image file with single `EC2` node drawn as `simple_diagram.png` on your working directory, and open that created image file immediately. | |||||
## Options | |||||
You can specify the output file format with `outformat` parameter. Default is **png**. | |||||
> (png, jpg, svg, and pdf) are allowed. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
with Diagram("Simple Diagram", outformat="jpg"): | |||||
EC2("web") | |||||
``` | |||||
You can also disable the automatic file opening by setting the `show` parameter as **false**. Default is **true**. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
with Diagram("Simple Diagram", show=False): | |||||
EC2("web") | |||||
``` | |||||
@@ -0,0 +1,129 @@ | |||||
--- | |||||
id: examples | |||||
title: Examples | |||||
--- | |||||
Here are some more examples. | |||||
## Grouped Workers | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
from diagrams.aws.database import RDS | |||||
from diagrams.aws.network import ELB | |||||
with Diagram("Grouped Workers", show=False, direction="TB"): | |||||
ELB("lb") >> [EC2("worker1"), | |||||
EC2("worker2"), | |||||
EC2("worker3"), | |||||
EC2("worker4"), | |||||
EC2("worker5")] >> RDS("events") | |||||
``` | |||||
![grouped workers diagram](/img/grouped_workers_diagram.png) | |||||
## Clustered Web Services | |||||
```python | |||||
from diagrams import Cluster, Diagram | |||||
from diagrams.aws.compute import ECS | |||||
from diagrams.aws.database import ElastiCache, RDS | |||||
from diagrams.aws.network import ELB | |||||
from diagrams.aws.network import Route53 | |||||
with Diagram("Clustered Web Services", show=False): | |||||
dns = Route53("dns") | |||||
lb = ELB("lb") | |||||
with Cluster("Services"): | |||||
svc_group = [ECS("web1"), | |||||
ECS("web2"), | |||||
ECS("web3")] | |||||
with Cluster("DB Cluster"): | |||||
db_master = RDS("userdb") | |||||
db_master - [RDS("userdb ro")] | |||||
memcached = ElastiCache("memcached") | |||||
dns >> lb >> svc_group | |||||
svc_group >> db_master | |||||
svc_group >> memcached | |||||
``` | |||||
![clustered web services diagram](/img/clustered_web_services_diagram.png) | |||||
## Event Processing | |||||
```python | |||||
from diagrams import Cluster, Diagram | |||||
from diagrams.aws.compute import ECS, EKS, Lambda | |||||
from diagrams.aws.database import Redshift | |||||
from diagrams.aws.integration import SQS | |||||
from diagrams.aws.storage import S3 | |||||
with Diagram("Event Processing", show=False): | |||||
source = EKS("k8s source") | |||||
with Cluster("Event Flows"): | |||||
with Cluster("Event Workers"): | |||||
workers = [ECS("worker1"), | |||||
ECS("worker2"), | |||||
ECS("worker3")] | |||||
queue = SQS("event queue") | |||||
with Cluster("Processing"): | |||||
handlers = [Lambda("proc1"), | |||||
Lambda("proc2"), | |||||
Lambda("proc3")] | |||||
store = S3("events store") | |||||
dw = Redshift("analytics") | |||||
source >> workers >> queue >> handlers | |||||
handlers >> store | |||||
handlers >> dw | |||||
``` | |||||
![event processing diagram](/img/event_processing_diagram.png) | |||||
## Message Collecting System | |||||
```python | |||||
from diagrams import Cluster, Diagram | |||||
from diagrams.gcp.analytics import BigQuery, Dataflow, PubSub | |||||
from diagrams.gcp.compute import AppEngine, Functions | |||||
from diagrams.gcp.database import BigTable | |||||
from diagrams.gcp.iot import IotCore | |||||
from diagrams.gcp.storage import GCS | |||||
with Diagram("Message Collecting", show=False): | |||||
pubsub = PubSub("pubsub") | |||||
with Cluster("Source of Data"): | |||||
[IotCore("core1"), | |||||
IotCore("core2"), | |||||
IotCore("core3")] >> pubsub | |||||
with Cluster("Targets"): | |||||
with Cluster("Data Flow"): | |||||
flow = Dataflow("data flow") | |||||
with Cluster("Data Lake"): | |||||
flow >> [BigQuery("bq"), | |||||
GCS("storage")] | |||||
with Cluster("Event Driven"): | |||||
with Cluster("Processing"): | |||||
flow >> AppEngine("engine") >> BigTable("bigtable") | |||||
with Cluster("Serverless"): | |||||
flow >> Functions("func") >> AppEngine("appengine") | |||||
pubsub >> flow | |||||
``` | |||||
![message collecting diagram](/img/message_collecting_diagram.png) |
@@ -0,0 +1,37 @@ | |||||
--- | |||||
id: installation | |||||
title: Installation | |||||
--- | |||||
It uses [Graphviz](https://www.graphviz.org/) to render the diagram, so you need to [install Graphviz](https://graphviz.gitlab.io/download/) to use **diagrams**. After installing graphviz (or already have it), install the **diagrams**. | |||||
```shell | |||||
$ pip install diagrams | |||||
``` | |||||
## Quick Start | |||||
```python | |||||
# diagram.py | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
from diagrams.aws.database import RDS | |||||
from diagrams.aws.network import ELB | |||||
with Diagram("Web Service", show=False): | |||||
ELB("lb") >> EC2("web") >> RDS("userdb") | |||||
``` | |||||
This code generates below diagram. | |||||
```shell | |||||
$ python diagram.py | |||||
``` | |||||
![web service diagram](/img/web_service_diagram.png) | |||||
It will be saved as `web_service.png` on your working directory. | |||||
## Next | |||||
See more [Examples](/docs/examples) or see [Guides](/docs/diagram) page for more details. |
@@ -0,0 +1,113 @@ | |||||
--- | |||||
id: node | |||||
title: Nodes | |||||
--- | |||||
Node is a second object representing a node or system component. | |||||
## Basic | |||||
Node is an abstract concept that represents a single system component object. | |||||
A node object consists of three parts: **provider**, **resource type** and **name**. You may already have seen each part in the previous example. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
with Diagram("Simple Diagram"): | |||||
EC2("web") | |||||
``` | |||||
In above example, the `EC2` is a node of `compute` resource type which provided by `aws` provider. | |||||
You can use other node objects in a similar manner like: | |||||
```python | |||||
# aws resources | |||||
from diagrams.aws.compute import ECS, Lambda | |||||
from diagrams.aws.database import RDS, ElastiCache | |||||
from diagrams.aws.network import ELB, Route53, VPC | |||||
... | |||||
# azure resources | |||||
from diagrams.azure.compute import FunctionApps | |||||
from diagrams.azure.storage import BlobStorage | |||||
... | |||||
# gcp resources | |||||
from diagrams.gcp.compute import AppEngine, GKE | |||||
from diagrams.gcp.ml import AutoML | |||||
... | |||||
``` | |||||
## Data Flow | |||||
You can represent data flow by connecting the nodes with these operators: `>>`, `<<` and `-`. | |||||
* **>>**: Connect nodes in left to right direction. | |||||
* **<<**: Connect nodes in right to left direction. | |||||
* **-**: Connect nodes in no direction. Undirected. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
from diagrams.aws.database import RDS | |||||
from diagrams.aws.network import ELB | |||||
from diagrams.aws.storage import S3 | |||||
with Diagram("Web Services", show=False): | |||||
ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store") | |||||
ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat") | |||||
(ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb") | |||||
``` | |||||
> Be careful when using the `-` and any shift operators together, which could cause unexpected results due to operator precedence. | |||||
![web services diagram](/img/web_services_diagram.png) | |||||
> The order of rendered diagrams is the reverse of the declaration order. | |||||
You can change the data flow direction with `direction` parameter. Default is **LR**. | |||||
> (TB, BT, LR and RL) are allowed. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
from diagrams.aws.database import RDS | |||||
from diagrams.aws.network import ELB | |||||
with Diagram("Workers", show=False, direction="TB"): | |||||
lb = ELB("lb") | |||||
db = RDS("events") | |||||
lb >> EC2("worker1") >> db | |||||
lb >> EC2("worker2") >> db | |||||
lb >> EC2("worker3") >> db | |||||
lb >> EC2("worker4") >> db | |||||
lb >> EC2("worker5") >> db | |||||
``` | |||||
![workers diagram](/img/workers_diagram.png) | |||||
## Group Data Flow | |||||
Above worker example has too many redundant flows. In this case, you can group nodes into a list so that all nodes are connected to other nodes at once. | |||||
```python | |||||
from diagrams import Diagram | |||||
from diagrams.aws.compute import EC2 | |||||
from diagrams.aws.database import RDS | |||||
from diagrams.aws.network import ELB | |||||
with Diagram("Grouped Workers", show=False, direction="TB"): | |||||
ELB("lb") >> [EC2("worker1"), | |||||
EC2("worker2"), | |||||
EC2("worker3"), | |||||
EC2("worker4"), | |||||
EC2("worker5")] >> RDS("events") | |||||
``` | |||||
![grouped workers diagram](/img/grouped_workers_diagram.png) | |||||
> You can't connect two **lists** directly because shift/arithmetic operations between lists are not allowed in Python. |
@@ -0,0 +1,279 @@ | |||||
[[package]] | |||||
category = "dev" | |||||
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." | |||||
name = "appdirs" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "1.4.3" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "An abstract syntax tree for Python with inference support." | |||||
name = "astroid" | |||||
optional = false | |||||
python-versions = ">=3.5.*" | |||||
version = "2.3.3" | |||||
[package.dependencies] | |||||
lazy-object-proxy = ">=1.4.0,<1.5.0" | |||||
six = ">=1.12,<2.0" | |||||
wrapt = ">=1.11.0,<1.12.0" | |||||
[package.dependencies.typed-ast] | |||||
python = "<3.8" | |||||
version = ">=1.4.0,<1.5" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Atomic file writes." | |||||
name = "atomicwrites" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "1.3.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Classes Without Boilerplate" | |||||
name = "attrs" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "19.3.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "The uncompromising code formatter." | |||||
name = "black" | |||||
optional = false | |||||
python-versions = ">=3.6" | |||||
version = "18.9b0" | |||||
[package.dependencies] | |||||
appdirs = "*" | |||||
attrs = ">=17.4.0" | |||||
click = ">=6.5" | |||||
toml = ">=0.9.4" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Composable command line interface toolkit" | |||||
name = "click" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "7.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Cross-platform colored terminal text." | |||||
marker = "sys_platform == \"win32\"" | |||||
name = "colorama" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "0.4.1" | |||||
[[package]] | |||||
category = "main" | |||||
description = "Simple Python interface for Graphviz" | |||||
name = "graphviz" | |||||
optional = false | |||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" | |||||
version = "0.13.2" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Read metadata from Python packages" | |||||
marker = "python_version < \"3.8\"" | |||||
name = "importlib-metadata" | |||||
optional = false | |||||
python-versions = ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3" | |||||
version = "0.23" | |||||
[package.dependencies] | |||||
zipp = ">=0.5" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "A Python utility / library to sort Python imports." | |||||
name = "isort" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "4.3.21" | |||||
[[package]] | |||||
category = "main" | |||||
description = "A very fast and expressive template engine." | |||||
name = "jinja2" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "2.10.3" | |||||
[package.dependencies] | |||||
MarkupSafe = ">=0.23" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "A fast and thorough lazy object proxy." | |||||
name = "lazy-object-proxy" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "1.4.3" | |||||
[[package]] | |||||
category = "main" | |||||
description = "Safely add untrusted strings to HTML/XML markup." | |||||
name = "markupsafe" | |||||
optional = false | |||||
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" | |||||
version = "1.1.1" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "McCabe checker, plugin for flake8" | |||||
name = "mccabe" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "0.6.1" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "More routines for operating on iterables, beyond itertools" | |||||
name = "more-itertools" | |||||
optional = false | |||||
python-versions = ">=3.4" | |||||
version = "7.2.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "plugin and hook calling mechanisms for python" | |||||
name = "pluggy" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "0.13.0" | |||||
[package.dependencies] | |||||
[package.dependencies.importlib-metadata] | |||||
python = "<3.8" | |||||
version = ">=0.12" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "library with cross-python path, ini-parsing, io, code, log facilities" | |||||
name = "py" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "1.8.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "python code static checker" | |||||
name = "pylint" | |||||
optional = false | |||||
python-versions = ">=3.5.*" | |||||
version = "2.4.4" | |||||
[package.dependencies] | |||||
astroid = ">=2.3.0,<2.4" | |||||
colorama = "*" | |||||
isort = ">=4.2.5,<5" | |||||
mccabe = ">=0.6,<0.7" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "pytest: simple powerful testing with Python" | |||||
name = "pytest" | |||||
optional = false | |||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | |||||
version = "3.10.1" | |||||
[package.dependencies] | |||||
atomicwrites = ">=1.0" | |||||
attrs = ">=17.4.0" | |||||
colorama = "*" | |||||
more-itertools = ">=4.0.0" | |||||
pluggy = ">=0.7" | |||||
py = ">=1.5.0" | |||||
setuptools = "*" | |||||
six = ">=1.10.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "a python refactoring library..." | |||||
name = "rope" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "0.14.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Python 2 and 3 compatibility utilities" | |||||
name = "six" | |||||
optional = false | |||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*" | |||||
version = "1.13.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Python Library for Tom's Obvious, Minimal Language" | |||||
name = "toml" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "0.10.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "a fork of Python 2 and 3 ast modules with type comment support" | |||||
marker = "implementation_name == \"cpython\" and python_version < \"3.8\"" | |||||
name = "typed-ast" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "1.4.0" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Module for decorators, wrappers and monkey patching." | |||||
name = "wrapt" | |||||
optional = false | |||||
python-versions = "*" | |||||
version = "1.11.2" | |||||
[[package]] | |||||
category = "dev" | |||||
description = "Backport of pathlib-compatible object wrapper for zip files" | |||||
marker = "python_version < \"3.8\"" | |||||
name = "zipp" | |||||
optional = false | |||||
python-versions = ">=2.7" | |||||
version = "0.6.0" | |||||
[package.dependencies] | |||||
more-itertools = "*" | |||||
[metadata] | |||||
content-hash = "3b785a1e91f632b465008b9c48568990a6466dcf38b52f47d0cf982b706c4659" | |||||
python-versions = "^3.7" | |||||
[metadata.hashes] | |||||
appdirs = ["9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", "d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"] | |||||
astroid = ["71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", "840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"] | |||||
atomicwrites = ["03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", "75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"] | |||||
attrs = ["08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", "f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"] | |||||
black = ["817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", "e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5"] | |||||
click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"] | |||||
colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"] | |||||
graphviz = ["241fb099e32b8e8c2acca747211c8237e40c0b89f24b1622860075d59f4c4b25", "60acbeee346e8c14555821eab57dbf68a169e6c10bce40e83c1bf44f63a62a01"] | |||||
importlib-metadata = ["aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", "d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af"] | |||||
isort = ["54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", "6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"] | |||||
jinja2 = ["74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", "9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de"] | |||||
lazy-object-proxy = ["0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", "194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", "1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", "4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", "48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", "5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", "59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", "8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", "9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", "9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", "97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", "9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", "a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", "a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", "ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", "cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", "d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", "d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", "eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", "efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", "f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"] | |||||
markupsafe = ["00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", "09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", "24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", "62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", "6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", "7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", "88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", "8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", "98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", "9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", "9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", "ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", "b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", "b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", "b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", "ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", "e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"] | |||||
mccabe = ["ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", "dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"] | |||||
more-itertools = ["409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", "92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4"] | |||||
pluggy = ["0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", "fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34"] | |||||
py = ["64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", "dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"] | |||||
pylint = ["3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd", "886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"] | |||||
pytest = ["3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec", "e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"] | |||||
rope = ["6b728fdc3e98a83446c27a91fc5d56808a004f8beab7a31ab1d7224cecc7d969", "c5c5a6a87f7b1a2095fb311135e2a3d1f194f5ecb96900fdd0a9100881f48aaf", "f0dcf719b63200d492b85535ebe5ea9b29e0d0b8aebeb87fe03fc1a65924fdaf"] | |||||
six = ["1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", "30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"] | |||||
toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"] | |||||
typed-ast = ["1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161", "18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", "262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", "2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", "354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", "48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47", "4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", "630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", "66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", "71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", "7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2", "838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e", "95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", "bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", "cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", "d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", "d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", "d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", "fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66", "ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12"] | |||||
wrapt = ["565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"] | |||||
zipp = ["3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", "f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"] |
@@ -0,0 +1,25 @@ | |||||
[tool.poetry] | |||||
name = "diagrams" | |||||
version = "0.1.0" | |||||
description = "Diagram as Code" | |||||
license = "MIT" | |||||
authors = ["mingrammer <mingrammer@gmail.com>"] | |||||
readme = "README.md" | |||||
homepage = "https://diagrams.mingrammer.com" | |||||
repository = "https://github.com/mingrammer/diagrams" | |||||
include = ["resources/**/*"] | |||||
[tool.poetry.dependencies] | |||||
python = "^3.6" | |||||
graphviz = "^0.13.2" | |||||
jinja2 = "^2.10" | |||||
[tool.poetry.dev-dependencies] | |||||
pytest = "^3.0" | |||||
pylint = "^2.4" | |||||
black = {version = "^18.3-alpha.0", allows-prereleases = true} | |||||
rope = "^0.14.0" | |||||
isort = "^4.3" | |||||
[tool.black] | |||||
line-length = 120 |