157 lines
7.0 KiB
Python
157 lines
7.0 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Q5 / Q2 — fix grammar errors in depth-5 (and a handful of depth-4) questions.
|
||
|
||
Three families of template-generated errors:
|
||
|
||
1. emotional_intimacy — "When does [plural/compound noun] affect..."
|
||
Subject-verb disagreement: "does" should be "do".
|
||
Also: "your deeper fears" (awkward) → "your deep fears";
|
||
"emotional needs you hide" (missing article) → "the emotional needs you hide";
|
||
"the parts of you you protect" (double-you) → "the parts of yourself you protect".
|
||
|
||
2. stress_080 – stress_150 (every 5th) — "after [topic] affects the way we treat each other"
|
||
Reads as machine-made and wordy: "the way" is filler. Fixed to
|
||
"when [topic] affects how we treat each other".
|
||
|
||
Edits BOTH the source JSON and the shipped asset DB (data only — Room hash untouched).
|
||
build_db.py is NOT run. One-off migration kept in repo for traceability.
|
||
"""
|
||
import json
|
||
import os
|
||
import sqlite3
|
||
|
||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||
DB_PATH = os.path.join(HERE, "..", "app", "src", "main", "assets", "database", "app.db")
|
||
EI_JSON = os.path.join(HERE, "questions", "emotional_intimacy.json")
|
||
ST_JSON = os.path.join(HERE, "questions", "stress.json")
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 1. Exact rewrites keyed by question id
|
||
# ---------------------------------------------------------------------------
|
||
REWRITES = {
|
||
# --- deeper fears block (076 d4 + 077-080 d5) ---
|
||
"emotional_intimacy_076": "What do you wish I understood about your deep fears?",
|
||
"emotional_intimacy_077": "When do your deep fears affect how close you feel to me?",
|
||
"emotional_intimacy_078": "What would help you share more honestly about your deep fears?",
|
||
"emotional_intimacy_079": "How can I respond to your deep fears in a way that feels safe instead of fixing you?",
|
||
"emotional_intimacy_080": "What is one boundary or reassurance that would help with your deep fears?",
|
||
|
||
# --- emotional needs you hide block (081 d4 + 082-085 d5) ---
|
||
"emotional_intimacy_081": "What do you wish I understood about the emotional needs you hide?",
|
||
"emotional_intimacy_082": "When do the emotional needs you hide affect how close you feel to me?",
|
||
"emotional_intimacy_083": "What would help you share more honestly about the emotional needs you hide?",
|
||
"emotional_intimacy_084": "How can I respond to the emotional needs you hide in a way that feels safe instead of fixing you?",
|
||
"emotional_intimacy_085": "What is one boundary or reassurance that would help with the emotional needs you hide?",
|
||
|
||
# --- moments you feel unseen (087 d5 only — does→do + article) ---
|
||
"emotional_intimacy_087": "When do the moments you feel unseen affect how close you feel to me?",
|
||
|
||
# --- childhood patterns / shame (092, 097 d5 — does→do) ---
|
||
"emotional_intimacy_092": "When do childhood patterns affect how close you feel to me?",
|
||
"emotional_intimacy_097": "When do shame and tenderness affect how close you feel to me?",
|
||
|
||
# --- parts of yourself block (146 d4 + 147-150 d5) ---
|
||
"emotional_intimacy_146": "What do you wish I understood about the parts of yourself you protect?",
|
||
"emotional_intimacy_147": "When do the parts of yourself you protect affect how close you feel to me?",
|
||
"emotional_intimacy_148": "What would help you share more honestly about the parts of yourself you protect?",
|
||
"emotional_intimacy_149": "How can I respond to the parts of yourself you protect in a way that feels safe instead of fixing you?",
|
||
"emotional_intimacy_150": "What is one boundary or reassurance that would help with the parts of yourself you protect?",
|
||
}
|
||
|
||
# Stress block: "after [topic] affects the way we treat each other"
|
||
# → "when [topic] affects how we treat each other"
|
||
STRESS_SUFFIX_OLD = " affects the way we treat each other?"
|
||
STRESS_SUFFIX_NEW = " affects how we treat each other?"
|
||
STRESS_PREFIX_OLD = "What repair do we need after "
|
||
STRESS_PREFIX_NEW = "What repair do we need when "
|
||
|
||
STRESS_IDS = [f"stress_{n:03d}" for n in range(80, 155, 5)]
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# helpers
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def fix_stress_text(text: str) -> str | None:
|
||
if text.startswith(STRESS_PREFIX_OLD) and text.endswith(STRESS_SUFFIX_OLD):
|
||
topic = text[len(STRESS_PREFIX_OLD) : -len(STRESS_SUFFIX_OLD)]
|
||
return f"{STRESS_PREFIX_NEW}{topic}{STRESS_SUFFIX_NEW}"
|
||
return None
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# JSON pass
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def migrate_json(json_path: str, rewrites: dict, stress_ids: list[str]) -> int:
|
||
with open(json_path) as f:
|
||
data = json.load(f)
|
||
changed = 0
|
||
for q in data.get("questions", []):
|
||
qid = q["id"]
|
||
if qid in rewrites:
|
||
q["text"] = rewrites[qid]
|
||
changed += 1
|
||
if qid in stress_ids:
|
||
fixed = fix_stress_text(q["text"])
|
||
if fixed:
|
||
q["text"] = fixed
|
||
changed += 1
|
||
if changed:
|
||
with open(json_path, "w") as f:
|
||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||
f.write("\n")
|
||
return changed
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# DB pass
|
||
# ---------------------------------------------------------------------------
|
||
|
||
def migrate_db(rewrites: dict, stress_ids: list[str]) -> int:
|
||
con = sqlite3.connect(DB_PATH)
|
||
cur = con.cursor()
|
||
changed = 0
|
||
|
||
for qid, new_text in rewrites.items():
|
||
cur.execute("UPDATE question SET text=? WHERE id=?", (new_text, qid))
|
||
if cur.rowcount:
|
||
changed += 1
|
||
|
||
for qid in stress_ids:
|
||
row = cur.execute("SELECT text FROM question WHERE id=?", (qid,)).fetchone()
|
||
if row:
|
||
fixed = fix_stress_text(row[0])
|
||
if fixed:
|
||
cur.execute("UPDATE question SET text=? WHERE id=?", (fixed, qid))
|
||
if cur.rowcount:
|
||
changed += 1
|
||
|
||
con.commit()
|
||
con.close()
|
||
return changed
|
||
|
||
|
||
if __name__ == "__main__":
|
||
n = migrate_json(EI_JSON, REWRITES, [])
|
||
print(f"JSON emotional_intimacy: {n} fixed")
|
||
n = migrate_json(ST_JSON, {}, STRESS_IDS)
|
||
print(f"JSON stress: {n} fixed")
|
||
n = migrate_db(REWRITES, STRESS_IDS)
|
||
print(f"DB total: {n} fixed")
|
||
|
||
# Quick sanity check: verify no original bad text remains
|
||
con = sqlite3.connect(DB_PATH)
|
||
cur = con.cursor()
|
||
h = cur.execute("SELECT identity_hash FROM room_master_table").fetchone()[0]
|
||
bad = cur.execute(
|
||
"SELECT id FROM question WHERE text LIKE '%When does%affect%' OR text LIKE '%needs you hide%' OR text LIKE '%of you you protect%' OR text LIKE '%deeper fears%'"
|
||
).fetchall()
|
||
con.close()
|
||
print(f"Room hash: {h}")
|
||
if bad:
|
||
print(f"WARNING — still-bad rows: {[r[0] for r in bad]}")
|
||
else:
|
||
print("Verified: 0 bad rows remaining")
|