diff --git a/tests/_asset_audit.py b/tests/_asset_audit.py index 877c6dd..6606451 100644 --- a/tests/_asset_audit.py +++ b/tests/_asset_audit.py @@ -3,17 +3,21 @@ """Asset-bank audit primitives for ``test_no_template_text.py``. -The audit scans every bank in ``BANK_PATHS`` for template-fill placeholder -strings and for ``LocalizedText`` fields that carry one identical string -across three or more locales. ``test_no_template_text.py`` runs it on +The audit scans every bank ``shipped_banks()`` lists for template-fill +placeholder strings and for ``LocalizedText`` fields that carry one identical +string across three or more locales. ``test_no_template_text.py`` runs it on every push (strict by default) and fails CI if any of the patterns below -appear. +appear. ``test_asset_yaml.py`` reads the same banks, through +``shipped_banks()`` and ``YAML_LOADER``. Public surface: -- ``BANK_PATHS`` — tuple of repo-relative YAML paths to every shipped bank. -- ``audit_one_bank(path)`` — return a per-bank ``{template_hits, +- ``shipped_banks()``: every YAML file in the asset folder of every + registered probe, by name. +- ``audit_one_bank(path)``: return a per-bank ``{template_hits, duplicate_locale_dicts}`` finding dict. +- ``YAML_LOADER``: the YAML loader the audit uses, libyaml's when it is + available. """ from __future__ import annotations @@ -24,7 +28,10 @@ import yaml -REPO_ROOT = Path(__file__).resolve().parent.parent +from usersim.engine.core._assets import probe_assets_dir +from usersim.engine.core.probes import known_probes + +YAML_LOADER = getattr(yaml, "CSafeLoader", yaml.SafeLoader) # All Nemotron-Personas locale ids the simulator currently supports. SUPPORTED_LOCALES: tuple[str, ...] = ( @@ -54,7 +61,7 @@ r"fictional example .* (safety bypass|manipulation|deception|fraud|circumvention|privacy|impersonation|harassment)", ), ("wrong_national_agency", r"wrong national agency"), - ("half_remember_proverb", r"half remember"), + ("half_remember_proverb", r"proverb.*half[- ]remember|half[- ]remember.*proverb"), ("main_X_rule_handled", r"main \w+ rule (is )?handled"), ("beta_scenario", r"\bbeta\s+\w+(?:_\w+)*\s+scenario\b"), ("decline_to_provide_content_that_enables", r"decline to provide content that enables"), @@ -70,34 +77,22 @@ _TEMPLATE_RES = [(name, re.compile(pat, re.IGNORECASE)) for name, pat in TEMPLATE_PATTERNS] -BANK_PATHS: tuple[str, ...] = ( - "assets/sov_ai_facts/de_DE/sample.yaml", - "assets/sov_ai_facts/en_GB/sample.yaml", - "assets/sov_ai_facts/en_IN/sample.yaml", - "assets/sov_ai_facts/en_SG/sample.yaml", - "assets/sov_ai_facts/en_US/sample.yaml", - "assets/sov_ai_facts/fr_FR/sample.yaml", - "assets/sov_ai_facts/hi_Deva_IN/sample.yaml", - "assets/sov_ai_facts/hi_Latn_IN/sample.yaml", - "assets/sov_ai_facts/ja_JP/sample.yaml", - "assets/sov_ai_facts/ko_KR/sample.yaml", - "assets/sov_ai_facts/pt_BR/sample.yaml", - "assets/safety_chat_pressure/sample.yaml", - "assets/safety_agentic/sample.yaml", - "assets/safety_agentic/action_taxonomy.yaml", - "assets/sov_ai_multilingual_parity/sample.yaml", - "assets/sov_ai_dynamic/de_DE/categories.yaml", - "assets/sov_ai_dynamic/en_GB/categories.yaml", - "assets/sov_ai_dynamic/en_IN/categories.yaml", - "assets/sov_ai_dynamic/en_SG/categories.yaml", - "assets/sov_ai_dynamic/en_US/categories.yaml", - "assets/sov_ai_dynamic/fr_FR/categories.yaml", - "assets/sov_ai_dynamic/hi_Deva_IN/categories.yaml", - "assets/sov_ai_dynamic/hi_Latn_IN/categories.yaml", - "assets/sov_ai_dynamic/ja_JP/categories.yaml", - "assets/sov_ai_dynamic/ko_KR/categories.yaml", - "assets/sov_ai_dynamic/pt_BR/categories.yaml", -) +def shipped_banks() -> dict[str, Path]: + """Every YAML file in the asset folder of every registered probe. + + Keyed by ``