- cf_vision/models.py: ImageFrame + ImageElement + BoundingBox (MIT) Full Dolphin-v2 element taxonomy (21 types), convenience accessors (text_blocks, barcodes, tables, full_text) - cf_vision/router.py: VisionRouter — mock + real paths, task routing (document, barcode, receipt, general) - cf_vision/barcode.py: BarcodeScanner — pyzbar wrapper, CPU-only, MIT - cf_vision/ocr.py: DolphinOCR — ByteDance/Dolphin-v2 async stub (BSL 1.1) - cf_vision/receipt.py: ReceiptParser stub — Kiwi Phase 2 target (BSL 1.1) - cf_vision/camera.py: CameraCapture — OpenCV single-frame capture (MIT) - pyproject.toml: inference / barcode / camera optional extras - .env.example: HF_TOKEN, CF_VISION_DEVICE, CF_VISION_MOCK - README: module map, ImageFrame API reference, consumer roadmap - tests: 6 passing (ImageFrame accessors, VisionRouter mock/real) Extracted from circuitforge_core.vision per cf-core#36.
71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
"""Tests for ImageFrame API contract."""
|
|
import pytest
|
|
from cf_vision.models import BoundingBox, ImageElement, ImageFrame
|
|
|
|
|
|
def test_imageframe_text_blocks():
|
|
frame = ImageFrame(
|
|
source="mock",
|
|
image_bytes=None,
|
|
elements=[
|
|
ImageElement(element_type="title", text="My Doc", confidence=0.99),
|
|
ImageElement(element_type="barcode", text="123456", confidence=1.0),
|
|
ImageElement(element_type="plain_text", text="Body text.", confidence=0.9),
|
|
],
|
|
model="mock",
|
|
)
|
|
blocks = frame.text_blocks()
|
|
assert len(blocks) == 2
|
|
assert all(b.element_type in ("title", "plain_text") for b in blocks)
|
|
|
|
|
|
def test_imageframe_barcodes():
|
|
frame = ImageFrame(
|
|
source="mock",
|
|
image_bytes=None,
|
|
elements=[
|
|
ImageElement(element_type="barcode", text="0123456789012", confidence=1.0,
|
|
metadata={"format": "EAN13"}),
|
|
],
|
|
model="mock",
|
|
)
|
|
barcodes = frame.barcodes()
|
|
assert len(barcodes) == 1
|
|
assert barcodes[0].text == "0123456789012"
|
|
|
|
|
|
def test_imageframe_full_text():
|
|
frame = ImageFrame(
|
|
source="mock",
|
|
image_bytes=None,
|
|
elements=[
|
|
ImageElement(element_type="title", text="Title", confidence=0.99),
|
|
ImageElement(element_type="plain_text", text="Paragraph.", confidence=0.9),
|
|
],
|
|
model="mock",
|
|
)
|
|
assert frame.full_text() == "Title\nParagraph."
|
|
|
|
|
|
def test_visionrouter_mock():
|
|
from cf_vision.router import VisionRouter
|
|
router = VisionRouter(mock=True)
|
|
frame = router.analyze(b"fake_image_bytes", task="document")
|
|
assert frame.source == "mock"
|
|
assert len(frame.elements) > 0
|
|
|
|
|
|
def test_visionrouter_mock_barcode():
|
|
from cf_vision.router import VisionRouter
|
|
router = VisionRouter(mock=True)
|
|
frame = router.analyze(b"fake", task="barcode")
|
|
barcodes = frame.barcodes()
|
|
assert len(barcodes) == 1
|
|
assert barcodes[0].element_type == "barcode"
|
|
|
|
|
|
def test_visionrouter_real_raises():
|
|
from cf_vision.router import VisionRouter
|
|
router = VisionRouter(mock=False)
|
|
with pytest.raises(NotImplementedError):
|
|
router.analyze(b"fake")
|