From 5edb413394b0e1298438b5b5206f6f76a94c176e Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 6 Jun 2025 12:49:17 +0200 Subject: [PATCH 1/3] Add static files path --- prophet/app.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prophet/app.py b/prophet/app.py index 0b02c17..f781d25 100644 --- a/prophet/app.py +++ b/prophet/app.py @@ -4,6 +4,7 @@ from datetime import datetime import feedparser from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles from fastapi_utils.tasks import repeat_every from prophet.domain.improvement import Improvement @@ -64,6 +65,7 @@ def improve_originals(originals: list[Original]) -> list[Improvement]: app = FastAPI() +app.mount("/static", StaticFiles(directory="static"), name="static") origins = [ "http://localhost", From c3b88979a86be7055ea859fcef1f2817d090a5d6 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 6 Jun 2025 13:14:23 +0200 Subject: [PATCH 2/3] Switch function of update and refresh functions --- prophet/app.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/prophet/app.py b/prophet/app.py index f781d25..32715a6 100644 --- a/prophet/app.py +++ b/prophet/app.py @@ -96,16 +96,17 @@ def improve_summary(original_title: str, new_title: str, original_summary: str): @app.on_event("startup") @repeat_every(seconds=REFRESH_PERIOD) -def refresh_articles(): - adding = keep_only_new_originals(grab_latest_originals()) - improved = improve_originals(adding) - repo.add_all(improved) - print(f"Updated articles. Added {len(improved)} new ones.") +async def refresh_articles(): + _ = await fetch_update() @app.get("/update") -async def fetch_update(): - await refresh_articles() +async def fetch_update(debug_print: bool = True): + adding = keep_only_new_originals(grab_latest_originals()) + improved = improve_originals(adding) + repo.add_all(improved) + if debug_print: + print(f"Updated articles. Added {len(improved)} new ones.") return json.dumps(improved) From 9666f104a246d4ed0f5577a48c5a24e766832a25 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 6 Jun 2025 13:14:23 +0200 Subject: [PATCH 3/3] Move HTML response to view package --- prophet/app.py | 34 ++++++++----- prophet/view.py | 129 +++++++++++++++++++++-------------------------- static/style.css | 12 +++++ 3 files changed, 90 insertions(+), 85 deletions(-) create mode 100644 static/style.css diff --git a/prophet/app.py b/prophet/app.py index 32715a6..78c12b1 100644 --- a/prophet/app.py +++ b/prophet/app.py @@ -7,6 +7,7 @@ from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from fastapi_utils.tasks import repeat_every +from prophet import view from prophet.domain.improvement import Improvement from prophet.domain.improvement_repo import IImprovementRepo from prophet.domain.original import Original @@ -64,21 +65,27 @@ def improve_originals(originals: list[Original]) -> list[Improvement]: return improvements -app = FastAPI() -app.mount("/static", StaticFiles(directory="static"), name="static") +def init() -> FastAPI: + app = FastAPI() + app.mount("/static", StaticFiles(directory="static"), name="static") -origins = [ - "http://localhost", - "http://localhost:8080", -] + origins = [ + "http://localhost", + "http://localhost:8080", + ] -app.add_middleware( - CORSMiddleware, - allow_origins=origins, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) + app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + view.define_routes(app) + return app + + +app = init() @app.get("/improve-title") @@ -94,6 +101,7 @@ def improve_summary(original_title: str, new_title: str, original_summary: str): return llm.rewrite_summary(o, new_title) +# TODO: Switch to lifecycle events to avoid deprecated method @app.on_event("startup") @repeat_every(seconds=REFRESH_PERIOD) async def refresh_articles(): diff --git a/prophet/view.py b/prophet/view.py index 6079d60..fbfcf59 100644 --- a/prophet/view.py +++ b/prophet/view.py @@ -1,84 +1,69 @@ +# pyright: reportUnusedFunction=false + +from fastapi import FastAPI from fastapi.responses import HTMLResponse -from prophet import app from prophet.domain.improvement_repo import IImprovementRepo from prophet.infra.improvement_pickle_repo import ImprovementPickleRepo repo: IImprovementRepo = ImprovementPickleRepo() -html_app = app.app - -@html_app.get("/improvements", response_class=HTMLResponse) -def list_improvements(): - improved = repo.get_all() - return ( - """ """ - + "\n".join( - f""" -
-
- -
-
{item.title}
-
{item.summary}
-
""" - for item in sorted(improved, key=lambda i: i.original.date, reverse=True) +def define_routes(app: FastAPI): + @app.get("/improvements", response_class=HTMLResponse) + def list_improvements(): + improved = repo.get_all() + return ( + """ """ + + "\n".join( + f""" +
+
+ +
+
{item.title}
+
{item.summary}
+
""" + for item in sorted( + improved, key=lambda i: i.original.date, reverse=True + ) + ) ) - ) - -@html_app.get("/originals", response_class=HTMLResponse) -def list_originals(): - improved = repo.get_all() - return ( - """ """ - + "\n".join( - f""" -
-
- -
-
{item.original.title}
-
{item.original.summary}
-
""" - for item in sorted(improved, key=lambda i: i.original.date, reverse=True) + @app.get("/originals", response_class=HTMLResponse) + def list_originals(): + improved = repo.get_all() + return ( + """ """ + + "\n".join( + f""" +
+
+ +
+
{item.original.title}
+
{item.original.summary}
+
""" + for item in sorted( + improved, key=lambda i: i.original.date, reverse=True + ) + ) ) - ) - -style = """ -.card { - border: 1px solid #ccc; - padding: 10px; - margin: auto; - margin-bottom: 40px; - width: 600px; -} - -.card-title { - font-size: 24px; - margin-bottom: 5px; -} -""" - - -@html_app.get("/", response_class=HTMLResponse) -def root_route(): - return f""" - - - - The Pollen Prophet - - - - -

The Pollen Prophet

-

Making funny since 2025 what ought not bee.

-
- - - """ + @app.get("/", response_class=HTMLResponse) + def root_route(): + return """ + + + + The Pollen Prophet + + + +

The Pollen Prophet

+

Making funny since 2025 what ought not bee.

+
+ + + """ diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..c731e2a --- /dev/null +++ b/static/style.css @@ -0,0 +1,12 @@ +.card { + border: 1px solid #ccc; + padding: 10px; + margin: auto; + margin-bottom: 40px; + width: 600px; +} + +.card-title { + font-size: 24px; + margin-bottom: 5px; +}