Hide keyboard shortcuts

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 

2 

3from flask import Flask, Response, request, redirect, url_for 

4from flasgger import Swagger, swag_from 

5import lunchbox.tools as lbt 

6 

7from rolling_pin.blob_etl import BlobETL 

8# ------------------------------------------------------------------------------ 

9 

10 

11''' 

12Rolling-Pin Flask service. 

13''' 

14 

15 

16app = Flask(__name__) 

17swagger = Swagger(app) 

18 

19 

20@app.route('/') 

21def index(): 

22 # type: () -> Any 

23 return redirect(url_for('flasgger.apidocs')) 

24 

25 

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. 

37 

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: 

46 

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 

53 

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 

65 

66 

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) 

132 

133 

134if __name__ == '__main__': 

135 app.run(debug=True, host='0.0.0.0')