60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
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)
|