From 56827a66e8f675288a832434a4d869ec9247a2cb Mon Sep 17 00:00:00 2001 From: Isaak Buslovich Date: Fri, 22 Dec 2023 00:37:25 +0100 Subject: [PATCH] Initial Commit --- index.html | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 213 insertions(+) create mode 100644 index.html create mode 100644 main.py diff --git a/index.html b/index.html new file mode 100644 index 0000000..151b058 --- /dev/null +++ b/index.html @@ -0,0 +1,108 @@ + + + + + + YAML Editor + + + + + +
+
+ + +
+
+ + + diff --git a/main.py b/main.py new file mode 100644 index 0000000..018ae5d --- /dev/null +++ b/main.py @@ -0,0 +1,105 @@ +""" +Flask app for YAML file I/O. + +Provides web interface for reading and updating YAML file content. +Handles HTTP GET (view) and POST (update) at '/data', and serves index page at '/'. + +Author: Isaak Buslovich +Date: 2023-12-21 +""" +from flask import Flask, request, jsonify, send_from_directory +import yaml +from pathlib import Path +import logging + +app = Flask(__name__, static_folder='.', static_url_path='') +logging.basicConfig(level=logging.INFO) + +DATA_FILE = 'data.yaml' + + +def read_yaml(): + """ + Reads and returns content from the YAML file. + + Returns: + dict: A dictionary with the key 'text' containing file content. + None: If an error occurs, along with an error message. + """ + file_path = Path(DATA_FILE) + try: + if not file_path.is_file(): + logging.info("YAML file not found. Returning empty data.") + return {'text': ''}, None + with file_path.open() as file: + data = yaml.safe_load(file) or {} + return {'text': data.get('text', '')}, None + except yaml.YAMLError as e: + logging.error(f"YAML Error: {e}", exc_info=True) + return None, f"YAML parsing error: {e}" + except IOError as e: + logging.error(f"IO Error: {e}", exc_info=True) + return None, f"File I/O error: {e}" + except Exception as e: + logging.error(f"Unexpected Error: {e}", exc_info=True) + return None, f"Unexpected error: {e}" + + +def write_yaml(content): + """ + Writes content to the YAML file. + + Args: + content (str): The text content to be saved in the file. + + Returns: + bool: True if the operation was successful, False otherwise. + None: If successful, or an error message if an error occurs. + """ + file_path = Path(DATA_FILE) + try: + with file_path.open('w') as file: + yaml.dump({'text': content}, file) + return True, None + except Exception as e: + logging.error(f"Error writing YAML file: {e}", exc_info=True) + return False, f"Error writing file: {e}" + + +@app.route('/data', methods=['GET', 'POST']) +def handle_data(): + """ + Handles GET and POST requests to '/data'. + GET: Returns the content of the YAML file. + POST: Updates the content of the YAML file. + + Returns: + JSON response for GET requests. + Text message for POST requests. + """ + if request.method == 'GET': + data, error = read_yaml() + if error: + return error, 500 + return jsonify(data), 200 + elif request.method == 'POST': + content = request.json.get('text', '') + success, error = write_yaml(content) + if error: + return error, 500 + return "File saved successfully", 200 + + +@app.route('/') +def index(): + """ + Serves the main index HTML page. + + Returns: + HTML content of the main page. + """ + return send_from_directory('.', 'index.html') + + +if __name__ == '__main__': + app.run(debug=True)