[add] graphviz
This commit is contained in:
parent
e195c3a9f1
commit
999c503294
6 changed files with 98 additions and 0 deletions
10
graphviz/Dockerfile
Normal file
10
graphviz/Dockerfile
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
FROM alpine:3
|
||||||
|
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
graphviz python3 py-pip
|
||||||
|
|
||||||
|
ADD requirements.txt ./
|
||||||
|
RUN pip3 install -r requirements.txt --break-system-packages
|
||||||
|
|
||||||
|
ADD server.py ./
|
||||||
|
CMD hug -f server.py
|
7
graphviz/compose.yml
Normal file
7
graphviz/compose.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
name: graphviz
|
||||||
|
services:
|
||||||
|
graphviz:
|
||||||
|
ports:
|
||||||
|
- 8000:8000
|
||||||
|
image: graphviz
|
||||||
|
restart: unless-stopped
|
7
graphviz/readme.md
Normal file
7
graphviz/readme.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
docker build -t graphviz .
|
||||||
|
docker run -p8000:8000 graphviz
|
||||||
|
```
|
||||||
|
Based on https://github.com/sseemayer/docker-graphviz
|
3
graphviz/requirements.txt
Normal file
3
graphviz/requirements.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
hug==2.6.1
|
||||||
|
hug-middleware-cors==1.0.0
|
||||||
|
six==1.16.0
|
60
graphviz/server.py
Normal file
60
graphviz/server.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
import hug
|
||||||
|
from hug.middleware import CORSMiddleware
|
||||||
|
from six import BytesIO
|
||||||
|
import subprocess
|
||||||
|
import logging
|
||||||
|
from tempfile import NamedTemporaryFile as ntf
|
||||||
|
|
||||||
|
logging.basicConfig()
|
||||||
|
api = hug.API(__name__)
|
||||||
|
api.http.add_middleware(CORSMiddleware(api, allow_credentials=True))
|
||||||
|
|
||||||
|
@hug.not_found()
|
||||||
|
def not_found_handler():
|
||||||
|
return "Not Found"
|
||||||
|
|
||||||
|
@hug.get_post('/viz.svg', output=hug.output_format.image("svg+xml"))
|
||||||
|
@hug.get_post('/viz.png', output=hug.output_format.image("png"))
|
||||||
|
@hug.get_post('/viz.dot', output=hug.output_format.text)
|
||||||
|
@hug.get_post('/viz.xdot', output=hug.output_format.text)
|
||||||
|
def demo(
|
||||||
|
dot: 'A Graphviz dot document',
|
||||||
|
request,
|
||||||
|
response,
|
||||||
|
algorithm: hug.types.one_of(['dot', 'neato', 'twopi', 'circo', 'fdp', 'sfdp', 'patchwork', 'osage'])='dot',
|
||||||
|
):
|
||||||
|
|
||||||
|
suffix = request.path.split(".")[-1]
|
||||||
|
|
||||||
|
# Enforce unicode strings
|
||||||
|
try:
|
||||||
|
dot = dot.decode("utf-8")
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
with ntf(suffix=".dot", mode="w") as f_dot, ntf(mode="r+b") as f_out, ntf(mode="r") as f_err:
|
||||||
|
f_dot.write(dot)
|
||||||
|
f_dot.flush()
|
||||||
|
|
||||||
|
cmd = [
|
||||||
|
algorithm,
|
||||||
|
'-T',
|
||||||
|
suffix,
|
||||||
|
f_dot.name,
|
||||||
|
'-o',
|
||||||
|
f_out.name
|
||||||
|
]
|
||||||
|
|
||||||
|
proc = subprocess.Popen(cmd, stdout=f_err, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
|
ret = proc.wait()
|
||||||
|
|
||||||
|
if ret != 0:
|
||||||
|
response.status = hug.HTTP_500
|
||||||
|
f_err.seek(0)
|
||||||
|
return {"status_code": ret, "message": f_err.read()}
|
||||||
|
|
||||||
|
f_out.seek(0)
|
||||||
|
out_data = f_out.read()
|
||||||
|
|
||||||
|
return BytesIO(out_data)
|
11
graphviz/test.dot
Normal file
11
graphviz/test.dot
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
|
||||||
|
digraph D {
|
||||||
|
|
||||||
|
node [fontname="Arial"];
|
||||||
|
|
||||||
|
node_A [shape=record label="shape=record|{above|middle|below}|right"];
|
||||||
|
node_B [shape=plaintext label="shape=plaintext|{curly|braces and|bars without}|effect"];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue