rest_api.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import logging
  2. from base64 import b64encode
  3. from copy import deepcopy
  4. from json import dumps, loads
  5. from os import environ, urandom
  6. from flask import Flask, jsonify, render_template, request
  7. <<<<<<< HEAD
  8. from scriptshifter.exceptions import ApiError
  9. =======
  10. # from scriptshifter.exceptions import ApiError
  11. >>>>>>> 7e9bbf5e0854f7fd8325abc809b17b50ff927038
  12. from scriptshifter.tables import list_tables, load_table
  13. from scriptshifter.trans import transliterate
  14. logger = logging.getLogger(__name__)
  15. logging.basicConfig(level=environ.get("TXL_LOGLEVEL", logging.INFO))
  16. def create_app():
  17. flask_env = environ.get("TXL_APP_MODE", "production")
  18. app = Flask(__name__)
  19. app.config.update({
  20. "ENV": flask_env,
  21. "SECRET_KEY": environ.get("TXL_FLASK_SECRET", b64encode(urandom(64))),
  22. "JSON_AS_ASCII": False,
  23. "JSONIFY_PRETTYPRINT_REGULAR": True,
  24. })
  25. return app
  26. app = create_app()
  27. <<<<<<< HEAD
  28. @app.errorhandler(ApiError)
  29. def handle_exception(e: ApiError):
  30. rsp = e.get_response()
  31. rsp.data = dumps({
  32. "content": e.to_json(),
  33. "status_code": e.status_code
  34. })
  35. return rsp
  36. =======
  37. #@app.exception_handler(ApiError)
  38. #def handle_exception(request: Request, e: ApiError):
  39. # return JSONResponse(
  40. # content=e.to_json(),
  41. # status_code=e.status_code
  42. # )
  43. >>>>>>> 7e9bbf5e0854f7fd8325abc809b17b50ff927038
  44. @app.route("/", methods=["GET"])
  45. def index():
  46. return render_template("index.html", languages=list_tables())
  47. @app.route("/health", methods=["GET"])
  48. def health_check():
  49. return "I'm alive!\n"
  50. @app.route("/languages", methods=["GET"])
  51. def list_languages():
  52. return jsonify(list_tables())
  53. @app.route("/table/<lang>")
  54. def dump_table(lang):
  55. """
  56. Dump parsed transliteration table for a language.
  57. """
  58. tbl = deepcopy(load_table(lang))
  59. for sec_name in ("roman_to_script", "script_to_roman"):
  60. if sec_name in tbl:
  61. for hname, fn_defs in tbl[sec_name].get("hooks", {}).items():
  62. tbl[sec_name]["hooks"][hname] = [
  63. (fn.__name__, kw) for (fn, kw) in fn_defs]
  64. return jsonify(tbl)
  65. @app.route("/options/<lang>", methods=["GET"])
  66. def get_options(lang):
  67. """
  68. Get extra options for a table.
  69. """
  70. tbl = load_table(lang)
  71. return jsonify(tbl.get("options", []))
  72. @app.route("/trans", methods=["POST"])
  73. def transliterate_req():
  74. lang = request.form["lang"]
  75. in_txt = request.form["text"]
  76. capitalize = request.form.get("capitalize", False)
  77. t_dir = request.form.get("t_dir", "s2r")
  78. if t_dir not in ("s2r", "r2s"):
  79. return f"Invalid direction: {t_dir}", 400
  80. if not len(in_txt):
  81. return ("No input text provided! ", 400)
  82. options = loads(request.form.get("options", "{}"))
  83. logger.debug(f"Extra options: {options}")
  84. try:
  85. out, warnings = transliterate(in_txt, lang, t_dir, capitalize, options)
  86. except (NotImplementedError, ValueError) as e:
  87. return (str(e), 400)
  88. return {"output": out, "warnings": warnings}