Skip to content

Thai Thaksa

A Thai Thaksa (ทักษา) engine that deterministically seats the eight grahas into a querent's houses from their birth datetime. The result drives Thai name and number divination: the Boriwan ruler and its lucky colour, Buddha posture, planetary strength, and the inauspicious Kalakini graha.

from fortune_telling_core import Querent, ReadingRequest
from fortune_telling_core.traditions.thaksa import THAKSA_DECK, THAKSA_SPREAD, build_engine

request = ReadingRequest(
    deck_id=THAKSA_DECK.id,
    spread_id=THAKSA_SPREAD.id,
    querent=Querent(
        id="sample",
        display_name="Sample",
        attributes={"birth_datetime": "1990-04-15T09:00:00+07:00"},
    ),
)
reading = build_engine().cast(request)

thaksa

THAKSA_DECK module-attribute

THAKSA_DECK = Deck(
    id="thaksa.deck.grahas.v1",
    symbols=tuple(
        (
            Symbol(
                id=graha.symbol_id,
                name=graha.name,
                attributes={
                    "slug": graha.slug,
                    "thai": graha.thai,
                    "cycle_index": str(graha.index),
                    "color": graha.color,
                    "buddha_posture": graha.buddha_posture,
                    "strength": str(graha.strength),
                },
            )
        )
        for graha in GRAHAS
    ),
)

THAKSA_SPREAD module-attribute

THAKSA_SPREAD = Spread(
    id="thaksa.spread.houses.v1",
    name="Thaksa",
    positions=tuple(
        (Position(house.slug, house.name, house.meaning))
        for house in HOUSES
    ),
)

ThaksaEngine

Bases: AbstractEngine

Thai Thaksa (ทักษา) engine.

The engine deterministically derives a querent's birth-day ruling graha and seats the eight grahas into the eight Thaksa houses, surfacing the ruler's lucky color, Buddha posture, planetary strength, and the inauspicious Kalakini graha. A Wednesday birth at or after 18:00 rules under Rahu (Wednesday night).

id class-attribute instance-attribute

id = 'thaksa.engine'

version class-attribute instance-attribute

version = '0.1.0'

deck

deck(request: ReadingRequest) -> Deck

Return the Thaksa graha deck.

Parameters:

Name Type Description Default
request ReadingRequest

Reading request whose deck_id must match THAKSA_DECK.id.

required

Returns:

Type Description
Deck

The bundled Thaksa deck.

Raises:

Type Description
ValidationError

If the requested deck is unsupported.

Source code in src/fortune_telling_core/traditions/thaksa/engine.py
def deck(self, request: ReadingRequest) -> Deck:
    """Return the Thaksa graha deck.

    Args:
        request: Reading request whose ``deck_id`` must match
            ``THAKSA_DECK.id``.

    Returns:
        The bundled Thaksa deck.

    Raises:
        ValidationError: If the requested deck is unsupported.
    """

    if request.deck_id != THAKSA_DECK.id:
        raise ValidationError(f"unsupported Thaksa deck: {request.deck_id}")
    return THAKSA_DECK

spread

spread(request: ReadingRequest) -> Spread

Return the Thaksa house spread.

Parameters:

Name Type Description Default
request ReadingRequest

Reading request whose spread_id must match THAKSA_SPREAD.id.

required

Returns:

Type Description
Spread

The bundled Thaksa spread.

Raises:

Type Description
ValidationError

If the requested spread is unsupported.

Source code in src/fortune_telling_core/traditions/thaksa/engine.py
def spread(self, request: ReadingRequest) -> Spread:
    """Return the Thaksa house spread.

    Args:
        request: Reading request whose ``spread_id`` must match
            ``THAKSA_SPREAD.id``.

    Returns:
        The bundled Thaksa spread.

    Raises:
        ValidationError: If the requested spread is unsupported.
    """

    if request.spread_id != THAKSA_SPREAD.id:
        raise ValidationError(f"unsupported Thaksa spread: {request.spread_id}")
    return THAKSA_SPREAD

draw

draw(request: ReadingRequest, rng: Rng) -> Draw

Compute the Thaksa house placements as a deterministic draw.

Parameters:

Name Type Description Default
request ReadingRequest

Reading request with birth_datetime in options or querent attributes.

required
rng Rng

Ignored. The argument is present for Engine compatibility.

required

Returns:

Type Description
Draw

A draw with one graha selection per Thaksa house.

Raises:

Type Description
ValidationError

If required birth data is invalid.

Source code in src/fortune_telling_core/traditions/thaksa/engine.py
def draw(self, request: ReadingRequest, rng: Rng) -> Draw:
    """Compute the Thaksa house placements as a deterministic draw.

    Args:
        request: Reading request with ``birth_datetime`` in options or
            querent attributes.
        rng: Ignored. The argument is present for ``Engine`` compatibility.

    Returns:
        A draw with one graha selection per Thaksa house.

    Raises:
        ValidationError: If required birth data is invalid.
    """

    del rng
    birth = parse_birth_data(request)
    return draw_from_chart(compute_chart(birth.birth_datetime))

cast

cast(request: ReadingRequest) -> Reading

Compute a Thaksa reading without a caller RNG.

Parameters:

Name Type Description Default
request ReadingRequest

Reading request containing birth data.

required

Returns:

Type Description
Reading

A reading with the eight house placements and a Thaksa summary.

Raises:

Type Description
ValidationError

If required birth data is invalid.

Source code in src/fortune_telling_core/traditions/thaksa/engine.py
def cast(self, request: ReadingRequest) -> Reading:
    """Compute a Thaksa reading without a caller RNG.

    Args:
        request: Reading request containing birth data.

    Returns:
        A reading with the eight house placements and a Thaksa summary.

    Raises:
        ValidationError: If required birth data is invalid.
    """

    draw = self.draw(request, _NULL_RNG)
    return self._interpret(request, draw, rng=None)

build_engine

build_engine() -> ThaksaEngine

Create a Thaksa engine.

Returns:

Type Description
ThaksaEngine

A new ThaksaEngine instance.

Source code in src/fortune_telling_core/traditions/thaksa/engine.py
def build_engine() -> ThaksaEngine:
    """Create a Thaksa engine.

    Returns:
        A new ``ThaksaEngine`` instance.
    """

    return ThaksaEngine()