fix(ayanamsa): keep a caller-selected mode across import and transit paths (BUG-1269, upstream 23be1807)

This commit is contained in:
jesse-ux
2026-10-07 17:05:18 +08:00
parent 4b9c019814
commit 4e134b9b9f
6 changed files with 183 additions and 24 deletions
+92
View File
@@ -0,0 +1,92 @@
"""BUG-1269: import bootstrap must not clobber a chosen ayanamsa, and the
natal, transit, bhava-chalit, and nakshatra paths must apply the requested mode.
"""
from __future__ import annotations
import subprocess
import sys
from types import SimpleNamespace
import pytest
from scripts.ayanamsa_utils import AYANAMSA_MODES
from scripts.bhava_chalit import cmd_bhava_chalit
from scripts.cmd_nakshatra_adv import cmd_nakshatra_adv
from scripts.jyotish_engine import cmd_transit, compute_chart_data
MODES = ("lahiri", "raman", "krishnamurti", "fagan_bradley", "true_citra", "true_pushya")
def test_mode_names_exist():
for name in MODES:
assert name in AYANAMSA_MODES
def _birth(mode: str, second: int = 0):
return SimpleNamespace(
year=1955, month=2, day=24, hour=19, minute=15, second=second,
lat=37.7749, lon=-122.4194, tz=-8.0,
ayanamsa=mode, node_mode="mean",
mode="chart", house_system="sripati", planet=None,
retrograde_calendar=False,
)
@pytest.mark.parametrize("mode", MODES)
def test_requested_ayanamsa_is_applied_on_four_paths(mode: str):
chart, _asc, _jd, _value = compute_chart_data(
1955, 2, 24, 19, 15, 37.7749, -122.4194, -8.0, "mean",
second=0, ayanamsa_name=mode,
)
assert chart["birth_info"]["ayanamsa_name"] == mode
transit = cmd_transit(SimpleNamespace(
year=2026, month=10, day=5, tz=-8.0, ayanamsa=mode,
node_mode="mean", planet=None, retrograde_calendar=False,
))
policy = transit["transit_ayanamsa_policy"]
assert policy["requested_ayanamsa"] == mode
assert policy["applied_ayanamsa"] == mode
assert policy["same_ayanamsa_transit_parity"] is True
bhava = cmd_bhava_chalit(_birth(mode))
assert bhava["requested_ayanamsa"] == mode
assert bhava["applied_ayanamsa"] == mode
nak_args = _birth(mode)
nak_args.mode = "detail"
nakshatra = cmd_nakshatra_adv(nak_args)
assert nakshatra["requested_ayanamsa"] == mode
assert nakshatra["applied_ayanamsa"] == mode
def test_lahiri_and_raman_longitudes_differ():
lahiri, *_ = compute_chart_data(1955, 2, 24, 19, 15, 37.7749, -122.4194, -8.0, "mean", ayanamsa_name="lahiri")
raman, *_ = compute_chart_data(1955, 2, 24, 19, 15, 37.7749, -122.4194, -8.0, "mean", ayanamsa_name="raman")
assert lahiri["planets"]["Sun"]["degree_raw"] != pytest.approx(raman["planets"]["Sun"]["degree_raw"], abs=0.2)
lahiri_t = cmd_transit(SimpleNamespace(year=2026, month=10, day=5, tz=-8.0, ayanamsa="lahiri", node_mode="mean", planet=None, retrograde_calendar=False))
raman_t = cmd_transit(SimpleNamespace(year=2026, month=10, day=5, tz=-8.0, ayanamsa="raman", node_mode="mean", planet=None, retrograde_calendar=False))
assert lahiri_t["planets"]["Sun"]["degree_raw"] != pytest.approx(raman_t["planets"]["Sun"]["degree_raw"], abs=0.2)
def test_bhava_chalit_uses_birth_second():
zero = cmd_bhava_chalit(_birth("lahiri", 0))
later = cmd_bhava_chalit(_birth("lahiri", 40))
assert abs(later["ascendant_lon"] - zero["ascendant_lon"]) > 0.05
def test_import_bootstrap_does_not_clobber_explicit_mode():
probe = """
import sys
sys.path.insert(0, "scripts")
import ayanamsa_utils as au
au.apply_ayanamsa("lahiri")
import jyotish_engine
assert au.ACTIVE_AYANAMSA_NAME == "lahiri", au.ACTIVE_AYANAMSA_NAME
print("OK")
"""
proc = subprocess.run([sys.executable, "-c", probe], capture_output=True, text=True, cwd=str(__import__("pathlib").Path(__file__).resolve().parents[1]))
assert proc.returncode == 0, proc.stderr[-2000:]
assert proc.stdout.strip().endswith("OK")