Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from typing import Any, Dict, Optional
3from flask import Flask, Response, request, redirect, url_for
4from flasgger import Swagger, swag_from
5import lunchbox.tools as lbt
7from rolling_pin.blob_etl import BlobETL
8# ------------------------------------------------------------------------------
11'''
12Rolling-Pin Flask service.
13'''
16app = Flask(__name__)
17swagger = Swagger(app)
20@app.route('/')
21def index():
22 # type: () -> Any
23 return redirect(url_for('flasgger.apidocs'))
26@lbt.api_function
27def get_svg(
28 data='<required>',
29 layout='dot',
30 orthogonal_edges=False,
31 orient='tb',
32 color_scheme=None,
33):
34 # type: (str, str, bool, str, Optional[Dict]) -> str
35 '''
36 Generate a SVG string from a given JSON blob.
38 Args:
39 data (dict or list): JSON blob.
40 layout (str, optional): Graph layout style.
41 Options include: circo, dot, fdp, neato, sfdp, twopi. Default: dot.
42 orthogonal_edges (bool, optional): Whether graph edges should have
43 non-right angles. Default: False.
44 orient (str, optional): Graph layout orientation. Default: tb.
45 Options include:
47 * tb - top to bottom
48 * bt - bottom to top
49 * lr - left to right
50 * rl - right to left
51 color_scheme: (dict, optional): Color scheme to be applied to graph.
52 Default: rolling_pin.tools.COLOR_SCHEME
54 Returns:
55 str: SVG string.
56 '''
57 output = BlobETL(data)\
58 .to_dot_graph(
59 orthogonal_edges=orthogonal_edges,
60 orient=orient,
61 color_scheme=color_scheme)\
62 .create_svg(prog=layout)\
63 .decode('utf-8')
64 return output
67@app.route('/to_svg')
68@swag_from(dict(
69 parameters=[
70 dict(
71 name='data',
72 type='object',
73 required=True,
74 ),
75 dict(
76 name='layout',
77 type='string',
78 description='Graph layout style.',
79 enum=['circo', 'dot', 'fdp', 'neato', 'sfdp', 'twopi'],
80 required=False,
81 default='dot',
82 ),
83 dict(
84 name='orthogonal_edges',
85 type='boolean',
86 required=False,
87 description='Whether graph edges should have non-right angles.',
88 default=False,
89 ),
90 dict(
91 name='orient',
92 type='string',
93 required=False,
94 description='Graph layout orientation.',
95 default='tb',
96 enum=['tb', 'bt', 'lr', 'rl'],
97 ),
98 dict(
99 name='color_scheme',
100 type='object',
101 required=False,
102 description='Color scheme to be applied to graph.',
103 default='none',
104 )
105 ],
106 responses={
107 200: dict(
108 description='A SVG image.',
109 content='image/svg+xml',
110 ),
111 400: dict(
112 description='Invalid JSON request sent.',
113 example=dict(
114 error="KeyError: data",
115 status=400,
116 success=False,
117 )
118 )
119 }
120))
121def to_svg():
122 # type: () -> Response
123 '''
124 Endpoint for converting a given JSON blob into a SVG graph.
125 '''
126 try:
127 params = request.get_json()
128 return Response(get_svg(**params), mimetype='image/svg+xml')
129 except Exception as e:
130 msg = e.__class__.__name__ + ': ' + ' '.join(e.args)
131 return Response(msg, status=400)
134if __name__ == '__main__':
135 app.run(debug=True, host='0.0.0.0')