kerykeion 4.26.2__py3-none-any.whl → 5.0.0a2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kerykeion might be problematic. Click here for more details.
- kerykeion/__init__.py +9 -7
- kerykeion/aspects/aspects_utils.py +14 -8
- kerykeion/aspects/natal_aspects.py +26 -17
- kerykeion/aspects/synastry_aspects.py +32 -15
- kerykeion/aspects/transits_time_range.py +2 -2
- kerykeion/astrological_subject_factory.py +1132 -0
- kerykeion/charts/charts_utils.py +676 -146
- kerykeion/charts/draw_planets.py +9 -8
- kerykeion/charts/draw_planets_v2.py +639 -0
- kerykeion/charts/kerykeion_chart_svg.py +1334 -601
- kerykeion/charts/templates/chart.xml +184 -78
- kerykeion/charts/templates/wheel_only.xml +13 -12
- kerykeion/charts/themes/classic.css +91 -76
- kerykeion/charts/themes/dark-high-contrast.css +129 -107
- kerykeion/charts/themes/dark.css +130 -107
- kerykeion/charts/themes/light.css +130 -103
- kerykeion/charts/themes/strawberry.css +143 -0
- kerykeion/composite_subject_factory.py +26 -43
- kerykeion/ephemeris_data.py +6 -10
- kerykeion/house_comparison/__init__.py +3 -0
- kerykeion/house_comparison/house_comparison_factory.py +70 -0
- kerykeion/house_comparison/house_comparison_models.py +38 -0
- kerykeion/house_comparison/house_comparison_utils.py +98 -0
- kerykeion/kr_types/chart_types.py +13 -5
- kerykeion/kr_types/kr_literals.py +34 -6
- kerykeion/kr_types/kr_models.py +122 -160
- kerykeion/kr_types/settings_models.py +107 -143
- kerykeion/planetary_return_factory.py +299 -0
- kerykeion/{relationship_score/relationship_score_factory.py → relationship_score_factory.py} +10 -13
- kerykeion/report.py +4 -4
- kerykeion/settings/config_constants.py +35 -6
- kerykeion/settings/kerykeion_settings.py +1 -0
- kerykeion/settings/kr.config.json +1301 -1255
- kerykeion/settings/legacy/__init__.py +0 -0
- kerykeion/settings/legacy/legacy_celestial_points_settings.py +299 -0
- kerykeion/settings/legacy/legacy_chart_aspects_settings.py +71 -0
- kerykeion/settings/legacy/legacy_color_settings.py +42 -0
- kerykeion/transits_time_range.py +13 -9
- kerykeion/utilities.py +228 -31
- {kerykeion-4.26.2.dist-info → kerykeion-5.0.0a2.dist-info}/METADATA +119 -107
- kerykeion-5.0.0a2.dist-info/RECORD +54 -0
- {kerykeion-4.26.2.dist-info → kerykeion-5.0.0a2.dist-info}/WHEEL +1 -1
- kerykeion/astrological_subject.py +0 -841
- kerykeion/relationship_score/__init__.py +0 -2
- kerykeion/relationship_score/relationship_score.py +0 -175
- kerykeion-4.26.2.dist-info/LICENSE +0 -661
- kerykeion-4.26.2.dist-info/RECORD +0 -46
- /LICENSE → /kerykeion-5.0.0a2.dist-info/LICENSE +0 -0
- {kerykeion-4.26.2.dist-info → kerykeion-5.0.0a2.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from kerykeion.house_comparison.house_comparison_utils import calculate_points_in_reciprocal_houses
|
|
2
|
+
from typing import Union
|
|
3
|
+
from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS, DEFAULT_ACTIVE_ASPECTS
|
|
4
|
+
from kerykeion.house_comparison.house_comparison_models import HouseComparisonModel
|
|
5
|
+
from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
|
|
6
|
+
from kerykeion.kr_types import AstrologicalSubjectModel, PlanetReturnModel
|
|
7
|
+
from kerykeion.kr_types.kr_literals import AstrologicalPoint
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class HouseComparisonFactory:
|
|
11
|
+
"""
|
|
12
|
+
Factory class for creating house comparison analyses between two astrological charts.
|
|
13
|
+
|
|
14
|
+
This class handles the generation of house comparison data, calculating how planets
|
|
15
|
+
from one chart interact with the house system of another chart (and vice versa).
|
|
16
|
+
This is useful for synastry analysis and other forms of relationship astrology.
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
first_subject (AstrologicalSubject): The first person's astrological chart
|
|
20
|
+
second_subject (AstrologicalSubject): The second person's astrological chart
|
|
21
|
+
|
|
22
|
+
Example:
|
|
23
|
+
>>> natal_chart = AstrologicalSubjectFactory.from_birth_data("Person A", 1990, 5, 15, 10, 30, "Rome", "IT")
|
|
24
|
+
>>> partner_chart = AstrologicalSubjectFactory.from_birth_data("Person B", 1992, 8, 23, 14, 45, "Milan", "IT")
|
|
25
|
+
>>> factory = HouseComparisonFactory(natal_chart, partner_chart)
|
|
26
|
+
>>> comparison = factory.get_house_comparison()
|
|
27
|
+
>>> print(comparison.model_dump_json(indent=4))
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
def __init__(self,
|
|
31
|
+
first_subject: Union["AstrologicalSubjectModel", "PlanetReturnModel"],
|
|
32
|
+
second_subject: Union["AstrologicalSubjectModel", "PlanetReturnModel"],
|
|
33
|
+
active_points: list[AstrologicalPoint] = DEFAULT_ACTIVE_POINTS,
|
|
34
|
+
|
|
35
|
+
):
|
|
36
|
+
self.first_subject = first_subject
|
|
37
|
+
self.second_subject = second_subject
|
|
38
|
+
self.active_points = active_points
|
|
39
|
+
|
|
40
|
+
def get_house_comparison(self) -> "HouseComparisonModel":
|
|
41
|
+
"""
|
|
42
|
+
Creates a house comparison model for two astrological subjects.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
chart1: First astrological subject
|
|
46
|
+
chart2: Second astrological subject
|
|
47
|
+
description: Description of the comparison
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
"HouseComparisonModel": Model containing the comparison data.
|
|
51
|
+
"""
|
|
52
|
+
first_points_in_second_houses = calculate_points_in_reciprocal_houses(self.first_subject, self.second_subject, self.active_points)
|
|
53
|
+
second_points_in_first_houses = calculate_points_in_reciprocal_houses(self.second_subject, self.first_subject, self.active_points)
|
|
54
|
+
|
|
55
|
+
return HouseComparisonModel(
|
|
56
|
+
first_subject_name=self.first_subject.name,
|
|
57
|
+
second_subject_name=self.second_subject.name,
|
|
58
|
+
first_points_in_second_houses=first_points_in_second_houses,
|
|
59
|
+
second_points_in_first_houses=second_points_in_first_houses,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
if __name__ == "__main__":
|
|
64
|
+
natal_chart = AstrologicalSubjectFactory.from_birth_data("Person A", 1990, 5, 15, 10, 30, "Rome", "IT")
|
|
65
|
+
partner_chart = AstrologicalSubjectFactory.from_birth_data("Person B", 1992, 8, 23, 14, 45, "Milan", "IT")
|
|
66
|
+
|
|
67
|
+
factory = HouseComparisonFactory(natal_chart, partner_chart)
|
|
68
|
+
comparison = factory.get_house_comparison()
|
|
69
|
+
|
|
70
|
+
print(comparison.model_dump_json(indent=4))
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from kerykeion.kr_types import SubscriptableBaseModel
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class PointInHouseModel(SubscriptableBaseModel):
|
|
6
|
+
"""Represents a point from one chart positioned in a house from another chart"""
|
|
7
|
+
|
|
8
|
+
point_name: str
|
|
9
|
+
"""Name of the celestial point"""
|
|
10
|
+
point_degree: float
|
|
11
|
+
"""Degree of the celestial point"""
|
|
12
|
+
point_sign: str
|
|
13
|
+
"""Sign of the celestial point"""
|
|
14
|
+
point_owner_name: str
|
|
15
|
+
"""Name of the owner of the celestial point"""
|
|
16
|
+
point_owner_house_number: Optional[int]
|
|
17
|
+
"""House number of the point of the owner of the celestial point"""
|
|
18
|
+
point_owner_house_name: Optional[str]
|
|
19
|
+
"""House name of the point of the owner of the celestial point"""
|
|
20
|
+
projected_house_number: int
|
|
21
|
+
"""Number of the house where the point is projected"""
|
|
22
|
+
projected_house_name: str
|
|
23
|
+
"""Name of the house where the point is projected"""
|
|
24
|
+
projected_house_owner_name: str
|
|
25
|
+
"""Name of the owner of the house where the point is projected"""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class HouseComparisonModel(SubscriptableBaseModel):
|
|
29
|
+
"""Pydantic model for comparing points in houses between two astrological subjects"""
|
|
30
|
+
|
|
31
|
+
first_subject_name: str
|
|
32
|
+
"""Name of the first subject"""
|
|
33
|
+
second_subject_name: str
|
|
34
|
+
"""Name of the second subject"""
|
|
35
|
+
first_points_in_second_houses: list[PointInHouseModel]
|
|
36
|
+
"""List of points from the first subject in the houses of the second subject"""
|
|
37
|
+
second_points_in_first_houses: list[PointInHouseModel]
|
|
38
|
+
"""List of points from the second subject in the houses of the first subject"""
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
|
|
2
|
+
from kerykeion.kr_types.kr_models import AstrologicalSubjectModel, PlanetReturnModel
|
|
3
|
+
from kerykeion.kr_types.kr_literals import AstrologicalPoint
|
|
4
|
+
from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS
|
|
5
|
+
from kerykeion.utilities import get_planet_house, get_house_number
|
|
6
|
+
from kerykeion.house_comparison.house_comparison_models import PointInHouseModel
|
|
7
|
+
from typing import Union
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def calculate_points_in_reciprocal_houses(
|
|
11
|
+
point_subject: Union[AstrologicalSubjectModel, PlanetReturnModel],
|
|
12
|
+
house_subject: Union[AstrologicalSubjectModel, PlanetReturnModel],
|
|
13
|
+
active_points: list[AstrologicalPoint] = DEFAULT_ACTIVE_POINTS,
|
|
14
|
+
) -> list[PointInHouseModel]:
|
|
15
|
+
"""
|
|
16
|
+
Calculates which houses of the house_subject the points of point_subject fall into.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
point_subject: Subject whose points are being analyzed
|
|
20
|
+
house_subject: Subject whose houses are being considered
|
|
21
|
+
active_points: Optional list of point names to process. If None, all points are processed.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of PointInHouseModel objects
|
|
25
|
+
"""
|
|
26
|
+
points_in_houses: list[PointInHouseModel] = []
|
|
27
|
+
|
|
28
|
+
# List of points to consider
|
|
29
|
+
celestial_points = []
|
|
30
|
+
|
|
31
|
+
for point in point_subject.active_points:
|
|
32
|
+
if point not in active_points:
|
|
33
|
+
continue
|
|
34
|
+
|
|
35
|
+
point_obj = getattr(point_subject, point.lower())
|
|
36
|
+
if point_obj is not None:
|
|
37
|
+
celestial_points.append(point_obj)
|
|
38
|
+
|
|
39
|
+
# Ordered list of house cusps degrees for house_subject
|
|
40
|
+
house_cusps = [
|
|
41
|
+
house_subject.first_house.abs_pos,
|
|
42
|
+
house_subject.second_house.abs_pos,
|
|
43
|
+
house_subject.third_house.abs_pos,
|
|
44
|
+
house_subject.fourth_house.abs_pos,
|
|
45
|
+
house_subject.fifth_house.abs_pos,
|
|
46
|
+
house_subject.sixth_house.abs_pos,
|
|
47
|
+
house_subject.seventh_house.abs_pos,
|
|
48
|
+
house_subject.eighth_house.abs_pos,
|
|
49
|
+
house_subject.ninth_house.abs_pos,
|
|
50
|
+
house_subject.tenth_house.abs_pos,
|
|
51
|
+
house_subject.eleventh_house.abs_pos,
|
|
52
|
+
house_subject.twelfth_house.abs_pos,
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
# Ordered list of house cusps degrees for point_subject
|
|
56
|
+
point_subject_house_cusps = [
|
|
57
|
+
point_subject.first_house.abs_pos,
|
|
58
|
+
point_subject.second_house.abs_pos,
|
|
59
|
+
point_subject.third_house.abs_pos,
|
|
60
|
+
point_subject.fourth_house.abs_pos,
|
|
61
|
+
point_subject.fifth_house.abs_pos,
|
|
62
|
+
point_subject.sixth_house.abs_pos,
|
|
63
|
+
point_subject.seventh_house.abs_pos,
|
|
64
|
+
point_subject.eighth_house.abs_pos,
|
|
65
|
+
point_subject.ninth_house.abs_pos,
|
|
66
|
+
point_subject.tenth_house.abs_pos,
|
|
67
|
+
point_subject.eleventh_house.abs_pos,
|
|
68
|
+
point_subject.twelfth_house.abs_pos,
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
# For each point, determine which house it falls in
|
|
72
|
+
for point in celestial_points:
|
|
73
|
+
if point is None:
|
|
74
|
+
continue
|
|
75
|
+
|
|
76
|
+
point_degree = point.abs_pos
|
|
77
|
+
house_name = get_planet_house(point_degree, house_cusps)
|
|
78
|
+
house_number = get_house_number(house_name)
|
|
79
|
+
|
|
80
|
+
# Find which house the point is in its own chart (point_subject)
|
|
81
|
+
point_owner_house_name = get_planet_house(point_degree, point_subject_house_cusps)
|
|
82
|
+
point_owner_house_number = get_house_number(point_owner_house_name)
|
|
83
|
+
|
|
84
|
+
point_in_house = PointInHouseModel(
|
|
85
|
+
point_name=point.name,
|
|
86
|
+
point_degree=point.position,
|
|
87
|
+
point_sign=point.sign,
|
|
88
|
+
point_owner_name=point_subject.name,
|
|
89
|
+
point_owner_house_name=point_owner_house_name,
|
|
90
|
+
point_owner_house_number=point_owner_house_number,
|
|
91
|
+
projected_house_number=house_number,
|
|
92
|
+
projected_house_name=house_name,
|
|
93
|
+
projected_house_owner_name=house_subject.name,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
points_in_houses.append(point_in_house)
|
|
97
|
+
|
|
98
|
+
return points_in_houses
|
|
@@ -9,6 +9,8 @@ class ChartTemplateDictionary(TypedDict):
|
|
|
9
9
|
third_circle: str
|
|
10
10
|
makeAspects: str
|
|
11
11
|
makeAspectGrid: str
|
|
12
|
+
makeDoubleChartAspectList: str
|
|
13
|
+
makeHouseComparisonGrid: str
|
|
12
14
|
chart_height: float
|
|
13
15
|
chart_width: float
|
|
14
16
|
viewbox: str
|
|
@@ -80,16 +82,22 @@ class ChartTemplateDictionary(TypedDict):
|
|
|
80
82
|
makeZodiac: str
|
|
81
83
|
makeHouses: str
|
|
82
84
|
makePlanets: str
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
makeMainPlanetGrid: str
|
|
86
|
+
makeSecondaryPlanetGrid: str
|
|
87
|
+
makeMainHousesGrid: str
|
|
88
|
+
makeSecondaryHousesGrid: str
|
|
85
89
|
|
|
86
90
|
color_style_tag: str
|
|
87
91
|
|
|
92
|
+
element_string: str
|
|
88
93
|
fire_string: str
|
|
89
94
|
earth_string: str
|
|
90
95
|
air_string: str
|
|
91
96
|
water_string: str
|
|
92
97
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
98
|
+
quality_string: str
|
|
99
|
+
cardinal_string: str
|
|
100
|
+
fixed_string: str
|
|
101
|
+
mutable_string: str
|
|
102
|
+
|
|
103
|
+
makeLunarPhase: str
|
|
@@ -25,10 +25,35 @@ HouseNumbers = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
|
|
|
25
25
|
"""Literal type for House Numbers, starting from the First House (1) to the Twelfth House (12)"""
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
AstrologicalPoint = Literal[
|
|
29
|
+
# Main Planets
|
|
30
|
+
"Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto",
|
|
31
|
+
|
|
32
|
+
# Nodes
|
|
33
|
+
"Mean_Node", "True_Node", "Mean_South_Node", "True_South_Node",
|
|
34
|
+
|
|
35
|
+
# Special Points
|
|
36
|
+
"Chiron", "Mean_Lilith", "True_Lilith", "Earth", "Pholus",
|
|
37
|
+
|
|
38
|
+
# Asteroids
|
|
39
|
+
"Ceres", "Pallas", "Juno", "Vesta",
|
|
40
|
+
|
|
41
|
+
# Trans-Neptunian Objects
|
|
42
|
+
"Eris", "Sedna", "Haumea", "Makemake", "Ixion", "Orcus", "Quaoar",
|
|
43
|
+
|
|
44
|
+
# Fixed Stars
|
|
45
|
+
"Regulus", "Spica",
|
|
46
|
+
|
|
47
|
+
# Arabic Parts
|
|
48
|
+
"Pars_Fortunae", "Pars_Spiritus", "Pars_Amoris", "Pars_Fidei",
|
|
49
|
+
|
|
50
|
+
# Special Points
|
|
51
|
+
"Vertex", "Anti_Vertex",
|
|
52
|
+
|
|
53
|
+
# Axial Cusps
|
|
54
|
+
"Ascendant", "Medium_Coeli", "Descendant", "Imum_Coeli",
|
|
55
|
+
]
|
|
30
56
|
|
|
31
|
-
AxialCusps = Literal["Ascendant", "Medium_Coeli", "Descendant", "Imum_Coeli"]
|
|
32
57
|
"""Literal type for Axial Cusps"""
|
|
33
58
|
|
|
34
59
|
|
|
@@ -40,11 +65,11 @@ Quality = Literal["Cardinal", "Fixed", "Mutable"]
|
|
|
40
65
|
"""Literal type for Qualities"""
|
|
41
66
|
|
|
42
67
|
|
|
43
|
-
ChartType = Literal["Natal", "ExternalNatal", "Synastry", "Transit", "Composite"]
|
|
68
|
+
ChartType = Literal["Natal", "ExternalNatal", "Synastry", "Transit", "Composite", "Return", "SingleWheelReturn"]
|
|
44
69
|
"""Literal type for Chart Types"""
|
|
45
70
|
|
|
46
71
|
|
|
47
|
-
PointType = Literal["
|
|
72
|
+
PointType = Literal["AstrologicalPoint", "House"]
|
|
48
73
|
"""Literal type for Point Types"""
|
|
49
74
|
|
|
50
75
|
|
|
@@ -107,7 +132,7 @@ Usually the standard is "Apparent Geocentric"
|
|
|
107
132
|
SignsEmoji = Literal["♈️", "♉️", "♊️", "♋️", "♌️", "♍️", "♎️", "♏️", "♐️", "♑️", "♒️", "♓️"]
|
|
108
133
|
"""Literal type for Zodiac Signs Emoji"""
|
|
109
134
|
|
|
110
|
-
KerykeionChartTheme = Literal["light", "dark", "dark-high-contrast", "classic"]
|
|
135
|
+
KerykeionChartTheme = Literal["light", "dark", "dark-high-contrast", "classic", "strawberry"]
|
|
111
136
|
"""Literal type for Kerykeion Chart Themes"""
|
|
112
137
|
|
|
113
138
|
|
|
@@ -136,3 +161,6 @@ AspectName = Literal[
|
|
|
136
161
|
"opposition"
|
|
137
162
|
]
|
|
138
163
|
"""Literal type for all the available aspects names"""
|
|
164
|
+
|
|
165
|
+
ReturnType = Literal["Lunar", "Solar"]
|
|
166
|
+
"""Literal type for Return Types"""
|
kerykeion/kr_types/kr_models.py
CHANGED
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
This is part of Kerykeion (C) 2025 Giacomo Battaglia
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
from typing import Union, Optional
|
|
6
|
+
from typing import Union, Optional, List
|
|
8
7
|
from typing_extensions import TypedDict
|
|
9
|
-
from pydantic import BaseModel
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
10
9
|
from kerykeion.kr_types.kr_literals import AspectName
|
|
11
10
|
|
|
12
11
|
from kerykeion.kr_types import (
|
|
13
|
-
AxialCusps,
|
|
14
12
|
LunarPhaseEmoji,
|
|
15
13
|
LunarPhaseName,
|
|
16
|
-
|
|
14
|
+
AstrologicalPoint,
|
|
17
15
|
Houses,
|
|
18
16
|
Quality,
|
|
19
17
|
Element,
|
|
@@ -23,10 +21,10 @@ from kerykeion.kr_types import (
|
|
|
23
21
|
PointType,
|
|
24
22
|
SiderealMode,
|
|
25
23
|
HousesSystemIdentifier,
|
|
26
|
-
Houses,
|
|
27
24
|
SignsEmoji,
|
|
28
25
|
RelationshipScoreDescription,
|
|
29
|
-
PerspectiveType
|
|
26
|
+
PerspectiveType,
|
|
27
|
+
ReturnType
|
|
30
28
|
)
|
|
31
29
|
|
|
32
30
|
|
|
@@ -61,7 +59,7 @@ class KerykeionPointModel(SubscriptableBaseModel):
|
|
|
61
59
|
Kerykeion Point Model
|
|
62
60
|
"""
|
|
63
61
|
|
|
64
|
-
name: Union[
|
|
62
|
+
name: Union[AstrologicalPoint, Houses]
|
|
65
63
|
quality: Quality
|
|
66
64
|
element: Element
|
|
67
65
|
sign: Sign
|
|
@@ -74,61 +72,91 @@ class KerykeionPointModel(SubscriptableBaseModel):
|
|
|
74
72
|
retrograde: Optional[bool] = None
|
|
75
73
|
|
|
76
74
|
|
|
77
|
-
class
|
|
75
|
+
class AstrologicalBaseModel(SubscriptableBaseModel):
|
|
78
76
|
"""
|
|
79
|
-
|
|
77
|
+
Base Model with common fields for all astrological subjects
|
|
80
78
|
"""
|
|
81
|
-
|
|
82
|
-
# Data
|
|
79
|
+
# Common identification data
|
|
83
80
|
name: str
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
day: int
|
|
87
|
-
hour: int
|
|
88
|
-
minute: int
|
|
81
|
+
|
|
82
|
+
# Common location data
|
|
89
83
|
city: str
|
|
90
84
|
nation: str
|
|
91
85
|
lng: float
|
|
92
86
|
lat: float
|
|
93
87
|
tz_str: str
|
|
88
|
+
|
|
89
|
+
# Common time data
|
|
90
|
+
iso_formatted_local_datetime: str
|
|
91
|
+
iso_formatted_utc_datetime: str
|
|
92
|
+
julian_day: float
|
|
93
|
+
day_of_week: str
|
|
94
|
+
|
|
95
|
+
# Common configuration
|
|
94
96
|
zodiac_type: ZodiacType
|
|
95
97
|
sidereal_mode: Union[SiderealMode, None]
|
|
96
98
|
houses_system_identifier: HousesSystemIdentifier
|
|
97
99
|
houses_system_name: str
|
|
98
100
|
perspective_type: PerspectiveType
|
|
99
|
-
iso_formatted_local_datetime: str
|
|
100
|
-
iso_formatted_utc_datetime: str
|
|
101
|
-
julian_day: float
|
|
102
|
-
|
|
103
|
-
# Deprecated properties -->
|
|
104
|
-
utc_time: float
|
|
105
|
-
local_time: float
|
|
106
|
-
# <-- Deprecated properties
|
|
107
101
|
|
|
108
|
-
|
|
109
|
-
#
|
|
102
|
+
# Common celestial points
|
|
103
|
+
# Main planets
|
|
110
104
|
sun: KerykeionPointModel
|
|
111
105
|
moon: KerykeionPointModel
|
|
112
|
-
mercury: KerykeionPointModel
|
|
113
|
-
venus: KerykeionPointModel
|
|
114
|
-
mars: KerykeionPointModel
|
|
115
|
-
jupiter: KerykeionPointModel
|
|
116
|
-
saturn: KerykeionPointModel
|
|
117
|
-
uranus: KerykeionPointModel
|
|
118
|
-
neptune: KerykeionPointModel
|
|
119
|
-
pluto: KerykeionPointModel
|
|
120
|
-
|
|
121
|
-
#
|
|
122
|
-
ascendant: KerykeionPointModel
|
|
123
|
-
descendant: KerykeionPointModel
|
|
124
|
-
medium_coeli: KerykeionPointModel
|
|
125
|
-
imum_coeli: KerykeionPointModel
|
|
126
|
-
|
|
127
|
-
#
|
|
128
|
-
chiron:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
106
|
+
mercury: Optional[KerykeionPointModel] = None
|
|
107
|
+
venus: Optional[KerykeionPointModel] = None
|
|
108
|
+
mars: Optional[KerykeionPointModel] = None
|
|
109
|
+
jupiter: Optional[KerykeionPointModel] = None
|
|
110
|
+
saturn: Optional[KerykeionPointModel] = None
|
|
111
|
+
uranus: Optional[KerykeionPointModel] = None
|
|
112
|
+
neptune: Optional[KerykeionPointModel] = None
|
|
113
|
+
pluto: Optional[KerykeionPointModel] = None
|
|
114
|
+
|
|
115
|
+
# Common axes
|
|
116
|
+
ascendant: Optional[KerykeionPointModel] = None
|
|
117
|
+
descendant: Optional[KerykeionPointModel] = None
|
|
118
|
+
medium_coeli: Optional[KerykeionPointModel] = None
|
|
119
|
+
imum_coeli: Optional[KerykeionPointModel] = None
|
|
120
|
+
|
|
121
|
+
# Common optional planets
|
|
122
|
+
chiron: Optional[KerykeionPointModel] = None
|
|
123
|
+
earth: Optional[KerykeionPointModel] = None
|
|
124
|
+
pholus: Optional[KerykeionPointModel] = None
|
|
125
|
+
|
|
126
|
+
# Lilith Points
|
|
127
|
+
mean_lilith: Optional[KerykeionPointModel] = None
|
|
128
|
+
true_lilith: Optional[KerykeionPointModel] = None
|
|
129
|
+
|
|
130
|
+
# Asteroids
|
|
131
|
+
ceres: Optional[KerykeionPointModel] = None
|
|
132
|
+
pallas: Optional[KerykeionPointModel] = None
|
|
133
|
+
juno: Optional[KerykeionPointModel] = None
|
|
134
|
+
vesta: Optional[KerykeionPointModel] = None
|
|
135
|
+
|
|
136
|
+
# Trans-Neptunian Objects
|
|
137
|
+
eris: Optional[KerykeionPointModel] = None
|
|
138
|
+
sedna: Optional[KerykeionPointModel] = None
|
|
139
|
+
haumea: Optional[KerykeionPointModel] = None
|
|
140
|
+
makemake: Optional[KerykeionPointModel] = None
|
|
141
|
+
ixion: Optional[KerykeionPointModel] = None
|
|
142
|
+
orcus: Optional[KerykeionPointModel] = None
|
|
143
|
+
quaoar: Optional[KerykeionPointModel] = None
|
|
144
|
+
|
|
145
|
+
# Fixed Stars
|
|
146
|
+
regulus: Optional[KerykeionPointModel] = None
|
|
147
|
+
spica: Optional[KerykeionPointModel] = None
|
|
148
|
+
|
|
149
|
+
# Arabic Parts
|
|
150
|
+
pars_fortunae: Optional[KerykeionPointModel] = None
|
|
151
|
+
pars_spiritus: Optional[KerykeionPointModel] = None
|
|
152
|
+
pars_amoris: Optional[KerykeionPointModel] = None
|
|
153
|
+
pars_fidei: Optional[KerykeionPointModel] = None
|
|
154
|
+
|
|
155
|
+
# Special Points
|
|
156
|
+
vertex: Optional[KerykeionPointModel] = None
|
|
157
|
+
anti_vertex: Optional[KerykeionPointModel] = None
|
|
158
|
+
|
|
159
|
+
# Common houses
|
|
132
160
|
first_house: KerykeionPointModel
|
|
133
161
|
second_house: KerykeionPointModel
|
|
134
162
|
third_house: KerykeionPointModel
|
|
@@ -142,29 +170,54 @@ class AstrologicalSubjectModel(SubscriptableBaseModel):
|
|
|
142
170
|
eleventh_house: KerykeionPointModel
|
|
143
171
|
twelfth_house: KerykeionPointModel
|
|
144
172
|
|
|
145
|
-
#
|
|
146
|
-
mean_node: KerykeionPointModel
|
|
147
|
-
true_node: KerykeionPointModel
|
|
148
|
-
mean_south_node: KerykeionPointModel
|
|
149
|
-
true_south_node: KerykeionPointModel
|
|
173
|
+
# Common nodes
|
|
174
|
+
mean_node: Optional[KerykeionPointModel] = None
|
|
175
|
+
true_node: Optional[KerykeionPointModel] = None
|
|
176
|
+
mean_south_node: Optional[KerykeionPointModel] = None
|
|
177
|
+
true_south_node: Optional[KerykeionPointModel] = None
|
|
178
|
+
|
|
179
|
+
# Common lists and settings
|
|
180
|
+
houses_names_list: List[Houses] = Field(description="Ordered list of houses names")
|
|
181
|
+
active_points: List[AstrologicalPoint] = Field(description="List of active points in the chart or aspects calculations.")
|
|
150
182
|
|
|
151
|
-
|
|
152
|
-
|
|
183
|
+
# Common lunar phase data
|
|
184
|
+
lunar_phase: LunarPhaseModel = Field(description="Lunar phase model")
|
|
153
185
|
|
|
154
|
-
axial_cusps_names_list: list[AxialCusps]
|
|
155
|
-
"""Ordered list of available axes names"""
|
|
156
186
|
|
|
157
|
-
|
|
158
|
-
"""
|
|
187
|
+
class AstrologicalSubjectModel(AstrologicalBaseModel):
|
|
188
|
+
"""
|
|
189
|
+
Pydantic Model for Astrological Subject
|
|
190
|
+
"""
|
|
191
|
+
# Specific birth/event data
|
|
192
|
+
year: int
|
|
193
|
+
month: int
|
|
194
|
+
day: int
|
|
195
|
+
hour: int
|
|
196
|
+
minute: int
|
|
159
197
|
|
|
160
|
-
|
|
161
|
-
|
|
198
|
+
|
|
199
|
+
class CompositeSubjectModel(AstrologicalBaseModel):
|
|
200
|
+
"""
|
|
201
|
+
Pydantic Model for Composite Subject
|
|
202
|
+
"""
|
|
203
|
+
# Specific composite data
|
|
204
|
+
first_subject: AstrologicalSubjectModel
|
|
205
|
+
second_subject: AstrologicalSubjectModel
|
|
206
|
+
composite_chart_type: str
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class PlanetReturnModel(AstrologicalBaseModel):
|
|
210
|
+
"""
|
|
211
|
+
Pydantic Model for Planet Return
|
|
212
|
+
"""
|
|
213
|
+
# Specific return data
|
|
214
|
+
return_type: ReturnType = Field(description="Type of return: Solar or Lunar")
|
|
162
215
|
|
|
163
216
|
|
|
164
217
|
class EphemerisDictModel(SubscriptableBaseModel):
|
|
165
218
|
date: str
|
|
166
|
-
planets:
|
|
167
|
-
houses:
|
|
219
|
+
planets: List[KerykeionPointModel]
|
|
220
|
+
houses: List[KerykeionPointModel]
|
|
168
221
|
|
|
169
222
|
|
|
170
223
|
class AspectModel(SubscriptableBaseModel):
|
|
@@ -201,80 +254,8 @@ class RelationshipScoreModel(SubscriptableBaseModel):
|
|
|
201
254
|
score_value: int
|
|
202
255
|
score_description: RelationshipScoreDescription
|
|
203
256
|
is_destiny_sign: bool
|
|
204
|
-
aspects:
|
|
205
|
-
subjects:
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
class CompositeSubjectModel(SubscriptableBaseModel):
|
|
209
|
-
"""
|
|
210
|
-
Pydantic Model for Composite Subject
|
|
211
|
-
"""
|
|
212
|
-
|
|
213
|
-
# Data
|
|
214
|
-
name: str
|
|
215
|
-
first_subject: AstrologicalSubjectModel
|
|
216
|
-
second_subject: AstrologicalSubjectModel
|
|
217
|
-
composite_chart_type: str
|
|
218
|
-
|
|
219
|
-
zodiac_type: ZodiacType
|
|
220
|
-
sidereal_mode: Union[SiderealMode, None]
|
|
221
|
-
houses_system_identifier: HousesSystemIdentifier
|
|
222
|
-
houses_system_name: str
|
|
223
|
-
perspective_type: PerspectiveType
|
|
224
|
-
|
|
225
|
-
# Planets
|
|
226
|
-
sun: KerykeionPointModel
|
|
227
|
-
moon: KerykeionPointModel
|
|
228
|
-
mercury: KerykeionPointModel
|
|
229
|
-
venus: KerykeionPointModel
|
|
230
|
-
mars: KerykeionPointModel
|
|
231
|
-
jupiter: KerykeionPointModel
|
|
232
|
-
saturn: KerykeionPointModel
|
|
233
|
-
uranus: KerykeionPointModel
|
|
234
|
-
neptune: KerykeionPointModel
|
|
235
|
-
pluto: KerykeionPointModel
|
|
236
|
-
|
|
237
|
-
# Axes
|
|
238
|
-
ascendant: KerykeionPointModel
|
|
239
|
-
descendant: KerykeionPointModel
|
|
240
|
-
medium_coeli: KerykeionPointModel
|
|
241
|
-
imum_coeli: KerykeionPointModel
|
|
242
|
-
|
|
243
|
-
# Optional Planets:
|
|
244
|
-
chiron: Union[KerykeionPointModel, None]
|
|
245
|
-
mean_lilith: Union[KerykeionPointModel, None]
|
|
246
|
-
|
|
247
|
-
# Houses
|
|
248
|
-
first_house: KerykeionPointModel
|
|
249
|
-
second_house: KerykeionPointModel
|
|
250
|
-
third_house: KerykeionPointModel
|
|
251
|
-
fourth_house: KerykeionPointModel
|
|
252
|
-
fifth_house: KerykeionPointModel
|
|
253
|
-
sixth_house: KerykeionPointModel
|
|
254
|
-
seventh_house: KerykeionPointModel
|
|
255
|
-
eighth_house: KerykeionPointModel
|
|
256
|
-
ninth_house: KerykeionPointModel
|
|
257
|
-
tenth_house: KerykeionPointModel
|
|
258
|
-
eleventh_house: KerykeionPointModel
|
|
259
|
-
twelfth_house: KerykeionPointModel
|
|
260
|
-
|
|
261
|
-
# Nodes
|
|
262
|
-
mean_node: KerykeionPointModel
|
|
263
|
-
true_node: KerykeionPointModel
|
|
264
|
-
mean_south_node: KerykeionPointModel
|
|
265
|
-
true_south_node: KerykeionPointModel
|
|
266
|
-
|
|
267
|
-
planets_names_list: list[Planet]
|
|
268
|
-
"""Ordered list of available planets names"""
|
|
269
|
-
|
|
270
|
-
axial_cusps_names_list: list[AxialCusps]
|
|
271
|
-
"""Ordered list of available axes names"""
|
|
272
|
-
|
|
273
|
-
houses_names_list: list[Houses]
|
|
274
|
-
"""Ordered list of houses names"""
|
|
275
|
-
|
|
276
|
-
lunar_phase: LunarPhaseModel
|
|
277
|
-
"""Lunar phase model"""
|
|
257
|
+
aspects: List[RelationshipScoreAspectModel]
|
|
258
|
+
subjects: List[AstrologicalSubjectModel]
|
|
278
259
|
|
|
279
260
|
|
|
280
261
|
class ActiveAspect(TypedDict):
|
|
@@ -288,17 +269,9 @@ class TransitMomentModel(SubscriptableBaseModel):
|
|
|
288
269
|
|
|
289
270
|
Captures all active aspects between moving celestial bodies and
|
|
290
271
|
the fixed positions in a person's natal chart at a specific date and time.
|
|
291
|
-
|
|
292
|
-
Attributes:
|
|
293
|
-
date: ISO 8601 formatted date and time of the transit moment.
|
|
294
|
-
aspects: List of astrological aspects active at this specific moment.
|
|
295
272
|
"""
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
"""ISO 8601 formatted date and time of the transit moment."""
|
|
299
|
-
|
|
300
|
-
aspects: list[AspectModel]
|
|
301
|
-
"""List of aspects active at this specific moment."""
|
|
273
|
+
date: str = Field(description="ISO 8601 formatted date and time of the transit moment.")
|
|
274
|
+
aspects: List[AspectModel] = Field(description="List of aspects active at this specific moment.")
|
|
302
275
|
|
|
303
276
|
|
|
304
277
|
class TransitsTimeRangeModel(SubscriptableBaseModel):
|
|
@@ -307,18 +280,7 @@ class TransitsTimeRangeModel(SubscriptableBaseModel):
|
|
|
307
280
|
|
|
308
281
|
This model holds a time series of transit snapshots, allowing analysis of
|
|
309
282
|
planetary movements and their aspects to a natal chart over a period of time.
|
|
310
|
-
|
|
311
|
-
Attributes:
|
|
312
|
-
transits: List of transit moments occurring during the specified time period.
|
|
313
|
-
subject: The astrological subject model for whom the transits are calculated.
|
|
314
|
-
dates: List of all dates in ISO 8601 format for which transits were calculated.
|
|
315
283
|
"""
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
subject: Optional[AstrologicalSubjectModel]
|
|
321
|
-
"""Astrological subject data."""
|
|
322
|
-
|
|
323
|
-
dates: Optional[list[str]]
|
|
324
|
-
"""ISO 8601 formatted dates of all transit moments."""
|
|
284
|
+
transits: List[TransitMomentModel] = Field(description="List of transit moments.")
|
|
285
|
+
subject: Optional[AstrologicalSubjectModel] = Field(description="Astrological subject data.")
|
|
286
|
+
dates: Optional[List[str]] = Field(description="ISO 8601 formatted dates of all transit moments.")
|