AniFileBERT / tools /test_expand_dmhy_dag_annotations.py
ModerRAS's picture
Add DMHY annotation workflow helpers
7509455
Raw
History Blame Contribute Delete
8.96 kB
"""Tests for full source-list expansion of DAG annotation patches."""
from __future__ import annotations
import json
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
def write_jsonl(path: Path, rows: list[dict]) -> None:
path.write_text(
"\n".join(json.dumps(row, ensure_ascii=False) for row in rows) + "\n",
encoding="utf-8",
)
class ExpandDmhyDagAnnotationsTests(unittest.TestCase):
def run_expand(
self,
tmp: Path,
dag: dict,
source_rows: list[dict],
patch_rows: list[dict],
*,
limit: int | None = None,
) -> tuple[list[dict], dict, subprocess.CompletedProcess[str]]:
dag_path = tmp / "dag.json"
source_path = tmp / "dmhy_list.jsonl"
patches_path = tmp / "patches.jsonl"
output_path = tmp / "expanded.jsonl"
manifest_path = tmp / "expanded.manifest.json"
dag_path.write_text(json.dumps(dag, ensure_ascii=False), encoding="utf-8")
write_jsonl(source_path, source_rows)
write_jsonl(patches_path, patch_rows)
command = [
sys.executable,
"-m",
"tools.expand_dmhy_dag_annotations",
"--dag",
str(dag_path),
"--source-list",
str(source_path),
"--patches",
str(patches_path),
"--output",
str(output_path),
"--manifest-output",
str(manifest_path),
]
if limit is not None:
command.extend(["--limit", str(limit)])
run = subprocess.run(command, check=False, capture_output=True, text=True)
self.assertEqual(run.returncode, 0, run.stderr)
rows = [
json.loads(line)
for line in output_path.read_text(encoding="utf-8").splitlines()
if line.strip()
]
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
return rows, manifest, run
def test_source_list_expands_multiple_values_for_same_terminal(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
rows, manifest, _run = self.run_expand(
Path(tmpdir),
{
"nodes": [],
"terminals": [
{
"terminal_id": "t0",
"node_id": 1,
"prefix": "[ANi] Full Show - ",
"value_examples": ["[ANi] Full Show - 01 [1080P].mkv"],
}
],
},
[
{"value": "[ANi] Full Show - 01 [1080P].mkv"},
{"value": "[ANi] Full Show - 02 [1080P].mkv"},
{"value": "[ANi] Full Show - 03 [1080P].mkv"},
],
[
{
"unit_id": "u0",
"terminal_ids": ["t0"],
"episode_title_suffixes": [],
"media_suffixes": ["[1080P]"],
"title_candidates": ["Full Show"],
"source": "responses-dag-v1",
"fallback": False,
"status": "ok",
}
],
)
self.assertEqual([row["filename"] for row in rows], [
"[ANi] Full Show - 01 [1080P].mkv",
"[ANi] Full Show - 02 [1080P].mkv",
"[ANi] Full Show - 03 [1080P].mkv",
])
self.assertTrue(all(row["terminal_id"] == "t0" for row in rows))
self.assertEqual(manifest["input_rows"], 3)
self.assertEqual(manifest["matched_rows"], 3)
self.assertEqual(manifest["output_rows"], 3)
self.assertEqual(manifest["unique_terminals_matched"], 1)
def test_unmatched_values_are_counted(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
rows, manifest, _run = self.run_expand(
Path(tmpdir),
{
"nodes": [],
"terminals": [
{
"terminal_id": "t0",
"node_id": 1,
"prefix": "Known Show - ",
"value_examples": ["Known Show - 01 [1080P].mkv"],
}
],
},
[
{"value": "Known Show - 01 [1080P].mkv"},
{"value": "Other Show - 01 [1080P].mkv"},
{"value": ""},
],
[
{
"unit_id": "u0",
"terminal_ids": ["t0"],
"episode_title_suffixes": [],
"media_suffixes": ["[1080P]"],
"title_candidates": [],
"source": "responses-dag-v1",
"fallback": False,
"status": "ok",
}
],
)
self.assertEqual(len(rows), 1)
self.assertEqual(manifest["input_rows"], 3)
self.assertEqual(manifest["matched_rows"], 1)
self.assertEqual(manifest["unmatched_rows"], 2)
self.assertEqual(manifest["status_counts"]["unmatched"], 2)
def test_patch_with_multiple_terminal_ids_maps_to_each_terminal(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
rows, manifest, _run = self.run_expand(
Path(tmpdir),
{
"nodes": [],
"terminals": [
{
"terminal_id": "t0",
"node_id": 1,
"prefix": "Shared A - ",
"value_examples": ["Shared A - 01 [1080P].mkv"],
},
{
"terminal_id": "t1",
"node_id": 2,
"prefix": "Shared B - ",
"value_examples": ["Shared B - 01 [1080P].mkv"],
},
],
},
[
{"value": "Shared A - 01 [1080P].mkv"},
{"value": "Shared B - 02 [1080P].mkv"},
],
[
{
"unit_id": "dag-node-1",
"terminal_ids": ["t0", "t1"],
"episode_title_suffixes": ["Finale"],
"media_suffixes": ["[1080P]"],
"title_candidates": ["Shared"],
"source": "responses-dag-v1",
"fallback": False,
"status": "ok",
}
],
)
self.assertEqual([row["terminal_id"] for row in rows], ["t0", "t1"])
self.assertEqual({row["unit_id"] for row in rows}, {"dag-node-1"})
self.assertTrue(all(row["annotations"]["terminal_ids"] == ["t0", "t1"] for row in rows))
self.assertTrue(all(row["episode_title_suffixes"] == ["Finale"] for row in rows))
self.assertEqual(manifest["patch_covered_rows"], 2)
self.assertEqual(manifest["unique_terminals_matched"], 2)
def test_limit_scans_only_requested_source_rows(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
rows, manifest, _run = self.run_expand(
Path(tmpdir),
{
"nodes": [],
"terminals": [
{
"terminal_id": "t0",
"node_id": 1,
"prefix": "Limit Show - ",
"value_examples": ["Limit Show - 01 [1080P].mkv"],
}
],
},
[
{"value": "Limit Show - 01 [1080P].mkv"},
{"value": "Limit Show - 02 [1080P].mkv"},
],
[
{
"unit_id": "u0",
"terminal_ids": ["t0"],
"episode_title_suffixes": [],
"media_suffixes": ["[1080P]"],
"title_candidates": [],
"source": "responses-dag-v1",
"fallback": False,
"status": "ok",
}
],
limit=1,
)
self.assertEqual(len(rows), 1)
self.assertEqual(manifest["input_rows"], 1)
if __name__ == "__main__":
unittest.main()