kerykeion 4.26.1__py3-none-any.whl → 5.0.0a1__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.

Files changed (50) hide show
  1. kerykeion/__init__.py +8 -5
  2. kerykeion/aspects/aspects_utils.py +14 -8
  3. kerykeion/aspects/natal_aspects.py +26 -17
  4. kerykeion/aspects/synastry_aspects.py +32 -15
  5. kerykeion/aspects/transits_time_range.py +2 -2
  6. kerykeion/astrological_subject_factory.py +1132 -0
  7. kerykeion/charts/charts_utils.py +583 -85
  8. kerykeion/charts/draw_planets.py +9 -8
  9. kerykeion/charts/draw_planets_v2.py +639 -0
  10. kerykeion/charts/kerykeion_chart_svg.py +1289 -592
  11. kerykeion/charts/templates/chart.xml +178 -79
  12. kerykeion/charts/templates/wheel_only.xml +13 -12
  13. kerykeion/charts/themes/classic.css +91 -76
  14. kerykeion/charts/themes/dark-high-contrast.css +129 -107
  15. kerykeion/charts/themes/dark.css +130 -107
  16. kerykeion/charts/themes/light.css +130 -103
  17. kerykeion/charts/themes/strawberry.css +143 -0
  18. kerykeion/composite_subject_factory.py +26 -43
  19. kerykeion/ephemeris_data.py +6 -10
  20. kerykeion/house_comparison/__init__.py +3 -0
  21. kerykeion/house_comparison/house_comparison_factory.py +70 -0
  22. kerykeion/house_comparison/house_comparison_models.py +38 -0
  23. kerykeion/house_comparison/house_comparison_utils.py +98 -0
  24. kerykeion/kr_types/chart_types.py +9 -3
  25. kerykeion/kr_types/kr_literals.py +34 -6
  26. kerykeion/kr_types/kr_models.py +122 -160
  27. kerykeion/kr_types/settings_models.py +107 -143
  28. kerykeion/planetary_return_factory.py +299 -0
  29. kerykeion/relationship_score/relationship_score.py +3 -3
  30. kerykeion/relationship_score/relationship_score_factory.py +9 -12
  31. kerykeion/report.py +4 -4
  32. kerykeion/settings/config_constants.py +35 -6
  33. kerykeion/settings/kerykeion_settings.py +1 -0
  34. kerykeion/settings/kr.config.json +1301 -1255
  35. kerykeion/settings/legacy/__init__.py +0 -0
  36. kerykeion/settings/legacy/legacy_celestial_points_settings.py +299 -0
  37. kerykeion/settings/legacy/legacy_chart_aspects_settings.py +71 -0
  38. kerykeion/settings/legacy/legacy_color_settings.py +42 -0
  39. kerykeion/transits_time_range.py +13 -9
  40. kerykeion/utilities.py +228 -31
  41. {kerykeion-4.26.1.dist-info → kerykeion-5.0.0a1.dist-info}/METADATA +137 -10
  42. kerykeion-5.0.0a1.dist-info/RECORD +56 -0
  43. {kerykeion-4.26.1.dist-info → kerykeion-5.0.0a1.dist-info}/WHEEL +1 -1
  44. kerykeion/.DS_Store +0 -0
  45. kerykeion/astrological_subject.py +0 -841
  46. kerykeion/charts/.DS_Store +0 -0
  47. kerykeion-4.26.1.dist-info/LICENSE +0 -661
  48. kerykeion-4.26.1.dist-info/RECORD +0 -48
  49. /LICENSE → /kerykeion-5.0.0a1.dist-info/LICENSE +0 -0
  50. {kerykeion-4.26.1.dist-info → kerykeion-5.0.0a1.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
@@ -85,11 +87,15 @@ class ChartTemplateDictionary(TypedDict):
85
87
 
86
88
  color_style_tag: str
87
89
 
90
+ element_string: str
88
91
  fire_string: str
89
92
  earth_string: str
90
93
  air_string: str
91
94
  water_string: str
92
95
 
93
- lunar_phase_rotate: str
94
- lunar_phase_circle_center_x: str
95
- lunar_phase_circle_radius: str
96
+ quality_string: str
97
+ cardinal_string: str
98
+ fixed_string: str
99
+ mutable_string: str
100
+
101
+ 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
- Planet = Literal["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto", "Mean_Node", "True_Node", "Mean_South_Node", "True_South_Node", "Chiron", "Mean_Lilith"]
29
- """Literal type for Planets"""
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["Planet", "House", "AxialCusps"]
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"""
@@ -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
- Planet,
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[Planet, Houses, AxialCusps]
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 AstrologicalSubjectModel(SubscriptableBaseModel):
75
+ class AstrologicalBaseModel(SubscriptableBaseModel):
78
76
  """
79
- Pydantic Model for Astrological Subject
77
+ Base Model with common fields for all astrological subjects
80
78
  """
81
-
82
- # Data
79
+ # Common identification data
83
80
  name: str
84
- year: int
85
- month: int
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
- # Planets
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
- # Axes
122
- ascendant: KerykeionPointModel
123
- descendant: KerykeionPointModel
124
- medium_coeli: KerykeionPointModel
125
- imum_coeli: KerykeionPointModel
126
-
127
- # Optional Planets:
128
- chiron: Union[KerykeionPointModel, None]
129
- mean_lilith: Union[KerykeionPointModel, None]
130
-
131
- # Houses
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
- # Nodes
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
- planets_names_list: list[Planet]
152
- """Ordered list of available planets names"""
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
- houses_names_list: list[Houses]
158
- """Ordered list of houses names"""
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
- lunar_phase: LunarPhaseModel
161
- """Lunar phase model"""
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: list[KerykeionPointModel]
167
- houses: list[KerykeionPointModel]
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: list[RelationshipScoreAspectModel]
205
- subjects: list[AstrologicalSubjectModel]
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
- date: str
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
- transits: list[TransitMomentModel]
318
- """List of transit moments."""
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.")