From a84070c6d3168f6531e9fd80fd5283424932a61c Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Fri, 23 Feb 2024 00:36:53 -0800 Subject: [PATCH] refac: changelog api --- backend/config.py | 63 +++++++++++++++++++++++++++++++++++++++++++ backend/main.py | 68 ++--------------------------------------------- 2 files changed, 65 insertions(+), 66 deletions(-) diff --git a/backend/config.py b/backend/config.py index 51416b34..784c95d1 100644 --- a/backend/config.py +++ b/backend/config.py @@ -6,6 +6,8 @@ from base64 import b64encode from constants import ERROR_MESSAGES from pathlib import Path import json +import markdown +from bs4 import BeautifulSoup try: @@ -31,6 +33,67 @@ except: VERSION = PACKAGE_DATA["version"] + +# Function to parse each section +def parse_section(section): + items = [] + for li in section.find_all("li"): + # Extract raw HTML string + raw_html = str(li) + + # Extract text without HTML tags + text = li.get_text(separator=" ", strip=True) + + # Split into title and content + parts = text.split(": ", 1) + title = parts[0].strip() if len(parts) > 1 else "" + content = parts[1].strip() if len(parts) > 1 else text + + items.append({"title": title, "content": content, "raw": raw_html}) + return items + + +try: + with open("../CHANGELOG.md", "r") as file: + changelog_content = file.read() +except: + changelog_content = "" + +# Convert markdown content to HTML +html_content = markdown.markdown(changelog_content) + +# Parse the HTML content +soup = BeautifulSoup(html_content, "html.parser") + +# Initialize JSON structure +changelog_json = {} + +# Iterate over each version +for version in soup.find_all("h2"): + version_number = version.get_text().strip().split(" - ")[0][1:-1] # Remove brackets + date = version.get_text().strip().split(" - ")[1] + + version_data = {"date": date} + + # Find the next sibling that is a h3 tag (section title) + current = version.find_next_sibling() + + print(current) + + while current and current.name != "h2": + if current.name == "h3": + section_title = current.get_text().lower() # e.g., "added", "fixed" + section_items = parse_section(current.find_next_sibling("ul")) + version_data[section_title] = section_items + + # Move to the next element + current = current.find_next_sibling() + + changelog_json[version_number] = version_data + + +CHANGELOG = changelog_json + #################################### # DATA/FRONTEND BUILD DIR #################################### diff --git a/backend/main.py b/backend/main.py index 9e4da784..8a9b9dce 100644 --- a/backend/main.py +++ b/backend/main.py @@ -20,7 +20,7 @@ from apps.rag.main import app as rag_app from apps.web.main import app as webui_app -from config import ENV, VERSION, FRONTEND_BUILD_DIR +from config import ENV, VERSION, CHANGELOG, FRONTEND_BUILD_DIR class SPAStaticFiles(StaticFiles): @@ -79,73 +79,9 @@ async def get_app_config(): } -# Function to parse each section -def parse_section(section): - items = [] - for li in section.find_all("li"): - # Extract raw HTML string - raw_html = str(li) - - # Extract text without HTML tags - text = li.get_text(separator=" ", strip=True) - - # Split into title and content - parts = text.split(": ", 1) - title = parts[0].strip() if len(parts) > 1 else "" - content = parts[1].strip() if len(parts) > 1 else text - - items.append({"title": title, "content": content, "raw": raw_html}) - return items - - @app.get("/api/changelog") async def get_app_changelog(): - try: - with open("../CHANGELOG.md", "r") as file: - changelog_content = file.read() - # Convert markdown content to HTML - html_content = markdown.markdown(changelog_content) - - # Parse the HTML content - soup = BeautifulSoup(html_content, "html.parser") - - print(soup) - # Initialize JSON structure - changelog_json = {} - - # Iterate over each version - for version in soup.find_all("h2"): - version_number = ( - version.get_text().strip().split(" - ")[0][1:-1] - ) # Remove brackets - date = version.get_text().strip().split(" - ")[1] - - version_data = {"date": date} - - # Find the next sibling that is a h3 tag (section title) - current = version.find_next_sibling() - - print(current) - - while current and current.name != "h2": - if current.name == "h3": - section_title = current.get_text().lower() # e.g., "added", "fixed" - section_items = parse_section(current.find_next_sibling("ul")) - version_data[section_title] = section_items - - # Move to the next element - current = current.find_next_sibling() - - changelog_json[version_number] = version_data - - # print(changelog_json) - - # Return content as JSON string - return changelog_json - except FileNotFoundError: - return {"error": "readme.md not found"} - except Exception as e: - return {"error": f"An error occurred: {e}"} + return CHANGELOG app.mount(