docs: Add docstrings for the store manager and main

Refs: OPS-68
This commit is contained in:
Alivecow 2025-03-21 16:22:12 +01:00
parent 3c3cf80aaf
commit e6da82595a
4 changed files with 137 additions and 8 deletions

0
docs/auto_docu.sh Normal file → Executable file
View file

View file

@ -19,21 +19,16 @@ def foobar():
@dataclass @dataclass
class Haiku: class Haiku:
"""
A class representing a haiku poem with three lines.
Attributes:
lines (list[str]): A list containing the three lines of the haiku.
"""
lines: list[str] lines: list[str]
def get_json(self): def get_json(self):
""" """
Converts the haiku lines to a JSON string. Converts the haiku lines to a JSON string.
Returns: Returns:
str: A JSON string representation of the haiku lines. str: A JSON string representation of the haiku lines.
""" """
return json.dumps(self.lines) return json.dumps(self.lines)
@staticmethod @staticmethod

View file

@ -24,11 +24,28 @@ def foobar():
@app.route("/") @app.route("/")
def index_view(): def index_view():
"""
Render the main index page of the application.
Returns:
Text: The index.html template with title "Senju".
"""
return render_template("index.html", title="Senju") return render_template("index.html", title="Senju")
@app.route("/haiku/") @app.route("/haiku/")
def haiku_index_view(): def haiku_index_view():
"""
Redirect to the most recently created haiku.
Returns:
Response: Redirects to the haiku_view route with the latest haiku ID.
Raises:
KeyError: If no haikus exist in the store yet.
"""
haiku_id: int | None = store.get_id_of_latest_haiku() haiku_id: int | None = store.get_id_of_latest_haiku()
if haiku_id is None: if haiku_id is None:
# TODO: add "empty haiku list" error page # TODO: add "empty haiku list" error page
@ -38,7 +55,23 @@ def haiku_index_view():
@app.route("/haiku/<int:haiku_id>") @app.route("/haiku/<int:haiku_id>")
def haiku_view(haiku_id): def haiku_view(haiku_id):
"""test""" """
Display a specific haiku by its ID.
Loads the haiku with the given ID from the store and renders it using
the haiku.html template. If no haiku is found with the provided ID,
raises a KeyError.
Args:
haiku_id (int): The ID of the haiku to display.
Returns:
Text: The haiku.html template with the haiku data in context.
Raises:
KeyError: If no haiku exists with the given ID.
"""
haiku: Haiku | None = store.load_haiku(haiku_id) haiku: Haiku | None = store.load_haiku(haiku_id)
if haiku is None: if haiku is None:
# TODO: add "haiku not found" page # TODO: add "haiku not found" page
@ -55,6 +88,13 @@ def haiku_view(haiku_id):
@app.route("/prompt") @app.route("/prompt")
def prompt_view(): def prompt_view():
"""
Render the haiku generation prompt page.
Returns:
Text: The prompt.html template with title "Haiku generation".
"""
return render_template( return render_template(
"prompt.html", "prompt.html",
title="Haiku generation" title="Haiku generation"
@ -63,6 +103,12 @@ def prompt_view():
@app.route("/scan") @app.route("/scan")
def scan_view(): def scan_view():
"""
Render the image scanning page.
Returns:
Text: The scan.html template with title "Image scanning".
"""
return render_template( return render_template(
"scan.html", "scan.html",
title="Image scanning" title="Image scanning"
@ -71,6 +117,17 @@ def scan_view():
@app.route("/api/v1/haiku", methods=['POST']) @app.route("/api/v1/haiku", methods=['POST'])
def generate_haiku(): def generate_haiku():
"""
API endpoint to generate a new haiku based on the provided prompt.
Accepts POST requests with JSON data containing a 'prompt' field.
Generates a haiku using the prompt, saves it to the store, and returns the ID.
Returns:
str: The ID of the newly created haiku if method is POST.
tuple: Error message and status code 405 if method is not POST.
"""
if request.method == 'POST': if request.method == 'POST':
json_data = request.get_json() json_data = request.get_json()
prompt = json_data["prompt"] prompt = json_data["prompt"]
@ -83,6 +140,13 @@ def generate_haiku():
@app.route('/favicon.ico') @app.route('/favicon.ico')
def favicon(): def favicon():
"""
Serve the favicon.ico file from the static directory.
Returns:
Response: The favicon.ico file with the appropriate MIME type.
"""
return send_from_directory(os.path.join(app.root_path, 'static/img'), return send_from_directory(os.path.join(app.root_path, 'static/img'),
'favicon.ico', 'favicon.ico',
mimetype='image/vnd.microsoft.icon') mimetype='image/vnd.microsoft.icon')

View file

@ -25,13 +25,43 @@ class StoreManager:
logger: Logger logger: Logger
def __init__(self, path_to_db: Path = DEFAULT_DB_PATH) -> None: def __init__(self, path_to_db: Path = DEFAULT_DB_PATH) -> None:
"""
Initialize the StoreManager with a database path.
Args:
path_to_db (Path, optional): Path to the TinyDB database file.
Defaults to DEFAULT_DB_PATH.
"""
self._db = TinyDB(path_to_db) self._db = TinyDB(path_to_db)
self.logger = Logger(__name__) self.logger = Logger(__name__)
def _query(self, query: QueryImpl) -> list[dict]: def _query(self, query: QueryImpl) -> list[dict]:
"""
Execute a query against the database.
Args:
query (QueryImpl): TinyDB query to execute.
Returns:
list[dict]: List of documents matching the query.
"""
return self._db.search(query) return self._db.search(query)
def _load(self, id: int) -> Optional[dict]: def _load(self, id: int) -> Optional[dict]:
"""
Load a document by its ID.
Args:
id (int): Document ID to load.
Returns:
Optional[dict]: The document if found, None otherwise.
Logs:
Warning if document with specified ID is not found.
"""
try: try:
return self._db.get(doc_id=id) return self._db.get(doc_id=id)
except IndexError as e: except IndexError as e:
@ -39,9 +69,29 @@ class StoreManager:
return None return None
def _save(self, data: dict) -> int: def _save(self, data: dict) -> int:
"""
Save a document to the database.
Args:
data (dict): Document data to save.
Returns:
int: The document ID of the saved document.
"""
return self._db.insert(data) return self._db.insert(data)
def load_haiku(self, key: int) -> Optional[Haiku]: def load_haiku(self, key: int) -> Optional[Haiku]:
"""
Load a haiku by its ID.
Args:
key (int): The ID of the haiku to load.
Returns:
Optional[Haiku]: A Haiku object if found, None otherwise.
"""
raw_haiku: dict | None = self._load(key) raw_haiku: dict | None = self._load(key)
if raw_haiku is None: if raw_haiku is None:
return None return None
@ -49,9 +99,29 @@ class StoreManager:
return h return h
def save_haiku(self, data: Haiku) -> int: def save_haiku(self, data: Haiku) -> int:
"""
Save a haiku to the database.
Args:
data (Haiku): The Haiku object to save.
Returns:
int: The document ID of the saved haiku.
"""
return self._save(data.__dict__) return self._save(data.__dict__)
def get_id_of_latest_haiku(self) -> Optional[int]: def get_id_of_latest_haiku(self) -> Optional[int]:
"""
Get the ID of the most recently added haiku.
Returns:
Optional[int]: The ID of the latest haiku if any exists, None otherwise.
Logs:
Error if the database is empty.
"""
try: try:
id = self._db.all()[-1].doc_id id = self._db.all()[-1].doc_id
return id return id