- Remove legacy compute-worker monolith under `src/compute/`, including PDF and Whisper inference, control-plane, and runtime orchestration - Move PDF and Whisper inference logic to new `src/inference/` module - Move control-plane, orchestrator, and state machine logic to `src/operations/` - Move NATS/JetStream adapters to `src/infrastructure/` - Move job orchestration, progress, and artifact persistence to `src/jobs/` - Update imports throughout tests and main app to reference new module structure - Update Dockerfile and scripts to use new asset paths - Add new entrypoints: `src/api/app.ts` and `src/api/contracts.ts` - Remove obsolete files and update `.gitignore` for new dev artifacts This refactor modularizes the compute-worker, improving maintainability and separation of concerns. No functional changes to inference or orchestration logic. BREAKING CHANGE: compute-worker internal APIs, directory structure, and imports have changed; downstream code must update imports and integration points.
52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import { describe, expect, test } from 'vitest';
|
||
import { mergeTextWithRegions } from '../../../src/inference';
|
||
|
||
describe('mergeTextWithRegions', () => {
|
||
test('assigns text items to containing regions by centroid and joins in reading order', () => {
|
||
const regions = [
|
||
{ bbox: [0, 0, 100, 50] as [number, number, number, number], label: 'text' as const },
|
||
{ bbox: [0, 50, 100, 100] as [number, number, number, number], label: 'figure_title' as const },
|
||
];
|
||
|
||
const textItems = [
|
||
{ text: 'world', x: 40, y: 20, width: 20, height: 8 },
|
||
{ text: 'hello', x: 10, y: 20, width: 20, height: 8 },
|
||
{ text: 'Figure', x: 10, y: 70, width: 24, height: 8 },
|
||
{ text: '1.2', x: 40, y: 70, width: 10, height: 8 },
|
||
];
|
||
|
||
const merged = mergeTextWithRegions(regions, textItems);
|
||
expect(merged).toHaveLength(2);
|
||
expect(merged[0].text).toBe('hello world');
|
||
expect(merged[1].text).toBe('Figure 1.2');
|
||
});
|
||
|
||
test('drops text whose centroid is outside every region', () => {
|
||
const regions = [
|
||
{ bbox: [0, 0, 50, 50] as [number, number, number, number], label: 'text' as const },
|
||
];
|
||
const textItems = [
|
||
{ text: 'inside', x: 10, y: 10, width: 10, height: 8 },
|
||
{ text: 'outside', x: 80, y: 80, width: 12, height: 8 },
|
||
];
|
||
|
||
const merged = mergeTextWithRegions(regions, textItems);
|
||
expect(merged).toHaveLength(1);
|
||
expect(merged[0].text).toBe('inside');
|
||
});
|
||
|
||
test('keeps decorative drop caps attached to the same line when boxes overlap vertically', () => {
|
||
const regions = [
|
||
{ bbox: [0, 0, 200, 120] as [number, number, number, number], label: 'text' as const },
|
||
];
|
||
|
||
const textItems = [
|
||
{ text: 'I', x: 0, y: 10, width: 12, height: 60 },
|
||
{ text: 't’s funny,', x: 12, y: 40, width: 50, height: 12 },
|
||
];
|
||
|
||
const merged = mergeTextWithRegions(regions, textItems);
|
||
expect(merged).toHaveLength(1);
|
||
expect(merged[0].text).toBe('It’s funny,');
|
||
});
|
||
});
|