feat: add scientific subtitle review workflow
This commit is contained in:
@@ -217,6 +217,80 @@ class VerifyDeliveryTests(unittest.TestCase):
|
||||
self.assertTrue(result["complete"])
|
||||
self.assertEqual(result["burned_video"], str(expected.resolve()))
|
||||
|
||||
def test_scientific_review_gate_is_required_and_checksum_bound(self) -> None:
|
||||
inputs = self.root / "subtitles" / "translation-input"
|
||||
inputs.mkdir(parents=True)
|
||||
batch = inputs / "batch-0001.json"
|
||||
batch.write_text("{}", encoding="utf-8")
|
||||
outputs = self.root / "subtitles" / "translation-output"
|
||||
outputs.mkdir()
|
||||
(outputs / "batch-0001.json").write_text("{}", encoding="utf-8")
|
||||
subtitle_manifest = self.root / "subtitles" / "subtitle-manifest.json"
|
||||
subtitle_manifest.write_text(
|
||||
json.dumps(
|
||||
{
|
||||
"translation_batches": [{"path": str(batch)}],
|
||||
"translation_output_dir": str(outputs),
|
||||
}
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
self.manifest.write_text(
|
||||
json.dumps(
|
||||
{
|
||||
"deliverable": "bilingual-subs",
|
||||
"output_directory": str(self.root),
|
||||
"execution": {"scientific_review_required": True},
|
||||
"artifacts": {
|
||||
"intermediate": None,
|
||||
"subtitle": {"source_srt": {"path": self.subtitle.name}},
|
||||
},
|
||||
}
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
pending = delivery.assess_delivery(self.manifest)
|
||||
self.assertEqual(pending["stage"], "scientific_review_required")
|
||||
|
||||
review_dir = self.root / "subtitles" / "scientific-review"
|
||||
reviewed = review_dir / "reviewed-translations"
|
||||
reviewed.mkdir(parents=True)
|
||||
(reviewed / "translations.json").write_text("{}", encoding="utf-8")
|
||||
report = review_dir / "report.json"
|
||||
report.write_text(
|
||||
json.dumps(
|
||||
{
|
||||
"status": "complete",
|
||||
"human_expert_reviewed": False,
|
||||
"subtitle_manifest_sha256": hashlib.sha256(
|
||||
subtitle_manifest.read_bytes()
|
||||
).hexdigest(),
|
||||
}
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
rendered = self.root / "subtitles" / "rendered"
|
||||
rendered.mkdir()
|
||||
(rendered / "bilingual.ass").write_text("[Script Info]\n", encoding="utf-8")
|
||||
(rendered / "validation.json").write_text(
|
||||
json.dumps(
|
||||
{
|
||||
"translation_quality_reviewed": True,
|
||||
"scientific_review": {
|
||||
"report_sha256": hashlib.sha256(report.read_bytes()).hexdigest()
|
||||
},
|
||||
}
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
result = delivery.assess_delivery(self.manifest)
|
||||
self.assertTrue(result["complete"])
|
||||
|
||||
report.write_text("{}", encoding="utf-8")
|
||||
with self.assertRaisesRegex(delivery.DeliveryError, "incomplete"):
|
||||
delivery.assess_delivery(self.manifest)
|
||||
|
||||
def test_declared_citation_requires_matching_burn_receipt(self) -> None:
|
||||
inputs = self.root / "subtitles" / "translation-input"
|
||||
inputs.mkdir(parents=True)
|
||||
|
||||
Reference in New Issue
Block a user