Source code for stellium.utils.chart_ruler
"""Chart ruler calculation utilities.
The chart ruler is the planet that rules the Ascendant sign.
"""
from typing import Literal
from stellium.engines.dignities import DIGNITIES
[docs]
def get_sign_ruler(
sign: str,
system: Literal["traditional", "modern"] = "traditional",
) -> str:
"""
Get the planetary ruler of a zodiac sign.
Args:
sign: The zodiac sign name (e.g., "Aries", "Leo")
system: "traditional" (classical rulerships) or "modern" (includes outer planets)
Returns:
The name of the ruling planet
Example:
>>> get_sign_ruler("Aries")
'Mars'
>>> get_sign_ruler("Scorpio", system="modern")
'Pluto'
>>> get_sign_ruler("Scorpio", system="traditional")
'Mars'
"""
if sign not in DIGNITIES:
raise ValueError(f"Unknown sign: {sign}")
return DIGNITIES[sign][system]["ruler"]
[docs]
def get_chart_ruler(
ascendant_sign: str,
system: Literal["traditional", "modern"] = "traditional",
) -> str:
"""
Get the chart ruler based on the Ascendant sign.
The chart ruler is the planet that rules the rising sign.
It is considered one of the most important planets in the natal chart.
Args:
ascendant_sign: The zodiac sign on the Ascendant (e.g., "Leo", "Scorpio")
system: "traditional" (classical rulerships) or "modern" (includes outer planets)
Returns:
The name of the chart ruler planet
Example:
>>> get_chart_ruler("Leo")
'Sun'
>>> get_chart_ruler("Aquarius", system="modern")
'Uranus'
>>> get_chart_ruler("Aquarius", system="traditional")
'Saturn'
"""
return get_sign_ruler(ascendant_sign, system)
[docs]
def get_chart_ruler_from_chart(
chart, # CalculatedChart - avoiding import for type hint to prevent circular imports
system: Literal["traditional", "modern"] = "traditional",
) -> tuple[str, str]:
"""
Get the chart ruler from a CalculatedChart object.
Args:
chart: A CalculatedChart instance
system: "traditional" or "modern" rulership system
Returns:
A tuple of (ruler_planet_name, ascendant_sign)
Example:
>>> chart = ChartBuilder.from_notable("Kate Louie").calculate()
>>> ruler, sign = get_chart_ruler_from_chart(chart)
>>> print(f"Chart ruler: {ruler} (ruling {sign} rising)")
Chart ruler: Sun (ruling Leo rising)
"""
# Get the Ascendant from the chart
asc = chart.get_object("ASC")
if asc is None:
raise ValueError("Chart does not contain an Ascendant")
ascendant_sign = asc.sign
ruler = get_chart_ruler(ascendant_sign, system)
return (ruler, ascendant_sign)