Deploy website

Deploy website version based on 38ce94389f
gh-pages
mingrammer 6 years ago
commit b2f28d796c

@ -0,0 +1 @@
diagrams.mingrrammer.com

File diff suppressed because one or more lines are too long

@ -0,0 +1,115 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* Modified prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*='language-'],
pre[class*='language-'] {
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*='language-'] {
padding: 1em;
margin: 0.5em 0;
overflow: auto;
}
/* Inline code */
:not(pre) > code[class*='language-'] {
padding: 0.1em;
border-radius: 0.3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: 0.7;
}
.token.property,
.token.tag,
.token.boolean,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.number,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #dd4a68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

@ -0,0 +1,113 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Clusters · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Cluster allows you group (or clustering) the nodes in an isolated group."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Clusters · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Cluster allows you group (or clustering) the nodes in an isolated group."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Clusters</h1></header><article><div><span><p>Cluster allows you group (or clustering) the nodes in an isolated group.</p>
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
<p>Cluster represents a local cluster context.</p>
<p>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.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> Route53
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Web Service with DB Cluster"</span>, show=<span class="hljs-literal">False</span>):
dns = Route53(<span class="hljs-string">"dns"</span>)
web = ECS(<span class="hljs-string">"service"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"DB Cluster"</span>):
db_master = RDS(<span class="hljs-string">"master"</span>)
db_master - [RDS(<span class="hljs-string">"slave1"</span>),
RDS(<span class="hljs-string">"slave2"</span>)]
dns &gt;&gt; web &gt;&gt; db_master
</code></pre>
<p><img src="/img/simple_web_service_with_db_cluster_diagram.png" alt="simple web service with db cluster diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="nested-clusters"></a><a href="#nested-clusters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Nested Clusters</h2>
<p>Nested clustering is also possible.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS, EKS, Lambda
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> Redshift
<span class="hljs-keyword">from</span> diagrams.aws.integration <span class="hljs-keyword">import</span> SQS
<span class="hljs-keyword">from</span> diagrams.aws.storage <span class="hljs-keyword">import</span> S3
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Event Processing"</span>, show=<span class="hljs-literal">False</span>):
source = EKS(<span class="hljs-string">"k8s source"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Flows"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Workers"</span>):
workers = [ECS(<span class="hljs-string">"worker1"</span>),
ECS(<span class="hljs-string">"worker2"</span>),
ECS(<span class="hljs-string">"worker3"</span>)]
queue = SQS(<span class="hljs-string">"event queue"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Processing"</span>):
handlers = [Lambda(<span class="hljs-string">"proc1"</span>),
Lambda(<span class="hljs-string">"proc2"</span>),
Lambda(<span class="hljs-string">"proc3"</span>)]
store = S3(<span class="hljs-string">"events store"</span>)
dw = Redshift(<span class="hljs-string">"analytics"</span>)
source &gt;&gt; workers &gt;&gt; queue &gt;&gt; handlers
handlers &gt;&gt; store
handlers &gt;&gt; dw
</code></pre>
<p><img src="/img/event_processing_diagram.png" alt="event processing diagram"></p>
<blockquote>
<p>There is no depth limit of nesting. Feel free to create nested clusters as deep as you want.</p>
</blockquote>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/node"><span class="arrow-prev"></span><span>Nodes</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#nested-clusters">Nested Clusters</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,113 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Clusters · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Cluster allows you group (or clustering) the nodes in an isolated group."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Clusters · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Cluster allows you group (or clustering) the nodes in an isolated group."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Clusters</h1></header><article><div><span><p>Cluster allows you group (or clustering) the nodes in an isolated group.</p>
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
<p>Cluster represents a local cluster context.</p>
<p>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.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> Route53
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Web Service with DB Cluster"</span>, show=<span class="hljs-literal">False</span>):
dns = Route53(<span class="hljs-string">"dns"</span>)
web = ECS(<span class="hljs-string">"service"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"DB Cluster"</span>):
db_master = RDS(<span class="hljs-string">"master"</span>)
db_master - [RDS(<span class="hljs-string">"slave1"</span>),
RDS(<span class="hljs-string">"slave2"</span>)]
dns &gt;&gt; web &gt;&gt; db_master
</code></pre>
<p><img src="/img/simple_web_service_with_db_cluster_diagram.png" alt="simple web service with db cluster diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="nested-clusters"></a><a href="#nested-clusters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Nested Clusters</h2>
<p>Nested clustering is also possible.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS, EKS, Lambda
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> Redshift
<span class="hljs-keyword">from</span> diagrams.aws.integration <span class="hljs-keyword">import</span> SQS
<span class="hljs-keyword">from</span> diagrams.aws.storage <span class="hljs-keyword">import</span> S3
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Event Processing"</span>, show=<span class="hljs-literal">False</span>):
source = EKS(<span class="hljs-string">"k8s source"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Flows"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Workers"</span>):
workers = [ECS(<span class="hljs-string">"worker1"</span>),
ECS(<span class="hljs-string">"worker2"</span>),
ECS(<span class="hljs-string">"worker3"</span>)]
queue = SQS(<span class="hljs-string">"event queue"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Processing"</span>):
handlers = [Lambda(<span class="hljs-string">"proc1"</span>),
Lambda(<span class="hljs-string">"proc2"</span>),
Lambda(<span class="hljs-string">"proc3"</span>)]
store = S3(<span class="hljs-string">"events store"</span>)
dw = Redshift(<span class="hljs-string">"analytics"</span>)
source &gt;&gt; workers &gt;&gt; queue &gt;&gt; handlers
handlers &gt;&gt; store
handlers &gt;&gt; dw
</code></pre>
<p><img src="/img/event_processing_diagram.png" alt="event processing diagram"></p>
<blockquote>
<p>There is no depth limit of nesting. Feel free to create nested clusters as deep as you want.</p>
</blockquote>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/node"><span class="arrow-prev"></span><span>Nodes</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#nested-clusters">Nested Clusters</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,89 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Diagrams · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Diagram is a primary object representing a diagram."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Diagrams · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Diagram is a primary object representing a diagram."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive siteNavItemActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem navListItemActive"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Diagrams</h1></header><article><div><span><p>Diagram is a primary object representing a diagram.</p>
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
<p>Diagram represents a global diagram context.</p>
<p>You can create a diagram context with Diagram class. The first parameter of Diagram constructor will be used for output filename.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
<p>And if you run the above script with below command,</p>
<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python diagram.py</span>
</code></pre>
<p>It will generate an image file with single <code>EC2</code> node drawn as <code>simple_diagram.png</code> on your working directory, and open that created image file immediately.</p>
<h2><a class="anchor" aria-hidden="true" id="options"></a><a href="#options" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Options</h2>
<p>You can specify the output file format with <code>outformat</code> parameter. Default is <strong>png</strong>.</p>
<blockquote>
<p>(png, jpg, svg, and pdf) are allowed.</p>
</blockquote>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>, outformat=<span class="hljs-string">"jpg"</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
<p>You can also disable the automatic file opening by setting the <code>show</code> parameter as <strong>false</strong>. Default is <strong>true</strong>.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>, show=<span class="hljs-literal">False</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/examples"><span class="arrow-prev"></span><span>Examples</span></a><a class="docs-next button" href="/docs/node"><span>Nodes</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#options">Options</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,89 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Diagrams · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Diagram is a primary object representing a diagram."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Diagrams · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Diagram is a primary object representing a diagram."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive siteNavItemActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem navListItemActive"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Diagrams</h1></header><article><div><span><p>Diagram is a primary object representing a diagram.</p>
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
<p>Diagram represents a global diagram context.</p>
<p>You can create a diagram context with Diagram class. The first parameter of Diagram constructor will be used for output filename.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
<p>And if you run the above script with below command,</p>
<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python diagram.py</span>
</code></pre>
<p>It will generate an image file with single <code>EC2</code> node drawn as <code>simple_diagram.png</code> on your working directory, and open that created image file immediately.</p>
<h2><a class="anchor" aria-hidden="true" id="options"></a><a href="#options" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Options</h2>
<p>You can specify the output file format with <code>outformat</code> parameter. Default is <strong>png</strong>.</p>
<blockquote>
<p>(png, jpg, svg, and pdf) are allowed.</p>
</blockquote>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>, outformat=<span class="hljs-string">"jpg"</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
<p>You can also disable the automatic file opening by setting the <code>show</code> parameter as <strong>false</strong>. Default is <strong>true</strong>.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>, show=<span class="hljs-literal">False</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/examples"><span class="arrow-prev"></span><span>Examples</span></a><a class="docs-next button" href="/docs/node"><span>Nodes</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#options">Options</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,165 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Examples · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Here are some more examples."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Examples · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Here are some more examples."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Getting Started</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Examples</h1></header><article><div><span><p>Here are some more examples.</p>
<h2><a class="anchor" aria-hidden="true" id="grouped-workers"></a><a href="#grouped-workers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Grouped Workers</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Grouped Workers"</span>, show=<span class="hljs-literal">False</span>, direction=<span class="hljs-string">"TB"</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; [EC2(<span class="hljs-string">"worker1"</span>),
EC2(<span class="hljs-string">"worker2"</span>),
EC2(<span class="hljs-string">"worker3"</span>),
EC2(<span class="hljs-string">"worker4"</span>),
EC2(<span class="hljs-string">"worker5"</span>)] &gt;&gt; RDS(<span class="hljs-string">"events"</span>)
</code></pre>
<p><img src="/img/grouped_workers_diagram.png" alt="grouped workers diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="clustered-web-services"></a><a href="#clustered-web-services" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Clustered Web Services</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> ElastiCache, RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> Route53
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Clustered Web Services"</span>, show=<span class="hljs-literal">False</span>):
dns = Route53(<span class="hljs-string">"dns"</span>)
lb = ELB(<span class="hljs-string">"lb"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Services"</span>):
svc_group = [ECS(<span class="hljs-string">"web1"</span>),
ECS(<span class="hljs-string">"web2"</span>),
ECS(<span class="hljs-string">"web3"</span>)]
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"DB Cluster"</span>):
db_master = RDS(<span class="hljs-string">"userdb"</span>)
db_master - [RDS(<span class="hljs-string">"userdb ro"</span>)]
memcached = ElastiCache(<span class="hljs-string">"memcached"</span>)
dns &gt;&gt; lb &gt;&gt; svc_group
svc_group &gt;&gt; db_master
svc_group &gt;&gt; memcached
</code></pre>
<p><img src="/img/clustered_web_services_diagram.png" alt="clustered web services diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="event-processing"></a><a href="#event-processing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Event Processing</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS, EKS, Lambda
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> Redshift
<span class="hljs-keyword">from</span> diagrams.aws.integration <span class="hljs-keyword">import</span> SQS
<span class="hljs-keyword">from</span> diagrams.aws.storage <span class="hljs-keyword">import</span> S3
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Event Processing"</span>, show=<span class="hljs-literal">False</span>):
source = EKS(<span class="hljs-string">"k8s source"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Flows"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Workers"</span>):
workers = [ECS(<span class="hljs-string">"worker1"</span>),
ECS(<span class="hljs-string">"worker2"</span>),
ECS(<span class="hljs-string">"worker3"</span>)]
queue = SQS(<span class="hljs-string">"event queue"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Processing"</span>):
handlers = [Lambda(<span class="hljs-string">"proc1"</span>),
Lambda(<span class="hljs-string">"proc2"</span>),
Lambda(<span class="hljs-string">"proc3"</span>)]
store = S3(<span class="hljs-string">"events store"</span>)
dw = Redshift(<span class="hljs-string">"analytics"</span>)
source &gt;&gt; workers &gt;&gt; queue &gt;&gt; handlers
handlers &gt;&gt; store
handlers &gt;&gt; dw
</code></pre>
<p><img src="/img/event_processing_diagram.png" alt="event processing diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="message-collecting-system"></a><a href="#message-collecting-system" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Message Collecting System</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.gcp.analytics <span class="hljs-keyword">import</span> BigQuery, Dataflow, PubSub
<span class="hljs-keyword">from</span> diagrams.gcp.compute <span class="hljs-keyword">import</span> AppEngine, Functions
<span class="hljs-keyword">from</span> diagrams.gcp.database <span class="hljs-keyword">import</span> BigTable
<span class="hljs-keyword">from</span> diagrams.gcp.iot <span class="hljs-keyword">import</span> IotCore
<span class="hljs-keyword">from</span> diagrams.gcp.storage <span class="hljs-keyword">import</span> GCS
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Message Collecting"</span>, show=<span class="hljs-literal">False</span>):
pubsub = PubSub(<span class="hljs-string">"pubsub"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Source of Data"</span>):
[IotCore(<span class="hljs-string">"core1"</span>),
IotCore(<span class="hljs-string">"core2"</span>),
IotCore(<span class="hljs-string">"core3"</span>)] &gt;&gt; pubsub
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Targets"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Data Flow"</span>):
flow = Dataflow(<span class="hljs-string">"data flow"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Data Lake"</span>):
flow &gt;&gt; [BigQuery(<span class="hljs-string">"bq"</span>),
GCS(<span class="hljs-string">"storage"</span>)]
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Driven"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Processing"</span>):
flow &gt;&gt; AppEngine(<span class="hljs-string">"engine"</span>) &gt;&gt; BigTable(<span class="hljs-string">"bigtable"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Serverless"</span>):
flow &gt;&gt; Functions(<span class="hljs-string">"func"</span>) &gt;&gt; AppEngine(<span class="hljs-string">"appengine"</span>)
pubsub &gt;&gt; flow
</code></pre>
<p><img src="/img/message_collecting_diagram.png" alt="message collecting diagram"></p>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/installation"><span class="arrow-prev"></span><span>Installation</span></a><a class="docs-next button" href="/docs/diagram"><span>Diagrams</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#grouped-workers">Grouped Workers</a></li><li><a href="#clustered-web-services">Clustered Web Services</a></li><li><a href="#event-processing">Event Processing</a></li><li><a href="#message-collecting-system">Message Collecting System</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,165 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Examples · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Here are some more examples."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Examples · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Here are some more examples."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Getting Started</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Examples</h1></header><article><div><span><p>Here are some more examples.</p>
<h2><a class="anchor" aria-hidden="true" id="grouped-workers"></a><a href="#grouped-workers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Grouped Workers</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Grouped Workers"</span>, show=<span class="hljs-literal">False</span>, direction=<span class="hljs-string">"TB"</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; [EC2(<span class="hljs-string">"worker1"</span>),
EC2(<span class="hljs-string">"worker2"</span>),
EC2(<span class="hljs-string">"worker3"</span>),
EC2(<span class="hljs-string">"worker4"</span>),
EC2(<span class="hljs-string">"worker5"</span>)] &gt;&gt; RDS(<span class="hljs-string">"events"</span>)
</code></pre>
<p><img src="/img/grouped_workers_diagram.png" alt="grouped workers diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="clustered-web-services"></a><a href="#clustered-web-services" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Clustered Web Services</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> ElastiCache, RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> Route53
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Clustered Web Services"</span>, show=<span class="hljs-literal">False</span>):
dns = Route53(<span class="hljs-string">"dns"</span>)
lb = ELB(<span class="hljs-string">"lb"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Services"</span>):
svc_group = [ECS(<span class="hljs-string">"web1"</span>),
ECS(<span class="hljs-string">"web2"</span>),
ECS(<span class="hljs-string">"web3"</span>)]
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"DB Cluster"</span>):
db_master = RDS(<span class="hljs-string">"userdb"</span>)
db_master - [RDS(<span class="hljs-string">"userdb ro"</span>)]
memcached = ElastiCache(<span class="hljs-string">"memcached"</span>)
dns &gt;&gt; lb &gt;&gt; svc_group
svc_group &gt;&gt; db_master
svc_group &gt;&gt; memcached
</code></pre>
<p><img src="/img/clustered_web_services_diagram.png" alt="clustered web services diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="event-processing"></a><a href="#event-processing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Event Processing</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS, EKS, Lambda
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> Redshift
<span class="hljs-keyword">from</span> diagrams.aws.integration <span class="hljs-keyword">import</span> SQS
<span class="hljs-keyword">from</span> diagrams.aws.storage <span class="hljs-keyword">import</span> S3
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Event Processing"</span>, show=<span class="hljs-literal">False</span>):
source = EKS(<span class="hljs-string">"k8s source"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Flows"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Workers"</span>):
workers = [ECS(<span class="hljs-string">"worker1"</span>),
ECS(<span class="hljs-string">"worker2"</span>),
ECS(<span class="hljs-string">"worker3"</span>)]
queue = SQS(<span class="hljs-string">"event queue"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Processing"</span>):
handlers = [Lambda(<span class="hljs-string">"proc1"</span>),
Lambda(<span class="hljs-string">"proc2"</span>),
Lambda(<span class="hljs-string">"proc3"</span>)]
store = S3(<span class="hljs-string">"events store"</span>)
dw = Redshift(<span class="hljs-string">"analytics"</span>)
source &gt;&gt; workers &gt;&gt; queue &gt;&gt; handlers
handlers &gt;&gt; store
handlers &gt;&gt; dw
</code></pre>
<p><img src="/img/event_processing_diagram.png" alt="event processing diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="message-collecting-system"></a><a href="#message-collecting-system" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Message Collecting System</h2>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram
<span class="hljs-keyword">from</span> diagrams.gcp.analytics <span class="hljs-keyword">import</span> BigQuery, Dataflow, PubSub
<span class="hljs-keyword">from</span> diagrams.gcp.compute <span class="hljs-keyword">import</span> AppEngine, Functions
<span class="hljs-keyword">from</span> diagrams.gcp.database <span class="hljs-keyword">import</span> BigTable
<span class="hljs-keyword">from</span> diagrams.gcp.iot <span class="hljs-keyword">import</span> IotCore
<span class="hljs-keyword">from</span> diagrams.gcp.storage <span class="hljs-keyword">import</span> GCS
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Message Collecting"</span>, show=<span class="hljs-literal">False</span>):
pubsub = PubSub(<span class="hljs-string">"pubsub"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Source of Data"</span>):
[IotCore(<span class="hljs-string">"core1"</span>),
IotCore(<span class="hljs-string">"core2"</span>),
IotCore(<span class="hljs-string">"core3"</span>)] &gt;&gt; pubsub
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Targets"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Data Flow"</span>):
flow = Dataflow(<span class="hljs-string">"data flow"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Data Lake"</span>):
flow &gt;&gt; [BigQuery(<span class="hljs-string">"bq"</span>),
GCS(<span class="hljs-string">"storage"</span>)]
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Event Driven"</span>):
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Processing"</span>):
flow &gt;&gt; AppEngine(<span class="hljs-string">"engine"</span>) &gt;&gt; BigTable(<span class="hljs-string">"bigtable"</span>)
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Serverless"</span>):
flow &gt;&gt; Functions(<span class="hljs-string">"func"</span>) &gt;&gt; AppEngine(<span class="hljs-string">"appengine"</span>)
pubsub &gt;&gt; flow
</code></pre>
<p><img src="/img/message_collecting_diagram.png" alt="message collecting diagram"></p>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/installation"><span class="arrow-prev"></span><span>Installation</span></a><a class="docs-next button" href="/docs/diagram"><span>Diagrams</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#grouped-workers">Grouped Workers</a></li><li><a href="#clustered-web-services">Clustered Web Services</a></li><li><a href="#event-processing">Event Processing</a></li><li><a href="#message-collecting-system">Message Collecting System</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,77 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Installation · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="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**."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Installation · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="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**."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive siteNavItemActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Getting Started</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem navListItemActive"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Installation</h1></header><article><div><span><p>It uses <a href="https://www.graphviz.org/">Graphviz</a> to render the diagram, so you need to <a href="https://graphviz.gitlab.io/download/">install Graphviz</a> to use <strong>diagrams</strong>. After installing graphviz (or already have it), install the <strong>diagrams</strong>.</p>
<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> pip install diagrams</span>
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="quick-start"></a><a href="#quick-start" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Quick Start</h2>
<pre><code class="hljs css language-python"><span class="hljs-comment"># diagram.py</span>
<span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Web Service"</span>, show=<span class="hljs-literal">False</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>)
</code></pre>
<p>This code generates below diagram.</p>
<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python diagram.py</span>
</code></pre>
<p><img src="/img/web_service_diagram.png" alt="web service diagram"></p>
<p>It will be saved as <code>web_service.png</code> on your working directory.</p>
<h2><a class="anchor" aria-hidden="true" id="next"></a><a href="#next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Next</h2>
<p>See more <a href="/docs/examples">Examples</a> or see <a href="/docs/diagram">Guides</a> page for more details.</p>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-next button" href="/docs/examples"><span>Examples</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#quick-start">Quick Start</a></li><li><a href="#next">Next</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,77 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Installation · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="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**."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Installation · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="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**."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive siteNavItemActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Getting Started</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem navListItemActive"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Installation</h1></header><article><div><span><p>It uses <a href="https://www.graphviz.org/">Graphviz</a> to render the diagram, so you need to <a href="https://graphviz.gitlab.io/download/">install Graphviz</a> to use <strong>diagrams</strong>. After installing graphviz (or already have it), install the <strong>diagrams</strong>.</p>
<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> pip install diagrams</span>
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="quick-start"></a><a href="#quick-start" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Quick Start</h2>
<pre><code class="hljs css language-python"><span class="hljs-comment"># diagram.py</span>
<span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Web Service"</span>, show=<span class="hljs-literal">False</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>)
</code></pre>
<p>This code generates below diagram.</p>
<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> python diagram.py</span>
</code></pre>
<p><img src="/img/web_service_diagram.png" alt="web service diagram"></p>
<p>It will be saved as <code>web_service.png</code> on your working directory.</p>
<h2><a class="anchor" aria-hidden="true" id="next"></a><a href="#next" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Next</h2>
<p>See more <a href="/docs/examples">Examples</a> or see <a href="/docs/diagram">Guides</a> page for more details.</p>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-next button" href="/docs/examples"><span>Examples</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#quick-start">Quick Start</a></li><li><a href="#next">Next</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,147 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Nodes · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Node is a second object representing a node or system component."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Nodes · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Node is a second object representing a node or system component."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Nodes</h1></header><article><div><span><p>Node is a second object representing a node or system component.</p>
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
<p>Node is an abstract concept that represents a single system component object.</p>
<p>A node object consists of three parts: <strong>provider</strong>, <strong>resource type</strong> and <strong>name</strong>. You may already have seen each part in the previous example.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
<p>In above example, the <code>EC2</code> is a node of <code>compute</code> resource type which provided by <code>aws</code> provider.</p>
<p>You can use other node objects in a similar manner like:</p>
<pre><code class="hljs css language-python"><span class="hljs-comment"># aws resources</span>
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS, Lambda
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS, ElastiCache
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB, Route53, VPC
...
<span class="hljs-comment"># azure resources</span>
<span class="hljs-keyword">from</span> diagrams.azure.compute <span class="hljs-keyword">import</span> FunctionApps
<span class="hljs-keyword">from</span> diagrams.azure.storage <span class="hljs-keyword">import</span> BlobStorage
...
<span class="hljs-comment"># gcp resources</span>
<span class="hljs-keyword">from</span> diagrams.gcp.compute <span class="hljs-keyword">import</span> AppEngine, GKE
<span class="hljs-keyword">from</span> diagrams.gcp.ml <span class="hljs-keyword">import</span> AutoML
...
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="data-flow"></a><a href="#data-flow" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Data Flow</h2>
<p>You can represent data flow by connecting the nodes with these operators: <code>&gt;&gt;</code>, <code>&lt;&lt;</code> and <code>-</code>.</p>
<ul>
<li><strong>&gt;&gt;</strong>: Connect nodes in left to right direction.</li>
<li><strong>&lt;&lt;</strong>: Connect nodes in right to left direction.</li>
<li><strong>-</strong>: Connect nodes in no direction. Undirected.</li>
</ul>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">from</span> diagrams.aws.storage <span class="hljs-keyword">import</span> S3
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Web Services"</span>, show=<span class="hljs-literal">False</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>) &gt;&gt; S3(<span class="hljs-string">"store"</span>)
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>) &lt;&lt; EC2(<span class="hljs-string">"stat"</span>)
(ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>)) - EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>)
</code></pre>
<blockquote>
<p>Be careful when using the <code>-</code> and any shift operators together, which could cause unexpected results due to operator precedence.</p>
</blockquote>
<p><img src="/img/web_services_diagram.png" alt="web services diagram"></p>
<blockquote>
<p>The order of rendered diagrams is the reverse of the declaration order.</p>
</blockquote>
<p>You can change the data flow direction with <code>direction</code> parameter. Default is <strong>LR</strong>.</p>
<blockquote>
<p>(TB, BT, LR and RL) are allowed.</p>
</blockquote>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Workers"</span>, show=<span class="hljs-literal">False</span>, direction=<span class="hljs-string">"TB"</span>):
lb = ELB(<span class="hljs-string">"lb"</span>)
db = RDS(<span class="hljs-string">"events"</span>)
lb &gt;&gt; EC2(<span class="hljs-string">"worker1"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker2"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker3"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker4"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker5"</span>) &gt;&gt; db
</code></pre>
<p><img src="/img/workers_diagram.png" alt="workers diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="group-data-flow"></a><a href="#group-data-flow" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Group Data Flow</h2>
<p>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.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Grouped Workers"</span>, show=<span class="hljs-literal">False</span>, direction=<span class="hljs-string">"TB"</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; [EC2(<span class="hljs-string">"worker1"</span>),
EC2(<span class="hljs-string">"worker2"</span>),
EC2(<span class="hljs-string">"worker3"</span>),
EC2(<span class="hljs-string">"worker4"</span>),
EC2(<span class="hljs-string">"worker5"</span>)] &gt;&gt; RDS(<span class="hljs-string">"events"</span>)
</code></pre>
<p><img src="/img/grouped_workers_diagram.png" alt="grouped workers diagram"></p>
<blockquote>
<p>You can't connect two <strong>lists</strong> directly because shift/arithmetic operations between lists are not allowed in Python.</p>
</blockquote>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/diagram"><span class="arrow-prev"></span><span>Diagrams</span></a><a class="docs-next button" href="/docs/cluster"><span>Clusters</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#data-flow">Data Flow</a></li><li><a href="#group-data-flow">Group Data Flow</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,147 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Nodes · Diagrams</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Node is a second object representing a node or system component."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Nodes · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Node is a second object representing a node or system component."/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/diagram">Diagrams</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/cluster">Clusters</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Nodes</h1></header><article><div><span><p>Node is a second object representing a node or system component.</p>
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
<p>Node is an abstract concept that represents a single system component object.</p>
<p>A node object consists of three parts: <strong>provider</strong>, <strong>resource type</strong> and <strong>name</strong>. You may already have seen each part in the previous example.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Simple Diagram"</span>):
EC2(<span class="hljs-string">"web"</span>)
</code></pre>
<p>In above example, the <code>EC2</code> is a node of <code>compute</code> resource type which provided by <code>aws</code> provider.</p>
<p>You can use other node objects in a similar manner like:</p>
<pre><code class="hljs css language-python"><span class="hljs-comment"># aws resources</span>
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> ECS, Lambda
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS, ElastiCache
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB, Route53, VPC
...
<span class="hljs-comment"># azure resources</span>
<span class="hljs-keyword">from</span> diagrams.azure.compute <span class="hljs-keyword">import</span> FunctionApps
<span class="hljs-keyword">from</span> diagrams.azure.storage <span class="hljs-keyword">import</span> BlobStorage
...
<span class="hljs-comment"># gcp resources</span>
<span class="hljs-keyword">from</span> diagrams.gcp.compute <span class="hljs-keyword">import</span> AppEngine, GKE
<span class="hljs-keyword">from</span> diagrams.gcp.ml <span class="hljs-keyword">import</span> AutoML
...
</code></pre>
<h2><a class="anchor" aria-hidden="true" id="data-flow"></a><a href="#data-flow" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Data Flow</h2>
<p>You can represent data flow by connecting the nodes with these operators: <code>&gt;&gt;</code>, <code>&lt;&lt;</code> and <code>-</code>.</p>
<ul>
<li><strong>&gt;&gt;</strong>: Connect nodes in left to right direction.</li>
<li><strong>&lt;&lt;</strong>: Connect nodes in right to left direction.</li>
<li><strong>-</strong>: Connect nodes in no direction. Undirected.</li>
</ul>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">from</span> diagrams.aws.storage <span class="hljs-keyword">import</span> S3
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Web Services"</span>, show=<span class="hljs-literal">False</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>) &gt;&gt; S3(<span class="hljs-string">"store"</span>)
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>) &lt;&lt; EC2(<span class="hljs-string">"stat"</span>)
(ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; EC2(<span class="hljs-string">"web"</span>)) - EC2(<span class="hljs-string">"web"</span>) &gt;&gt; RDS(<span class="hljs-string">"userdb"</span>)
</code></pre>
<blockquote>
<p>Be careful when using the <code>-</code> and any shift operators together, which could cause unexpected results due to operator precedence.</p>
</blockquote>
<p><img src="/img/web_services_diagram.png" alt="web services diagram"></p>
<blockquote>
<p>The order of rendered diagrams is the reverse of the declaration order.</p>
</blockquote>
<p>You can change the data flow direction with <code>direction</code> parameter. Default is <strong>LR</strong>.</p>
<blockquote>
<p>(TB, BT, LR and RL) are allowed.</p>
</blockquote>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Workers"</span>, show=<span class="hljs-literal">False</span>, direction=<span class="hljs-string">"TB"</span>):
lb = ELB(<span class="hljs-string">"lb"</span>)
db = RDS(<span class="hljs-string">"events"</span>)
lb &gt;&gt; EC2(<span class="hljs-string">"worker1"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker2"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker3"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker4"</span>) &gt;&gt; db
lb &gt;&gt; EC2(<span class="hljs-string">"worker5"</span>) &gt;&gt; db
</code></pre>
<p><img src="/img/workers_diagram.png" alt="workers diagram"></p>
<h2><a class="anchor" aria-hidden="true" id="group-data-flow"></a><a href="#group-data-flow" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Group Data Flow</h2>
<p>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.</p>
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Diagram
<span class="hljs-keyword">from</span> diagrams.aws.compute <span class="hljs-keyword">import</span> EC2
<span class="hljs-keyword">from</span> diagrams.aws.database <span class="hljs-keyword">import</span> RDS
<span class="hljs-keyword">from</span> diagrams.aws.network <span class="hljs-keyword">import</span> ELB
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"Grouped Workers"</span>, show=<span class="hljs-literal">False</span>, direction=<span class="hljs-string">"TB"</span>):
ELB(<span class="hljs-string">"lb"</span>) &gt;&gt; [EC2(<span class="hljs-string">"worker1"</span>),
EC2(<span class="hljs-string">"worker2"</span>),
EC2(<span class="hljs-string">"worker3"</span>),
EC2(<span class="hljs-string">"worker4"</span>),
EC2(<span class="hljs-string">"worker5"</span>)] &gt;&gt; RDS(<span class="hljs-string">"events"</span>)
</code></pre>
<p><img src="/img/grouped_workers_diagram.png" alt="grouped workers diagram"></p>
<blockquote>
<p>You can't connect two <strong>lists</strong> directly because shift/arithmetic operations between lists are not allowed in Python.</p>
</blockquote>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 2020-2-3</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/diagram"><span class="arrow-prev"></span><span>Diagrams</span></a><a class="docs-next button" href="/docs/cluster"><span>Clusters</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#data-flow">Data Flow</a></li><li><a href="#group-data-flow">Group Data Flow</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,5 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Diagrams · Diagram as Code</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Diagram as Code"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Diagrams · Diagram as Code"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Diagram as Code"/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class=""><a href="/docs/installation" target="_self">Docs</a></li><li class=""><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div><div class="homeContainer"><div class="homeSplashFade"><div class="wrapper homeWrapper"><div class="projectLogo"><img src="/img/diagrams.svg" alt="Project Logo"/></div><div class="inner"><h2 class="projectTitle">Diagrams<small>Diagram as Code</small></h2><div class="section promoSection"><div class="promoRow"><div class="pluginRowBlock"><div class="pluginWrapper buttonWrapper"><a class="button" href="/docs/en/installation">Try It Out</a></div><div class="pluginWrapper buttonWrapper"><a class="button" href="/docs/en/examples">Show Examples</a></div></div></div></div></div></div></div></div><div class="mainContainer"><div class="productShowcaseSection paddingBottom" style="text-align:center"><h2>About Diagram</h2><div><span><p>Diagrams lets you to draw the cloud system architecture <strong>in Python code</strong>.</p>
</span></div><div><span><p>It was born for <strong>prototyping</strong> a new system architecture without any design tools. You can also describe or visualize the existing system architecture as well.</p>
</span></div><div><span><p><code>Diagram as Code</code> allows you to <strong>tracking</strong> the architecture diagram changes on any <strong>version control</strong> system.</p>
</span></div><div><span><p>Diagrams currently supports three major cloud providers: <code>AWS</code>, <code>Azure</code>, <code>GCP</code>.</p>
</span></div></div><div class="container paddingBottom paddingTop"><div class="wrapper"><div class="gridBlock"><div class="blockElement alignCenter imageAlignSide imageAlignLeft twoByGridBlock"><div class="blockImage"><img src="/img/message_collecting_code.png"/></div><div class="blockContent"><div></div></div></div><div class="blockElement alignCenter imageAlignSide imageAlignRight twoByGridBlock"><div class="blockContent"><div></div></div><div class="blockImage"><img src="/img/message_collecting_diagram.png"/></div></div></div></div></div><div class="container paddingBottom paddingTop"><div class="wrapper"><div class="gridBlock"><div class="blockElement alignCenter imageAlignSide imageAlignLeft twoByGridBlock"><div class="blockImage"><img src="/img/event_processing_code.png"/></div><div class="blockContent"><div></div></div></div><div class="blockElement alignCenter imageAlignSide imageAlignRight twoByGridBlock"><div class="blockContent"><div></div></div><div class="blockImage"><img src="/img/event_processing_diagram.png"/></div></div></div></div></div></div></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/en/installation">Getting Started</a><a href="/docs/en/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

@ -0,0 +1 @@
<svg height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><path fill="#FF8959" d="M394.667 373.732h97.819v97.881h-97.819zM19.516 40.386h97.821v97.876H19.516z"/><path d="M388.884 86.462V34.605h109.383v109.439H388.884V92.243h-52.895v93.715h-5.781V86.462h58.676zm103.602 51.8V40.386h-97.819v97.876h97.819zM65.531 298.287V144.044H13.733V34.605h109.386v109.439H71.313v148.462H335.99v85.393h-5.781v-79.611H65.531zM19.516 138.262h97.821V40.386H19.516v97.876z" fill="#1D1D1B"/><path d="M446.467 238.916v129.035h51.8v109.443H388.884V367.951h51.8V244.697H256.896v-98.225h-80.82v-5.782h86.602v98.226h183.789zm46.019 232.697v-97.881h-97.819v97.881h97.819zM224.292 367.951v103.662h108.806v5.781H218.511V373.732h-43.016v51.863h-52.376v51.799H13.733V367.951h109.386v51.861h46.594v-51.861h54.579zM117.337 471.613v-97.881H19.516v97.881h97.821z" fill="#1D1D1B"/><path fill="#99A4E3" d="M19.516 373.732h97.821v97.881H19.516zM394.667 40.386h97.819v97.876h-97.819z"/></svg>

After

Width:  |  Height:  |  Size: 981 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

@ -0,0 +1,3 @@
<svg class="language {{include.class}}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path fill="#ffffff" d="M19.753 10.909c-.624-1.707-2.366-2.726-4.661-2.726-.09 0-.176.002-.262.006l-.016-2.063 3.525-.607c.115-.019.133-.119.109-.231-.023-.111-.167-.883-.188-.976-.027-.131-.102-.127-.207-.109-.104.018-3.25.461-3.25.461l-.013-2.078c-.001-.125-.069-.158-.194-.156l-1.025.016c-.105.002-.164.049-.162.148l.033 2.307s-3.061.527-3.144.543c-.084.014-.17.053-.151.143.019.09.19 1.094.208 1.172.018.08.072.129.188.107l2.924-.504.035 2.018c-1.077.281-1.801.824-2.256 1.303-.768.807-1.207 1.887-1.207 2.963 0 1.586.971 2.529 2.328 2.695 3.162.387 5.119-3.06 5.769-4.715 1.097 1.506.256 4.354-2.094 5.98-.043.029-.098.129-.033.207l.619.756c.08.096.206.059.256.023 2.51-1.73 3.661-4.515 2.869-6.683zm-7.386 3.188c-.966-.121-.944-.914-.944-1.453 0-.773.327-1.58.876-2.156a3.21 3.21 0 0 1 1.229-.799l.082 4.277a2.773 2.773 0 0 1-1.243.131zm2.427-.553l.046-4.109c.084-.004.166-.01.252-.01.773 0 1.494.145 1.885.361.391.217-1.023 2.713-2.183 3.758zm-8.95-7.668a.196.196 0 0 0-.196-.145h-1.95a.194.194 0 0 0-.194.144L.008 16.916c-.017.051-.011.076.062.076h1.733c.075 0 .099-.023.114-.072l1.008-3.318h3.496l1.008 3.318c.016.049.039.072.113.072h1.734c.072 0 .078-.025.062-.076-.014-.05-3.083-9.741-3.494-11.04zm-2.618 6.318l1.447-5.25 1.447 5.25H3.226z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@ -0,0 +1,5 @@
<!DOCTYPE html><html lang=""><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Diagrams · Diagram as Code</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="Diagram as Code"/><meta property="og:title" content="Diagrams · Diagram as Code"/><meta property="og:type" content="website"/><meta property="og:url" content="diagrams.mingrrammer.com/"/><meta property="og:description" content="Diagram as Code"/><meta property="og:image" content="diagrams.mingrrammer.com/img/diagrams.svg"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class=""><a href="/docs/installation" target="_self">Docs</a></li><li class=""><a href="/docs/diagram" target="_self">Guides</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div><div class="homeContainer"><div class="homeSplashFade"><div class="wrapper homeWrapper"><div class="projectLogo"><img src="/img/diagrams.svg" alt="Project Logo"/></div><div class="inner"><h2 class="projectTitle">Diagrams<small>Diagram as Code</small></h2><div class="section promoSection"><div class="promoRow"><div class="pluginRowBlock"><div class="pluginWrapper buttonWrapper"><a class="button" href="/docs/installation">Try It Out</a></div><div class="pluginWrapper buttonWrapper"><a class="button" href="/docs/examples">Show Examples</a></div></div></div></div></div></div></div></div><div class="mainContainer"><div class="productShowcaseSection paddingBottom" style="text-align:center"><h2>About Diagram</h2><div><span><p>Diagrams lets you to draw the cloud system architecture <strong>in Python code</strong>.</p>
</span></div><div><span><p>It was born for <strong>prototyping</strong> a new system architecture without any design tools. You can also describe or visualize the existing system architecture as well.</p>
</span></div><div><span><p><code>Diagram as Code</code> allows you to <strong>tracking</strong> the architecture diagram changes on any <strong>version control</strong> system.</p>
</span></div><div><span><p>Diagrams currently supports three major cloud providers: <code>AWS</code>, <code>Azure</code>, <code>GCP</code>.</p>
</span></div></div><div class="container paddingBottom paddingTop"><div class="wrapper"><div class="gridBlock"><div class="blockElement alignCenter imageAlignSide imageAlignLeft twoByGridBlock"><div class="blockImage"><img src="/img/message_collecting_code.png"/></div><div class="blockContent"><div></div></div></div><div class="blockElement alignCenter imageAlignSide imageAlignRight twoByGridBlock"><div class="blockContent"><div></div></div><div class="blockImage"><img src="/img/message_collecting_diagram.png"/></div></div></div></div></div><div class="container paddingBottom paddingTop"><div class="wrapper"><div class="gridBlock"><div class="blockElement alignCenter imageAlignSide imageAlignLeft twoByGridBlock"><div class="blockImage"><img src="/img/event_processing_code.png"/></div><div class="blockContent"><div></div></div></div><div class="blockElement alignCenter imageAlignSide imageAlignRight twoByGridBlock"><div class="blockContent"><div></div></div><div class="blockImage"><img src="/img/event_processing_diagram.png"/></div></div></div></div></div></div></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/installation">Getting Started</a><a href="/docs/diagram">Guides</a></div><div><h5>More</h5><a href="https://github.com/mingrammer/diagrams">GitHub</a><a class="github-button" data-icon="octicon-star" data-count-href="/mingrammer/diagrams/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">Star</a></div></section><section class="copyright">Copyright © 2020 mingrammer</section></footer></div></body></html>

@ -0,0 +1,31 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Turn off ESLint for this file because it's sent down to users as-is.
/* eslint-disable */
window.addEventListener('load', function() {
// add event listener for all tab
document.querySelectorAll('.nav-link').forEach(function(el) {
el.addEventListener('click', function(e) {
var groupId = e.target.getAttribute('data-group');
document
.querySelectorAll('.nav-link[data-group='.concat(groupId, ']'))
.forEach(function(el) {
el.classList.remove('active');
});
document
.querySelectorAll('.tab-pane[data-group='.concat(groupId, ']'))
.forEach(function(el) {
el.classList.remove('active');
});
e.target.classList.add('active');
document
.querySelector('#'.concat(e.target.getAttribute('data-tab')))
.classList.add('active');
});
});
});

@ -0,0 +1,83 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/* eslint-disable */
(function scrollSpy() {
var OFFSET = 10;
var timer;
var headingsCache;
var findHeadings = function findHeadings() {
return headingsCache || document.querySelectorAll('.toc-headings > li > a');
};
var onScroll = function onScroll() {
if (timer) {
// throttle
return;
}
timer = setTimeout(function() {
timer = null;
var activeNavFound = false;
var headings = findHeadings(); // toc nav anchors
/**
* On every call, try to find header right after <-- next header
* the one whose content is on the current screen <-- highlight this
*/
for (var i = 0; i < headings.length; i++) {
// headings[i] is current element
// if an element is already active, then current element is not active
// if no element is already active, then current element is active
var currNavActive = !activeNavFound;
/**
* Enter the following check up only when an active nav header is not yet found
* Then, check the bounding rectangle of the next header
* The headers that are scrolled passed will have negative bounding rect top
* So the first one with positive bounding rect top will be the nearest next header
*/
if (currNavActive && i < headings.length - 1) {
var heading = headings[i + 1];
var next = decodeURIComponent(heading.href.split('#')[1]);
var nextHeader = document.getElementById(next);
if (nextHeader) {
var top = nextHeader.getBoundingClientRect().top;
currNavActive = top > OFFSET;
} else {
console.error('Can not find header element', {
id: next,
heading: heading,
});
}
}
/**
* Stop searching once a first such header is found,
* this makes sure the highlighted header is the most current one
*/
if (currNavActive) {
activeNavFound = true;
headings[i].classList.add('active');
} else {
headings[i].classList.remove('active');
}
}
}, 100);
};
document.addEventListener('scroll', onScroll);
document.addEventListener('resize', onScroll);
document.addEventListener('DOMContentLoaded', function() {
// Cache the headings once the page has fully loaded.
headingsCache = findHeadings();
onScroll();
});
})();
Loading…
Cancel
Save