11import xml .etree .ElementTree as ET
22import LidoRDFConverter as LRC
33from pathlib import Path
4- from x3ml_classes import X3ml
5- from flask import Flask , render_template , request , jsonify , make_response
4+ from x3ml_classes import X3ml
5+ from flask import Flask , render_template , request , jsonify , make_response
66import logging
77import json
8+ from dataclasses import dataclass
89
910from waitress import serve
1011from argparse import ArgumentParser , BooleanOptionalAction
1112
12- app = Flask (__name__ ,template_folder = 'templates' , static_folder = 'static' , static_url_path = '/assets' )
13+ app = Flask (__name__ , template_folder = 'templates' , static_folder = 'static' , static_url_path = '/assets' )
14+
1315
1416def dlftMappingFile ():
1517 return Path ('./defaultMapping.x3ml' )
1618
19+
1720def dlftLidoFile ():
1821 return Path ('./defaultLido.xml' )
1922
20- def convert_lido_str (lido_str , x3ml_str ,format = 'turtle' ):
23+
24+ def convert_lido_str (lido_str , x3ml_str , format = 'turtle' ):
2125 '''Converts LIDO XML string to RDF using the provided X3ML mapping string.
2226 Returns the RDF string in the specified format.'''
2327 if lido_str :
@@ -26,36 +30,31 @@ def convert_lido_str(lido_str, x3ml_str,format='turtle'):
2630 return graph .serialize (format = format )
2731 return ''
2832
29- def get_version_data ():
30- version = Path ('./version.txt' )
31- if version .exists ():
32- ver_str = version .read_text ()
33- last_line = ver_str .split ('\n ' )[- 1 ]
34- tokens = last_line .split (':' , 3 )
35- if len (tokens ) == 3 :
36- return {'date' :tokens [0 ],'commit' :tokens [1 ],'version' :tokens [2 ]}
37- return {'date' :'' ,'commit' :'' ,'version' :'0' }
38- return 'unkown'
39-
40- VERSION_DATA = get_version_data ()
41-
4233#############################################################################
4334
35+
4436@app .route ('/' )
4537def index ():
46- return render_template ('index.html' , version = VERSION_DATA .get ('version' ,'unkown' ))
38+ return render_template ('index.html' , version = app .config ['version' ].value )
39+
40+
41+ @app .route ('/version' )
42+ def version ():
43+ return jsonify (app .config ['version' ])
44+
4745
4846@app .route ('/barriere' )
4947def barriere ():
5048 return render_template ('barriere.html' )
5149
50+
5251@app .route ('/json_to_x3ml' , methods = ['POST' ])
5352def json_to_x3ml ():
5453 parm = request .get_json ()
5554 if js := parm .get ('x3ml' ):
5655 model = X3ml .fromJSON (js )
5756 x3ml_str = model .to_str ()
58- return jsonify ({'status' : 'success' , 'x3ml' : x3ml_str })
57+ return jsonify ({'status' : 'success' , 'x3ml' : x3ml_str })
5958 return jsonify ({'status' : 'failed' , 'message' : 'No mapping data provided!' })
6059
6160
@@ -92,14 +91,16 @@ def upload_mapping():
9291def run_mappings ():
9392 response_object = {'status' : 'success' }
9493 parm = request .get_json ()
95- lido_data = parm [ 'data' ]
94+ lido_data = parm . get ( 'data' , '' )
9695 if js := parm .get ('x3ml' ):
9796 model = X3ml .fromJSON (js )
98- response_object = {'status' : 'success' , 'message' : 'Mappings applied to Lido!' }
99- response_object ['text' ] = convert_lido_str (lido_data , model .to_str ())
97+ format = parm .get ('format' ,'turtle' )
98+ response_object = {'status' : 'success' , 'message' : 'Mappings applied to Lido!' , 'format' :format }
99+ response_object ['text' ] = convert_lido_str (lido_data , model .to_str (),format = format )
100100 return jsonify (response_object )
101101 return jsonify ({'status' : 'failed' , 'message' : 'No Lido data provided!' })
102102
103+
103104@app .route ('/convert' , methods = ['POST' ])
104105def convert ():
105106 # TODO: catch error and provide better error response e.g. code 400 for malformed LIDO
@@ -113,19 +114,52 @@ def convert():
113114 else :
114115 mapping_data = dlftMappingFile ().read_text ()
115116 lido_data = request .files ['file' ].read ().decode ('utf-8' )
116- format = request .form .get ('format' ,'turtle' )
117+ format = request .form .get ('format' , 'turtle' )
117118 else :
118119 mapping_data = dlftMappingFile ().read_text ()
119120 lido_data = request .get_data ()
120- format = 'turtle'
121+ format = 'turtle'
121122 try :
122- rdf_str = convert_lido_str (lido_data , mapping_data ,format = format )
123+ rdf_str = convert_lido_str (lido_data , mapping_data , format = format )
123124 response = make_response (rdf_str , 200 )
124125 response .mime_type = f"text/{ format } "
125126 except Exception as e :
126127 return jsonify ({'error' : str (e )}), 400
127128 return response
128129
130+
131+ @dataclass
132+ class Version ():
133+ date : str = ''
134+ commit : str = ''
135+ value : str = '???'
136+
137+ def update (self , tokens :list ):
138+ ''' Updates attributes from tokens '''
139+ data = {'date' : tokens [0 ], 'commit' : tokens [1 ], 'value' : tokens [2 ]}
140+ self .__dict__ .update (data )
141+ return self
142+
143+ @classmethod
144+ def from_tokens (cls , tokens ):
145+ ''' Creates an object from tokens '''
146+ if len (tokens ) == 3 :
147+ return cls ().update (tokens )
148+ return cls ()
149+
150+
151+ def get_version_data ():
152+ ''' Reads version data from file into the app configuration'''
153+ tokens = []
154+ ver_file = Path ('./version.txt' )
155+ if ver_file .exists ():
156+ # Get last line and split it into 3 tokens
157+ text = ver_file .read_text ()
158+ last_line = text .splitlines ()[- 1 ]
159+ tokens = last_line .split (':' , 3 )
160+ app .config ['version' ] = Version .from_tokens (tokens )
161+
162+
129163if __name__ == '__main__' :
130164 parser = ArgumentParser ()
131165 parser .add_argument ('-w' , '--wsgi' , action = BooleanOptionalAction , help = "Use WSGI server" )
@@ -135,8 +169,9 @@ def convert():
135169
136170 if args .log :
137171 logging .basicConfig (filename = 'app.log' , level = logging .INFO )
138-
139-
172+
173+ get_version_data ()
174+
140175 if args .wsgi :
141176 print (f"Starting WSGI server at http://localhost:{ args .port } /" )
142177 serve (app , host = "0.0.0.0" , port = args .port )
0 commit comments