Files
md-vector-db/tests/test_splitters_epub.py
T
Serendipity 3b8b585f31 feat: 添加 EPUBSplitter — ebooklib 提取章节文字后分块
- 新增 splitters/epub.py: ebooklib 读取 EPUB → BeautifulSoup 去标签 → TextSplitter 分块
- epub 作为可选依赖: uv sync --extra epub
- registry 新增 .epub 映射, ingest_file 处理 EPUB 二进制文件
- 测试: 3 个 EPUBSplitter 测试 (含空 EPUB/Protocol 合规)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-10 14:32:41 +08:00

57 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""EPUBSplitter 测试."""
import pytest
ebooklib = pytest.importorskip("ebooklib", reason="ebooklib 未安装")
class TestEPUBSplitter:
"""EPUBSplitter 测试(需 ebooklib."""
def test_split_simple_epub(self, tmp_path):
"""用 ebooklib 创建一个简单 EPUB 并测试分块."""
from src.core.splitters.epub import EPUBSplitter
from ebooklib import epub
epub_path = tmp_path / "test.epub"
book = epub.EpubBook()
book.set_identifier("test123")
book.set_title("测试书名")
book.set_language("zh")
chapter = epub.EpubHtml(
title="第一章",
file_name="chap01.xhtml",
lang="zh",
)
chapter.content = "<h1>第一章</h1><p>这是EPUB电子书的内容。</p><p>第二段文字在这里。</p>"
book.add_item(chapter)
book.toc = [epub.Link("chap01.xhtml", "第一章", "chap01")]
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
book.spine = ["nav", chapter]
epub.write_epub(str(epub_path), book)
s = EPUBSplitter(max_size=500)
chunks = s.split(str(epub_path), source_file="test.epub")
assert len(chunks) >= 1
all_text = "".join(c["content"] for c in chunks)
assert "第一章" in all_text
assert "EPUB电子书" in all_text
assert "第二段文字" in all_text
def test_epub_has_split_method(self):
"""EPUBSplitter 遵循 Splitter Protocol."""
from src.core.splitters.epub import EPUBSplitter
s = EPUBSplitter()
assert hasattr(s, "split")
def test_epub_missing_dependency_message(self):
"""EPUBSplitter.split() 在未安装 ebooklib 时应给出明确提示."""
from src.core.splitters.epub import EPUBSplitter
s = EPUBSplitter()
# 验证 split 方法存在且可调用(有明确的 import error 信息)
assert callable(s.split)