145 lines
5.9 KiB
Python
145 lines
5.9 KiB
Python
"""T5: sourced dasha children are copied into the master pack and rendered."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from scripts.annual_native.dasha_children import (
|
|
attach_kalachakra_simplified_children,
|
|
enrich_master_family,
|
|
)
|
|
from scripts.ashtottari_dasha import calculate_ashtottari_dasha
|
|
from scripts.jyotish_engine import _native_dasha_master_families
|
|
from scripts.kalachakra_dasha import calculate_kalachakra_dasha
|
|
from scripts.pl9_reader_export import render_pl9_parity_markdown
|
|
from scripts.yogini_dasha import calculate_yogini_dasha
|
|
|
|
|
|
def _major_view(row: dict) -> tuple:
|
|
return (
|
|
row.get("lord") or row.get("planet") or row.get("rashi") or row.get("sign"),
|
|
row.get("rashi") or row.get("sign"),
|
|
row.get("years"),
|
|
row.get("start_date") or row.get("start"),
|
|
row.get("end_date") or row.get("end"),
|
|
)
|
|
|
|
|
|
def _applicable_ashtottari() -> dict:
|
|
for index in range(27):
|
|
result = calculate_ashtottari_dasha({
|
|
"moon_nakshatra_index": index,
|
|
"is_shukla_paksha": True,
|
|
"moon_longitude": index * (360.0 / 27.0) + 1.0,
|
|
"birth_datetime": datetime(1990, 1, 1, 12, 0),
|
|
})
|
|
if result.get("major"):
|
|
return result
|
|
raise AssertionError("no applicable Ashtottari fixture")
|
|
|
|
|
|
def test_kalachakra_children_hang_on_existing_majors() -> None:
|
|
source = calculate_kalachakra_dasha({
|
|
"moon_nakshatra_index": 0,
|
|
"moon_pada": 1,
|
|
"birth_datetime": datetime(1990, 6, 15, 10, 30),
|
|
})
|
|
before = [_major_view(row) for row in source["major"]]
|
|
enriched, antardasha, pratyantar = attach_kalachakra_simplified_children(
|
|
source["major"], source["total_cycle"],
|
|
)
|
|
assert [_major_view(row) for row in source["major"]] == before
|
|
assert "antardasha" not in source["major"][0]
|
|
assert [_major_view(row) for row in enriched] == before
|
|
assert antardasha and pratyantar
|
|
assert enriched[0]["antardasha"][-1]["end_date"] == enriched[0]["end_date"]
|
|
assert enriched[0]["antardasha"][0]["model"] == "simplified"
|
|
assert enriched[0]["antardasha"][0]["pratyantardasha"]
|
|
|
|
|
|
def test_master_pack_keeps_sourced_children_and_leaves_modules_alone() -> None:
|
|
ashtottari = _applicable_ashtottari()
|
|
yogini = calculate_yogini_dasha({
|
|
"birth_datetime": datetime(1990, 6, 15, 10, 30),
|
|
"moon_longitude": 10.0,
|
|
"as_of": datetime(2020, 1, 1),
|
|
})
|
|
kalachakra = calculate_kalachakra_dasha({
|
|
"moon_nakshatra_index": 0,
|
|
"moon_pada": 1,
|
|
"birth_datetime": datetime(1990, 6, 15, 10, 30),
|
|
})
|
|
narayana = {
|
|
"mahadasha_sequence": [{
|
|
"sign": "Aries", "lord": "Mars", "years": 7,
|
|
"start_age": 0, "end_age": 7, "period_key": "md-0",
|
|
}],
|
|
"dense_boundaries": [{
|
|
"level": "AD", "sign": "Taurus", "lord": "Venus",
|
|
"duration_years": 1, "start_age": 0, "end_age": 1,
|
|
"parent_md": "Aries", "parent_period_key": "md-0",
|
|
}],
|
|
}
|
|
tribhagi = {"major": [{
|
|
"lord": "Sun", "years": 1,
|
|
"start_date": "2000-01-01T00:00:00", "end_date": "2001-01-01T00:00:00",
|
|
}]}
|
|
families = _native_dasha_master_families({
|
|
"ashtottari_dasha": ashtottari,
|
|
"yogini_dasha": yogini,
|
|
"kalachakra_dasha": kalachakra,
|
|
"narayana_dasha": narayana,
|
|
"tribhagi_dasha": tribhagi,
|
|
"dasha": {"timeline": [{"lord": "Sun", "start": "2000-01-01", "end": "2006-01-01"}]},
|
|
})
|
|
assert families["ashtottari"]["periods"][0]["antardasha"]
|
|
assert families["yogini"]["periods"][0]["antardasha"]
|
|
assert families["kala_chakra"]["periods"][0]["antardasha"][0]["pratyantardasha"]
|
|
assert families["narayana"]["periods"][0]["antardasha"][0]["sign"] == "Taurus"
|
|
assert "antardasha" not in tribhagi["major"][0]
|
|
assert "antardasha" not in yogini["major"][0]
|
|
assert "antardasha" not in kalachakra["major"][0]
|
|
assert "antardasha" not in narayana["mahadasha_sequence"][0]
|
|
assert [_major_view(row) for row in families["kala_chakra"]["periods"]] == [
|
|
_major_view(row) for row in kalachakra["major"]
|
|
]
|
|
assert families["vimshottari"]["periods"][0]["lord"] == "Sun"
|
|
assert "antardasha" not in families["vimshottari"]["periods"][0]
|
|
|
|
|
|
def test_missing_child_rule_and_kalachakra_model_are_labeled() -> None:
|
|
packet = {
|
|
"report_language": "zh",
|
|
"worksheets": {"timing_and_predictive_systems": {"dasha_master_pack": {"families": {
|
|
"tribhagi": {"periods": [{
|
|
"lord": "Sun", "years": 1,
|
|
"start_date": "2000-01-01T00:00:00", "end_date": "2001-01-01T00:00:00",
|
|
}]},
|
|
"kala_chakra": {"periods": [{
|
|
"lord": "Sun", "rashi": "Aries", "years": 7,
|
|
"start_date": "2000-01-01T00:00:00", "end_date": "2007-01-01T00:00:00",
|
|
"antardasha": [{
|
|
"lord": "Moon", "rashi": "Cancer", "parent_rashi": "Aries",
|
|
"start_date": "2000-01-01T00:00:00", "end_date": "2001-01-01T00:00:00",
|
|
"pratyantardasha": [{
|
|
"lord": "Mars", "rashi": "Aries",
|
|
"start_date": "2000-01-01T00:00:00", "end_date": "2000-02-01T00:00:00",
|
|
}],
|
|
}],
|
|
}]},
|
|
}}}},
|
|
}
|
|
chinese = render_pl9_parity_markdown(packet)
|
|
assert "本体系未提供子运" in chinese
|
|
assert "简化模型" in chinese
|
|
assert "次小运" in chinese
|
|
english = render_pl9_parity_markdown({**packet, "report_language": "en"})
|
|
assert "This system does not provide sub-periods." in english
|
|
assert "Simplified model" in english
|
|
|
|
|
|
def test_enrich_does_not_invent_children_for_vimshottari() -> None:
|
|
rows = enrich_master_family("vimshottari", {"timeline": []}, [{"lord": "Sun", "years": 6}])
|
|
assert rows == [{"lord": "Sun", "years": 6}]
|
|
assert "antardasha" not in rows[0]
|