전 저장소 리팩터링과 SSOT 정비
This commit is contained in:
parent
14ecbd4e7d
commit
3dfddcac6f
173 changed files with 19679 additions and 6952 deletions
|
|
@ -7,6 +7,7 @@ from pathlib import Path
|
|||
from app.services.dataset_export import (
|
||||
APPROVED_EXPORT_STATUS,
|
||||
DRY_RUN_EXPORT_STATUS,
|
||||
DatasetManifestInput,
|
||||
ExportKeyMaps,
|
||||
build_dataset_record,
|
||||
build_manifest,
|
||||
|
|
@ -24,7 +25,9 @@ EXPORT_SCRIPT_PATH = REPO_ROOT / "scripts" / "export-recursive-dataset.py"
|
|||
|
||||
|
||||
def load_export_script():
|
||||
spec = importlib.util.spec_from_file_location("export_recursive_dataset", EXPORT_SCRIPT_PATH)
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
"export_recursive_dataset", EXPORT_SCRIPT_PATH
|
||||
)
|
||||
assert spec is not None and spec.loader is not None
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
sys.modules[spec.name] = module
|
||||
|
|
@ -92,7 +95,10 @@ class DatasetExportTests(unittest.TestCase):
|
|||
keys=ExportKeyMaps(),
|
||||
)
|
||||
|
||||
self.assertEqual(record["supervisor_comments"], [{"kind": "note", "intent_deviation": {"severity": "low"}}])
|
||||
self.assertEqual(
|
||||
record["supervisor_comments"],
|
||||
[{"kind": "note", "intent_deviation": {"severity": "low"}}],
|
||||
)
|
||||
self.assertNotIn("김서연", str(record))
|
||||
self.assertNotIn("010-1234-5678", str(record))
|
||||
|
||||
|
|
@ -109,38 +115,72 @@ class DatasetExportTests(unittest.TestCase):
|
|||
self.assertIn("phone", kinds)
|
||||
self.assertIn("national_id", kinds)
|
||||
self.assertIn("blocked_field", kinds)
|
||||
self.assertFalse(any("learner@hs.ac.kr" in finding["sample"] for finding in findings))
|
||||
self.assertFalse(any("010-1234-5678" in finding["sample"] for finding in findings))
|
||||
self.assertFalse(
|
||||
any("learner@hs.ac.kr" in finding["sample"] for finding in findings)
|
||||
)
|
||||
self.assertFalse(
|
||||
any("010-1234-5678" in finding["sample"] for finding in findings)
|
||||
)
|
||||
|
||||
def test_agreement_metrics(self) -> None:
|
||||
annotations = [
|
||||
{"item_id": "1", "labels": {"appropriateness": "good", "rapport_signal": 4.0}},
|
||||
{"item_id": "1", "labels": {"appropriateness": "good", "rapport_signal": 4.1}},
|
||||
{"item_id": "2", "labels": {"appropriateness": "bad", "rapport_signal": 2.0}},
|
||||
{"item_id": "2", "labels": {"appropriateness": "bad", "rapport_signal": 2.1}},
|
||||
{"item_id": "3", "labels": {"appropriateness": "good", "rapport_signal": 5.0}},
|
||||
{"item_id": "3", "labels": {"appropriateness": "good", "rapport_signal": 5.0}},
|
||||
{
|
||||
"item_id": "1",
|
||||
"labels": {"appropriateness": "good", "rapport_signal": 4.0},
|
||||
},
|
||||
{
|
||||
"item_id": "1",
|
||||
"labels": {"appropriateness": "good", "rapport_signal": 4.1},
|
||||
},
|
||||
{
|
||||
"item_id": "2",
|
||||
"labels": {"appropriateness": "bad", "rapport_signal": 2.0},
|
||||
},
|
||||
{
|
||||
"item_id": "2",
|
||||
"labels": {"appropriateness": "bad", "rapport_signal": 2.1},
|
||||
},
|
||||
{
|
||||
"item_id": "3",
|
||||
"labels": {"appropriateness": "good", "rapport_signal": 5.0},
|
||||
},
|
||||
{
|
||||
"item_id": "3",
|
||||
"labels": {"appropriateness": "good", "rapport_signal": 5.0},
|
||||
},
|
||||
]
|
||||
|
||||
self.assertEqual(cohen_kappa(annotations, "appropriateness"), 1.0)
|
||||
self.assertGreater(intraclass_correlation(annotations, "rapport_signal") or 0, 0.9)
|
||||
self.assertGreater(
|
||||
intraclass_correlation(annotations, "rapport_signal") or 0, 0.9
|
||||
)
|
||||
|
||||
def test_manifest_gate_blocks_unapproved_approved_status(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "PII scan must pass"):
|
||||
build_manifest(
|
||||
export_id="phase3-rl-seed-test",
|
||||
dataset_name="vignette_phase3_recursive_learning_seed",
|
||||
export_status=APPROVED_EXPORT_STATUS,
|
||||
purpose="test",
|
||||
records=[],
|
||||
jsonl_path="03-export/anonymized_dataset.jsonl",
|
||||
jsonl_sha256="",
|
||||
pii_findings=[{"kind": "email", "path": "$.text_masked", "sample": "<email:hs.ac.kr>"}],
|
||||
participants_included=0,
|
||||
agreement={"kappa": 0.59, "icc": 0.74, "gold_status": "not_gold"},
|
||||
DatasetManifestInput(
|
||||
export_id="phase3-rl-seed-test",
|
||||
dataset_name="vignette_phase3_recursive_learning_seed",
|
||||
export_status=APPROVED_EXPORT_STATUS,
|
||||
purpose="test",
|
||||
records=[],
|
||||
jsonl_path="03-export/anonymized_dataset.jsonl",
|
||||
jsonl_sha256="",
|
||||
pii_findings=[
|
||||
{
|
||||
"kind": "email",
|
||||
"path": "$.text_masked",
|
||||
"sample": "<email:hs.ac.kr>",
|
||||
}
|
||||
],
|
||||
participants_included=0,
|
||||
agreement={"kappa": 0.59, "icc": 0.74, "gold_status": "not_gold"},
|
||||
)
|
||||
)
|
||||
|
||||
def test_manifest_gate_requires_withdrawal_and_recursive_consent_scope(self) -> None:
|
||||
def test_manifest_gate_requires_withdrawal_and_recursive_consent_scope(
|
||||
self,
|
||||
) -> None:
|
||||
manifest = {
|
||||
"export_status": APPROVED_EXPORT_STATUS,
|
||||
"pii_scan": {"status": "pass"},
|
||||
|
|
@ -172,15 +212,17 @@ class DatasetExportTests(unittest.TestCase):
|
|||
write_jsonl([record], path)
|
||||
digest = sha256_file(path)
|
||||
manifest = build_manifest(
|
||||
export_id="phase3-rl-seed-test",
|
||||
dataset_name="vignette_phase3_recursive_learning_seed",
|
||||
export_status=DRY_RUN_EXPORT_STATUS,
|
||||
purpose="test",
|
||||
records=[record],
|
||||
jsonl_path="03-export/anonymized_dataset.jsonl",
|
||||
jsonl_sha256=digest,
|
||||
pii_findings=[],
|
||||
participants_included=1,
|
||||
DatasetManifestInput(
|
||||
export_id="phase3-rl-seed-test",
|
||||
dataset_name="vignette_phase3_recursive_learning_seed",
|
||||
export_status=DRY_RUN_EXPORT_STATUS,
|
||||
purpose="test",
|
||||
records=[record],
|
||||
jsonl_path="03-export/anonymized_dataset.jsonl",
|
||||
jsonl_sha256=digest,
|
||||
pii_findings=[],
|
||||
participants_included=1,
|
||||
)
|
||||
)
|
||||
self.assertEqual(manifest["files"][0]["rows"], 1)
|
||||
self.assertEqual(manifest["files"][0]["sha256"], digest)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue