fix: restore ayanamsa state and keep tests hermetic
Independent Staging Quality Gate / validate (push) Successful in 21m34s
Independent Staging Quality Gate / publish (push) Successful in 2m1s

This commit is contained in:
Jesse_Chen
2026-09-03 23:22:15 +08:00
parent 027e4b0827
commit c1e3f32a0f
30 changed files with 227 additions and 53 deletions
+14 -3
View File
@@ -9,6 +9,10 @@ try:
from scripts.domain_calculation_service import CalculationError, compute_chart
except ModuleNotFoundError: # pragma: no cover - CLI execution path
from domain_calculation_service import CalculationError, compute_chart
try:
from scripts.ayanamsa_utils import DEFAULT_AYANAMSA_NAME, normalize_ayanamsa_name
except ModuleNotFoundError: # pragma: no cover - CLI execution path
from ayanamsa_utils import DEFAULT_AYANAMSA_NAME, normalize_ayanamsa_name
try:
from scripts.gulika import calculate_gulika
except ModuleNotFoundError: # pragma: no cover - CLI execution path
@@ -39,6 +43,10 @@ def _timezone_offset(value: Any, moment: datetime) -> float:
raise PrashnaContextError("timezone must be a numeric UTC offset or present in question_timestamp")
def _payload_ayanamsa(payload: dict[str, Any]) -> str:
return normalize_ayanamsa_name(payload.get("ayanamsa") or DEFAULT_AYANAMSA_NAME)
def build_prashna_context(payload: dict[str, Any]) -> dict[str, Any]:
required = ("question_text", "question_timestamp", "lat", "lon", "timezone")
missing = [field for field in required if payload.get(field) in (None, "")]
@@ -56,18 +64,21 @@ def build_prashna_context(payload: dict[str, Any]) -> dict[str, Any]:
if abs(timestamp_tz - tz) > 0.001:
raise PrashnaContextError("timezone conflicts with question_timestamp offset")
moment = moment.replace(tzinfo=None)
ayanamsa = _payload_ayanamsa(payload)
try:
chart = compute_chart({
"year": moment.year, "month": moment.month, "day": moment.day,
"hour": moment.hour, "minute": moment.minute, "second": moment.second,
"lat": float(payload["lat"]), "lon": float(payload["lon"]), "tz": tz,
"ayanamsa": str(payload.get("ayanamsa") or "lahiri"),
"ayanamsa": ayanamsa,
"node_mode": str(payload.get("node_mode") or "mean"),
})
except (CalculationError, ValueError, TypeError) as exc:
raise PrashnaContextError(f"Swiss Prashna chart blocked: {exc}") from exc
try:
gulika = calculate_gulika(moment, lat=float(payload["lat"]), lon=float(payload["lon"]), tz=tz)
gulika = calculate_gulika(
moment, lat=float(payload["lat"]), lon=float(payload["lon"]), tz=tz, ayanamsa=ayanamsa
)
except Exception as exc:
gulika = {
"status": "blocked",
@@ -92,7 +103,7 @@ def build_prashna_context(payload: dict[str, Any]) -> dict[str, Any]:
"question_text": str(payload["question_text"])[:500],
"question_timestamp": str(payload["question_timestamp"]),
"location": {"lat": float(payload["lat"]), "lon": float(payload["lon"]), "timezone": tz, "location_convention": "wgs84"},
"ayanamsa": str(payload.get("ayanamsa") or "lahiri"),
"ayanamsa": ayanamsa,
"node_mode": str(payload.get("node_mode") or "mean"),
"chart_source": "swiss_ephemeris_backend",
"ascendant": chart["ascendant"],