e1b5298b20
Porta da branch marker la riscrittura completa di conversione/_pipeline/ (9 stadi PyMuPDF) e la suite tests/ senza modificare il resto del progetto RAG (ollama/, step-5/, step-6/, step-8/, rag.py, retrieve.py, config.py). requirements.txt: aggiunge PyMuPDF>=1.24.0 e pytest>=8.0, mantiene chromadb, rimuove opendataloader-pdf e pymupdf4llm. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
"""Fixture condivise per l'intera test suite."""
|
|
import pytest
|
|
from conversione._pipeline.models import Block, Section
|
|
|
|
|
|
@pytest.fixture
|
|
def make_block():
|
|
"""Factory per Block di test con valori di default ragionevoli."""
|
|
def _make(
|
|
text="testo di prova",
|
|
page=1,
|
|
font_size=12.0,
|
|
font_name="Helvetica",
|
|
is_bold=False,
|
|
block_type="paragraph",
|
|
space_before=5.0,
|
|
bbox=(50.0, 100.0, 400.0, 114.0),
|
|
level=0,
|
|
):
|
|
return Block(
|
|
text=text,
|
|
page=page,
|
|
bbox=bbox,
|
|
font_size=font_size,
|
|
font_name=font_name,
|
|
is_bold=is_bold,
|
|
block_type=block_type,
|
|
space_before=space_before,
|
|
level=level,
|
|
)
|
|
return _make
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_fitz_page():
|
|
"""Dizionario che simula l'output di page.get_text('dict') per una pagina."""
|
|
return {
|
|
"width": 595.0,
|
|
"height": 842.0,
|
|
"blocks": [
|
|
{
|
|
"type": 0,
|
|
"bbox": (50, 50, 450, 70),
|
|
"lines": [{
|
|
"bbox": (50, 50, 450, 70),
|
|
"spans": [{
|
|
"text": "1. Capitolo Primo",
|
|
"font": "Helvetica-Bold",
|
|
"size": 18.0,
|
|
"flags": 16,
|
|
"bbox": (50, 50, 450, 70),
|
|
"origin": (50, 68),
|
|
"color": 0,
|
|
}],
|
|
}],
|
|
},
|
|
{
|
|
"type": 0,
|
|
"bbox": (50, 90, 500, 104),
|
|
"lines": [{
|
|
"bbox": (50, 90, 500, 104),
|
|
"spans": [{
|
|
"text": "Testo del primo paragrafo del capitolo.",
|
|
"font": "Helvetica",
|
|
"size": 12.0,
|
|
"flags": 0,
|
|
"bbox": (50, 90, 500, 104),
|
|
"origin": (50, 102),
|
|
"color": 0,
|
|
}],
|
|
}],
|
|
},
|
|
],
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def simple_hierarchy_blocks(make_block):
|
|
"""Lista di Block con gerarchia semplice H1→H2→H3 numerata."""
|
|
return [
|
|
make_block("1. Introduzione", font_size=18, is_bold=True, space_before=20.0),
|
|
make_block("Testo del paragrafo di introduzione.", font_size=12),
|
|
make_block("1.1 Contesto", font_size=15, is_bold=True, space_before=15.0),
|
|
make_block("Testo della sezione di contesto.", font_size=12),
|
|
make_block("1.1.1 Dettaglio", font_size=13, is_bold=True, space_before=10.0),
|
|
make_block("Testo del dettaglio specifico.", font_size=12),
|
|
make_block("2. Conclusioni", font_size=18, is_bold=True, space_before=20.0),
|
|
make_block("Testo conclusivo.", font_size=12),
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def sources_dir():
|
|
from pathlib import Path
|
|
d = Path(__file__).parent.parent / "sources"
|
|
return d if d.exists() else None
|