animalmind-backend / services /breed_knowledge.py
firstoff's picture
feat: update backend with v1 routes, breed knowledge, quality check & feedback
3064989 verified
Raw
History Blame Contribute Delete
1.62 kB
import json
import pathlib
from typing import Any, Dict, Optional
from schemas.breed import BreedInfo
_DATA_DIR = pathlib.Path(__file__).parent.parent / "data" / "breed_knowledge"
_dogs_data: Optional[Dict[str, Any]] = None
_cats_data: Optional[Dict[str, Any]] = None
def _load_data():
global _dogs_data, _cats_data
if _dogs_data is None:
dogs_path = _DATA_DIR / "dogs.json"
if dogs_path.exists():
with open(dogs_path, "r", encoding="utf-8") as f:
_dogs_data = json.load(f)
else:
_dogs_data = {}
if _cats_data is None:
cats_path = _DATA_DIR / "cats.json"
if cats_path.exists():
with open(cats_path, "r", encoding="utf-8") as f:
_cats_data = json.load(f)
else:
_cats_data = {}
def get_breed_info(breed_name: str, species: str = "dog") -> Optional[BreedInfo]:
"""
Returns rich breed information given a breed name and species (dog/cat).
Fuzzy matches by title/lowercase.
"""
_load_data()
dataset = _dogs_data if species.lower() == "dog" else _cats_data
if not dataset:
return None
# Exact lookup
if breed_name in dataset:
data = dataset[breed_name]
return BreedInfo(**data)
# Normalized lookup
norm_target = breed_name.lower().replace("_", " ").replace("-", " ").strip()
for key, data in dataset.items():
norm_key = key.lower().replace("_", " ").replace("-", " ").strip()
if norm_key == norm_target or norm_target in norm_key:
return BreedInfo(**data)
return None