diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 2c39972c..34661352 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -10,7 +10,7 @@ RUN apk update && apk add --no-cache \
RUN go install github.com/mingrammer/round@latest
# install fonts
-RUN curl -O https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
+RUN curl -O https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
&& mkdir -p /usr/share/fonts/NotoSansCJKjp \
&& unzip NotoSansCJKjp-hinted.zip -d /usr/share/fonts/NotoSansCJKjp/ \
&& rm NotoSansCJKjp-hinted.zip \
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 4b8064a2..57e86248 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -25,7 +25,7 @@
"extensions": [
"ms-python.python",
"ms-python.debugpy",
- "mhutchie.git-graph",
+ "mhutchie.git-graph",
"mutantdino.resourcemonitor",
"tehpeng.diagramspreviewer"
]
@@ -35,4 +35,4 @@
"workspaceFolder": "/usr/src/diagrams"
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
-}
\ No newline at end of file
+}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 93dc0d05..0f644a9a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -67,6 +67,21 @@ find . -type f -name "*.svg" -exec bash -c 'rm "$0"' {} \;
If you get any errors with autogen, it will probably be a '+' in filename
+### Add new provider
+
+To add a new provider to Diagrams, please follow the steps below in addition to the image intructions above:
+- in `autogen.sh` add in the `providers` variable the new provider code
+- in `config.py`:
+ - in the `providers` variable, add the new provider code
+ - in the `FILE_PREFIXES` variable, add a new entry with your new provider code. And eventually a file prefix
+ - Optionnaly, update the `UPPER_WORDS` variable to a new entry with your new provider code.
+ - in the `ALIASES` variable, add a new entry with your new provider code. See below on how to add new aliases.
+- in `scripts/resource.py`:
+ - add a function `cleaner_XXX` (replace XXX by your provider name). For the implementation look at the existing functions
+ - in the `cleaners` variable, add an entry with your new provider code and the function defined above
+- in `sidebars.json`, update the `Nodes` array to add the reference of the new provider
+- in the `diagrams` folder, add a new file `__init__.py` for the new provider. For the content look at the existing providers
+
### Update Aliases
Some node classes have alias. For example, `aws.compute.ECS` class is an alias
diff --git a/README.md b/README.md
index 500e4f88..b98cf470 100644
--- a/README.md
+++ b/README.md
@@ -82,6 +82,8 @@ To contribute to diagram, check out [contribution guidelines](CONTRIBUTING.md).
[Airflow Diagrams](https://github.com/feluelle/airflow-diagrams) is an Airflow plugin that aims to easily visualise your Airflow DAGs on service level from providers like AWS, GCP, Azure, etc. via diagrams.
+[KubeDiagrams](https://github.com/philippemerle/KubeDiagrams) is a tool to generate Kubernetes architecture diagrams from Kubernetes manifest files, kustomization files, Helm charts, and actual cluster state. [KubeDiagrams](https://github.com/philippemerle/KubeDiagrams) supports all Kubernetes built-in resources, any custom resources, and label-based resource clustering.
+
## Other languages
- If you are familiar with Go, you can use [go-diagrams](https://github.com/blushft/go-diagrams) as well.
diff --git a/autogen.sh b/autogen.sh
index 9e8cefe5..c8e6922d 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -20,6 +20,7 @@ providers=(
"generic"
"openstack"
"outscale"
+ "gis"
)
if ! [ -x "$(command -v round)" ]; then
diff --git a/config.py b/config.py
index 86a58342..06aa05bb 100644
--- a/config.py
+++ b/config.py
@@ -29,6 +29,7 @@ PROVIDERS = (
"generic",
"openstack",
"outscale",
+ "gis"
)
#########################
@@ -59,6 +60,7 @@ FILE_PREFIXES = {
"outscale": (),
"generic": (),
"openstack": (),
+ "gis": (),
}
#########################
@@ -87,8 +89,9 @@ UPPER_WORDS = {
"generic": ("vpn", "ios", "xen", "sql", "lxc"),
"outscale": ("osc",),
"openstack": ("rpm", "loci", "nfv", "ec2api"),
- "pve": ("pve"),
- "ibm": ("ibm"),
+ "pve": ("pve",),
+ "ibm": ("ibm",),
+ "gis": ("gis","ban","ign","ogc","qgis","wfs","wms"),
}
TITLE_WORDS = {
@@ -143,6 +146,7 @@ ALIASES = {
"Mssql": "MSSQL",
"Mysql": "MySQL",
"Postgresql": "PostgreSQL",
+ "Qdrant": "Qdrant",
},
"gitops": {
"Argocd": "ArgoCD",
@@ -411,6 +415,7 @@ ALIASES = {
}
},
"digitalocean": {},
+ "gis": {},
"oci": {
"compute": {
"VM": "VirtualMachine",
diff --git a/diagrams/__init__.py b/diagrams/__init__.py
index 8625cd5d..66c3458f 100644
--- a/diagrams/__init__.py
+++ b/diagrams/__init__.py
@@ -528,7 +528,7 @@ class Edge:
for o in other:
if isinstance(o, Edge):
o.forward = forward if forward else o.forward
- o.reverse = forward if forward else o.reverse
+ o.reverse = reverse if reverse else o.reverse
self._attrs = o.attrs.copy()
result.append(o)
else:
diff --git a/diagrams/aws/compute.py b/diagrams/aws/compute.py
index 14c54403..66022a16 100644
--- a/diagrams/aws/compute.py
+++ b/diagrams/aws/compute.py
@@ -96,6 +96,10 @@ class ElasticContainerServiceService(_Compute):
_icon = "elastic-container-service-service.png"
+class ElasticContainerServiceTask(_Compute):
+ _icon = "elastic-container-service-task.png"
+
+
class ElasticContainerService(_Compute):
_icon = "elastic-container-service.png"
diff --git a/diagrams/aws/devtools.py b/diagrams/aws/devtools.py
index d6458e5a..968d53c9 100644
--- a/diagrams/aws/devtools.py
+++ b/diagrams/aws/devtools.py
@@ -20,6 +20,10 @@ class Cloud9(_Devtools):
_icon = "cloud9.png"
+class Cloudshell(_Devtools):
+ _icon = "cloudshell.png"
+
+
class Codeartifact(_Devtools):
_icon = "codeartifact.png"
diff --git a/diagrams/aws/integration.py b/diagrams/aws/integration.py
index cfe23d48..40a1b809 100644
--- a/diagrams/aws/integration.py
+++ b/diagrams/aws/integration.py
@@ -32,10 +32,30 @@ class EventbridgeDefaultEventBusResource(_Integration):
_icon = "eventbridge-default-event-bus-resource.png"
+class EventbridgeEvent(_Integration):
+ _icon = "eventbridge-event.png"
+
+
+class EventbridgePipes(_Integration):
+ _icon = "eventbridge-pipes.png"
+
+
+class EventbridgeRule(_Integration):
+ _icon = "eventbridge-rule.png"
+
+
class EventbridgeSaasPartnerEventBusResource(_Integration):
_icon = "eventbridge-saas-partner-event-bus-resource.png"
+class EventbridgeScheduler(_Integration):
+ _icon = "eventbridge-scheduler.png"
+
+
+class EventbridgeSchema(_Integration):
+ _icon = "eventbridge-schema.png"
+
+
class Eventbridge(_Integration):
_icon = "eventbridge.png"
diff --git a/diagrams/aws/management.py b/diagrams/aws/management.py
index f6710686..3de22625 100644
--- a/diagrams/aws/management.py
+++ b/diagrams/aws/management.py
@@ -236,6 +236,10 @@ class TrustedAdvisor(_Management):
_icon = "trusted-advisor.png"
+class UserNotifications(_Management):
+ _icon = "user-notifications.png"
+
+
class WellArchitectedTool(_Management):
_icon = "well-architected-tool.png"
diff --git a/diagrams/aws/ml.py b/diagrams/aws/ml.py
index beb454bd..a08da89c 100644
--- a/diagrams/aws/ml.py
+++ b/diagrams/aws/ml.py
@@ -16,6 +16,10 @@ class AugmentedAi(_ML):
_icon = "augmented-ai.png"
+class Bedrock(_ML):
+ _icon = "bedrock.png"
+
+
class Comprehend(_ML):
_icon = "comprehend.png"
@@ -72,6 +76,10 @@ class Polly(_ML):
_icon = "polly.png"
+class Q(_ML):
+ _icon = "q.png"
+
+
class RekognitionImage(_ML):
_icon = "rekognition-image.png"
diff --git a/diagrams/azure/ml.py b/diagrams/azure/ml.py
index eb0c474e..e9fff87d 100644
--- a/diagrams/azure/ml.py
+++ b/diagrams/azure/ml.py
@@ -12,8 +12,8 @@ class AzureOpenAI(_Ml):
_icon = "azure-open-ai.png"
-class AzureSpeedToText(_Ml):
- _icon = "azure-speed-to-text.png"
+class AzureSpeechService(_Ml):
+ _icon = "azure-speech-service.png"
class BatchAI(_Ml):
diff --git a/diagrams/cli.py b/diagrams/cli.py
new file mode 100644
index 00000000..c75eb3d9
--- /dev/null
+++ b/diagrams/cli.py
@@ -0,0 +1,38 @@
+import argparse
+import sys
+
+
+def run() -> int:
+ """
+ Run diagrams code files in a diagrams environment.
+ Args:
+ paths: A list of paths to Python files containing diagrams code.
+
+ Returns:
+ The exit code.
+ """
+ parser = argparse.ArgumentParser(
+ description="Run diagrams code files in a diagrams environment.",
+ )
+ parser.add_argument(
+ "paths",
+ metavar="path",
+ type=str,
+ nargs="+",
+ help="a Python file containing diagrams code",
+ )
+ args = parser.parse_args()
+
+ for path in args.paths:
+ with open(path, encoding='utf-8') as f:
+ exec(f.read())
+
+ return 0
+
+
+def main():
+ sys.exit(run())
+
+
+if __name__ == "__main__":
+ main()
diff --git a/diagrams/gis/__init__.py b/diagrams/gis/__init__.py
new file mode 100644
index 00000000..684dca02
--- /dev/null
+++ b/diagrams/gis/__init__.py
@@ -0,0 +1,12 @@
+"""
+GIS provides a set of services for Geographic Information Systems provider.
+"""
+
+from diagrams import Node
+
+
+class _GIS(Node):
+ _provider = "gis"
+ _icon_dir = "resources/gis"
+
+ fontcolor = "#2d3436"
diff --git a/diagrams/gis/cli.py b/diagrams/gis/cli.py
new file mode 100644
index 00000000..4cf8e9f1
--- /dev/null
+++ b/diagrams/gis/cli.py
@@ -0,0 +1,35 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Cli(_GIS):
+ _type = "cli"
+ _icon_dir = "resources/gis/cli"
+
+
+class Gdal(_Cli):
+ _icon = "gdal.png"
+
+
+class Imposm(_Cli):
+ _icon = "imposm.png"
+
+
+class Lastools(_Cli):
+ _icon = "lastools.png"
+
+
+class Mapnik(_Cli):
+ _icon = "mapnik.png"
+
+
+class Mdal(_Cli):
+ _icon = "mdal.png"
+
+
+class Pdal(_Cli):
+ _icon = "pdal.png"
+
+
+# Aliases
diff --git a/diagrams/gis/cplusplus.py b/diagrams/gis/cplusplus.py
new file mode 100644
index 00000000..a772d45d
--- /dev/null
+++ b/diagrams/gis/cplusplus.py
@@ -0,0 +1,15 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Cplusplus(_GIS):
+ _type = "cplusplus"
+ _icon_dir = "resources/gis/cplusplus"
+
+
+class Mapnik(_Cplusplus):
+ _icon = "mapnik.png"
+
+
+# Aliases
diff --git a/diagrams/gis/data.py b/diagrams/gis/data.py
new file mode 100644
index 00000000..99dbd696
--- /dev/null
+++ b/diagrams/gis/data.py
@@ -0,0 +1,31 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Data(_GIS):
+ _type = "data"
+ _icon_dir = "resources/gis/data"
+
+
+class BAN(_Data):
+ _icon = "ban.png"
+
+
+class Here(_Data):
+ _icon = "here.png"
+
+
+class IGN(_Data):
+ _icon = "ign.png"
+
+
+class Openstreetmap(_Data):
+ _icon = "openstreetmap.png"
+
+
+class Overturemaps(_Data):
+ _icon = "overturemaps.png"
+
+
+# Aliases
diff --git a/diagrams/gis/database.py b/diagrams/gis/database.py
new file mode 100644
index 00000000..04ee2f72
--- /dev/null
+++ b/diagrams/gis/database.py
@@ -0,0 +1,15 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Database(_GIS):
+ _type = "database"
+ _icon_dir = "resources/gis/database"
+
+
+class Postgis(_Database):
+ _icon = "postgis.png"
+
+
+# Aliases
diff --git a/diagrams/gis/desktop.py b/diagrams/gis/desktop.py
new file mode 100644
index 00000000..b39ff222
--- /dev/null
+++ b/diagrams/gis/desktop.py
@@ -0,0 +1,19 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Desktop(_GIS):
+ _type = "desktop"
+ _icon_dir = "resources/gis/desktop"
+
+
+class Maptunik(_Desktop):
+ _icon = "maptunik.png"
+
+
+class QGIS(_Desktop):
+ _icon = "qgis.png"
+
+
+# Aliases
diff --git a/diagrams/gis/format.py b/diagrams/gis/format.py
new file mode 100644
index 00000000..3c932a1f
--- /dev/null
+++ b/diagrams/gis/format.py
@@ -0,0 +1,19 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Format(_GIS):
+ _type = "format"
+ _icon_dir = "resources/gis/format"
+
+
+class Geopackage(_Format):
+ _icon = "geopackage.png"
+
+
+class Geoparquet(_Format):
+ _icon = "geoparquet.png"
+
+
+# Aliases
diff --git a/diagrams/gis/geocoding.py b/diagrams/gis/geocoding.py
new file mode 100644
index 00000000..de533277
--- /dev/null
+++ b/diagrams/gis/geocoding.py
@@ -0,0 +1,27 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Geocoding(_GIS):
+ _type = "geocoding"
+ _icon_dir = "resources/gis/geocoding"
+
+
+class Addok(_Geocoding):
+ _icon = "addok.png"
+
+
+class Gisgraphy(_Geocoding):
+ _icon = "gisgraphy.png"
+
+
+class Nominatim(_Geocoding):
+ _icon = "nominatim.png"
+
+
+class Pelias(_Geocoding):
+ _icon = "pelias.png"
+
+
+# Aliases
diff --git a/diagrams/gis/georchestra.py b/diagrams/gis/georchestra.py
new file mode 100644
index 00000000..fc1b8ebf
--- /dev/null
+++ b/diagrams/gis/georchestra.py
@@ -0,0 +1,11 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Georchestra(_GIS):
+ _type = "georchestra"
+ _icon_dir = "resources/gis/georchestra"
+
+
+# Aliases
diff --git a/diagrams/gis/java.py b/diagrams/gis/java.py
new file mode 100644
index 00000000..371b847f
--- /dev/null
+++ b/diagrams/gis/java.py
@@ -0,0 +1,15 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Java(_GIS):
+ _type = "java"
+ _icon_dir = "resources/gis/java"
+
+
+class Geotools(_Java):
+ _icon = "geotools.png"
+
+
+# Aliases
diff --git a/diagrams/gis/javascript.py b/diagrams/gis/javascript.py
new file mode 100644
index 00000000..4a9c7391
--- /dev/null
+++ b/diagrams/gis/javascript.py
@@ -0,0 +1,43 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Javascript(_GIS):
+ _type = "javascript"
+ _icon_dir = "resources/gis/javascript"
+
+
+class Cesium(_Javascript):
+ _icon = "cesium.png"
+
+
+class Geostyler(_Javascript):
+ _icon = "geostyler.png"
+
+
+class Keplerjs(_Javascript):
+ _icon = "keplerjs.png"
+
+
+class Leaflet(_Javascript):
+ _icon = "leaflet.png"
+
+
+class Maplibre(_Javascript):
+ _icon = "maplibre.png"
+
+
+class OlExt(_Javascript):
+ _icon = "ol-ext.png"
+
+
+class Openlayers(_Javascript):
+ _icon = "openlayers.png"
+
+
+class Turfjs(_Javascript):
+ _icon = "turfjs.png"
+
+
+# Aliases
diff --git a/diagrams/gis/mobile.py b/diagrams/gis/mobile.py
new file mode 100644
index 00000000..b798eddd
--- /dev/null
+++ b/diagrams/gis/mobile.py
@@ -0,0 +1,23 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Mobile(_GIS):
+ _type = "mobile"
+ _icon_dir = "resources/gis/mobile"
+
+
+class Mergin(_Mobile):
+ _icon = "mergin.png"
+
+
+class Qfield(_Mobile):
+ _icon = "qfield.png"
+
+
+class Smash(_Mobile):
+ _icon = "smash.png"
+
+
+# Aliases
diff --git a/diagrams/gis/ogc.py b/diagrams/gis/ogc.py
new file mode 100644
index 00000000..956df61e
--- /dev/null
+++ b/diagrams/gis/ogc.py
@@ -0,0 +1,23 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _OGC(_GIS):
+ _type = "ogc"
+ _icon_dir = "resources/gis/ogc"
+
+
+class OGC(_OGC):
+ _icon = "ogc.png"
+
+
+class WFS(_OGC):
+ _icon = "wfs.png"
+
+
+class WMS(_OGC):
+ _icon = "wms.png"
+
+
+# Aliases
diff --git a/diagrams/gis/organization.py b/diagrams/gis/organization.py
new file mode 100644
index 00000000..5fc49441
--- /dev/null
+++ b/diagrams/gis/organization.py
@@ -0,0 +1,15 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Organization(_GIS):
+ _type = "organization"
+ _icon_dir = "resources/gis/organization"
+
+
+class Osgeo(_Organization):
+ _icon = "osgeo.png"
+
+
+# Aliases
diff --git a/diagrams/gis/python.py b/diagrams/gis/python.py
new file mode 100644
index 00000000..340139d8
--- /dev/null
+++ b/diagrams/gis/python.py
@@ -0,0 +1,19 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Python(_GIS):
+ _type = "python"
+ _icon_dir = "resources/gis/python"
+
+
+class Geopandas(_Python):
+ _icon = "geopandas.png"
+
+
+class Pysal(_Python):
+ _icon = "pysal.png"
+
+
+# Aliases
diff --git a/diagrams/gis/routing.py b/diagrams/gis/routing.py
new file mode 100644
index 00000000..2176df71
--- /dev/null
+++ b/diagrams/gis/routing.py
@@ -0,0 +1,27 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Routing(_GIS):
+ _type = "routing"
+ _icon_dir = "resources/gis/routing"
+
+
+class Graphhopper(_Routing):
+ _icon = "graphhopper.png"
+
+
+class Osrm(_Routing):
+ _icon = "osrm.png"
+
+
+class Pgrouting(_Routing):
+ _icon = "pgrouting.png"
+
+
+class Valhalla(_Routing):
+ _icon = "valhalla.png"
+
+
+# Aliases
diff --git a/diagrams/gis/server.py b/diagrams/gis/server.py
new file mode 100644
index 00000000..c6ac4106
--- /dev/null
+++ b/diagrams/gis/server.py
@@ -0,0 +1,99 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Server(_GIS):
+ _type = "server"
+ _icon_dir = "resources/gis/server"
+
+
+class Actinia(_Server):
+ _icon = "actinia.png"
+
+
+class Baremaps(_Server):
+ _icon = "baremaps.png"
+
+
+class Deegree(_Server):
+ _icon = "deegree.png"
+
+
+class G3WSuite(_Server):
+ _icon = "g3w-suite.png"
+
+
+class Geohealthcheck(_Server):
+ _icon = "geohealthcheck.png"
+
+
+class Geomapfish(_Server):
+ _icon = "geomapfish.png"
+
+
+class Geomesa(_Server):
+ _icon = "geomesa.png"
+
+
+class Geonetwork(_Server):
+ _icon = "geonetwork.png"
+
+
+class Geonode(_Server):
+ _icon = "geonode.png"
+
+
+class Georchestra(_Server):
+ _icon = "georchestra.png"
+
+
+class Geoserver(_Server):
+ _icon = "geoserver.png"
+
+
+class Geowebcache(_Server):
+ _icon = "geowebcache.png"
+
+
+class Kepler(_Server):
+ _icon = "kepler.png"
+
+
+class Mapproxy(_Server):
+ _icon = "mapproxy.png"
+
+
+class Mapserver(_Server):
+ _icon = "mapserver.png"
+
+
+class Mapstore(_Server):
+ _icon = "mapstore.png"
+
+
+class Mviewer(_Server):
+ _icon = "mviewer.png"
+
+
+class Pg_Tileserv(_Server):
+ _icon = "pg_tileserv.png"
+
+
+class Pycsw(_Server):
+ _icon = "pycsw.png"
+
+
+class Pygeoapi(_Server):
+ _icon = "pygeoapi.png"
+
+
+class QGISServer(_Server):
+ _icon = "qgis-server.png"
+
+
+class Zooproject(_Server):
+ _icon = "zooproject.png"
+
+
+# Aliases
diff --git a/diagrams/gis/toolkit.py b/diagrams/gis/toolkit.py
new file mode 100644
index 00000000..d67d1d81
--- /dev/null
+++ b/diagrams/gis/toolkit.py
@@ -0,0 +1,11 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _GIS
+
+
+class _Toolkit(_GIS):
+ _type = "toolkit"
+ _icon_dir = "resources/gis/toolkit"
+
+
+# Aliases
diff --git a/diagrams/onprem/database.py b/diagrams/onprem/database.py
index 40ed89ca..7013c7b0 100644
--- a/diagrams/onprem/database.py
+++ b/diagrams/onprem/database.py
@@ -36,6 +36,10 @@ class Druid(_Database):
_icon = "druid.png"
+class Duckdb(_Database):
+ _icon = "duckdb.png"
+
+
class Hbase(_Database):
_icon = "hbase.png"
@@ -76,6 +80,10 @@ class Postgresql(_Database):
_icon = "postgresql.png"
+class Qdrant(_Database):
+ _icon = "qdrant.png"
+
+
class Scylla(_Database):
_icon = "scylla.png"
@@ -93,3 +101,4 @@ MongoDB = Mongodb
MSSQL = Mssql
MySQL = Mysql
PostgreSQL = Postgresql
+Qdrant = Qdrant
diff --git a/diagrams/onprem/iac.py b/diagrams/onprem/iac.py
index 33d8ea77..c56284ac 100644
--- a/diagrams/onprem/iac.py
+++ b/diagrams/onprem/iac.py
@@ -20,6 +20,10 @@ class Awx(_Iac):
_icon = "awx.png"
+class Pulumi(_Iac):
+ _icon = "pulumi.png"
+
+
class Puppet(_Iac):
_icon = "puppet.png"
diff --git a/diagrams/onprem/network.py b/diagrams/onprem/network.py
index 7ef068b5..73b6f28e 100644
--- a/diagrams/onprem/network.py
+++ b/diagrams/onprem/network.py
@@ -24,6 +24,18 @@ class Caddy(_Network):
_icon = "caddy.png"
+class CiscoRouter(_Network):
+ _icon = "cisco-router.png"
+
+
+class CiscoSwitchL2(_Network):
+ _icon = "cisco-switch-l2.png"
+
+
+class CiscoSwitchL3(_Network):
+ _icon = "cisco-switch-l3.png"
+
+
class Consul(_Network):
_icon = "consul.png"
diff --git a/diagrams/saas/automation.py b/diagrams/saas/automation.py
new file mode 100644
index 00000000..ef047d5f
--- /dev/null
+++ b/diagrams/saas/automation.py
@@ -0,0 +1,15 @@
+# This module is automatically generated by autogen.sh. DO NOT EDIT.
+
+from . import _Saas
+
+
+class _Automation(_Saas):
+ _type = "automation"
+ _icon_dir = "resources/saas/automation"
+
+
+class N8N(_Automation):
+ _icon = "n8n.png"
+
+
+# Aliases
diff --git a/diagrams/saas/cdn.py b/diagrams/saas/cdn.py
index cc0b4fc2..aafd50e3 100644
--- a/diagrams/saas/cdn.py
+++ b/diagrams/saas/cdn.py
@@ -20,4 +20,8 @@ class Fastly(_Cdn):
_icon = "fastly.png"
+class Imperva(_Cdn):
+ _icon = "imperva.png"
+
+
# Aliases
diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile
index bc6e76ae..ab653077 100644
--- a/docker/dev/Dockerfile
+++ b/docker/dev/Dockerfile
@@ -1,5 +1,5 @@
# use latest python alpine image.
-FROM python:3.13.1-alpine3.20
+FROM python:3.13.3-alpine3.20
# install system dependencies.
RUN apk update && apk add --no-cache \
diff --git a/docs/getting-started/examples.md b/docs/getting-started/examples.md
index d2d2f4c7..71c57542 100644
--- a/docs/getting-started/examples.md
+++ b/docs/getting-started/examples.md
@@ -211,9 +211,9 @@ with Diagram("Advanced Web Service with On-Premises", show=False):
ingress >> grpcsvc >> aggregator
```
-
+
-## Advanced Web Service with On-Premise (with colors and labels)
+## Advanced Web Service with On-Premises (with colors and labels)
```python
from diagrams import Cluster, Diagram, Edge
@@ -226,7 +226,7 @@ from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.onprem.network import Nginx
from diagrams.onprem.queue import Kafka
-with Diagram(name="Advanced Web Service with On-Premise (colored)", show=False):
+with Diagram(name="Advanced Web Service with On-Premises (colored)", show=False):
ingress = Nginx("ingress")
metrics = Prometheus("metric")
@@ -254,7 +254,7 @@ with Diagram(name="Advanced Web Service with On-Premise (colored)", show=False):
ingress >> Edge(color="darkgreen") << grpcsvc >> Edge(color="darkorange") >> aggregator
```
-
+
## RabbitMQ Consumers with Custom Nodes
diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md
index f38b5242..cdbc86f8 100644
--- a/docs/getting-started/installation.md
+++ b/docs/getting-started/installation.md
@@ -7,7 +7,7 @@ title: Installation
**diagrams** uses [Graphviz](https://www.graphviz.org/) to render the diagram, so you need to [install Graphviz](https://graphviz.gitlab.io/download/) to use it.
-> macOS users using [Homebrew](https://brew.sh) can install Graphviz via `brew install graphviz` . Similarly, Windows users with [Chocolatey](https://chocolatey.org) installed can run `choco install graphviz`.
+> macOS users using [Homebrew](https://brew.sh) can install Graphviz via `brew install graphviz` . Similarly, Windows users with [Chocolatey](https://chocolatey.org) installed can run `choco install graphviz` or use [Winget](https://learn.microsoft.com/windows/package-manager/) via `winget install Graphviz.Graphviz -i`.
After installing Graphviz (or if you already have it), install **diagrams**:
@@ -20,6 +20,9 @@ $ pipenv install diagrams
# using poetry
$ poetry add diagrams
+
+# using uv
+$ uv tool install diagrams
```
## Quick Start
@@ -47,6 +50,14 @@ This generates the diagram below:
It will be saved as `web_service.png` in your working directory.
+### CLI
+
+With the `diagrams` CLI you can process one or more diagram files at once.
+
+```shell
+$ diagrams diagram1.py diagram2.py
+```
+
## Next
See more [Examples](/docs/getting-started/examples) or see the [Guides](/docs/guides/diagram) page for more details.
diff --git a/docs/guides/edge.md b/docs/guides/edge.md
index befee710..c1bfced6 100644
--- a/docs/guides/edge.md
+++ b/docs/guides/edge.md
@@ -65,5 +65,131 @@ with Diagram(name="Advanced Web Service with On-Premises (colored)", show=False)
>> Edge(color="darkorange") \
>> aggregator
```
+
-
+## Less Edges
+
+As you can see on the previous graph the edges can quickly become noisy. Below are two examples to solve this problem.
+
+One approach is to get creative with the Node class to create blank placeholders, together with named nodes within Clusters, and then only pointing to single named elements within those Clusters.
+
+Compare the output below to the example output above .
+
+```python
+from diagrams import Cluster, Diagram, Node
+from diagrams.onprem.analytics import Spark
+from diagrams.onprem.compute import Server
+from diagrams.onprem.database import PostgreSQL
+from diagrams.onprem.inmemory import Redis
+from diagrams.onprem.aggregator import Fluentd
+from diagrams.onprem.monitoring import Grafana, Prometheus
+from diagrams.onprem.network import Nginx
+from diagrams.onprem.queue import Kafka
+
+with Diagram("\nAdvanced Web Service with On-Premise Less edges", show=False) as diag:
+ ingress = Nginx("ingress")
+
+ with Cluster("Service Cluster"):
+ serv1 = Server("grpc1")
+ serv2 = Server("grpc2")
+ serv3 = Server("grpc3")
+
+ with Cluster(""):
+ blankHA = Node("", shape="plaintext", width="0", height="0")
+
+ metrics = Prometheus("metric")
+ metrics << Grafana("monitoring")
+
+ aggregator = Fluentd("logging")
+ blankHA >> aggregator >> Kafka("stream") >> Spark("analytics")
+
+ with Cluster("Database HA"):
+ db = PostgreSQL("users")
+ db - PostgreSQL("replica") << metrics
+ blankHA >> db
+
+ with Cluster("Sessions HA"):
+ sess = Redis("session")
+ sess - Redis("replica") << metrics
+ blankHA >> sess
+
+ ingress >> serv2 >> blankHA
+
+diag
+```
+
+
+
+## Merged Edges
+
+Yet another option is to set the graph_attr dictionary key "concentrate" to "true".
+
+Note the following restrictions:
+
+1. the Edge must end at the same headport
+2. This only works when the "splines" graph_attr key is set to the value "spline". It has no effect when the value was set to "ortho", which is the default for the diagrams library.
+3. this will only work with the "dot" layout engine, which is the default for the diagrams library.
+
+For more information see:
+
+ https://graphviz.gitlab.io/doc/info/attrs.html#d:concentrate
+
+ https://www.graphviz.org/pdf/dotguide.pdf Section 3.3 Concentrators
+
+
+
+```python
+from diagrams import Cluster, Diagram, Edge, Node
+from diagrams.onprem.analytics import Spark
+from diagrams.onprem.compute import Server
+from diagrams.onprem.database import PostgreSQL
+from diagrams.onprem.inmemory import Redis
+from diagrams.onprem.aggregator import Fluentd
+from diagrams.onprem.monitoring import Grafana, Prometheus
+from diagrams.onprem.network import Nginx
+from diagrams.onprem.queue import Kafka
+
+graph_attr = {
+ "concentrate": "true",
+ "splines": "spline",
+}
+
+edge_attr = {
+ "minlen":"3",
+}
+
+with Diagram("\n\nAdvanced Web Service with On-Premise Merged edges", show=False,
+ graph_attr=graph_attr,
+ edge_attr=edge_attr) as diag:
+
+ ingress = Nginx("ingress")
+
+ metrics = Prometheus("metric")
+ metrics << Edge(minlen="0") << Grafana("monitoring")
+
+ with Cluster("Service Cluster"):
+ grpsrv = [
+ Server("grpc1"),
+ Server("grpc2"),
+ Server("grpc3")]
+
+ blank = Node("", shape="plaintext", height="0.0", width="0.0")
+
+ with Cluster("Sessions HA"):
+ sess = Redis("session")
+ sess - Redis("replica") << metrics
+
+ with Cluster("Database HA"):
+ db = PostgreSQL("users")
+ db - PostgreSQL("replica") << metrics
+
+ aggregator = Fluentd("logging")
+ aggregator >> Kafka("stream") >> Spark("analytics")
+
+ ingress >> [grpsrv[0], grpsrv[1], grpsrv[2],]
+ [grpsrv[0], grpsrv[1], grpsrv[2],] - Edge(headport="w", minlen="1") - blank
+ blank >> Edge(headport="w", minlen="2") >> [sess, db, aggregator]
+
+diag
+```
+
diff --git a/docs/nodes/aws.md b/docs/nodes/aws.md
index 7abb578a..5085f62d 100644
--- a/docs/nodes/aws.md
+++ b/docs/nodes/aws.md
@@ -203,6 +203,9 @@ Node classes list of the aws provider.
**diagrams.aws.compute.ElasticContainerServiceService**
+
+**diagrams.aws.compute.ElasticContainerServiceTask**
+
**diagrams.aws.compute.ElasticContainerService**, **ECS** (alias)
@@ -395,6 +398,9 @@ Node classes list of the aws provider.
**diagrams.aws.devtools.Cloud9**
+
+**diagrams.aws.devtools.Cloudshell**
+
**diagrams.aws.devtools.Codeartifact**
@@ -584,9 +590,24 @@ Node classes list of the aws provider.
**diagrams.aws.integration.EventbridgeDefaultEventBusResource**
+
+**diagrams.aws.integration.EventbridgeEvent**
+
+
+**diagrams.aws.integration.EventbridgePipes**
+
+
+**diagrams.aws.integration.EventbridgeRule**
+
**diagrams.aws.integration.EventbridgeSaasPartnerEventBusResource**
+
+**diagrams.aws.integration.EventbridgeScheduler**
+
+
+**diagrams.aws.integration.EventbridgeSchema**
+
**diagrams.aws.integration.Eventbridge**
@@ -980,6 +1001,9 @@ Node classes list of the aws provider.
**diagrams.aws.management.TrustedAdvisor**
+
+**diagrams.aws.management.UserNotifications**
+
**diagrams.aws.management.WellArchitectedTool**
@@ -1073,6 +1097,9 @@ Node classes list of the aws provider.
**diagrams.aws.ml.AugmentedAi**
+
+**diagrams.aws.ml.Bedrock**
+
**diagrams.aws.ml.Comprehend**
@@ -1115,6 +1142,9 @@ Node classes list of the aws provider.
**diagrams.aws.ml.Polly**
+
+**diagrams.aws.ml.Q**
+
**diagrams.aws.ml.RekognitionImage**
diff --git a/docs/nodes/azure.md b/docs/nodes/azure.md
index 5a91236f..570f537e 100644
--- a/docs/nodes/azure.md
+++ b/docs/nodes/azure.md
@@ -1571,8 +1571,8 @@ Node classes list of azure provider.
**diagrams.azure.ml.AzureOpenAI**
-
-**diagrams.azure.ml.AzureSpeedToText**
+
+**diagrams.azure.ml.AzureSpeechService**
**diagrams.azure.ml.BatchAI**
diff --git a/docs/nodes/gis.md b/docs/nodes/gis.md
new file mode 100644
index 00000000..4460c3b3
--- /dev/null
+++ b/docs/nodes/gis.md
@@ -0,0 +1,243 @@
+---
+id: gis
+title: GIS
+---
+
+Node classes list of the gis provider.
+
+## gis.cli
+
+
+
+**diagrams.gis.cli.Gdal**
+
+
+**diagrams.gis.cli.Imposm**
+
+
+**diagrams.gis.cli.Lastools**
+
+
+**diagrams.gis.cli.Mapnik**
+
+
+**diagrams.gis.cli.Mdal**
+
+
+**diagrams.gis.cli.Pdal**
+
+## gis.data
+
+
+
+**diagrams.gis.data.BAN**
+
+
+**diagrams.gis.data.Here**
+
+
+**diagrams.gis.data.IGN**
+
+
+**diagrams.gis.data.Openstreetmap**
+
+
+**diagrams.gis.data.Overturemaps**
+
+## gis.database
+
+
+
+**diagrams.gis.database.Postgis**
+
+## gis.desktop
+
+
+
+**diagrams.gis.desktop.Maptunik**
+
+
+**diagrams.gis.desktop.QGIS**
+
+## gis.format
+
+
+
+**diagrams.gis.format.Geopackage**
+
+
+**diagrams.gis.format.Geoparquet**
+
+## gis.geocoding
+
+
+
+**diagrams.gis.geocoding.Addok**
+
+
+**diagrams.gis.geocoding.Gisgraphy**
+
+
+**diagrams.gis.geocoding.Nominatim**
+
+
+**diagrams.gis.geocoding.Pelias**
+
+## gis.georchestra
+
+
+## gis.java
+
+
+
+**diagrams.gis.java.Geotools**
+
+## gis.javascript
+
+
+
+**diagrams.gis.javascript.Cesium**
+
+
+**diagrams.gis.javascript.Geostyler**
+
+
+**diagrams.gis.javascript.Keplerjs**
+
+
+**diagrams.gis.javascript.Leaflet**
+
+
+**diagrams.gis.javascript.Maplibre**
+
+
+**diagrams.gis.javascript.OlExt**
+
+
+**diagrams.gis.javascript.Openlayers**
+
+
+**diagrams.gis.javascript.Turfjs**
+
+## gis.mobile
+
+
+
+**diagrams.gis.mobile.Mergin**
+
+
+**diagrams.gis.mobile.Qfield**
+
+
+**diagrams.gis.mobile.Smash**
+
+## gis.ogc
+
+
+
+**diagrams.gis.ogc.OGC**
+
+
+**diagrams.gis.ogc.WFS**
+
+
+**diagrams.gis.ogc.WMS**
+
+## gis.organization
+
+
+
+**diagrams.gis.organization.Osgeo**
+
+## gis.python
+
+
+
+**diagrams.gis.python.Geopandas**
+
+
+**diagrams.gis.python.Pysal**
+
+## gis.routing
+
+
+
+**diagrams.gis.routing.Graphhopper**
+
+
+**diagrams.gis.routing.Osrm**
+
+
+**diagrams.gis.routing.Pgrouting**
+
+
+**diagrams.gis.routing.Valhalla**
+
+## gis.server
+
+
+
+**diagrams.gis.server.Actinia**
+
+
+**diagrams.gis.server.Baremaps**
+
+
+**diagrams.gis.server.Deegree**
+
+
+**diagrams.gis.server.G3WSuite**
+
+
+**diagrams.gis.server.Geohealthcheck**
+
+
+**diagrams.gis.server.Geomapfish**
+
+
+**diagrams.gis.server.Geomesa**
+
+
+**diagrams.gis.server.Geonetwork**
+
+
+**diagrams.gis.server.Geonode**
+
+
+**diagrams.gis.server.Georchestra**
+
+
+**diagrams.gis.server.Geoserver**
+
+
+**diagrams.gis.server.Geowebcache**
+
+
+**diagrams.gis.server.Kepler**
+
+
+**diagrams.gis.server.Mapproxy**
+
+
+**diagrams.gis.server.Mapserver**
+
+
+**diagrams.gis.server.Mapstore**
+
+
+**diagrams.gis.server.Mviewer**
+
+
+**diagrams.gis.server.Pg_Tileserv**
+
+
+**diagrams.gis.server.Pycsw**
+
+
+**diagrams.gis.server.Pygeoapi**
+
+
+**diagrams.gis.server.QGISServer**
+
+
+**diagrams.gis.server.Zooproject**
diff --git a/docs/nodes/onprem.md b/docs/nodes/onprem.md
index 149ebf90..741c347f 100644
--- a/docs/nodes/onprem.md
+++ b/docs/nodes/onprem.md
@@ -203,6 +203,9 @@ Node classes list of the onprem provider.
**diagrams.onprem.database.Druid**
+
+**diagrams.onprem.database.Duckdb**
+
**diagrams.onprem.database.Hbase**, **HBase** (alias)
@@ -233,6 +236,9 @@ Node classes list of the onprem provider.
**diagrams.onprem.database.Postgresql**, **PostgreSQL** (alias)
+
+**diagrams.onprem.database.Qdrant**, **Qdrant** (alias)
+
**diagrams.onprem.database.Scylla**
@@ -281,6 +287,9 @@ Node classes list of the onprem provider.
**diagrams.onprem.iac.Awx**
+
+**diagrams.onprem.iac.Pulumi**
+
**diagrams.onprem.iac.Puppet**
@@ -401,6 +410,15 @@ Node classes list of the onprem provider.
**diagrams.onprem.network.Caddy**
+
+**diagrams.onprem.network.CiscoRouter**
+
+
+**diagrams.onprem.network.CiscoSwitchL2**
+
+
+**diagrams.onprem.network.CiscoSwitchL3**
+
**diagrams.onprem.network.Consul**
diff --git a/docs/nodes/saas.md b/docs/nodes/saas.md
index 54f236d3..8db61382 100644
--- a/docs/nodes/saas.md
+++ b/docs/nodes/saas.md
@@ -35,6 +35,12 @@ Node classes list of the saas provider.
**diagrams.saas.analytics.Stitch**
+## saas.automation
+
+
+
+**diagrams.saas.automation.N8N**
+
## saas.cdn
@@ -47,6 +53,9 @@ Node classes list of the saas provider.
**diagrams.saas.cdn.Fastly**
+
+**diagrams.saas.cdn.Imperva**
+
## saas.chat
diff --git a/poetry.lock b/poetry.lock
index d6c4f138..e98e9fce 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
[[package]]
name = "astroid"
@@ -6,6 +6,7 @@ version = "3.3.8"
description = "An abstract syntax tree for Python with inference support."
optional = false
python-versions = ">=3.9.0"
+groups = ["dev"]
files = [
{file = "astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c"},
{file = "astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b"},
@@ -20,6 +21,7 @@ version = "24.10.0"
description = "The uncompromising code formatter."
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
files = [
{file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
{file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
@@ -66,6 +68,7 @@ version = "3.4.0"
description = "Validate configuration and produce human readable error messages."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"},
{file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
@@ -77,6 +80,7 @@ version = "8.1.7"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
files = [
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
@@ -91,6 +95,8 @@ version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+groups = ["dev"]
+markers = "sys_platform == \"win32\" or platform_system == \"Windows\""
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
@@ -102,6 +108,7 @@ version = "0.3.9"
description = "serialize all of Python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"},
{file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"},
@@ -117,6 +124,7 @@ version = "0.3.9"
description = "Distribution utilities"
optional = false
python-versions = "*"
+groups = ["dev"]
files = [
{file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
{file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
@@ -128,6 +136,8 @@ version = "1.2.2"
description = "Backport of PEP 654 (exception groups)"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
+markers = "python_version < \"3.11\""
files = [
{file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
{file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
@@ -142,6 +152,7 @@ version = "3.16.1"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"},
{file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"},
@@ -150,7 +161,7 @@ files = [
[package.extras]
docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"]
testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"]
-typing = ["typing-extensions (>=4.12.2)"]
+typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""]
[[package]]
name = "graphviz"
@@ -158,6 +169,7 @@ version = "0.20.3"
description = "Simple Python interface for Graphviz"
optional = false
python-versions = ">=3.8"
+groups = ["main"]
files = [
{file = "graphviz-0.20.3-py3-none-any.whl", hash = "sha256:81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5"},
{file = "graphviz-0.20.3.zip", hash = "sha256:09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d"},
@@ -174,6 +186,7 @@ version = "2.6.2"
description = "File identification library for Python"
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
files = [
{file = "identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3"},
{file = "identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd"},
@@ -188,6 +201,7 @@ version = "2.0.0"
description = "brain-dead simple config-ini parsing"
optional = false
python-versions = ">=3.7"
+groups = ["dev"]
files = [
{file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
@@ -199,6 +213,7 @@ version = "5.13.2"
description = "A Python utility / library to sort Python imports."
optional = false
python-versions = ">=3.8.0"
+groups = ["dev"]
files = [
{file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
{file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
@@ -213,6 +228,7 @@ version = "3.1.4"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
+groups = ["main"]
files = [
{file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
{file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
@@ -230,6 +246,7 @@ version = "3.0.2"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
python-versions = ">=3.9"
+groups = ["main"]
files = [
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
{file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
@@ -300,6 +317,7 @@ version = "0.7.0"
description = "McCabe checker, plugin for flake8"
optional = false
python-versions = ">=3.6"
+groups = ["dev"]
files = [
{file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
{file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
@@ -311,6 +329,7 @@ version = "1.0.0"
description = "Type system extensions for programs checked with the mypy type checker."
optional = false
python-versions = ">=3.5"
+groups = ["dev"]
files = [
{file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
@@ -322,6 +341,7 @@ version = "1.9.1"
description = "Node.js virtual environment builder"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+groups = ["dev"]
files = [
{file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"},
{file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"},
@@ -333,6 +353,7 @@ version = "24.2"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
{file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
@@ -344,6 +365,7 @@ version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
@@ -355,6 +377,7 @@ version = "4.3.6"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
{file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
@@ -371,6 +394,7 @@ version = "1.5.0"
description = "plugin and hook calling mechanisms for python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
{file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
@@ -386,6 +410,7 @@ version = "4.0.1"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
optional = false
python-versions = ">=3.9"
+groups = ["dev"]
files = [
{file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"},
{file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"},
@@ -398,12 +423,28 @@ nodeenv = ">=0.11.1"
pyyaml = ">=5.1"
virtualenv = ">=20.10.0"
+[[package]]
+name = "pygments"
+version = "2.19.1"
+description = "Pygments is a syntax highlighting package written in Python."
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
+ {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
+]
+
+[package.extras]
+windows-terminal = ["colorama (>=0.4.6)"]
+
[[package]]
name = "pylint"
version = "3.3.3"
description = "python code static checker"
optional = false
python-versions = ">=3.9.0"
+groups = ["dev"]
files = [
{file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"},
{file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"},
@@ -415,7 +456,7 @@ colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
dill = [
{version = ">=0.2", markers = "python_version < \"3.11\""},
{version = ">=0.3.7", markers = "python_version >= \"3.12\""},
- {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""},
+ {version = ">=0.3.6", markers = "python_version == \"3.11\""},
]
isort = ">=4.2.5,<5.13.0 || >5.13.0,<6"
mccabe = ">=0.6,<0.8"
@@ -430,25 +471,27 @@ testutils = ["gitpython (>3)"]
[[package]]
name = "pytest"
-version = "8.3.4"
+version = "8.4.0"
description = "pytest: simple powerful testing with Python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
+groups = ["dev"]
files = [
- {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
- {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
+ {file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"},
+ {file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"},
]
[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
-iniconfig = "*"
-packaging = "*"
+colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""}
+iniconfig = ">=1"
+packaging = ">=20"
pluggy = ">=1.5,<2"
+pygments = ">=2.7.2"
tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytoolconfig"
@@ -456,6 +499,7 @@ version = "1.3.1"
description = "Python tool configuration"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "pytoolconfig-1.3.1-py3-none-any.whl", hash = "sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b"},
{file = "pytoolconfig-1.3.1.tar.gz", hash = "sha256:51e6bd1a6f108238ae6aab6a65e5eed5e75d456be1c2bf29b04e5c1e7d7adbae"},
@@ -478,6 +522,7 @@ version = "6.0.2"
description = "YAML parser and emitter for Python"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
{file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
@@ -540,6 +585,7 @@ version = "1.13.0"
description = "a python refactoring library..."
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "rope-1.13.0-py3-none-any.whl", hash = "sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c"},
{file = "rope-1.13.0.tar.gz", hash = "sha256:51437d2decc8806cd5e9dd1fd9c1306a6d9075ecaf78d191af85fc1dfface880"},
@@ -559,6 +605,8 @@ version = "2.1.0"
description = "A lil' TOML parser"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version < \"3.11\""
files = [
{file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"},
{file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"},
@@ -570,6 +618,7 @@ version = "0.13.2"
description = "Style preserving TOML library"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
{file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
@@ -581,6 +630,8 @@ version = "4.12.2"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
+markers = "python_version < \"3.11\""
files = [
{file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
@@ -592,6 +643,7 @@ version = "20.27.1"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
+groups = ["dev"]
files = [
{file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"},
{file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"},
@@ -604,9 +656,9 @@ platformdirs = ">=3.9.1,<5"
[package.extras]
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
-test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
+test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""]
[metadata]
-lock-version = "2.0"
+lock-version = "2.1"
python-versions = "^3.9"
-content-hash = "64d8272592088d0e7a3aee3d7318d26acd2de67d7875b5bd00f10a593aec84dc"
+content-hash = "f774f01a9f7a5b2068566d1adf607e388e055eeb6c59245e4ac820660337a9dc"
diff --git a/pyproject.toml b/pyproject.toml
index bcb1e65e..6e1cb2d4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "diagrams"
-version = "0.24.1"
+version = "0.24.4"
description = "Diagram as Code"
license = "MIT"
authors = ["mingrammer "]
@@ -17,14 +17,14 @@ python = "^3.9"
graphviz = ">=0.13.2,<0.21.0"
jinja2 = ">=2.10,<4.0"
typed-ast = {version="^1.5.5", markers="python_version<'3.8'"}
-pre-commit = "^4.0.1"
[tool.poetry.dev-dependencies]
-pytest = "^8.3"
+pytest = "^8.4"
pylint = "^3.3"
rope = "^1.13"
isort = "^5.13"
black = "^24.4"
+pre-commit = "^4.0.1"
[tool.black]
line-length=120
diff --git a/resources/aws/compute/elastic-container-service-task.png b/resources/aws/compute/elastic-container-service-task.png
new file mode 100644
index 00000000..781c93ef
Binary files /dev/null and b/resources/aws/compute/elastic-container-service-task.png differ
diff --git a/resources/aws/devtools/cloudshell.png b/resources/aws/devtools/cloudshell.png
new file mode 100644
index 00000000..fe36338d
Binary files /dev/null and b/resources/aws/devtools/cloudshell.png differ
diff --git a/resources/aws/integration/eventbridge-default-event-bus-resource.png b/resources/aws/integration/eventbridge-default-event-bus-resource.png
index e59b3e5f..8ac11fc7 100644
Binary files a/resources/aws/integration/eventbridge-default-event-bus-resource.png and b/resources/aws/integration/eventbridge-default-event-bus-resource.png differ
diff --git a/resources/aws/integration/eventbridge-event.png b/resources/aws/integration/eventbridge-event.png
new file mode 100644
index 00000000..f9afe8d8
Binary files /dev/null and b/resources/aws/integration/eventbridge-event.png differ
diff --git a/resources/aws/integration/eventbridge-pipes.png b/resources/aws/integration/eventbridge-pipes.png
new file mode 100644
index 00000000..02e657df
Binary files /dev/null and b/resources/aws/integration/eventbridge-pipes.png differ
diff --git a/resources/aws/integration/eventbridge-rule.png b/resources/aws/integration/eventbridge-rule.png
new file mode 100644
index 00000000..0fb288db
Binary files /dev/null and b/resources/aws/integration/eventbridge-rule.png differ
diff --git a/resources/aws/integration/eventbridge-scheduler.png b/resources/aws/integration/eventbridge-scheduler.png
new file mode 100644
index 00000000..cf18011b
Binary files /dev/null and b/resources/aws/integration/eventbridge-scheduler.png differ
diff --git a/resources/aws/integration/eventbridge-schema.png b/resources/aws/integration/eventbridge-schema.png
new file mode 100644
index 00000000..b2d685fd
Binary files /dev/null and b/resources/aws/integration/eventbridge-schema.png differ
diff --git a/resources/aws/management/user-notifications.png b/resources/aws/management/user-notifications.png
new file mode 100644
index 00000000..fb4511f3
Binary files /dev/null and b/resources/aws/management/user-notifications.png differ
diff --git a/resources/aws/ml/bedrock.png b/resources/aws/ml/bedrock.png
new file mode 100644
index 00000000..0f184124
Binary files /dev/null and b/resources/aws/ml/bedrock.png differ
diff --git a/resources/aws/ml/q.png b/resources/aws/ml/q.png
new file mode 100644
index 00000000..2e381ca3
Binary files /dev/null and b/resources/aws/ml/q.png differ
diff --git a/resources/azure/ml/azure-speech-service.png b/resources/azure/ml/azure-speech-service.png
new file mode 100644
index 00000000..7716f11d
Binary files /dev/null and b/resources/azure/ml/azure-speech-service.png differ
diff --git a/resources/azure/ml/azure-speed-to-text.png b/resources/azure/ml/azure-speed-to-text.png
deleted file mode 100644
index ca331f12..00000000
Binary files a/resources/azure/ml/azure-speed-to-text.png and /dev/null differ
diff --git a/resources/gis/cli/gdal.png b/resources/gis/cli/gdal.png
new file mode 100644
index 00000000..19c93bde
Binary files /dev/null and b/resources/gis/cli/gdal.png differ
diff --git a/resources/gis/cli/imposm.png b/resources/gis/cli/imposm.png
new file mode 100644
index 00000000..6bbb013b
Binary files /dev/null and b/resources/gis/cli/imposm.png differ
diff --git a/resources/gis/cli/lastools.png b/resources/gis/cli/lastools.png
new file mode 100644
index 00000000..7e5848ee
Binary files /dev/null and b/resources/gis/cli/lastools.png differ
diff --git a/resources/gis/cli/mapnik.png b/resources/gis/cli/mapnik.png
new file mode 100644
index 00000000..622cacf4
Binary files /dev/null and b/resources/gis/cli/mapnik.png differ
diff --git a/resources/gis/cli/mdal.png b/resources/gis/cli/mdal.png
new file mode 100644
index 00000000..b1e1ed40
Binary files /dev/null and b/resources/gis/cli/mdal.png differ
diff --git a/resources/gis/cli/pdal.png b/resources/gis/cli/pdal.png
new file mode 100644
index 00000000..522949b6
Binary files /dev/null and b/resources/gis/cli/pdal.png differ
diff --git a/resources/gis/data/ban.png b/resources/gis/data/ban.png
new file mode 100644
index 00000000..af20419b
Binary files /dev/null and b/resources/gis/data/ban.png differ
diff --git a/resources/gis/data/here.png b/resources/gis/data/here.png
new file mode 100644
index 00000000..62b4f304
Binary files /dev/null and b/resources/gis/data/here.png differ
diff --git a/resources/gis/data/ign.png b/resources/gis/data/ign.png
new file mode 100644
index 00000000..c9b0e8c8
Binary files /dev/null and b/resources/gis/data/ign.png differ
diff --git a/resources/gis/data/openstreetmap.png b/resources/gis/data/openstreetmap.png
new file mode 100644
index 00000000..385bd973
Binary files /dev/null and b/resources/gis/data/openstreetmap.png differ
diff --git a/resources/gis/data/overturemaps.png b/resources/gis/data/overturemaps.png
new file mode 100644
index 00000000..44f52acc
Binary files /dev/null and b/resources/gis/data/overturemaps.png differ
diff --git a/resources/gis/database/postgis.png b/resources/gis/database/postgis.png
new file mode 100644
index 00000000..a6dc7b42
Binary files /dev/null and b/resources/gis/database/postgis.png differ
diff --git a/resources/gis/desktop/maptunik.png b/resources/gis/desktop/maptunik.png
new file mode 100644
index 00000000..4710e80f
Binary files /dev/null and b/resources/gis/desktop/maptunik.png differ
diff --git a/resources/gis/desktop/qgis.png b/resources/gis/desktop/qgis.png
new file mode 100644
index 00000000..3dc4b1cd
Binary files /dev/null and b/resources/gis/desktop/qgis.png differ
diff --git a/resources/gis/format/geopackage.png b/resources/gis/format/geopackage.png
new file mode 100644
index 00000000..0ff77fbf
Binary files /dev/null and b/resources/gis/format/geopackage.png differ
diff --git a/resources/gis/format/geoparquet.png b/resources/gis/format/geoparquet.png
new file mode 100644
index 00000000..d5ea1fd0
Binary files /dev/null and b/resources/gis/format/geoparquet.png differ
diff --git a/resources/gis/geocoding/addok.png b/resources/gis/geocoding/addok.png
new file mode 100644
index 00000000..93282493
Binary files /dev/null and b/resources/gis/geocoding/addok.png differ
diff --git a/resources/gis/geocoding/gisgraphy.png b/resources/gis/geocoding/gisgraphy.png
new file mode 100644
index 00000000..2d23928f
Binary files /dev/null and b/resources/gis/geocoding/gisgraphy.png differ
diff --git a/resources/gis/geocoding/nominatim.png b/resources/gis/geocoding/nominatim.png
new file mode 100644
index 00000000..385bd973
Binary files /dev/null and b/resources/gis/geocoding/nominatim.png differ
diff --git a/resources/gis/geocoding/pelias.png b/resources/gis/geocoding/pelias.png
new file mode 100644
index 00000000..6037fdec
Binary files /dev/null and b/resources/gis/geocoding/pelias.png differ
diff --git a/resources/gis/georchestra/analytics.svg b/resources/gis/georchestra/analytics.svg
new file mode 100644
index 00000000..fcd4027d
--- /dev/null
+++ b/resources/gis/georchestra/analytics.svg
@@ -0,0 +1,355 @@
+
+
+
+
diff --git a/resources/gis/georchestra/data_api.svg b/resources/gis/georchestra/data_api.svg
new file mode 100644
index 00000000..004328e8
--- /dev/null
+++ b/resources/gis/georchestra/data_api.svg
@@ -0,0 +1,335 @@
+
+
+
+
diff --git a/resources/gis/georchestra/datafeeder.svg b/resources/gis/georchestra/datafeeder.svg
new file mode 100644
index 00000000..c709fc46
--- /dev/null
+++ b/resources/gis/georchestra/datafeeder.svg
@@ -0,0 +1,465 @@
+
+
+
+
diff --git a/resources/gis/gis.png b/resources/gis/gis.png
new file mode 100644
index 00000000..95e4a2ef
Binary files /dev/null and b/resources/gis/gis.png differ
diff --git a/resources/gis/java/geotools.png b/resources/gis/java/geotools.png
new file mode 100644
index 00000000..624de5e1
Binary files /dev/null and b/resources/gis/java/geotools.png differ
diff --git a/resources/gis/javascript/cesium.png b/resources/gis/javascript/cesium.png
new file mode 100644
index 00000000..299a77d0
Binary files /dev/null and b/resources/gis/javascript/cesium.png differ
diff --git a/resources/gis/javascript/geostyler.png b/resources/gis/javascript/geostyler.png
new file mode 100644
index 00000000..ba4b1584
Binary files /dev/null and b/resources/gis/javascript/geostyler.png differ
diff --git a/resources/gis/javascript/keplerjs.png b/resources/gis/javascript/keplerjs.png
new file mode 100644
index 00000000..88363f02
Binary files /dev/null and b/resources/gis/javascript/keplerjs.png differ
diff --git a/resources/gis/javascript/leaflet.png b/resources/gis/javascript/leaflet.png
new file mode 100644
index 00000000..de9bc219
Binary files /dev/null and b/resources/gis/javascript/leaflet.png differ
diff --git a/resources/gis/javascript/maplibre.png b/resources/gis/javascript/maplibre.png
new file mode 100644
index 00000000..24502953
Binary files /dev/null and b/resources/gis/javascript/maplibre.png differ
diff --git a/resources/gis/javascript/ol-ext.png b/resources/gis/javascript/ol-ext.png
new file mode 100644
index 00000000..091fa606
Binary files /dev/null and b/resources/gis/javascript/ol-ext.png differ
diff --git a/resources/gis/javascript/openlayers.png b/resources/gis/javascript/openlayers.png
new file mode 100644
index 00000000..1ece99db
Binary files /dev/null and b/resources/gis/javascript/openlayers.png differ
diff --git a/resources/gis/javascript/turfjs.png b/resources/gis/javascript/turfjs.png
new file mode 100644
index 00000000..fab4c46f
Binary files /dev/null and b/resources/gis/javascript/turfjs.png differ
diff --git a/resources/gis/mobile/mergin.png b/resources/gis/mobile/mergin.png
new file mode 100644
index 00000000..00289fc3
Binary files /dev/null and b/resources/gis/mobile/mergin.png differ
diff --git a/resources/gis/mobile/qfield.png b/resources/gis/mobile/qfield.png
new file mode 100644
index 00000000..eb8f8c19
Binary files /dev/null and b/resources/gis/mobile/qfield.png differ
diff --git a/resources/gis/mobile/smash.png b/resources/gis/mobile/smash.png
new file mode 100644
index 00000000..38256c37
Binary files /dev/null and b/resources/gis/mobile/smash.png differ
diff --git a/resources/gis/ogc/ogc.png b/resources/gis/ogc/ogc.png
new file mode 100644
index 00000000..95b2f14f
Binary files /dev/null and b/resources/gis/ogc/ogc.png differ
diff --git a/resources/gis/ogc/wfs.png b/resources/gis/ogc/wfs.png
new file mode 100644
index 00000000..248ad034
Binary files /dev/null and b/resources/gis/ogc/wfs.png differ
diff --git a/resources/gis/ogc/wms.png b/resources/gis/ogc/wms.png
new file mode 100644
index 00000000..2893bbab
Binary files /dev/null and b/resources/gis/ogc/wms.png differ
diff --git a/resources/gis/organization/osgeo.png b/resources/gis/organization/osgeo.png
new file mode 100644
index 00000000..87095a95
Binary files /dev/null and b/resources/gis/organization/osgeo.png differ
diff --git a/resources/gis/python/geopandas.png b/resources/gis/python/geopandas.png
new file mode 100644
index 00000000..2bd72973
Binary files /dev/null and b/resources/gis/python/geopandas.png differ
diff --git a/resources/gis/python/pysal.png b/resources/gis/python/pysal.png
new file mode 100644
index 00000000..3e862666
Binary files /dev/null and b/resources/gis/python/pysal.png differ
diff --git a/resources/gis/routing/graphhopper.png b/resources/gis/routing/graphhopper.png
new file mode 100644
index 00000000..7d9bda14
Binary files /dev/null and b/resources/gis/routing/graphhopper.png differ
diff --git a/resources/gis/routing/osrm.png b/resources/gis/routing/osrm.png
new file mode 100644
index 00000000..b2a922ab
Binary files /dev/null and b/resources/gis/routing/osrm.png differ
diff --git a/resources/gis/routing/pgrouting.png b/resources/gis/routing/pgrouting.png
new file mode 100644
index 00000000..65ca4f3e
Binary files /dev/null and b/resources/gis/routing/pgrouting.png differ
diff --git a/resources/gis/routing/valhalla.png b/resources/gis/routing/valhalla.png
new file mode 100644
index 00000000..4756cf99
Binary files /dev/null and b/resources/gis/routing/valhalla.png differ
diff --git a/resources/gis/server/actinia.png b/resources/gis/server/actinia.png
new file mode 100644
index 00000000..f75392a2
Binary files /dev/null and b/resources/gis/server/actinia.png differ
diff --git a/resources/gis/server/baremaps.png b/resources/gis/server/baremaps.png
new file mode 100644
index 00000000..1614db7b
Binary files /dev/null and b/resources/gis/server/baremaps.png differ
diff --git a/resources/gis/server/deegree.png b/resources/gis/server/deegree.png
new file mode 100644
index 00000000..7ca17425
Binary files /dev/null and b/resources/gis/server/deegree.png differ
diff --git a/resources/gis/server/g3w-suite.png b/resources/gis/server/g3w-suite.png
new file mode 100644
index 00000000..9deea206
Binary files /dev/null and b/resources/gis/server/g3w-suite.png differ
diff --git a/resources/gis/server/geohealthcheck.png b/resources/gis/server/geohealthcheck.png
new file mode 100644
index 00000000..85299553
Binary files /dev/null and b/resources/gis/server/geohealthcheck.png differ
diff --git a/resources/gis/server/geomapfish.png b/resources/gis/server/geomapfish.png
new file mode 100644
index 00000000..631e3857
Binary files /dev/null and b/resources/gis/server/geomapfish.png differ
diff --git a/resources/gis/server/geomesa.png b/resources/gis/server/geomesa.png
new file mode 100644
index 00000000..8fe1a64d
Binary files /dev/null and b/resources/gis/server/geomesa.png differ
diff --git a/resources/gis/server/geonetwork.png b/resources/gis/server/geonetwork.png
new file mode 100644
index 00000000..8d117081
Binary files /dev/null and b/resources/gis/server/geonetwork.png differ
diff --git a/resources/gis/server/geonode.png b/resources/gis/server/geonode.png
new file mode 100644
index 00000000..b8de5c25
Binary files /dev/null and b/resources/gis/server/geonode.png differ
diff --git a/resources/gis/server/georchestra.png b/resources/gis/server/georchestra.png
new file mode 100644
index 00000000..3fe1b1c9
Binary files /dev/null and b/resources/gis/server/georchestra.png differ
diff --git a/resources/gis/server/geoserver.png b/resources/gis/server/geoserver.png
new file mode 100644
index 00000000..cea9265e
Binary files /dev/null and b/resources/gis/server/geoserver.png differ
diff --git a/resources/gis/server/geowebcache.png b/resources/gis/server/geowebcache.png
new file mode 100644
index 00000000..ff5277dd
Binary files /dev/null and b/resources/gis/server/geowebcache.png differ
diff --git a/resources/gis/server/kepler.png b/resources/gis/server/kepler.png
new file mode 100644
index 00000000..23e1428e
Binary files /dev/null and b/resources/gis/server/kepler.png differ
diff --git a/resources/gis/server/mapproxy.png b/resources/gis/server/mapproxy.png
new file mode 100644
index 00000000..9b119df6
Binary files /dev/null and b/resources/gis/server/mapproxy.png differ
diff --git a/resources/gis/server/mapserver.png b/resources/gis/server/mapserver.png
new file mode 100644
index 00000000..f03354df
Binary files /dev/null and b/resources/gis/server/mapserver.png differ
diff --git a/resources/gis/server/mapstore.png b/resources/gis/server/mapstore.png
new file mode 100644
index 00000000..c8bf5fdb
Binary files /dev/null and b/resources/gis/server/mapstore.png differ
diff --git a/resources/gis/server/mviewer.png b/resources/gis/server/mviewer.png
new file mode 100644
index 00000000..0b4166cc
Binary files /dev/null and b/resources/gis/server/mviewer.png differ
diff --git a/resources/gis/server/pg_tileserv.png b/resources/gis/server/pg_tileserv.png
new file mode 100644
index 00000000..be52c5f5
Binary files /dev/null and b/resources/gis/server/pg_tileserv.png differ
diff --git a/resources/gis/server/pycsw.png b/resources/gis/server/pycsw.png
new file mode 100644
index 00000000..acf6c054
Binary files /dev/null and b/resources/gis/server/pycsw.png differ
diff --git a/resources/gis/server/pygeoapi.png b/resources/gis/server/pygeoapi.png
new file mode 100644
index 00000000..8517f80e
Binary files /dev/null and b/resources/gis/server/pygeoapi.png differ
diff --git a/resources/gis/server/qgis-server.png b/resources/gis/server/qgis-server.png
new file mode 100644
index 00000000..3dc4b1cd
Binary files /dev/null and b/resources/gis/server/qgis-server.png differ
diff --git a/resources/gis/server/zooproject.png b/resources/gis/server/zooproject.png
new file mode 100644
index 00000000..53e71524
Binary files /dev/null and b/resources/gis/server/zooproject.png differ
diff --git a/resources/onprem/database/duckdb.png b/resources/onprem/database/duckdb.png
new file mode 100644
index 00000000..4c923a73
Binary files /dev/null and b/resources/onprem/database/duckdb.png differ
diff --git a/resources/onprem/database/qdrant.png b/resources/onprem/database/qdrant.png
new file mode 100644
index 00000000..5d489014
Binary files /dev/null and b/resources/onprem/database/qdrant.png differ
diff --git a/resources/onprem/iac/pulumi.png b/resources/onprem/iac/pulumi.png
new file mode 100644
index 00000000..3078d000
Binary files /dev/null and b/resources/onprem/iac/pulumi.png differ
diff --git a/resources/onprem/network/cisco-router.png b/resources/onprem/network/cisco-router.png
new file mode 100644
index 00000000..0d1bd810
Binary files /dev/null and b/resources/onprem/network/cisco-router.png differ
diff --git a/resources/onprem/network/cisco-switch-l2.png b/resources/onprem/network/cisco-switch-l2.png
new file mode 100644
index 00000000..6f0b6f8c
Binary files /dev/null and b/resources/onprem/network/cisco-switch-l2.png differ
diff --git a/resources/onprem/network/cisco-switch-l3.png b/resources/onprem/network/cisco-switch-l3.png
new file mode 100644
index 00000000..65e9b165
Binary files /dev/null and b/resources/onprem/network/cisco-switch-l3.png differ
diff --git a/resources/programming/framework/angular.png b/resources/programming/framework/angular.png
index a3c90671..836a59be 100644
Binary files a/resources/programming/framework/angular.png and b/resources/programming/framework/angular.png differ
diff --git a/resources/saas/automation/n8n.png b/resources/saas/automation/n8n.png
new file mode 100644
index 00000000..c11098d5
Binary files /dev/null and b/resources/saas/automation/n8n.png differ
diff --git a/resources/saas/cdn/imperva.png b/resources/saas/cdn/imperva.png
new file mode 100644
index 00000000..ee7055c8
Binary files /dev/null and b/resources/saas/cdn/imperva.png differ
diff --git a/scripts/resource.py b/scripts/resource.py
index bc98a72c..e4c27e28 100644
--- a/scripts/resource.py
+++ b/scripts/resource.py
@@ -137,6 +137,10 @@ def cleaner_openstack(f):
return f.lower()
+def cleaner_gis(f):
+ return f.lower()
+
+
cleaners = {
"onprem": cleaner_onprem,
"aws": cleaner_aws,
@@ -154,6 +158,7 @@ cleaners = {
"outscale": cleaner_outscale,
"generic": cleaner_generic,
"openstack": cleaner_openstack,
+ "gis": cleaner_gis,
}
diff --git a/tests/test_cli.py b/tests/test_cli.py
new file mode 100644
index 00000000..77759f59
--- /dev/null
+++ b/tests/test_cli.py
@@ -0,0 +1,95 @@
+import os
+import unittest
+from io import StringIO
+from unittest.mock import mock_open, patch
+
+from diagrams.cli import run
+
+
+class CliTest(unittest.TestCase):
+ def setUp(self):
+ self.test_file = "test_diagram.py"
+ # dummy content for the test file
+ self.test_content_1 = """
+from diagrams import Diagram
+with Diagram(name="Test", show=False):
+ pass
+"""
+ # content from getting started examples with utf-8
+ # only support the installed fonts defined in Dockerfile
+ self.test_content_2 = """
+from diagrams import Diagram
+from diagrams.aws.compute import EC2
+from diagrams.aws.database import RDS
+from diagrams.aws.network import ELB
+
+with Diagram("test_2", show=False, direction="TB"):
+ ELB("lb") >> [EC2("ワーカー1"),
+ EC2("작업자 2를"),
+ EC2("робітник 3"),
+ EC2("worker4"),
+ EC2("työntekijä 4")] >> RDS("events")
+"""
+
+ def tearDown(self):
+ try:
+ os.remove("test.png")
+ except FileNotFoundError:
+ pass
+
+ def test_run_with_valid_file(self):
+ # write the test file
+ with open(self.test_file, "w") as f:
+ f.write(self.test_content_1)
+ with patch("sys.argv", ["diagrams", self.test_file]):
+ exit_code = run()
+ self.assertEqual(exit_code, 0)
+ try:
+ os.remove(self.test_file)
+ except FileNotFoundError:
+ pass
+
+ def test_run_with_multiple_files(self):
+
+ multiple_files = ["file1.py", "file2.py"]
+
+ # write the code files
+ with open("file1.py", "w") as f:
+ f.write(self.test_content_1)
+ with open("file2.py", "w") as f:
+ f.write(self.test_content_2)
+
+ with patch("sys.argv", ["diagrams"] + multiple_files):
+ exit_code = run()
+ self.assertEqual(exit_code, 0)
+
+ # cleanup code file
+ for one_file in multiple_files:
+ try:
+ os.remove(one_file)
+ except FileNotFoundError:
+ pass
+ # cleanup generated image
+ try:
+ os.remove("test_2.png")
+ except FileNotFoundError:
+ pass
+
+ def test_run_with_no_arguments(self):
+ with patch("sys.argv", ["diagrams"]):
+ with patch("sys.stderr", new=StringIO()) as fake_stderr:
+ with self.assertRaises(SystemExit):
+ run()
+ self.assertIn("the following arguments are required: path", fake_stderr.getvalue())
+
+ def test_run_with_nonexistent_file(self):
+ with patch("sys.argv", ["diagrams", "nonexistent.py"]):
+ with self.assertRaises(FileNotFoundError):
+ run()
+
+ def test_run_with_invalid_python_code(self):
+ invalid_content = "this is not valid python code"
+ with patch("builtins.open", mock_open(read_data=invalid_content)):
+ with patch("sys.argv", ["diagrams", self.test_file]):
+ with self.assertRaises(SyntaxError):
+ run()
diff --git a/website/i18n/en.json b/website/i18n/en.json
index 7af9afd0..e411b343 100644
--- a/website/i18n/en.json
+++ b/website/i18n/en.json
@@ -53,6 +53,9 @@
"nodes/generic": {
"title": "Generic"
},
+ "nodes/gis": {
+ "title": "GIS"
+ },
"nodes/ibm": {
"title": "IBM"
},
diff --git a/website/sidebars.json b/website/sidebars.json
index 97086c08..e6b928fd 100644
--- a/website/sidebars.json
+++ b/website/sidebars.json
@@ -28,7 +28,8 @@
"nodes/programming",
"nodes/saas",
"nodes/c4",
- "nodes/custom"
+ "nodes/custom",
+ "nodes/gis"
]
}
}
diff --git a/website/static/img/advanced_web_service_with_on-premise_less_edges.png b/website/static/img/advanced_web_service_with_on-premise_less_edges.png
new file mode 100644
index 00000000..c3eca10a
Binary files /dev/null and b/website/static/img/advanced_web_service_with_on-premise_less_edges.png differ
diff --git a/website/static/img/advanced_web_service_with_on-premise_merged_edges.png b/website/static/img/advanced_web_service_with_on-premise_merged_edges.png
new file mode 100644
index 00000000..f04ab058
Binary files /dev/null and b/website/static/img/advanced_web_service_with_on-premise_merged_edges.png differ
diff --git a/website/static/img/resources/aws/compute/elastic-container-service-task.png b/website/static/img/resources/aws/compute/elastic-container-service-task.png
new file mode 100644
index 00000000..781c93ef
Binary files /dev/null and b/website/static/img/resources/aws/compute/elastic-container-service-task.png differ
diff --git a/website/static/img/resources/aws/devtools/cloudshell.png b/website/static/img/resources/aws/devtools/cloudshell.png
new file mode 100644
index 00000000..fe36338d
Binary files /dev/null and b/website/static/img/resources/aws/devtools/cloudshell.png differ
diff --git a/website/static/img/resources/aws/integration/eventbridge-default-event-bus-resource.png b/website/static/img/resources/aws/integration/eventbridge-default-event-bus-resource.png
index e59b3e5f..d62a871a 100644
Binary files a/website/static/img/resources/aws/integration/eventbridge-default-event-bus-resource.png and b/website/static/img/resources/aws/integration/eventbridge-default-event-bus-resource.png differ
diff --git a/website/static/img/resources/aws/integration/eventbridge-event.png b/website/static/img/resources/aws/integration/eventbridge-event.png
new file mode 100644
index 00000000..6d82886c
Binary files /dev/null and b/website/static/img/resources/aws/integration/eventbridge-event.png differ
diff --git a/website/static/img/resources/aws/integration/eventbridge-pipes.png b/website/static/img/resources/aws/integration/eventbridge-pipes.png
new file mode 100644
index 00000000..785c8a68
Binary files /dev/null and b/website/static/img/resources/aws/integration/eventbridge-pipes.png differ
diff --git a/website/static/img/resources/aws/integration/eventbridge-rule.png b/website/static/img/resources/aws/integration/eventbridge-rule.png
new file mode 100644
index 00000000..1ac1952b
Binary files /dev/null and b/website/static/img/resources/aws/integration/eventbridge-rule.png differ
diff --git a/website/static/img/resources/aws/integration/eventbridge-scheduler.png b/website/static/img/resources/aws/integration/eventbridge-scheduler.png
new file mode 100644
index 00000000..5a337b39
Binary files /dev/null and b/website/static/img/resources/aws/integration/eventbridge-scheduler.png differ
diff --git a/website/static/img/resources/aws/integration/eventbridge-schema.png b/website/static/img/resources/aws/integration/eventbridge-schema.png
new file mode 100644
index 00000000..418d8b39
Binary files /dev/null and b/website/static/img/resources/aws/integration/eventbridge-schema.png differ
diff --git a/website/static/img/resources/aws/management/user-notifications.png b/website/static/img/resources/aws/management/user-notifications.png
new file mode 100644
index 00000000..fb4511f3
Binary files /dev/null and b/website/static/img/resources/aws/management/user-notifications.png differ
diff --git a/website/static/img/resources/aws/ml/bedrock.png b/website/static/img/resources/aws/ml/bedrock.png
new file mode 100644
index 00000000..0f184124
Binary files /dev/null and b/website/static/img/resources/aws/ml/bedrock.png differ
diff --git a/website/static/img/resources/aws/ml/q.png b/website/static/img/resources/aws/ml/q.png
new file mode 100644
index 00000000..2e381ca3
Binary files /dev/null and b/website/static/img/resources/aws/ml/q.png differ
diff --git a/website/static/img/resources/azure/ml/azure-speech-service.png b/website/static/img/resources/azure/ml/azure-speech-service.png
new file mode 100644
index 00000000..7716f11d
Binary files /dev/null and b/website/static/img/resources/azure/ml/azure-speech-service.png differ
diff --git a/website/static/img/resources/azure/ml/azure-speed-to-text.png b/website/static/img/resources/azure/ml/azure-speed-to-text.png
deleted file mode 100644
index ca331f12..00000000
Binary files a/website/static/img/resources/azure/ml/azure-speed-to-text.png and /dev/null differ
diff --git a/website/static/img/resources/cas.png b/website/static/img/resources/cas.png
new file mode 100644
index 00000000..1f69615f
Binary files /dev/null and b/website/static/img/resources/cas.png differ
diff --git a/website/static/img/resources/gis/cli/gdal.png b/website/static/img/resources/gis/cli/gdal.png
new file mode 100644
index 00000000..19c93bde
Binary files /dev/null and b/website/static/img/resources/gis/cli/gdal.png differ
diff --git a/website/static/img/resources/gis/cli/imposm.png b/website/static/img/resources/gis/cli/imposm.png
new file mode 100644
index 00000000..6bbb013b
Binary files /dev/null and b/website/static/img/resources/gis/cli/imposm.png differ
diff --git a/website/static/img/resources/gis/cli/lastools.png b/website/static/img/resources/gis/cli/lastools.png
new file mode 100644
index 00000000..7e5848ee
Binary files /dev/null and b/website/static/img/resources/gis/cli/lastools.png differ
diff --git a/website/static/img/resources/gis/cli/mapnik.png b/website/static/img/resources/gis/cli/mapnik.png
new file mode 100644
index 00000000..622cacf4
Binary files /dev/null and b/website/static/img/resources/gis/cli/mapnik.png differ
diff --git a/website/static/img/resources/gis/cli/mdal.png b/website/static/img/resources/gis/cli/mdal.png
new file mode 100644
index 00000000..b1e1ed40
Binary files /dev/null and b/website/static/img/resources/gis/cli/mdal.png differ
diff --git a/website/static/img/resources/gis/cli/pdal.png b/website/static/img/resources/gis/cli/pdal.png
new file mode 100644
index 00000000..522949b6
Binary files /dev/null and b/website/static/img/resources/gis/cli/pdal.png differ
diff --git a/website/static/img/resources/gis/cplusplus/mapnik.png b/website/static/img/resources/gis/cplusplus/mapnik.png
new file mode 100644
index 00000000..622cacf4
Binary files /dev/null and b/website/static/img/resources/gis/cplusplus/mapnik.png differ
diff --git a/website/static/img/resources/gis/data/ban.png b/website/static/img/resources/gis/data/ban.png
new file mode 100644
index 00000000..af20419b
Binary files /dev/null and b/website/static/img/resources/gis/data/ban.png differ
diff --git a/website/static/img/resources/gis/data/here.png b/website/static/img/resources/gis/data/here.png
new file mode 100644
index 00000000..62b4f304
Binary files /dev/null and b/website/static/img/resources/gis/data/here.png differ
diff --git a/website/static/img/resources/gis/data/ign.png b/website/static/img/resources/gis/data/ign.png
new file mode 100644
index 00000000..c9b0e8c8
Binary files /dev/null and b/website/static/img/resources/gis/data/ign.png differ
diff --git a/website/static/img/resources/gis/data/nev_logo.png b/website/static/img/resources/gis/data/nev_logo.png
new file mode 100644
index 00000000..d56fe14e
Binary files /dev/null and b/website/static/img/resources/gis/data/nev_logo.png differ
diff --git a/website/static/img/resources/gis/data/openstreetmap.png b/website/static/img/resources/gis/data/openstreetmap.png
new file mode 100644
index 00000000..385bd973
Binary files /dev/null and b/website/static/img/resources/gis/data/openstreetmap.png differ
diff --git a/website/static/img/resources/gis/data/overturemaps.png b/website/static/img/resources/gis/data/overturemaps.png
new file mode 100644
index 00000000..44f52acc
Binary files /dev/null and b/website/static/img/resources/gis/data/overturemaps.png differ
diff --git a/website/static/img/resources/gis/database/logo_square_postgis.png b/website/static/img/resources/gis/database/logo_square_postgis.png
new file mode 100644
index 00000000..0368e76e
Binary files /dev/null and b/website/static/img/resources/gis/database/logo_square_postgis.png differ
diff --git a/website/static/img/resources/gis/database/postgis.png b/website/static/img/resources/gis/database/postgis.png
new file mode 100644
index 00000000..a6dc7b42
Binary files /dev/null and b/website/static/img/resources/gis/database/postgis.png differ
diff --git a/website/static/img/resources/gis/desktop/maptunik.png b/website/static/img/resources/gis/desktop/maptunik.png
new file mode 100644
index 00000000..4710e80f
Binary files /dev/null and b/website/static/img/resources/gis/desktop/maptunik.png differ
diff --git a/website/static/img/resources/gis/desktop/qgis.png b/website/static/img/resources/gis/desktop/qgis.png
new file mode 100644
index 00000000..3dc4b1cd
Binary files /dev/null and b/website/static/img/resources/gis/desktop/qgis.png differ
diff --git a/website/static/img/resources/gis/format/geopackage.png b/website/static/img/resources/gis/format/geopackage.png
new file mode 100644
index 00000000..0ff77fbf
Binary files /dev/null and b/website/static/img/resources/gis/format/geopackage.png differ
diff --git a/website/static/img/resources/gis/format/geoparquet.png b/website/static/img/resources/gis/format/geoparquet.png
new file mode 100644
index 00000000..d5ea1fd0
Binary files /dev/null and b/website/static/img/resources/gis/format/geoparquet.png differ
diff --git a/website/static/img/resources/gis/geocoding/addok.png b/website/static/img/resources/gis/geocoding/addok.png
new file mode 100644
index 00000000..93282493
Binary files /dev/null and b/website/static/img/resources/gis/geocoding/addok.png differ
diff --git a/website/static/img/resources/gis/geocoding/gisgraphy.png b/website/static/img/resources/gis/geocoding/gisgraphy.png
new file mode 100644
index 00000000..2d23928f
Binary files /dev/null and b/website/static/img/resources/gis/geocoding/gisgraphy.png differ
diff --git a/website/static/img/resources/gis/geocoding/nominatim.png b/website/static/img/resources/gis/geocoding/nominatim.png
new file mode 100644
index 00000000..385bd973
Binary files /dev/null and b/website/static/img/resources/gis/geocoding/nominatim.png differ
diff --git a/website/static/img/resources/gis/geocoding/pelias.png b/website/static/img/resources/gis/geocoding/pelias.png
new file mode 100644
index 00000000..6037fdec
Binary files /dev/null and b/website/static/img/resources/gis/geocoding/pelias.png differ
diff --git a/website/static/img/resources/gis/georchestra/analytics.svg b/website/static/img/resources/gis/georchestra/analytics.svg
new file mode 100644
index 00000000..fcd4027d
--- /dev/null
+++ b/website/static/img/resources/gis/georchestra/analytics.svg
@@ -0,0 +1,355 @@
+
+
+
+
diff --git a/website/static/img/resources/gis/georchestra/data_api.svg b/website/static/img/resources/gis/georchestra/data_api.svg
new file mode 100644
index 00000000..004328e8
--- /dev/null
+++ b/website/static/img/resources/gis/georchestra/data_api.svg
@@ -0,0 +1,335 @@
+
+
+
+
diff --git a/website/static/img/resources/gis/georchestra/datafeeder.svg b/website/static/img/resources/gis/georchestra/datafeeder.svg
new file mode 100644
index 00000000..c709fc46
--- /dev/null
+++ b/website/static/img/resources/gis/georchestra/datafeeder.svg
@@ -0,0 +1,465 @@
+
+
+
+
diff --git a/website/static/img/resources/gis/gis.png b/website/static/img/resources/gis/gis.png
new file mode 100644
index 00000000..95e4a2ef
Binary files /dev/null and b/website/static/img/resources/gis/gis.png differ
diff --git a/website/static/img/resources/gis/java/geotools.png b/website/static/img/resources/gis/java/geotools.png
new file mode 100644
index 00000000..624de5e1
Binary files /dev/null and b/website/static/img/resources/gis/java/geotools.png differ
diff --git a/website/static/img/resources/gis/javascript/cesium.png b/website/static/img/resources/gis/javascript/cesium.png
new file mode 100644
index 00000000..299a77d0
Binary files /dev/null and b/website/static/img/resources/gis/javascript/cesium.png differ
diff --git a/website/static/img/resources/gis/javascript/favicon.ico b/website/static/img/resources/gis/javascript/favicon.ico
new file mode 100644
index 00000000..bc4bafb6
Binary files /dev/null and b/website/static/img/resources/gis/javascript/favicon.ico differ
diff --git a/website/static/img/resources/gis/javascript/geostyler.png b/website/static/img/resources/gis/javascript/geostyler.png
new file mode 100644
index 00000000..ba4b1584
Binary files /dev/null and b/website/static/img/resources/gis/javascript/geostyler.png differ
diff --git a/website/static/img/resources/gis/javascript/keplerjs.png b/website/static/img/resources/gis/javascript/keplerjs.png
new file mode 100644
index 00000000..88363f02
Binary files /dev/null and b/website/static/img/resources/gis/javascript/keplerjs.png differ
diff --git a/website/static/img/resources/gis/javascript/leaflet.png b/website/static/img/resources/gis/javascript/leaflet.png
new file mode 100644
index 00000000..de9bc219
Binary files /dev/null and b/website/static/img/resources/gis/javascript/leaflet.png differ
diff --git a/website/static/img/resources/gis/javascript/maplibre.png b/website/static/img/resources/gis/javascript/maplibre.png
new file mode 100644
index 00000000..24502953
Binary files /dev/null and b/website/static/img/resources/gis/javascript/maplibre.png differ
diff --git a/website/static/img/resources/gis/javascript/ol-ext.png b/website/static/img/resources/gis/javascript/ol-ext.png
new file mode 100644
index 00000000..091fa606
Binary files /dev/null and b/website/static/img/resources/gis/javascript/ol-ext.png differ
diff --git a/website/static/img/resources/gis/javascript/openlayers.png b/website/static/img/resources/gis/javascript/openlayers.png
new file mode 100644
index 00000000..1ece99db
Binary files /dev/null and b/website/static/img/resources/gis/javascript/openlayers.png differ
diff --git a/website/static/img/resources/gis/javascript/png-transparent-leaflet-javascript-library-web-browser-plug-in-software-framework-others-leaf-rss-map.png b/website/static/img/resources/gis/javascript/png-transparent-leaflet-javascript-library-web-browser-plug-in-software-framework-others-leaf-rss-map.png
new file mode 100644
index 00000000..85bfda1b
Binary files /dev/null and b/website/static/img/resources/gis/javascript/png-transparent-leaflet-javascript-library-web-browser-plug-in-software-framework-others-leaf-rss-map.png differ
diff --git a/website/static/img/resources/gis/javascript/turfjs.png b/website/static/img/resources/gis/javascript/turfjs.png
new file mode 100644
index 00000000..fab4c46f
Binary files /dev/null and b/website/static/img/resources/gis/javascript/turfjs.png differ
diff --git a/website/static/img/resources/gis/mobile/88134486.png b/website/static/img/resources/gis/mobile/88134486.png
new file mode 100644
index 00000000..87a80c14
Binary files /dev/null and b/website/static/img/resources/gis/mobile/88134486.png differ
diff --git a/website/static/img/resources/gis/mobile/mergin.png b/website/static/img/resources/gis/mobile/mergin.png
new file mode 100644
index 00000000..00289fc3
Binary files /dev/null and b/website/static/img/resources/gis/mobile/mergin.png differ
diff --git a/website/static/img/resources/gis/mobile/qfield.png b/website/static/img/resources/gis/mobile/qfield.png
new file mode 100644
index 00000000..eb8f8c19
Binary files /dev/null and b/website/static/img/resources/gis/mobile/qfield.png differ
diff --git a/website/static/img/resources/gis/mobile/smash.png b/website/static/img/resources/gis/mobile/smash.png
new file mode 100644
index 00000000..38256c37
Binary files /dev/null and b/website/static/img/resources/gis/mobile/smash.png differ
diff --git a/website/static/img/resources/gis/ogc/ogc.png b/website/static/img/resources/gis/ogc/ogc.png
new file mode 100644
index 00000000..95b2f14f
Binary files /dev/null and b/website/static/img/resources/gis/ogc/ogc.png differ
diff --git a/website/static/img/resources/gis/ogc/wfs.png b/website/static/img/resources/gis/ogc/wfs.png
new file mode 100644
index 00000000..248ad034
Binary files /dev/null and b/website/static/img/resources/gis/ogc/wfs.png differ
diff --git a/website/static/img/resources/gis/ogc/wms.png b/website/static/img/resources/gis/ogc/wms.png
new file mode 100644
index 00000000..2893bbab
Binary files /dev/null and b/website/static/img/resources/gis/ogc/wms.png differ
diff --git a/website/static/img/resources/gis/organization/osgeo.png b/website/static/img/resources/gis/organization/osgeo.png
new file mode 100644
index 00000000..87095a95
Binary files /dev/null and b/website/static/img/resources/gis/organization/osgeo.png differ
diff --git a/website/static/img/resources/gis/python/geopandas.png b/website/static/img/resources/gis/python/geopandas.png
new file mode 100644
index 00000000..2bd72973
Binary files /dev/null and b/website/static/img/resources/gis/python/geopandas.png differ
diff --git a/website/static/img/resources/gis/python/pysal.png b/website/static/img/resources/gis/python/pysal.png
new file mode 100644
index 00000000..3e862666
Binary files /dev/null and b/website/static/img/resources/gis/python/pysal.png differ
diff --git a/website/static/img/resources/gis/routing/graphhopper.png b/website/static/img/resources/gis/routing/graphhopper.png
new file mode 100644
index 00000000..7d9bda14
Binary files /dev/null and b/website/static/img/resources/gis/routing/graphhopper.png differ
diff --git a/website/static/img/resources/gis/routing/osmr.png b/website/static/img/resources/gis/routing/osmr.png
new file mode 100644
index 00000000..b2a922ab
Binary files /dev/null and b/website/static/img/resources/gis/routing/osmr.png differ
diff --git a/website/static/img/resources/gis/routing/osrm.png b/website/static/img/resources/gis/routing/osrm.png
new file mode 100644
index 00000000..b2a922ab
Binary files /dev/null and b/website/static/img/resources/gis/routing/osrm.png differ
diff --git a/website/static/img/resources/gis/routing/pgrouting.png b/website/static/img/resources/gis/routing/pgrouting.png
new file mode 100644
index 00000000..65ca4f3e
Binary files /dev/null and b/website/static/img/resources/gis/routing/pgrouting.png differ
diff --git a/website/static/img/resources/gis/routing/valhalla.png b/website/static/img/resources/gis/routing/valhalla.png
new file mode 100644
index 00000000..4756cf99
Binary files /dev/null and b/website/static/img/resources/gis/routing/valhalla.png differ
diff --git a/website/static/img/resources/gis/server/actinia.png b/website/static/img/resources/gis/server/actinia.png
new file mode 100644
index 00000000..f75392a2
Binary files /dev/null and b/website/static/img/resources/gis/server/actinia.png differ
diff --git a/website/static/img/resources/gis/server/baremaps.png b/website/static/img/resources/gis/server/baremaps.png
new file mode 100644
index 00000000..1614db7b
Binary files /dev/null and b/website/static/img/resources/gis/server/baremaps.png differ
diff --git a/website/static/img/resources/gis/server/deegree.png b/website/static/img/resources/gis/server/deegree.png
new file mode 100644
index 00000000..7ca17425
Binary files /dev/null and b/website/static/img/resources/gis/server/deegree.png differ
diff --git a/website/static/img/resources/gis/server/g3w-suite.png b/website/static/img/resources/gis/server/g3w-suite.png
new file mode 100644
index 00000000..9deea206
Binary files /dev/null and b/website/static/img/resources/gis/server/g3w-suite.png differ
diff --git a/website/static/img/resources/gis/server/geohealthcheck.png b/website/static/img/resources/gis/server/geohealthcheck.png
new file mode 100644
index 00000000..85299553
Binary files /dev/null and b/website/static/img/resources/gis/server/geohealthcheck.png differ
diff --git a/website/static/img/resources/gis/server/geomapfish.jpg b/website/static/img/resources/gis/server/geomapfish.jpg
new file mode 100644
index 00000000..a39c869a
Binary files /dev/null and b/website/static/img/resources/gis/server/geomapfish.jpg differ
diff --git a/website/static/img/resources/gis/server/geomapfish.png b/website/static/img/resources/gis/server/geomapfish.png
new file mode 100644
index 00000000..631e3857
Binary files /dev/null and b/website/static/img/resources/gis/server/geomapfish.png differ
diff --git a/website/static/img/resources/gis/server/geomesa.png b/website/static/img/resources/gis/server/geomesa.png
new file mode 100644
index 00000000..8fe1a64d
Binary files /dev/null and b/website/static/img/resources/gis/server/geomesa.png differ
diff --git a/website/static/img/resources/gis/server/geonetwork.png b/website/static/img/resources/gis/server/geonetwork.png
new file mode 100644
index 00000000..8d117081
Binary files /dev/null and b/website/static/img/resources/gis/server/geonetwork.png differ
diff --git a/website/static/img/resources/gis/server/geonode.png b/website/static/img/resources/gis/server/geonode.png
new file mode 100644
index 00000000..b8de5c25
Binary files /dev/null and b/website/static/img/resources/gis/server/geonode.png differ
diff --git a/website/static/img/resources/gis/server/georchestra.png b/website/static/img/resources/gis/server/georchestra.png
new file mode 100644
index 00000000..3fe1b1c9
Binary files /dev/null and b/website/static/img/resources/gis/server/georchestra.png differ
diff --git a/website/static/img/resources/gis/server/geoserver.png b/website/static/img/resources/gis/server/geoserver.png
new file mode 100644
index 00000000..cea9265e
Binary files /dev/null and b/website/static/img/resources/gis/server/geoserver.png differ
diff --git a/website/static/img/resources/gis/server/geowebcache.png b/website/static/img/resources/gis/server/geowebcache.png
new file mode 100644
index 00000000..ff5277dd
Binary files /dev/null and b/website/static/img/resources/gis/server/geowebcache.png differ
diff --git a/website/static/img/resources/gis/server/kepler.png b/website/static/img/resources/gis/server/kepler.png
new file mode 100644
index 00000000..23e1428e
Binary files /dev/null and b/website/static/img/resources/gis/server/kepler.png differ
diff --git a/website/static/img/resources/gis/server/logo-geonetwork10.png b/website/static/img/resources/gis/server/logo-geonetwork10.png
new file mode 100644
index 00000000..ff2d4d52
Binary files /dev/null and b/website/static/img/resources/gis/server/logo-geonetwork10.png differ
diff --git a/website/static/img/resources/gis/server/mapproxy.png b/website/static/img/resources/gis/server/mapproxy.png
new file mode 100644
index 00000000..9b119df6
Binary files /dev/null and b/website/static/img/resources/gis/server/mapproxy.png differ
diff --git a/website/static/img/resources/gis/server/mapserver.png b/website/static/img/resources/gis/server/mapserver.png
new file mode 100644
index 00000000..f03354df
Binary files /dev/null and b/website/static/img/resources/gis/server/mapserver.png differ
diff --git a/website/static/img/resources/gis/server/mapstore.png b/website/static/img/resources/gis/server/mapstore.png
new file mode 100644
index 00000000..c8bf5fdb
Binary files /dev/null and b/website/static/img/resources/gis/server/mapstore.png differ
diff --git a/website/static/img/resources/gis/server/mviewer.png b/website/static/img/resources/gis/server/mviewer.png
new file mode 100644
index 00000000..0b4166cc
Binary files /dev/null and b/website/static/img/resources/gis/server/mviewer.png differ
diff --git a/website/static/img/resources/gis/server/nuCDhnVv_400x400.jpg b/website/static/img/resources/gis/server/nuCDhnVv_400x400.jpg
new file mode 100644
index 00000000..cab4e8f7
Binary files /dev/null and b/website/static/img/resources/gis/server/nuCDhnVv_400x400.jpg differ
diff --git a/website/static/img/resources/gis/server/pg_tileserv.png b/website/static/img/resources/gis/server/pg_tileserv.png
new file mode 100644
index 00000000..be52c5f5
Binary files /dev/null and b/website/static/img/resources/gis/server/pg_tileserv.png differ
diff --git a/website/static/img/resources/gis/server/pycsw.png b/website/static/img/resources/gis/server/pycsw.png
new file mode 100644
index 00000000..acf6c054
Binary files /dev/null and b/website/static/img/resources/gis/server/pycsw.png differ
diff --git a/website/static/img/resources/gis/server/pygeoapi.png b/website/static/img/resources/gis/server/pygeoapi.png
new file mode 100644
index 00000000..8517f80e
Binary files /dev/null and b/website/static/img/resources/gis/server/pygeoapi.png differ
diff --git a/website/static/img/resources/gis/server/qgis-server.png b/website/static/img/resources/gis/server/qgis-server.png
new file mode 100644
index 00000000..3dc4b1cd
Binary files /dev/null and b/website/static/img/resources/gis/server/qgis-server.png differ
diff --git a/website/static/img/resources/gis/server/zooproject.png b/website/static/img/resources/gis/server/zooproject.png
new file mode 100644
index 00000000..53e71524
Binary files /dev/null and b/website/static/img/resources/gis/server/zooproject.png differ
diff --git a/website/static/img/resources/gis/toolkit/mapnik.png b/website/static/img/resources/gis/toolkit/mapnik.png
new file mode 100644
index 00000000..622cacf4
Binary files /dev/null and b/website/static/img/resources/gis/toolkit/mapnik.png differ
diff --git a/website/static/img/resources/onprem/certificates/certbot.png b/website/static/img/resources/onprem/certificates/certbot.png
new file mode 100644
index 00000000..9659a81b
Binary files /dev/null and b/website/static/img/resources/onprem/certificates/certbot.png differ
diff --git a/website/static/img/resources/onprem/database/duckdb.png b/website/static/img/resources/onprem/database/duckdb.png
new file mode 100644
index 00000000..4c923a73
Binary files /dev/null and b/website/static/img/resources/onprem/database/duckdb.png differ
diff --git a/website/static/img/resources/onprem/database/qdrant.png b/website/static/img/resources/onprem/database/qdrant.png
new file mode 100644
index 00000000..5d489014
Binary files /dev/null and b/website/static/img/resources/onprem/database/qdrant.png differ
diff --git a/website/static/img/resources/onprem/iac/pulumi.png b/website/static/img/resources/onprem/iac/pulumi.png
new file mode 100644
index 00000000..3078d000
Binary files /dev/null and b/website/static/img/resources/onprem/iac/pulumi.png differ
diff --git a/website/static/img/resources/onprem/network/cisco-router.png b/website/static/img/resources/onprem/network/cisco-router.png
new file mode 100644
index 00000000..0d1bd810
Binary files /dev/null and b/website/static/img/resources/onprem/network/cisco-router.png differ
diff --git a/website/static/img/resources/onprem/network/cisco-switch-l2.png b/website/static/img/resources/onprem/network/cisco-switch-l2.png
new file mode 100644
index 00000000..6f0b6f8c
Binary files /dev/null and b/website/static/img/resources/onprem/network/cisco-switch-l2.png differ
diff --git a/website/static/img/resources/onprem/network/cisco-switch-l3.png b/website/static/img/resources/onprem/network/cisco-switch-l3.png
new file mode 100644
index 00000000..65e9b165
Binary files /dev/null and b/website/static/img/resources/onprem/network/cisco-switch-l3.png differ
diff --git a/website/static/img/resources/openldap.png b/website/static/img/resources/openldap.png
new file mode 100644
index 00000000..c55718f8
Binary files /dev/null and b/website/static/img/resources/openldap.png differ
diff --git a/website/static/img/resources/programming/framework/angular.png b/website/static/img/resources/programming/framework/angular.png
index a3c90671..836a59be 100644
Binary files a/website/static/img/resources/programming/framework/angular.png and b/website/static/img/resources/programming/framework/angular.png differ
diff --git a/website/static/img/resources/saas/automation/n8n.png b/website/static/img/resources/saas/automation/n8n.png
new file mode 100644
index 00000000..c11098d5
Binary files /dev/null and b/website/static/img/resources/saas/automation/n8n.png differ
diff --git a/website/static/img/resources/saas/cdn/imperva.png b/website/static/img/resources/saas/cdn/imperva.png
new file mode 100644
index 00000000..ee7055c8
Binary files /dev/null and b/website/static/img/resources/saas/cdn/imperva.png differ