Download handler.py from sundaycoil/spell-checker: direct link, hf CLI and curl.
- Browser
- Download file 2.68 kB
-
https://huggingface.co/sundaycoil/spell-checker/resolve/main/handler.py
- Command line
-
hf download hf://sundaycoil/spell-checker/handler.py
-
curl -L -o handler.py https://huggingface.co/sundaycoil/spell-checker/resolve/main/handler.py
2.68 kB
| """Spell Checker — Suggestion service layer.""" | |
| from __future__ import annotations | |
| import logging | |
| from typing import Any, Dict, List, Optional | |
| logger = logging.getLogger(__name__) | |
| class SpellHandler: | |
| """Business-logic service for Suggestion operations in Spell Checker.""" | |
| def __init__( | |
| self, | |
| repo: Any, | |
| events: Optional[Any] = None, | |
| ) -> None: | |
| self._repo = repo | |
| self._events = events | |
| logger.debug("SpellHandler started") | |
| def suggest( | |
| self, payload: Dict[str, Any] | |
| ) -> Dict[str, Any]: | |
| """Execute the suggest workflow for a new Suggestion.""" | |
| if "checked_at" not in payload: | |
| raise ValueError("Missing required field: checked_at") | |
| record = self._repo.insert( | |
| payload["checked_at"], payload.get("word"), | |
| **{k: v for k, v in payload.items() | |
| if k not in ("checked_at", "word")} | |
| ) | |
| if self._events: | |
| self._events.emit("suggestion.suggestd", record) | |
| return record | |
| def add(self, rec_id: str, **changes: Any) -> Dict[str, Any]: | |
| """Apply *changes* to a Suggestion and emit a change event.""" | |
| ok = self._repo.update(rec_id, **changes) | |
| if not ok: | |
| raise KeyError(f"Suggestion {rec_id!r} not found") | |
| updated = self._repo.fetch(rec_id) | |
| if self._events: | |
| self._events.emit("suggestion.addd", updated) | |
| return updated | |
| def ignore(self, rec_id: str) -> None: | |
| """Remove a Suggestion and emit a removal event.""" | |
| ok = self._repo.delete(rec_id) | |
| if not ok: | |
| raise KeyError(f"Suggestion {rec_id!r} not found") | |
| if self._events: | |
| self._events.emit("suggestion.ignored", {"id": rec_id}) | |
| def search( | |
| self, | |
| checked_at: Optional[Any] = None, | |
| status: Optional[str] = None, | |
| limit: int = 50, | |
| ) -> List[Dict[str, Any]]: | |
| """Search suggestions by *checked_at* and/or *status*.""" | |
| filters: Dict[str, Any] = {} | |
| if checked_at is not None: | |
| filters["checked_at"] = checked_at | |
| if status is not None: | |
| filters["status"] = status | |
| rows, _ = self._repo.query(filters, limit=limit) | |
| logger.debug("search suggestions: %d hits", len(rows)) | |
| return rows | |
| def stats(self) -> Dict[str, int]: | |
| """Quick summary of Suggestion counts by status.""" | |
| result: Dict[str, int] = {} | |
| for status in ("active", "pending", "closed"): | |
| _, count = self._repo.query({"status": status}, limit=0) | |
| result[status] = count | |
| return result | |