kerykeion 5.0.0a9__py3-none-any.whl → 5.0.0a10__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 (34) hide show
  1. kerykeion/__init__.py +22 -1
  2. kerykeion/aspects/__init__.py +7 -2
  3. kerykeion/aspects/aspects_utils.py +1 -3
  4. kerykeion/aspects/natal_aspects_factory.py +236 -0
  5. kerykeion/aspects/synastry_aspects_factory.py +234 -0
  6. kerykeion/astrological_subject_factory.py +5 -9
  7. kerykeion/charts/charts_utils.py +12 -12
  8. kerykeion/charts/draw_planets.py +3 -4
  9. kerykeion/charts/draw_planets_v2.py +5 -6
  10. kerykeion/charts/kerykeion_chart_svg.py +10 -10
  11. kerykeion/composite_subject_factory.py +1 -1
  12. kerykeion/house_comparison/__init__.py +6 -0
  13. kerykeion/house_comparison/house_comparison_factory.py +1 -1
  14. kerykeion/house_comparison/house_comparison_utils.py +0 -1
  15. kerykeion/kr_types/__init__.py +49 -0
  16. kerykeion/kr_types/kr_models.py +29 -0
  17. kerykeion/kr_types/settings_models.py +9 -1
  18. kerykeion/planetary_return_factory.py +6 -5
  19. kerykeion/relationship_score_factory.py +27 -17
  20. kerykeion/report.py +0 -1
  21. kerykeion/settings/__init__.py +5 -0
  22. kerykeion/settings/config_constants.py +20 -6
  23. kerykeion/settings/kr.config.json +80 -0
  24. kerykeion/transits_time_range.py +4 -4
  25. kerykeion/utilities.py +1 -1
  26. {kerykeion-5.0.0a9.dist-info → kerykeion-5.0.0a10.dist-info}/METADATA +9 -4
  27. kerykeion-5.0.0a10.dist-info/RECORD +53 -0
  28. kerykeion/aspects/natal_aspects.py +0 -181
  29. kerykeion/aspects/synastry_aspects.py +0 -141
  30. kerykeion/aspects/transits_time_range.py +0 -41
  31. kerykeion-5.0.0a9.dist-info/RECORD +0 -55
  32. kerykeion-5.0.0a9.dist-info/entry_points.txt +0 -2
  33. {kerykeion-5.0.0a9.dist-info → kerykeion-5.0.0a10.dist-info}/WHEEL +0 -0
  34. {kerykeion-5.0.0a9.dist-info → kerykeion-5.0.0a10.dist-info}/licenses/LICENSE +0 -0
