From 7bede9c99a056446648aa1e8fa36b3a4734a36eb Mon Sep 17 00:00:00 2001 From: jesse-ux Date: Wed, 28 Oct 2026 09:45:08 +0800 Subject: [PATCH] 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) --- scripts/darakaraka_reader.py | 42 +++++++++---------- ...stream_sync9_darakaraka_reader_identity.py | 42 +++++++++++++++++++ 2 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 tests/test_upstream_sync9_darakaraka_reader_identity.py diff --git a/scripts/darakaraka_reader.py b/scripts/darakaraka_reader.py index 7f2e7b24..b9aa5787 100644 --- a/scripts/darakaraka_reader.py +++ b/scripts/darakaraka_reader.py @@ -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): diff --git a/tests/test_upstream_sync9_darakaraka_reader_identity.py b/tests/test_upstream_sync9_darakaraka_reader_identity.py new file mode 100644 index 00000000..2a29b959 --- /dev/null +++ b/tests/test_upstream_sync9_darakaraka_reader_identity.py @@ -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"