@@ -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 |