Astrologer ruling 甲12. jyotish_engine._get_dignity_level drops the Rahu-Virgo / Ketu-Pisces OWN_SIGN clause (fed the D1 status column, Vimsopaka and varga_dignity); no node exaltation/debilitation added. yoga_engine.YogaContext resolves Scorpio -> Mars and Aquarius -> Saturn by default (as the lord chain, functional roles and frontend SIGN_LORDS do); _stronger_co_lord and RAHU_KETU_OWNED_SIGN_INDEX stay for Jaimini variants (dynamic_co_lords=True) only. narayana_dasha co-lord rules unchanged. Separate commit so it can be reverted alone; v5 / reported-offset results in PROGRESS. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
66 lines
2.8 KiB
Python
66 lines
2.8 KiB
Python
"""Rahu / Ketu have no own sign; the main path uses fixed lords (BUG-1211, ruling 甲12).
|
|
|
|
`jyotish_engine._get_dignity_level` no longer calls Rahu in Virgo or Ketu in
|
|
Pisces "own sign" (nor Aquarius / Scorpio); `yoga_engine.YogaContext` resolves
|
|
Scorpio to Mars and Aquarius to Saturn on the main path, keeping the stronger
|
|
co-lord comparison for Jaimini variants (dynamic_co_lords=True) only.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from scripts.jyotish_engine import _get_dignity_level
|
|
from scripts.yoga_engine import YogaContext
|
|
|
|
|
|
@pytest.mark.parametrize("planet,sign", [("Rahu", "Virgo"), ("Rahu", "Aquarius"), ("Ketu", "Pisces"), ("Ketu", "Scorpio")])
|
|
def test_nodes_are_never_own_sign(planet: str, sign: str) -> None:
|
|
assert _get_dignity_level(planet, sign) != "OWN_SIGN"
|
|
planets = {"Sun": {"sign": "Aries", "house": 1}, planet: {"sign": sign, "house": 2}}
|
|
assert _get_dignity_level(planet, sign, 15.0, planets) != "OWN_SIGN"
|
|
|
|
|
|
def test_classical_own_signs_unchanged() -> None:
|
|
assert _get_dignity_level("Saturn", "Aquarius", 25.0) == "OWN_SIGN"
|
|
assert _get_dignity_level("Mars", "Scorpio") == "OWN_SIGN"
|
|
|
|
|
|
def _context(asc: str) -> YogaContext:
|
|
# Ketu crowded in Taurus and Rahu with company: the old resolver could pick
|
|
# Ketu / Rahu as the stronger co-lord of Scorpio / Aquarius.
|
|
planets = {
|
|
"Mars": {"sign": "Leo", "house": 1, "degree": 5.0},
|
|
"Saturn": {"sign": "Pisces", "house": 2, "degree": 5.0},
|
|
"Ketu": {"sign": "Taurus", "house": 3, "degree": 5.0},
|
|
"Rahu": {"sign": "Scorpio", "house": 4, "degree": 5.0},
|
|
"Sun": {"sign": "Taurus", "house": 5, "degree": 6.0},
|
|
"Moon": {"sign": "Taurus", "house": 6, "degree": 7.0},
|
|
"Mercury": {"sign": "Scorpio", "house": 7, "degree": 8.0},
|
|
"Jupiter": {"sign": "Scorpio", "house": 8, "degree": 9.0},
|
|
"Venus": {"sign": "Taurus", "house": 9, "degree": 10.0},
|
|
}
|
|
return YogaContext(planets, asc)
|
|
|
|
|
|
@pytest.mark.parametrize("asc", ["Scorpio", "Aquarius", "Leo"])
|
|
def test_main_path_lords_are_fixed(asc: str) -> None:
|
|
ctx = _context(asc)
|
|
signs = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio",
|
|
"Sagittarius", "Capricorn", "Aquarius", "Pisces"]
|
|
for house in range(1, 13):
|
|
sign = signs[(signs.index(asc) + house - 1) % 12]
|
|
lord = ctx.lord_of_house(house)
|
|
if sign == "Scorpio":
|
|
assert lord == "Mars"
|
|
if sign == "Aquarius":
|
|
assert lord == "Saturn"
|
|
assert lord not in ("Rahu", "Ketu")
|
|
assert not ctx.is_own_sign("Rahu")
|
|
|
|
|
|
def test_jaimini_variant_still_available() -> None:
|
|
ctx = _context("Leo")
|
|
assert ctx._resolve_sign_lord("Scorpio", dynamic_co_lords=True) in ("Mars", "Ketu")
|
|
assert ctx._resolve_sign_lord("Scorpio") == "Mars"
|