fix(darakaraka): sort with the existing Jaimini tables (BUG-1478, upstream 45b3b66b)

Calls calc_chara_karaka_7 and calc_chara_karaka_8. jaimini.py is not edited.

Co-Authored-By: Grok (agent loop)
This commit is contained in:
jesse-ux
2026-10-28 09:45:08 +08:00
co-authored by Grok (agent loop)
parent 96312893b7
commit 7bede9c99a
2 changed files with 63 additions and 21 deletions
+21 -21
View File
@@ -10,6 +10,13 @@ Jaimini系统核心:配偶征象星的多维度深度分析
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass, field
if __package__:
from .jaimini import calc_chara_karaka_7, calc_chara_karaka_8
else:
try:
from jaimini import calc_chara_karaka_7, calc_chara_karaka_8
except ImportError:
from scripts.jaimini import calc_chara_karaka_7, calc_chara_karaka_8
# DK行星特质库
@@ -248,31 +255,24 @@ class DarakarakaReader:
"""计算Darakaraka行星"""
planets = chart_data.get("planets", {})
# 提取各行星星座内度数
# Share the seven/eight-planet ranking with the main Jaimini table.
# Rahu's reversed degree and Ketu's exclusion live in those functions.
planet_degs = {}
for pname, pdata in planets.items():
if isinstance(pdata, dict) and "degree" in pdata:
deg_in_sign = pdata.get("degree_in_sign", pdata["degree"] % 30)
# Rahu逆行校正(8星系统)
if pname == "Rahu" and use_8_karaka:
deg_in_sign = 30.0 - deg_in_sign
planet_degs[pname] = deg_in_sign
# 排序(降序)
sorted_planets = sorted(planet_degs.items(), key=lambda x: x[1], reverse=True)
if not sorted_planets:
if isinstance(pdata, dict):
if "degree_raw" in pdata:
planet_degs[pname] = pdata["degree_raw"] % 30
elif "degree_in_sign" in pdata:
planet_degs[pname] = pdata["degree_in_sign"]
elif "degree" in pdata:
planet_degs[pname] = pdata["degree"] % 30
if not planet_degs:
return "Unknown", {}
if use_8_karaka and len(sorted_planets) >= 8:
# 8星系统:第7高(第8颗被排除)
dk = sorted_planets[6][0] # 索引6 = 第7高
if use_8_karaka:
table = calc_chara_karaka_8(planet_degs).get("karaka_table_8", {})
else:
# 7星系统:最低的
dk = sorted_planets[-1][0]
table = calc_chara_karaka_7(planet_degs).get("karaka_table", {})
dk = table.get("Darakaraka", {}).get("planet", "Unknown")
return dk, planets.get(dk, {})
def _fill_planet_traits(self, analysis: DKAnalysis):
@@ -0,0 +1,42 @@
"""The interpretation reader must use the canonical Chara Karaka ranking.
Upstream calls calc_chara_karaka(..., variant=). This tree exposes
calc_chara_karaka_7 and calc_chara_karaka_8. jaimini.py stays frozen.
"""
from scripts.darakaraka_reader import DarakarakaReader
from scripts.jaimini import calc_chara_karaka_8
def test_eight_karaka_reader_excludes_ketu_and_outer_planets() -> None:
longitudes = {
"Sun": 1.0,
"Moon": 4.0,
"Mars": 8.0,
"Mercury": 12.0,
"Jupiter": 16.0,
"Venus": 20.0,
"Saturn": 24.0,
"Rahu": 28.0,
"Ketu": 29.0,
"Pluto": 29.5,
}
chart = {"planets": {name: {"degree_raw": longitude} for name, longitude in longitudes.items()}}
expected = calc_chara_karaka_8(longitudes)["karaka_table_8"]["Darakaraka"]["planet"]
planet, _ = DarakarakaReader()._calculate_dk(chart, use_8_karaka=True)
assert planet == expected
assert planet not in {"Ketu", "Pluto"}
def test_reader_uses_raw_longitude_when_available() -> None:
chart = {"planets": {
"Sun": {"degree_raw": 1.0, "degree_in_sign": 29.0},
"Moon": {"degree_raw": 2.0}, "Mars": {"degree_raw": 3.0},
"Mercury": {"degree_raw": 4.0}, "Jupiter": {"degree_raw": 5.0},
"Venus": {"degree_raw": 6.0}, "Saturn": {"degree_raw": 7.0},
"Rahu": {"degree_raw": 8.0},
}}
planet, _ = DarakarakaReader()._calculate_dk(chart, use_8_karaka=True)
assert planet == "Sun"