feat: integra pipeline PDF→Markdown a 9 stadi e test suite
Porta da main la riscrittura completa di conversione/_pipeline/ (9 stadi PyMuPDF) e la suite tests/ senza modificare chunks/, step-8/, rag.py, ollama/, 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>
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user