Pre-publication review draft
日常訳NICHIJOYAKU日本語 ↗

OPEN SOURCE

software/src/tui/data_provider.py

Read on this site and download the files you need.

Nichijoyaku was created using AI. A complete review by human biblical-language and biblical-studies specialists has not been established. Read alongside established translations and original-language resources.

← Back to the open-source guide

software/src/tui/data_provider.py197 linesDownload this file ↓

This is the same source included in the download. Each line number is a link you can save or share.

File verification detailsSHA-256 b5bc028018cabd64f35b890435422bed940f5e4bc48cc866ec5ad34fc6f4e093
1"""Data provider for the TUI."""23from __future__ import annotations45import json6from dataclasses import dataclass7from pathlib import Path89from src.data.loader import DataLoader10from src.evaluation.storage import EvaluationStorage11from src.models.evaluation import VerseEvaluation12from src.models.verse import Verse, VerseReference131415@dataclass16class VerseData:17    """Complete data for a verse including sources, translation, and evaluation."""1819    book: str20    chapter: int21    verse: int22    # Source texts23    greek_text: str | None24    kjv_text: str | None25    japanese_reference: str | None26    glossary_terms: list[str]27    # Translation28    translation_text: str | None29    translation_model: str | None30    translation_timestamp: str | None31    # Evaluation32    evaluation: VerseEvaluation | None333435class TUIDataProvider:36    """Provides data for the TUI from existing storage."""3738    def __init__(self, data_dir: Path | str) -> None:39        """Initialize the data provider.4041        Args:42            data_dir: Path to the data directory.43        """44        self.data_dir = Path(data_dir)45        self.loader = DataLoader(data_dir)46        self.eval_storage = EvaluationStorage(data_dir)47        self.output_dir = self.data_dir / "output"4849    def get_available_books(self) -> list[str]:50        """Get list of books that have translations.5152        Returns:53            List of book names.54        """55        if not self.output_dir.exists():56            return []5758        books = []59        for book_dir in sorted(self.output_dir.iterdir()):60            if book_dir.is_dir():61                # Check if there are any chapter files62                chapter_files = list(book_dir.glob("chapter_*.json"))63                # Filter out evaluation files64                chapter_files = [65                    f for f in chapter_files if not f.stem.endswith("_eval")66                ]67                if chapter_files:68                    books.append(book_dir.name)69        return books7071    def get_book_chapters(self, book: str) -> list[int]:72        """Get chapters that have translations for a book.7374        Args:75            book: Book name.7677        Returns:78            List of chapter numbers.79        """80        book_dir = self.output_dir / book81        if not book_dir.exists():82            return []8384        chapters = []85        for chapter_file in sorted(book_dir.glob("chapter_*.json")):86            # Skip evaluation files87            if chapter_file.stem.endswith("_eval"):88                continue89            # Extract chapter number from filename (chapter_01.json -> 1)90            try:91                chapter_num = int(chapter_file.stem.split("_")[1])92                chapters.append(chapter_num)93            except (IndexError, ValueError):94                continue95        return sorted(chapters)9697    def get_chapter_verses(self, book: str, chapter: int) -> list[int]:98        """Get verse numbers in a translated chapter.99100        Args:101            book: Book name.102            chapter: Chapter number.103104        Returns:105            List of verse numbers.106        """107        chapter_file = self.output_dir / book / f"chapter_{chapter:02d}.json"108        if not chapter_file.exists():109            return []110111        with chapter_file.open("r", encoding="utf-8") as f:112            data = json.load(f)113114        verses = data.get("verses", {})115        return sorted(int(v) for v in verses.keys())116117    def get_flagged_verses(self, book: str, chapter: int) -> set[int]:118        """Get set of flagged verse numbers in a chapter.119120        Args:121            book: Book name.122            chapter: Chapter number.123124        Returns:125            Set of flagged verse numbers.126        """127        chapter_eval = self.eval_storage.load_chapter_evaluation(book, chapter)128        if not chapter_eval:129            return set()130        return set(chapter_eval.flagged_verses)131132    def is_chapter_evaluated(self, book: str, chapter: int) -> bool:133        """Check if a chapter has been evaluated.134135        Args:136            book: Book name.137            chapter: Chapter number.138139        Returns:140            True if evaluation exists.141        """142        return self.eval_storage.is_chapter_evaluated(book, chapter)143144    def get_verse_data(self, book: str, chapter: int, verse: int) -> VerseData:145        """Get complete verse data including sources, translation, and evaluation.146147        Args:148            book: Book name.149            chapter: Chapter number.150            verse: Verse number.151152        Returns:153            VerseData object with all available data.154        """155        # Load source texts156        ref = VerseReference(book=book, chapter=chapter, verse=verse)157        source_verse: Verse = self.loader.load_verse(ref)158159        # Load translation160        translation_text = None161        translation_model = None162        translation_timestamp = None163        glossary_terms: list[str] = []164165        chapter_file = self.output_dir / book / f"chapter_{chapter:02d}.json"166        if chapter_file.exists():167            with chapter_file.open("r", encoding="utf-8") as f:168                data = json.load(f)169            verse_data = data.get("verses", {}).get(str(verse), {})170            translation_text = verse_data.get("text")171            translation_model = verse_data.get("model")172            translation_timestamp = verse_data.get("timestamp")173            glossary_terms = verse_data.get("glossary_terms_applied", [])174175        # Load evaluation176        evaluation = None177        chapter_eval = self.eval_storage.load_chapter_evaluation(book, chapter)178        if chapter_eval and verse in chapter_eval.verses:179            evaluation = chapter_eval.verses[verse]180181        # Get Japanese reference (prefer Kougo, fallback to Taisho)182        japanese_ref = source_verse.japanese_kougo or source_verse.japanese_taisho183184        return VerseData(185            book=book,186            chapter=chapter,187            verse=verse,188            greek_text=source_verse.greek_text,189            kjv_text=source_verse.english_kjv,190            japanese_reference=japanese_ref,191            glossary_terms=glossary_terms,192            translation_text=translation_text,193            translation_model=translation_model,194            translation_timestamp=translation_timestamp,195            evaluation=evaluation,196        )197