kerykeion 5.0.0a9__py3-none-any.whl → 5.1.8__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 (79) hide show
  1. kerykeion/__init__.py +50 -9
  2. kerykeion/aspects/__init__.py +5 -2
  3. kerykeion/aspects/aspects_factory.py +568 -0
  4. kerykeion/aspects/aspects_utils.py +78 -11
  5. kerykeion/astrological_subject_factory.py +1032 -275
  6. kerykeion/backword.py +820 -0
  7. kerykeion/chart_data_factory.py +552 -0
  8. kerykeion/charts/chart_drawer.py +2661 -0
  9. kerykeion/charts/charts_utils.py +652 -399
  10. kerykeion/charts/draw_planets.py +603 -353
  11. kerykeion/charts/templates/aspect_grid_only.xml +326 -198
  12. kerykeion/charts/templates/chart.xml +306 -256
  13. kerykeion/charts/templates/wheel_only.xml +330 -200
  14. kerykeion/charts/themes/black-and-white.css +148 -0
  15. kerykeion/charts/themes/classic.css +11 -0
  16. kerykeion/charts/themes/dark-high-contrast.css +11 -0
  17. kerykeion/charts/themes/dark.css +11 -0
  18. kerykeion/charts/themes/light.css +11 -0
  19. kerykeion/charts/themes/strawberry.css +10 -0
  20. kerykeion/composite_subject_factory.py +232 -13
  21. kerykeion/ephemeris_data_factory.py +443 -0
  22. kerykeion/fetch_geonames.py +78 -21
  23. kerykeion/house_comparison/__init__.py +4 -1
  24. kerykeion/house_comparison/house_comparison_factory.py +52 -19
  25. kerykeion/house_comparison/house_comparison_utils.py +37 -9
  26. kerykeion/kr_types/__init__.py +66 -6
  27. kerykeion/kr_types/chart_template_model.py +20 -0
  28. kerykeion/kr_types/kerykeion_exception.py +15 -9
  29. kerykeion/kr_types/kr_literals.py +14 -160
  30. kerykeion/kr_types/kr_models.py +14 -291
  31. kerykeion/kr_types/settings_models.py +15 -167
  32. kerykeion/planetary_return_factory.py +545 -40
  33. kerykeion/relationship_score_factory.py +137 -63
  34. kerykeion/report.py +749 -64
  35. kerykeion/schemas/__init__.py +106 -0
  36. kerykeion/schemas/chart_template_model.py +367 -0
  37. kerykeion/schemas/kerykeion_exception.py +20 -0
  38. kerykeion/schemas/kr_literals.py +181 -0
  39. kerykeion/schemas/kr_models.py +603 -0
  40. kerykeion/schemas/settings_models.py +188 -0
  41. kerykeion/settings/__init__.py +20 -1
  42. kerykeion/settings/chart_defaults.py +444 -0
  43. kerykeion/settings/config_constants.py +88 -12
  44. kerykeion/settings/kerykeion_settings.py +32 -75
  45. kerykeion/settings/translation_strings.py +1499 -0
  46. kerykeion/settings/translations.py +74 -0
  47. kerykeion/sweph/ast136/s136108s.se1 +0 -0
  48. kerykeion/sweph/ast136/s136199s.se1 +0 -0
  49. kerykeion/sweph/ast136/s136472s.se1 +0 -0
  50. kerykeion/sweph/ast28/se28978s.se1 +0 -0
  51. kerykeion/sweph/ast50/se50000s.se1 +0 -0
  52. kerykeion/sweph/ast90/se90377s.se1 +0 -0
  53. kerykeion/sweph/ast90/se90482s.se1 +0 -0
  54. kerykeion/sweph/sefstars.txt +1602 -0
  55. kerykeion/transits_time_range_factory.py +302 -0
  56. kerykeion/utilities.py +289 -204
  57. kerykeion-5.1.8.dist-info/METADATA +1793 -0
  58. kerykeion-5.1.8.dist-info/RECORD +63 -0
  59. kerykeion/aspects/natal_aspects.py +0 -181
  60. kerykeion/aspects/synastry_aspects.py +0 -141
  61. kerykeion/aspects/transits_time_range.py +0 -41
  62. kerykeion/charts/draw_planets_v2.py +0 -649
  63. kerykeion/charts/draw_planets_v3.py +0 -679
  64. kerykeion/charts/kerykeion_chart_svg.py +0 -2038
  65. kerykeion/enums.py +0 -57
  66. kerykeion/ephemeris_data.py +0 -238
  67. kerykeion/house_comparison/house_comparison_models.py +0 -38
  68. kerykeion/kr_types/chart_types.py +0 -106
  69. kerykeion/settings/kr.config.json +0 -1304
  70. kerykeion/settings/legacy/__init__.py +0 -0
  71. kerykeion/settings/legacy/legacy_celestial_points_settings.py +0 -299
  72. kerykeion/settings/legacy/legacy_chart_aspects_settings.py +0 -71
  73. kerykeion/settings/legacy/legacy_color_settings.py +0 -42
  74. kerykeion/transits_time_range.py +0 -128
  75. kerykeion-5.0.0a9.dist-info/METADATA +0 -636
  76. kerykeion-5.0.0a9.dist-info/RECORD +0 -55
  77. kerykeion-5.0.0a9.dist-info/entry_points.txt +0 -2
  78. {kerykeion-5.0.0a9.dist-info → kerykeion-5.1.8.dist-info}/WHEEL +0 -0
  79. {kerykeion-5.0.0a9.dist-info → kerykeion-5.1.8.dist-info}/licenses/LICENSE +0 -0
