generated from john/python-template
gpt-5.3 codex review: Phase 7 and the addition of the new test-effectiveness-auditor skill.
Quality Gate / gate (push) Failing after 12s
Quality Gate / gate (push) Failing after 12s
This commit is contained in:
@@ -2,8 +2,11 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
from transcription.config import Settings
|
||||
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
@@ -97,3 +100,93 @@ def test_canonical_authority_references_are_present():
|
||||
if absent:
|
||||
missing[relative_path] = absent
|
||||
assert missing == {}
|
||||
|
||||
|
||||
def _declared_env_example_keys(*, include_commented: bool) -> set[str]:
|
||||
text = _read(".env.example")
|
||||
pattern = r"^\s*#?\s*([A-Z0-9_]+)\s*=" if include_commented else r"^\s*([A-Z0-9_]+)\s*="
|
||||
return {match.group(1) for match in re.finditer(pattern, text, flags=re.MULTILINE)}
|
||||
|
||||
|
||||
def _active_env_example_values() -> dict[str, str]:
|
||||
text = _read(".env.example")
|
||||
return {
|
||||
key: value.strip()
|
||||
for key, value in re.findall(r"^\s*([A-Z0-9_]+)\s*=\s*(.*)$", text, flags=re.MULTILINE)
|
||||
}
|
||||
|
||||
|
||||
def _normalize_env_path_value(value: str | None) -> str | None:
|
||||
if value is None:
|
||||
return None
|
||||
normalized = value.strip().replace("\\", "/")
|
||||
while normalized.startswith("./"):
|
||||
normalized = normalized[2:]
|
||||
return normalized
|
||||
|
||||
|
||||
def test_env_example_keys_match_runtime_settings_contract():
|
||||
"""Guard against .env.example drift from Settings keys."""
|
||||
declared = _declared_env_example_keys(include_commented=True)
|
||||
settings_keys = {field.upper() for field in Settings.model_fields if field != "database"}
|
||||
database_keys = {
|
||||
"DATABASE__DRIVER",
|
||||
"DATABASE__PATH",
|
||||
"DATABASE__HOST",
|
||||
"DATABASE__PORT",
|
||||
"DATABASE__DATABASE",
|
||||
"DATABASE__USER",
|
||||
"DATABASE__PASSWORD",
|
||||
}
|
||||
allowed = settings_keys | database_keys
|
||||
|
||||
missing = sorted(allowed - declared)
|
||||
unknown = sorted(declared - allowed)
|
||||
assert missing == []
|
||||
assert unknown == []
|
||||
|
||||
|
||||
def test_env_example_default_values_match_settings_defaults():
|
||||
"""Uncommented .env.example entries should mirror in-code defaults."""
|
||||
defaults = Settings(_env_file=None, openrouter_api_key="placeholder-key")
|
||||
expected = {
|
||||
"HOST": defaults.host,
|
||||
"PORT": str(defaults.port),
|
||||
"LOG_LEVEL": defaults.log_level,
|
||||
"RELOAD": str(defaults.reload).lower(),
|
||||
"LOG_DIR": str(defaults.log_dir),
|
||||
"LOG_FILE_NAME": defaults.log_file_name,
|
||||
"LOG_FILE_MAX_BYTES": str(defaults.log_file_max_bytes),
|
||||
"LOG_FILE_BACKUP_COUNT": str(defaults.log_file_backup_count),
|
||||
"PROVIDER": defaults.provider.value,
|
||||
"PROVIDER_MODEL": defaults.provider_model or "",
|
||||
"DEFAULT_PROMPT_NAME": defaults.default_prompt_name,
|
||||
"ENVIRONMENT": defaults.environment,
|
||||
"DATABASE__DRIVER": defaults.database.driver,
|
||||
"DATABASE__PATH": getattr(defaults.database, "path", ""),
|
||||
"BOOTSTRAP_SCHEMA_ON_STARTUP": str(defaults.bootstrap_schema_on_startup).lower(),
|
||||
"SQLITE_CHECK_SAME_THREAD": str(defaults.sqlite_check_same_thread).lower(),
|
||||
"UPLOAD_DIR": str(defaults.upload_dir),
|
||||
"PROMPT_DIR": str(defaults.prompt_dir),
|
||||
"HOMEPAGE_DIR": str(defaults.homepage_dir),
|
||||
"DATABASE_BACKUP_DIR": str(defaults.database_backup_dir),
|
||||
"WORKER_MAX_RETRIES": str(defaults.worker_max_retries),
|
||||
"WORKER_PROVIDER_TIMEOUT_SECONDS": str(defaults.worker_provider_timeout_seconds),
|
||||
"WORKER_MIN_TRANSCRIPTION_CHARS": str(defaults.worker_min_transcription_chars),
|
||||
"WORKER_MIN_TRANSCRIPTION_LINES": str(defaults.worker_min_transcription_lines),
|
||||
"WORKER_FAIL_ON_FINISH_REASON_LENGTH": str(defaults.worker_fail_on_finish_reason_length).lower(),
|
||||
}
|
||||
active = _active_env_example_values()
|
||||
path_like_keys = {"LOG_DIR", "UPLOAD_DIR", "PROMPT_DIR", "HOMEPAGE_DIR", "DATABASE_BACKUP_DIR"}
|
||||
mismatches = {
|
||||
key: {
|
||||
"expected": _normalize_env_path_value(expected_value) if key in path_like_keys else expected_value,
|
||||
"actual": _normalize_env_path_value(active.get(key)) if key in path_like_keys else active.get(key),
|
||||
}
|
||||
for key, expected_value in expected.items()
|
||||
if (
|
||||
(_normalize_env_path_value(active.get(key)) if key in path_like_keys else active.get(key))
|
||||
!= (_normalize_env_path_value(expected_value) if key in path_like_keys else expected_value)
|
||||
)
|
||||
}
|
||||
assert mismatches == {}
|
||||
|
||||
Reference in New Issue
Block a user