@@ -88,7 +88,6 @@ def draw_planets(
88
88
  keys.sort()
89
89
  switch = 0
90
90
 
91
- planets_degrouped = {}
92
91
  groups = []
93
92
  planets_by_pos = list(range(len(planets_degut)))
94
93
  planet_drange = 3.4
@@ -186,7 +185,7 @@ def draw_planets(
186
185
  # position relative to next planets
187
186
  else:
188
187
  startA = (leftover / (xa + xb)) * xa
189
- startB = (leftover / (xa + xb)) * xb
188
+ (leftover / (xa + xb)) * xb
190
189
 
191
190
  if available > need:
192
191
  planets_delta[groups[a][0][0]] = startA - groups[a][0][1] + (1.5 * planet_drange)
@@ -265,7 +264,7 @@ def draw_planets(
265
264
 
266
265
  output += f'<g kr:node="ChartPoint" kr:house="{planet_details["house"]}" kr:sign="{planet_details["sign"]}" kr:slug="{planet_details["name"]}" transform="translate(-{12 * scale},-{12 * scale}) scale({scale})">'
267
266
  output += f'<use x="{planet_x * (1/scale)}" y="{planet_y * (1/scale)}" xlink:href="#{available_planets_setting[i]["name"]}" />'
268
- output += f"</g>"
267
+ output += "</g>"
269
268
 
270
269
  # make transit degut and display planets
271
270
  if chart_type == "Transit" or chart_type == "Synastry" or chart_type == "Return":
@@ -373,7 +372,7 @@ def draw_planets(
373
372
  xo = -1
374
373
  deg_x = sliceToX(0, (radius - rtext), t_offset + xo) + rtext
375
374
  deg_y = sliceToY(0, (radius - rtext), t_offset + xo) + rtext
376
- degree = int(t_offset)
375
+ int(t_offset)
377
376
  output += f'<g transform="translate({deg_x},{deg_y})">'
378
377
  output += f'<text transform="rotate({rotate})" text-anchor="{textanchor}'
379
378
  output += f'" style="fill: {available_planets_setting[i]["color"]}; font-size: 10px;">{convert_decimal_to_degree_string(t_points_deg[i], format_type="1")}'
@@ -50,15 +50,15 @@ def draw_planets_v2(
50
50
  # 1. Validate inputs and prepare data
51
51
  # -----------------------------------------------------------
52
52
  if chart_type == "Transit" and second_subject_available_kerykeion_celestial_points is None:
53
- raise KerykeionException(f"Secondary celestial points are required for Transit charts")
53
+ raise KerykeionException("Secondary celestial points are required for Transit charts")
54
54
  elif chart_type == "Synastry" and second_subject_available_kerykeion_celestial_points is None:
55
- raise KerykeionException(f"Secondary celestial points are required for Synastry charts")
55
+ raise KerykeionException("Secondary celestial points are required for Synastry charts")
56
56
  elif chart_type == "Return" and second_subject_available_kerykeion_celestial_points is None:
57
- raise KerykeionException(f"Secondary celestial points are required for Return charts")
57
+ raise KerykeionException("Secondary celestial points are required for Return charts")
58
58
 
59
59
  # Extract absolute and relative positions for main celestial points
60
60
  main_points_abs_positions = [planet.abs_pos for planet in available_kerykeion_celestial_points]
61
- main_points_rel_positions = [planet.position for planet in available_kerykeion_celestial_points]
61
+ [planet.position for planet in available_kerykeion_celestial_points]
62
62
 
63
63
  # Extract absolute and relative positions for secondary celestial points if needed
64
64
  secondary_points_abs_positions = []
@@ -87,7 +87,6 @@ def draw_planets_v2(
87
87
  # 3. Identify groups of celestial points that are close to each other
88
88
  # -----------------------------------------------------------
89
89
  point_groups = []
90
- current_group = []
91
90
  is_group_open = False
92
91
  planets_by_position = [None] * len(position_index_map)
93
92
 
@@ -573,7 +572,7 @@ def draw_secondary_points(
573
572
  # Draw point symbol
574
573
  point_x = sliceToX(0, radius - point_radius, point_offset) + point_radius
575
574
  point_y = sliceToY(0, radius - point_radius, point_offset) + point_radius
576
- output += f'<g class="transit-planet-name" transform="translate(-6,-6)"><g transform="scale(0.5)">'
575
+ output += '<g class="transit-planet-name" transform="translate(-6,-6)"><g transform="scale(0.5)">'
577
576
  output += f'<use x="{point_x*2}" y="{point_y*2}" xlink:href="#{points_settings[point_idx]["name"]}" /></g></g>'
578
577
 
579
578
  # Draw connecting line
@@ -9,8 +9,8 @@ import swisseph as swe
9
9
  from typing import get_args, Union, Optional
10
10
 
11
11
  from kerykeion.settings.kerykeion_settings import get_settings
12
- from kerykeion.aspects.synastry_aspects import SynastryAspects
13
- from kerykeion.aspects.natal_aspects import NatalAspects
12
+ from kerykeion.aspects.synastry_aspects_factory import SynastryAspectsFactory
13
+ from kerykeion.aspects.natal_aspects_factory import NatalAspectsFactory
14
14
  from kerykeion.house_comparison.house_comparison_factory import HouseComparisonFactory
15
15
  from kerykeion.kr_types import (
16
16
  KerykeionException,
@@ -73,7 +73,7 @@ from kerykeion.settings.legacy.legacy_chart_aspects_settings import DEFAULT_CHAR
73
73
  from pathlib import Path
74
74
  from scour.scour import scourString
75
75
  from string import Template
76
- from typing import Union, List, Literal
76
+ from typing import List, Literal
77
77
  from datetime import datetime
78
78
 
79
79
 
@@ -312,7 +312,7 @@ class KerykeionChartSVG:
312
312
  raise KerykeionException("First object must be an AstrologicalSubjectModel or AstrologicalSubject instance.")
313
313
 
314
314
  # Calculate aspects
315
- natal_aspects_instance = NatalAspects(
315
+ natal_aspects_instance = NatalAspectsFactory.from_subject(
316
316
  self.first_obj,
317
317
  new_settings_file=self.new_settings_file,
318
318
  active_points=self.active_points,
@@ -347,7 +347,7 @@ class KerykeionChartSVG:
347
347
  raise KerykeionException("First object must be a CompositeSubjectModel instance.")
348
348
 
349
349
  # Calculate aspects
350
- self.aspects_list = NatalAspects(self.first_obj, new_settings_file=self.new_settings_file, active_points=self.active_points).relevant_aspects
350
+ self.aspects_list = NatalAspectsFactory.from_subject(self.first_obj, new_settings_file=self.new_settings_file, active_points=self.active_points).relevant_aspects
351
351
 
352
352
  # Screen size
353
353
  self.height = self._DEFAULT_HEIGHT
@@ -378,7 +378,7 @@ class KerykeionChartSVG:
378
378
  self.second_obj = second_obj
379
379
 
380
380
  # Calculate aspects (transit to natal)
381
- synastry_aspects_instance = SynastryAspects(
381
+ synastry_aspects_instance = SynastryAspectsFactory.from_subjects(
382
382
  self.first_obj,
383
383
  self.second_obj,
384
384
  new_settings_file=self.new_settings_file,
@@ -423,7 +423,7 @@ class KerykeionChartSVG:
423
423
  self.second_obj = second_obj
424
424
 
425
425
  # Calculate aspects (natal to partner)
426
- synastry_aspects_instance = SynastryAspects(
426
+ synastry_aspects_instance = SynastryAspectsFactory.from_subjects(
427
427
  self.first_obj,
428
428
  self.second_obj,
429
429
  new_settings_file=self.new_settings_file,
@@ -464,7 +464,7 @@ class KerykeionChartSVG:
464
464
  self.second_obj = second_obj
465
465
 
466
466
  # Calculate aspects (natal to return)
467
- synastry_aspects_instance = SynastryAspects(
467
+ synastry_aspects_instance = SynastryAspectsFactory.from_subjects(
468
468
  self.first_obj,
469
469
  self.second_obj,
470
470
  new_settings_file=self.new_settings_file,
@@ -498,7 +498,7 @@ class KerykeionChartSVG:
498
498
  raise KerykeionException("First object must be an AstrologicalSubjectModel or AstrologicalSubject instance.")
499
499
 
500
500
  # Calculate aspects
501
- natal_aspects_instance = NatalAspects(
501
+ natal_aspects_instance = NatalAspectsFactory.from_subject(
502
502
  self.first_obj,
503
503
  new_settings_file=self.new_settings_file,
504
504
  active_points=self.active_points,
@@ -817,7 +817,7 @@ class KerykeionChartSVG:
817
817
  template_dict["makeAspects"] = self._draw_all_aspects_lines(self.main_radius, self.main_radius - self.third_circle_radius)
818
818
 
819
819
  # Chart title
820
- template_dict["stringTitle"] = f'{self.first_obj.name} - {self.language_settings.get("Birth Chart", "Birth Chart")}'
820
+ template_dict["stringTitle"] = f'{self.first_obj.name} - {self.language_settings.get("birth_chart", "Birth Chart")}'
821
821
 
822
822
  # Top left section
823
823
  latitude_string = convert_latitude_coordinate_to_string(self.geolat, self.language_settings["north"], self.language_settings["south"])
@@ -1,4 +1,4 @@
1
- from typing import Union, TYPE_CHECKING
1
+ from typing import Union
2
2
 
3
3
  # Fix the circular import by changing this import
4
4
  from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
@@ -1,3 +1,9 @@
1
1
 
2
2
  from .house_comparison_factory import HouseComparisonFactory
3
3
  from .house_comparison_models import HouseComparisonModel, PointInHouseModel
4
+
5
+ __all__ = [
6
+ "HouseComparisonFactory",
7
+ "HouseComparisonModel",
8
+ "PointInHouseModel",
9
+ ]
@@ -1,6 +1,6 @@
1
1
  from kerykeion.house_comparison.house_comparison_utils import calculate_points_in_reciprocal_houses
2
2
  from typing import Union
3
- from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS, DEFAULT_ACTIVE_ASPECTS
3
+ from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS
4
4
  from kerykeion.house_comparison.house_comparison_models import HouseComparisonModel
5
5
  from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
6
6
  from kerykeion.kr_types import AstrologicalSubjectModel, PlanetReturnModel
@@ -1,4 +1,3 @@
1
- from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
2
1
  from kerykeion.kr_types.kr_models import AstrologicalSubjectModel, PlanetReturnModel
3
2
  from kerykeion.kr_types.kr_literals import AstrologicalPoint
4
3
  from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS
@@ -8,3 +8,52 @@ from .kr_literals import *
8
8
  from .kr_models import *
9
9
  from .chart_types import ChartTemplateDictionary
10
10
  from .settings_models import KerykeionSettingsModel
11
+
12
+ __all__ = [
13
+ # Exceptions
14
+ "KerykeionException",
15
+
16
+ # Settings and Chart Types
17
+ "ChartTemplateDictionary",
18
+ "KerykeionSettingsModel",
19
+
20
+ # Main Literal Types (from kr_literals)
21
+ "ZodiacType",
22
+ "Sign",
23
+ "SignNumbers",
24
+ "Houses",
25
+ "HouseNumbers",
26
+ "AstrologicalPoint",
27
+ "Element",
28
+ "Quality",
29
+ "ChartType",
30
+ "PointType",
31
+ "LunarPhaseEmoji",
32
+ "LunarPhaseName",
33
+ "SiderealMode",
34
+ "HousesSystemIdentifier",
35
+ "PerspectiveType",
36
+ "SignsEmoji",
37
+ "KerykeionChartTheme",
38
+ "KerykeionChartLanguage",
39
+ "RelationshipScoreDescription",
40
+ "CompositeChartType",
41
+ "AspectName",
42
+
43
+ # Main Model Classes (from kr_models)
44
+ "SubscriptableBaseModel",
45
+ "LunarPhaseModel",
46
+ "KerykeionPointModel",
47
+ "AstrologicalBaseModel",
48
+ "AstrologicalSubjectModel",
49
+ "CompositeSubjectModel",
50
+ "PlanetReturnModel",
51
+ "EphemerisDictModel",
52
+ "AspectModel",
53
+ "ZodiacSignModel",
54
+ "RelationshipScoreAspectModel",
55
+ "RelationshipScoreModel",
56
+ "ActiveAspect",
57
+ "TransitMomentModel",
58
+ "TransitsTimeRangeModel",
59
+ ]
@@ -285,6 +285,35 @@ class TransitMomentModel(SubscriptableBaseModel):
285
285
  aspects: List[AspectModel] = Field(description="List of aspects active at this specific moment.")
286
286
 
287
287
 
288
+ class NatalAspectsModel(SubscriptableBaseModel):
289
+ """
290
+ Model representing all aspects in a natal chart.
291
+
292
+ Contains both all calculated aspects and the filtered relevant aspects
293
+ for an astrological subject.
294
+ """
295
+ subject: Union["AstrologicalSubjectModel", "CompositeSubjectModel", "PlanetReturnModel"] = Field(description="The astrological subject for which aspects were calculated.")
296
+ all_aspects: List[AspectModel] = Field(description="Complete list of all calculated aspects.")
297
+ relevant_aspects: List[AspectModel] = Field(description="Filtered list of relevant aspects based on orb settings.")
298
+ active_points: List[AstrologicalPoint] = Field(description="List of active points used in the calculation.")
299
+ active_aspects: List["ActiveAspect"] = Field(description="List of active aspects with their orb settings.")
300
+
301
+
302
+ class SynastryAspectsModel(SubscriptableBaseModel):
303
+ """
304
+ Model representing all aspects between two astrological subjects.
305
+
306
+ Contains both all calculated synastry aspects and the filtered relevant aspects
307
+ between two charts.
308
+ """
309
+ first_subject: Union["AstrologicalSubjectModel", "CompositeSubjectModel", "PlanetReturnModel"] = Field(description="The first astrological subject.")
310
+ second_subject: Union["AstrologicalSubjectModel", "CompositeSubjectModel", "PlanetReturnModel"] = Field(description="The second astrological subject.")
311
+ all_aspects: List[AspectModel] = Field(description="Complete list of all calculated synastry aspects.")
312
+ relevant_aspects: List[AspectModel] = Field(description="Filtered list of relevant synastry aspects based on orb settings.")
313
+ active_points: List[AstrologicalPoint] = Field(description="List of active points used in the calculation.")
314
+ active_aspects: List["ActiveAspect"] = Field(description="List of active aspects with their orb settings.")
315
+
316
+
288
317
  class TransitsTimeRangeModel(SubscriptableBaseModel):
289
318
  """
290
319
  Model representing a collection of transit moments for an astrological subject.
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
  from pydantic import Field
8
- from typing import List, Optional, Union
8
+ from typing import Optional
9
9
  from kerykeion.kr_types.kr_models import SubscriptableBaseModel
10
10
 
11
11
 
@@ -163,6 +163,14 @@ class KerykeionLanguageModel(SubscriptableBaseModel):
163
163
  return_point: str = Field(title="Return Point", description="The return point label in the chart, in the language")
164
164
  natal: str = Field(title="Natal", description="The natal label in the chart, in the language")
165
165
  perspective_type: str = Field(title="Perspective Type", description="The perspective type label in the chart, in the language")
166
+ location: str = Field(title="Location", description="The location label in the chart, in the language")
167
+ day_of_week: str = Field(title="Day of Week", description="The day of week label in the chart, in the language")
168
+ elements: str = Field(title="Elements", description="The elements label in the chart, in the language")
169
+ qualities: str = Field(title="Qualities", description="The qualities label in the chart, in the language")
170
+ cardinal: str = Field(title="Cardinal", description="The cardinal quality label in the chart, in the language")
171
+ fixed: str = Field(title="Fixed", description="The fixed quality label in the chart, in the language")
172
+ mutable: str = Field(title="Mutable", description="The mutable quality label in the chart, in the language")
173
+ birth_chart: str = Field(title="Birth Chart", description="The birth chart label in the chart, in the language")
166
174
 
167
175
  # Settings Model
168
176
  class KerykeionSettingsModel(SubscriptableBaseModel):
@@ -10,7 +10,7 @@ import logging
10
10
  import swisseph as swe
11
11
 
12
12
  from datetime import datetime, timezone
13
- from typing import Optional, Union
13
+ from typing import Union
14
14
 
15
15
  from kerykeion.kr_types import KerykeionException
16
16
  from kerykeion.fetch_geonames import FetchGeonames
@@ -18,6 +18,7 @@ from kerykeion.utilities import julian_to_datetime, datetime_to_julian
18
18
  from kerykeion.astrological_subject_factory import (
19
19
  GEONAMES_DEFAULT_USERNAME_WARNING,
20
20
  DEFAULT_GEONAMES_CACHE_EXPIRE_AFTER_DAYS,
21
+ DEFAULT_GEONAMES_USERNAME,
21
22
  )
22
23
  from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
23
24
  from kerykeion.kr_types.kr_literals import ReturnType
@@ -118,10 +119,10 @@ class PlanetaryReturnFactory:
118
119
  self.city_data: dict[str, str] = geonames.get_serialized_data()
119
120
 
120
121
  if (
121
- not "countryCode" in self.city_data
122
- or not "timezonestr" in self.city_data
123
- or not "lat" in self.city_data
124
- or not "lng" in self.city_data
122
+ "countryCode" not in self.city_data
123
+ or "timezonestr" not in self.city_data
124
+ or "lat" not in self.city_data
125
+ or "lng" not in self.city_data
125
126
  ):
126
127
  raise KerykeionException("No data found for this city, try again! Maybe check your connection?")
127
128
 
@@ -4,13 +4,21 @@
4
4
  """
5
5
 
6
6
  from kerykeion import AstrologicalSubjectFactory
7
- from kerykeion.aspects.synastry_aspects import SynastryAspects
7
+ from kerykeion.aspects.synastry_aspects_factory import SynastryAspectsFactory
8
8
  import logging
9
- from pathlib import Path
10
- from typing import Union
11
9
  from kerykeion.kr_types.kr_models import AstrologicalSubjectModel, RelationshipScoreAspectModel, RelationshipScoreModel
12
10
  from kerykeion.kr_types.kr_literals import RelationshipScoreDescription
13
11
 
12
+ # Scoring constants
13
+ DESTINY_SIGN_POINTS = 5
14
+ HIGH_PRECISION_ORBIT_THRESHOLD = 2
15
+ MAJOR_ASPECT_POINTS_HIGH_PRECISION = 11
16
+ MAJOR_ASPECT_POINTS_STANDARD = 8
17
+ MINOR_ASPECT_POINTS = 4
18
+ SUN_ASCENDANT_ASPECT_POINTS = 4
19
+ MOON_ASCENDANT_ASPECT_POINTS = 4
20
+ VENUS_MARS_ASPECT_POINTS = 4
21
+
14
22
 
15
23
  class RelationshipScoreFactory:
16
24
  """
@@ -56,16 +64,16 @@ class RelationshipScoreFactory:
56
64
  self.relationship_score_description: RelationshipScoreDescription = "Minimal"
57
65
  self.is_destiny_sign = True
58
66
  self.relationship_score_aspects: list[RelationshipScoreAspectModel] = []
59
- self._synastry_aspects = SynastryAspects(self.first_subject, self.second_subject).all_aspects
67
+ self._synastry_aspects = SynastryAspectsFactory.from_subjects(self.first_subject, self.second_subject).all_aspects
60
68
 
61
69
  def _evaluate_destiny_sign(self):
62
70
  """
63
71
  Evaluates if the subjects share the same sun sign quality and adds points if true.
64
72
  """
65
- if self.first_subject.sun["quality"] == self.second_subject.sun["quality"]:
73
+ if self.first_subject.sun["quality"] == self.second_subject.sun["quality"]: # type: ignore
66
74
  self.is_destiny_sign = True
67
- self.score_value += 5
68
- logging.debug(f"Destiny sign found, adding 5 points, total score: {self.score_value}")
75
+ self.score_value += DESTINY_SIGN_POINTS
76
+ logging.debug(f"Destiny sign found, adding {DESTINY_SIGN_POINTS} points, total score: {self.score_value}")
69
77
 
70
78
  def _evaluate_aspect(self, aspect, points):
71
79
  """
@@ -99,7 +107,7 @@ class RelationshipScoreFactory:
99
107
  aspect (dict): Aspect information.
100
108
  """
101
109
  if aspect["p1_name"] == "Sun" and aspect["p2_name"] == "Sun" and aspect["aspect"] in {"conjunction", "opposition", "square"}:
102
- points = 11 if aspect["orbit"] <= 2 else 8
110
+ points = MAJOR_ASPECT_POINTS_HIGH_PRECISION if aspect["orbit"] <= HIGH_PRECISION_ORBIT_THRESHOLD else MAJOR_ASPECT_POINTS_STANDARD
103
111
  self._evaluate_aspect(aspect, points)
104
112
 
105
113
  def _evaluate_sun_moon_conjunction(self, aspect):
@@ -112,7 +120,7 @@ class RelationshipScoreFactory:
112
120
  aspect (dict): Aspect information.
113
121
  """
114
122
  if {aspect["p1_name"], aspect["p2_name"]} == {"Moon", "Sun"} and aspect["aspect"] == "conjunction":
115
- points = 11 if aspect["orbit"] <= 2 else 8
123
+ points = MAJOR_ASPECT_POINTS_HIGH_PRECISION if aspect["orbit"] <= HIGH_PRECISION_ORBIT_THRESHOLD else MAJOR_ASPECT_POINTS_STANDARD
116
124
  self._evaluate_aspect(aspect, points)
117
125
 
118
126
  def _evaluate_sun_sun_other_aspects(self, aspect):
@@ -124,7 +132,7 @@ class RelationshipScoreFactory:
124
132
  aspect (dict): Aspect information.
125
133
  """
126
134
  if aspect["p1_name"] == "Sun" and aspect["p2_name"] == "Sun" and aspect["aspect"] not in {"conjunction", "opposition", "square"}:
127
- points = 4
135
+ points = MINOR_ASPECT_POINTS
128
136
  self._evaluate_aspect(aspect, points)
129
137
 
130
138
  def _evaluate_sun_moon_other_aspects(self, aspect):
@@ -136,7 +144,7 @@ class RelationshipScoreFactory:
136
144
  aspect (dict): Aspect information.
137
145
  """
138
146
  if {aspect["p1_name"], aspect["p2_name"]} == {"Moon", "Sun"} and aspect["aspect"] != "conjunction":
139
- points = 4
147
+ points = MINOR_ASPECT_POINTS
140
148
  self._evaluate_aspect(aspect, points)
141
149
 
142
150
  def _evaluate_sun_ascendant_aspect(self, aspect):
@@ -148,7 +156,7 @@ class RelationshipScoreFactory:
148
156
  aspect (dict): Aspect information.
149
157
  """
150
158
  if {aspect["p1_name"], aspect["p2_name"]} == {"Sun", "Ascendant"}:
151
- points = 4
159
+ points = SUN_ASCENDANT_ASPECT_POINTS
152
160
  self._evaluate_aspect(aspect, points)
153
161
 
154
162
  def _evaluate_moon_ascendant_aspect(self, aspect):
@@ -160,7 +168,7 @@ class RelationshipScoreFactory:
160
168
  aspect (dict): Aspect information.
161
169
  """
162
170
  if {aspect["p1_name"], aspect["p2_name"]} == {"Moon", "Ascendant"}:
163
- points = 4
171
+ points = MOON_ASCENDANT_ASPECT_POINTS
164
172
  self._evaluate_aspect(aspect, points)
165
173
 
166
174
  def _evaluate_venus_mars_aspect(self, aspect):
@@ -172,7 +180,7 @@ class RelationshipScoreFactory:
172
180
  aspect (dict): Aspect information.
173
181
  """
174
182
  if {aspect["p1_name"], aspect["p2_name"]} == {"Venus", "Mars"}:
175
- points = 4
183
+ points = VENUS_MARS_ASPECT_POINTS
176
184
  self._evaluate_aspect(aspect, points)
177
185
 
178
186
  def _evaluate_relationship_score_description(self):
@@ -218,10 +226,12 @@ if __name__ == "__main__":
218
226
 
219
227
  setup_logging(level="critical")
220
228
 
221
- john = AstrologicalSubjectFactory.from_birth_data("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
222
- yoko = AstrologicalSubjectFactory.from_birth_data("Yoko Ono", 1933, 2, 18, 18, 30, "Tokyo", "JP")
229
+ john = AstrologicalSubjectFactory.from_birth_data("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB", lng=53.416666, lat=-3, tz_str="Europe/London")
230
+ yoko = AstrologicalSubjectFactory.from_birth_data("Yoko Ono", 1933, 2, 18, 20, 30, "Tokyo", "JP", lng=35.68611, lat=139.7525, tz_str="Asia/Tokyo")
223
231
 
224
232
  factory = RelationshipScoreFactory(john, yoko)
225
233
  score = factory.get_relationship_score()
226
- print(score)
227
234
 
235
+ # Remove subjects key
236
+ score.subjects = []
237
+ print(score.model_dump_json(indent=4))
kerykeion/report.py CHANGED
@@ -1,7 +1,6 @@
1
1
  from kerykeion import AstrologicalSubjectFactory
2
2
  from simple_ascii_tables import AsciiTable
3
3
  from kerykeion.utilities import get_houses_list, get_available_astrological_points_list
4
- from typing import Union
5
4
  from kerykeion.kr_types.kr_models import AstrologicalSubjectModel
6
5
 
7
6
  class Report:
@@ -1 +1,6 @@
1
1
  from .kerykeion_settings import KerykeionSettingsModel, get_settings
2
+
3
+ __all__ = [
4
+ "KerykeionSettingsModel",
5
+ "get_settings",
6
+ ]
@@ -14,10 +14,10 @@ DEFAULT_ACTIVE_POINTS: List[AstrologicalPoint] = [
14
14
  "Uranus",
15
15
  "Neptune",
16
16
  "Pluto",
17
- "Mean_Node",
18
- # "True_Node",
19
- "Mean_South_Node",
20
- # "True_South_Node",
17
+ # "Mean_Node",
18
+ "True_Node",
19
+ # "Mean_South_Node",
20
+ "True_South_Node",
21
21
  "Chiron",
22
22
  "Mean_Lilith",
23
23
  # "True_Lilith",
@@ -38,8 +38,8 @@ DEFAULT_ACTIVE_POINTS: List[AstrologicalPoint] = [
38
38
  # "Spica",
39
39
  "Ascendant",
40
40
  "Medium_Coeli",
41
- # "Descendant",
42
- # "Imum_Coeli",
41
+ "Descendant",
42
+ "Imum_Coeli",
43
43
  # "Vertex",
44
44
  # "Anti_Vertex",
45
45
  # "Pars_Fortunae",
@@ -70,6 +70,20 @@ Default list of active aspects in the aspects calculations.
70
70
  The full list of aspects is available in the `kr_types.kr_literals.AspectName` literal.
71
71
  """
72
72
 
73
+ DISCEPOLO_SCORE_ACTIVE_ASPECTS: List[ActiveAspect] = [
74
+ {"name": "conjunction", "orb": 8},
75
+ {"name": "semi-sextile", "orb": 2},
76
+ {"name": "semi-square", "orb": 2},
77
+ {"name": "sextile", "orb": 4},
78
+ {"name": "square", "orb": 5},
79
+ {"name": "trine", "orb": 7},
80
+ {"name": "sesquiquadrate", "orb": 2},
81
+ {"name": "opposition", "orb": 8},
82
+ ]
83
+ """
84
+ List of active aspects with their orbs according to Ciro Discepolo's affinity scoring methodology.
85
+ """
86
+
73
87
  DEFAULT_AXIS_ORBIT: int = 1
74
88
  """
75
89
  Default orbit for the axes aspects.