@@ -4,18 +4,14 @@
4
4
  """
5
5
  # TODO: Better documentation and unit tests
6
6
 
7
- from kerykeion.settings import KerykeionSettingsModel
8
7
  from swisseph import difdeg2n
9
- from typing import Union, TYPE_CHECKING
10
- from kerykeion.kr_types.kr_models import AstrologicalSubjectModel, CompositeSubjectModel, PlanetReturnModel
11
- from kerykeion.kr_types.kr_literals import AstrologicalPoint
12
- from kerykeion.kr_types.settings_models import KerykeionSettingsCelestialPointModel
13
- from kerykeion.settings.legacy.legacy_celestial_points_settings import DEFAULT_CELESTIAL_POINTS_SETTINGS
8
+ from typing import Union
9
+ from kerykeion.schemas.kr_models import AstrologicalSubjectModel, CompositeSubjectModel, PlanetReturnModel
10
+ from kerykeion.schemas.kr_literals import AspectMovementType
11
+ from kerykeion.schemas.settings_models import KerykeionSettingsCelestialPointModel
12
+ from kerykeion.settings.chart_defaults import DEFAULT_CELESTIAL_POINTS_SETTINGS
14
13
 
15
14
 
16
- if TYPE_CHECKING:
17
- from kerykeion import AstrologicalSubjectFactory
18
-
19
15
  def get_aspect_from_two_points(
20
16
  aspects_settings: Union[list[dict], list[dict]],
21
17
  point_one: Union[float, int],
@@ -53,13 +49,84 @@ def get_aspect_from_two_points(
53
49
  return {
54
50
  "verdict": verdict,
55
51
  "name": name,
56
- "orbit": distance - aspect_degrees,
57
- "distance": distance - aspect_degrees,
52
+ "orbit": abs(distance - aspect_degrees),
53
+ "distance": abs(distance - aspect_degrees),
58
54
  "aspect_degrees": aspect_degrees,
59
55
  "diff": diff,
60
56
  }
61
57
 
62
58
 
59
+ def calculate_aspect_movement(
60
+ point_one_abs_pos: float,
61
+ point_two_abs_pos: float,
62
+ aspect_degrees: int,
63
+ exact_orb_threshold: float = 0.05
64
+ ) -> AspectMovementType:
65
+ """
66
+ Calculate whether an aspect is applying, separating, or exact.
67
+
68
+ An aspect is:
69
+ - "Exact": When the orb is very tight (default < 0.17°)
70
+ - "Applying": When the faster planet is moving toward the exact aspect
71
+ - "Separating": When the faster planet is moving away from the exact aspect
72
+
73
+ For simplicity, we assume the first planet (p1) is faster than the second (p2).
74
+ This is generally true for:
75
+ - Moon vs outer planets
76
+ - Inner planets vs outer planets
77
+ - Transits (transiting planet vs natal planet)
78
+
79
+ Args:
80
+ point_one_abs_pos: Absolute position of first point (0-360°)
81
+ point_two_abs_pos: Absolute position of second point (0-360°)
82
+ aspect_degrees: The exact degree of the aspect (0, 60, 90, 120, 180, etc.)
83
+ exact_orb_threshold: Maximum orb to consider aspect "exact" (default 0.17°)
84
+
85
+ Returns:
86
+ "Applying", "Separating", or "Exact"
87
+
88
+ Example:
89
+ >>> # Moon at 45° applying to Sun at 50° (conjunction at 0°/360°)
90
+ >>> calculate_aspect_movement(45, 50, 0)
91
+ 'Applying'
92
+ >>> # Moon at 55° separating from Sun at 50° (conjunction)
93
+ >>> calculate_aspect_movement(55, 50, 0)
94
+ 'Separating'
95
+ """
96
+
97
+ # Calculate the angular distance
98
+ distance = abs(difdeg2n(point_one_abs_pos, point_two_abs_pos))
99
+ orbit = abs(distance - aspect_degrees)
100
+
101
+ # Check if aspect is exact (within tight orb)
102
+ if orbit <= exact_orb_threshold:
103
+ return "Exact"
104
+
105
+ # Calculate if p1 is ahead or behind p2 relative to the aspect
106
+ # We need to determine the direction of movement
107
+ diff = difdeg2n(point_one_abs_pos, point_two_abs_pos)
108
+
109
+ # For conjunction (0°) or opposition (180°)
110
+ if aspect_degrees == 0 or aspect_degrees == 360:
111
+ # If p1 is behind p2 (negative diff), it's applying
112
+ # If p1 is ahead of p2 (positive diff), it's separating
113
+ return "Applying" if diff < 0 else "Separating"
114
+
115
+ elif aspect_degrees == 180:
116
+ # For opposition, the logic is reversed
117
+ return "Applying" if abs(diff) < 180 else "Separating"
118
+
119
+ else:
120
+ # For other aspects (60°, 90°, 120°, 150°)
121
+ # Check if the distance is increasing or decreasing
122
+ # If distance < aspect_degrees and diff < 0: applying
123
+ # If distance > aspect_degrees or diff > 0: separating
124
+ if abs(diff) < aspect_degrees:
125
+ return "Applying" if diff < 0 else "Separating"
126
+ else:
127
+ return "Separating" if diff > 0 else "Applying"
128
+
129
+
63
130
  def planet_id_decoder(planets_settings: list[KerykeionSettingsCelestialPointModel], name: str) -> int:
64
131
  """
65
132
  Check if the name of the planet is the same in the settings and return