kerykeion 4.21.0__py3-none-any.whl → 4.22.0__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.

@@ -16,10 +16,10 @@ from kerykeion.kr_types.settings_models import KerykeionSettingsModel
16
16
 
17
17
 
18
18
  AXES_LIST = [
19
- "First_House",
20
- "Tenth_House",
21
- "Seventh_House",
22
- "Fourth_House",
19
+ "Ascendant",
20
+ "Medium_Coeli",
21
+ "Descendant",
22
+ "Imum_Coeli",
23
23
  ]
24
24
 
25
25
 
@@ -54,18 +54,23 @@ class NatalAspects:
54
54
  for first in range(len(active_points_list)):
55
55
  # Generates the aspects list without repetitions
56
56
  for second in range(first + 1, len(active_points_list)):
57
- # South Node and North Node are always in opposition
58
- nodes_pairs = {
57
+ # AC/DC, MC/IC and North/South nodes are always in opposition
58
+ opposite_pairs = {
59
+ ("Ascendant", "Descendant"),
60
+ ("Descendant", "Ascendant"),
61
+ ("Medium_Coeli", "Imum_Coeli"),
62
+ ("Imum_Coeli", "Medium_Coeli"),
59
63
  ("True_Node", "True_South_Node"),
60
64
  ("Mean_Node", "Mean_South_Node"),
61
65
  ("True_South_Node", "True_Node"),
62
66
  ("Mean_South_Node", "Mean_Node"),
63
67
  }
64
- if (active_points_list[first]["name"], active_points_list[second]["name"]) in nodes_pairs:
68
+ if (active_points_list[first]["name"], active_points_list[second]["name"]) in opposite_pairs:
65
69
  continue
66
70
 
67
71
  aspect = get_aspect_from_two_points(
68
- self.aspects_settings, active_points_list[first]["abs_pos"],
72
+ self.aspects_settings,
73
+ active_points_list[first]["abs_pos"],
69
74
  active_points_list[second]["abs_pos"]
70
75
  )
71
76
 
@@ -109,6 +114,8 @@ class NatalAspects:
109
114
  self.all_aspects
110
115
 
111
116
  aspects_filtered = []
117
+
118
+ # Only pick aspects for which the is_active setting (specified usually in kr.config.json file) is true.
112
119
  for a in self.all_aspects_list:
113
120
  if self.aspects_settings[a["aid"]]["is_active"] == True:
114
121
  aspects_filtered.append(a)
@@ -116,6 +123,8 @@ class NatalAspects:
116
123
  axes_list = AXES_LIST
117
124
  counter = 0
118
125
 
126
+ # Remove aspects where the orbits exceed the maximum orb thresholds specified in the settings
127
+ # (specified usually in kr.config.json file)
119
128
  aspects_list_subtract = []
120
129
  for a in aspects_filtered:
121
130
  counter += 1
@@ -144,7 +153,7 @@ if __name__ == "__main__":
144
153
 
145
154
  # All aspects as a list of dictionaries
146
155
  aspects = NatalAspects(johnny)
147
- print([a.model_dump() for a in aspects.all_aspects])
156
+ #print([a.model_dump() for a in aspects.all_aspects])
148
157
 
149
158
  print("\n")
150
159
 
@@ -8,7 +8,9 @@ import swisseph as swe
8
8
  import logging
9
9
  import warnings
10
10
 
11
+ import math
11
12
  from datetime import datetime
13
+
12
14
  from functools import cached_property
13
15
  from kerykeion.fetch_geonames import FetchGeonames
14
16
  from kerykeion.kr_types import (
@@ -22,7 +24,8 @@ from kerykeion.kr_types import (
22
24
  HousesSystemIdentifier,
23
25
  PerspectiveType,
24
26
  Planet,
25
- Houses
27
+ Houses,
28
+ AxialCusps,
26
29
  )
27
30
  from kerykeion.utilities import (
28
31
  get_number_from_name,
@@ -144,6 +147,12 @@ class AstrologicalSubject:
144
147
  true_south_node: KerykeionPointModel
145
148
  mean_south_node: KerykeionPointModel
146
149
 
150
+ # Axes
151
+ asc: KerykeionPointModel
152
+ dsc: KerykeionPointModel
153
+ mc: KerykeionPointModel
154
+ ic: KerykeionPointModel
155
+
147
156
  # Houses
148
157
  first_house: KerykeionPointModel
149
158
  second_house: KerykeionPointModel
@@ -161,13 +170,15 @@ class AstrologicalSubject:
161
170
  # Lists
162
171
  _houses_list: list[KerykeionPointModel]
163
172
  _houses_degree_ut: list[float]
173
+ planets_names_list: list[Planet]
174
+ houses_names_list: list[Houses]
175
+ axial_cusps_names_list: list[AxialCusps]
164
176
 
165
177
  # Enable or disable features
166
178
  disable_chiron: Union[None, bool]
167
179
  disable_chiron_and_lilith: bool
168
180
 
169
- planets_names_list: list[Planet]
170
- houses_names_list: list[Houses]
181
+ lunar_phase: LunarPhaseModel
171
182
 
172
183
  def __init__(
173
184
  self,
@@ -436,20 +447,29 @@ class AstrologicalSubject:
436
447
  Y APC houses
437
448
  """
438
449
 
450
+ _ascmc = (-1.0, -1.0)
451
+
439
452
  if self.zodiac_type == "Sidereal":
440
- self._houses_degree_ut = swe.houses_ex(
453
+ cusps, ascmc = swe.houses_ex(
441
454
  tjdut=self.julian_day,
442
455
  lat=self.lat, lon=self.lng,
443
456
  hsys=str.encode(self.houses_system_identifier),
444
457
  flags=swe.FLG_SIDEREAL
445
- )[0]
458
+ )
459
+ self._houses_degree_ut = cusps
460
+ _ascmc = ascmc
446
461
 
447
462
  elif self.zodiac_type == "Tropic":
448
- self._houses_degree_ut = swe.houses(
463
+ cusps, ascmc = swe.houses(
449
464
  tjdut=self.julian_day, lat=self.lat,
450
465
  lon=self.lng,
451
466
  hsys=str.encode(self.houses_system_identifier)
452
- )[0]
467
+ )
468
+ self._houses_degree_ut = cusps
469
+ _ascmc = ascmc
470
+
471
+ else:
472
+ raise KerykeionException("Not a valid zodiac type: ", self.zodiac_type)
453
473
 
454
474
  point_type: PointType = "House"
455
475
 
@@ -485,6 +505,19 @@ class AstrologicalSubject:
485
505
  self.twelfth_house,
486
506
  ]
487
507
 
508
+ # AxialCusps
509
+ point_type: PointType = "AxialCusps"
510
+
511
+ # Calculate ascendant and medium coeli
512
+ self.ascendant = get_kerykeion_point_from_degree(_ascmc[0], "Ascendant", point_type=point_type)
513
+ self.medium_coeli = get_kerykeion_point_from_degree(_ascmc[1], "Medium_Coeli", point_type=point_type)
514
+ # For descendant and imum coeli there exist no Swiss Ephemeris library calculation function,
515
+ # but they are simply opposite the the ascendant and medium coeli
516
+ dsc_deg = math.fmod(_ascmc[0] + 180, 360)
517
+ ic_deg = math.fmod(_ascmc[1] + 180, 360)
518
+ self.descendant = get_kerykeion_point_from_degree(dsc_deg, "Descendant", point_type=point_type)
519
+ self.imum_coeli = get_kerykeion_point_from_degree(ic_deg, "Imum_Coeli", point_type=point_type)
520
+
488
521
  def _initialize_planets(self) -> None:
489
522
  """Defines body positon in signs and information and
490
523
  stores them in dictionaries"""
@@ -505,8 +538,10 @@ class AstrologicalSubject:
505
538
  true_node_deg = swe.calc(self.julian_day, 11, self._iflag)[0][0]
506
539
  # For south nodes there exist no Swiss Ephemeris library calculation function,
507
540
  # but they are simply opposite the north node.
508
- mean_south_node_deg = (mean_node_deg + 180) % 360
509
- true_south_node_deg = (true_node_deg + 180) % 360
541
+ mean_south_node_deg = math.fmod(mean_node_deg + 180, 360)
542
+ true_south_node_deg = math.fmod(true_node_deg + 180, 360)
543
+
544
+ # AC/DC axis and MC/IC axis were already calculated previously...
510
545
 
511
546
  self.sun = get_kerykeion_point_from_degree(sun_deg, "Sun", point_type=point_type)
512
547
  self.moon = get_kerykeion_point_from_degree(moon_deg, "Moon", point_type=point_type)
@@ -523,6 +558,13 @@ class AstrologicalSubject:
523
558
  self.mean_south_node = get_kerykeion_point_from_degree(mean_south_node_deg, "Mean_South_Node", point_type=point_type)
524
559
  self.true_south_node = get_kerykeion_point_from_degree(true_south_node_deg, "True_South_Node", point_type=point_type)
525
560
 
561
+ # Note that in whole-sign house systems ac/dc or mc/ic axes may not align with house cusps.
562
+ # Therefore, for the axes we need to calculate house positions explicitly too.
563
+ self.ascendant.house = get_planet_house(self.ascendant.abs_pos, self._houses_degree_ut)
564
+ self.descendant.house = get_planet_house(self.descendant.abs_pos, self._houses_degree_ut)
565
+ self.medium_coeli.house = get_planet_house(self.medium_coeli.abs_pos, self._houses_degree_ut)
566
+ self.imum_coeli.house = get_planet_house(self.imum_coeli.abs_pos, self._houses_degree_ut)
567
+
526
568
  self.sun.house = get_planet_house(sun_deg, self._houses_degree_ut)
527
569
  self.moon.house = get_planet_house(moon_deg, self._houses_degree_ut)
528
570
  self.mercury.house = get_planet_house(mercury_deg, self._houses_degree_ut)
@@ -577,6 +619,9 @@ class AstrologicalSubject:
577
619
 
578
620
  # FIXME: Update after removing planets_list
579
621
  self.planets_names_list = [planet["name"] for planet in planets_list]
622
+ self.axial_cusps_names_list = [
623
+ axis["name"] for axis in [self.ascendant, self.descendant, self.medium_coeli, self.imum_coeli]
624
+ ]
580
625
 
581
626
  # Check in retrograde or not:
582
627
  for planet in planets_list:
@@ -589,11 +634,17 @@ class AstrologicalSubject:
589
634
  elif planet_number == 1100: # Number of True South Node
590
635
  planet_number = 11 # Number of True North Node
591
636
 
637
+
592
638
  if swe.calc(self.julian_day, planet_number, self._iflag)[0][3] < 0:
593
639
  planet["retrograde"] = True
594
640
  else:
595
641
  planet["retrograde"] = False
596
642
 
643
+ # AC/DC and MC/IC axes are never retrograde. For consistency, set them to be not retrograde.
644
+ self.ascendant.retrograde = False
645
+ self.descendant.retrograde = False
646
+ self.medium_coeli.retrograde = False
647
+ self.imum_coeli.retrograde = False
597
648
 
598
649
  def _initialize_moon_phase(self) -> None:
599
650
  """
@@ -18,13 +18,6 @@ def get_decoded_kerykeion_celestial_point_name(input_planet_name: str, celestial
18
18
  str: The decoded celestial point name.
19
19
  """
20
20
 
21
- # Dictionary for special house names
22
- special_house_names = {
23
- "First_House": "Asc",
24
- "Seventh_House": "Dsc",
25
- "Tenth_House": "Mc",
26
- "Fourth_House": "Ic"
27
- }
28
21
 
29
22
  # Get the language model keys
30
23
  language_keys = celestial_point_language.model_dump().keys()
@@ -32,11 +25,8 @@ def get_decoded_kerykeion_celestial_point_name(input_planet_name: str, celestial
32
25
  # Check if the input planet name exists in the language model
33
26
  if input_planet_name in language_keys:
34
27
  return celestial_point_language[input_planet_name]
35
-
36
- # Return the special house name if it exists, otherwise return an empty string
37
- decoded_special_name = special_house_names.get(input_planet_name, "")
38
- return celestial_point_language[decoded_special_name]
39
-
28
+ else:
29
+ raise KerykeionException(f"Celestial point {input_planet_name} not found in language model.")
40
30
 
41
31
  def decHourJoin(inH: int, inM: int, inS: int) -> float:
42
32
  """Join hour, minutes, seconds, timezone integer to hour float.
@@ -88,7 +88,6 @@ class KerykeionChartSVG:
88
88
  earth: float
89
89
  air: float
90
90
  water: float
91
- main_radius: float
92
91
  first_circle_radius: float
93
92
  second_circle_radius: float
94
93
  third_circle_radius: float
@@ -634,8 +633,7 @@ class KerykeionChartSVG:
634
633
  with open(chartname, "w", encoding="utf-8", errors="ignore") as output_file:
635
634
  output_file.write(self.template)
636
635
 
637
- logging.info(f"SVG Generated Correctly in: {chartname}")
638
-
636
+ print(f"SVG Generated Correctly in: {chartname}")
639
637
  def makeWheelOnlyTemplate(self, minify: bool = False):
640
638
  """Creates the template for the SVG file with only the wheel"""
641
639
 
@@ -662,8 +660,7 @@ class KerykeionChartSVG:
662
660
  with open(chartname, "w", encoding="utf-8", errors="ignore") as output_file:
663
661
  output_file.write(template)
664
662
 
665
- logging.info(f"SVG Generated Correctly in: {chartname}")
666
-
663
+ print(f"SVG Generated Correctly in: {chartname}")
667
664
  def makeAspectGridOnlyTemplate(self, minify: bool = False):
668
665
  """Creates the template for the SVG file with only the aspect grid"""
669
666
 
@@ -696,8 +693,7 @@ class KerykeionChartSVG:
696
693
  with open(chartname, "w", encoding="utf-8", errors="ignore") as output_file:
697
694
  output_file.write(template)
698
695
 
699
- logging.info(f"SVG Generated Correctly in: {chartname}")
700
-
696
+ print(f"SVG Generated Correctly in: {chartname}")
701
697
 
702
698
  if __name__ == "__main__":
703
699
  from kerykeion.utilities import setup_logging
@@ -176,16 +176,16 @@ OpenAstro.org -->
176
176
  style="fill: $planets_color_16;" />
177
177
  </g>
178
178
  </symbol>
179
- <symbol id="First_House">
179
+ <symbol id="Ascendant">
180
180
  <text y="20" style="font-size: 22px; fill: $planets_color_12">As</text>
181
181
  </symbol>
182
- <symbol id="Tenth_House">
182
+ <symbol id="Medium_Coeli">
183
183
  <text y="20" style="font-size: 20px; fill: $planets_color_13">Mc</text>
184
184
  </symbol>
185
- <symbol id="Seventh_House">
185
+ <symbol id="Descendant">
186
186
  <text y="20" style="font-size: 22px; fill: $planets_color_14">Ds</text>
187
187
  </symbol>
188
- <symbol id="Fourth_House">
188
+ <symbol id="Imum_Coeli">
189
189
  <text y="20" style="font-size: 22px; fill: $planets_color_15">Ic</text>
190
190
  </symbol>
191
191
  <!-- Zodiac -->
@@ -273,16 +273,16 @@ OpenAstro.org -->
273
273
  style="fill: $planets_color_16;" />
274
274
  </g>
275
275
  </symbol>
276
- <symbol id="First_House">
276
+ <symbol id="Ascendant">
277
277
  <text y="20" style="font-size: 22px; fill: $planets_color_12">As</text>
278
278
  </symbol>
279
- <symbol id="Tenth_House">
279
+ <symbol id="Medium_Coeli">
280
280
  <text y="20" style="font-size: 20px; fill: $planets_color_13">Mc</text>
281
281
  </symbol>
282
- <symbol id="Seventh_House">
282
+ <symbol id="Descendant">
283
283
  <text y="20" style="font-size: 22px; fill: $planets_color_14">Ds</text>
284
284
  </symbol>
285
- <symbol id="Fourth_House">
285
+ <symbol id="Imum_Coeli">
286
286
  <text y="20" style="font-size: 22px; fill: $planets_color_15">Ic</text>
287
287
  </symbol>
288
288
  <!-- Zodiac -->
@@ -223,16 +223,16 @@
223
223
  style="fill: $planets_color_16;" />
224
224
  </g>
225
225
  </symbol>
226
- <symbol id="First_House">
226
+ <symbol id="Ascendant">
227
227
  <text y="20" style="font-size: 22px; fill: $planets_color_12">As</text>
228
228
  </symbol>
229
- <symbol id="Tenth_House">
229
+ <symbol id="Medium_Coeli">
230
230
  <text y="20" style="font-size: 20px; fill: $planets_color_13">Mc</text>
231
231
  </symbol>
232
- <symbol id="Seventh_House">
232
+ <symbol id="Descendant">
233
233
  <text y="20" style="font-size: 22px; fill: $planets_color_14">Ds</text>
234
234
  </symbol>
235
- <symbol id="Fourth_House">
235
+ <symbol id="Imum_Coeli">
236
236
  <text y="20" style="font-size: 22px; fill: $planets_color_15">Ic</text>
237
237
  </symbol>
238
238
  <!-- Zodiac -->
kerykeion/enums.py CHANGED
@@ -18,6 +18,10 @@ class Planets(Enum):
18
18
  TRUE_SOUTH_NODE = "True_South_Node"
19
19
  MEAN_SOUTH_NODE = "Mean_South_Node"
20
20
  MEAN_LILITH = "Mean_Lilith"
21
+ ASCENDANT = "Ascendant"
22
+ DESCENDANT = "Descendant"
23
+ MEDIUM_COELI = "Medium_Coeli"
24
+ IMUM_COELI = "Imum_Coeli"
21
25
 
22
26
 
23
27
  class Aspects(Enum):
@@ -1,5 +1,5 @@
1
1
  from kerykeion import AstrologicalSubject
2
- from kerykeion.utilities import get_houses_list, get_available_planets_list
2
+ from kerykeion.utilities import get_houses_list, get_available_astrological_points_list
3
3
  from kerykeion.astrological_subject import DEFAULT_HOUSES_SYSTEM_IDENTIFIER, DEFAULT_PERSPECTIVE_TYPE, DEFAULT_ZODIAC_TYPE
4
4
  from kerykeion.kr_types import EphemerisDictModel
5
5
  from kerykeion.kr_types import SiderealMode, HousesSystemIdentifier, PerspectiveType, ZodiacType
@@ -142,7 +142,7 @@ class EphemerisDataFactory:
142
142
  )
143
143
 
144
144
  houses_list = get_houses_list(subject)
145
- available_planets = get_available_planets_list(subject)
145
+ available_planets = get_available_astrological_points_list(subject)
146
146
 
147
147
  ephemeris_data_list.append({"date": date.isoformat(), "planets": available_planets, "houses": houses_list})
148
148
 
@@ -28,6 +28,9 @@ HouseNumbers = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
28
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
29
  """Literal type for Planets"""
30
30
 
31
+ AxialCusps = Literal["Ascendant", "Medium_Coeli", "Descendant", "Imum_Coeli"]
32
+ """Literal type for Axial Cusps"""
33
+
31
34
 
32
35
  Element = Literal["Air", "Fire", "Earth", "Water"]
33
36
  """Literal type for Elements"""
@@ -41,7 +44,7 @@ ChartType = Literal["Natal", "ExternalNatal", "Synastry", "Transit"]
41
44
  """Literal type for Chart Types"""
42
45
 
43
46
 
44
- PointType = Literal["Planet", "House"]
47
+ PointType = Literal["Planet", "House", "AxialCusps"]
45
48
  """Literal type for Point Types"""
46
49
 
47
50
 
@@ -8,6 +8,7 @@ from typing import Union, Optional
8
8
  from pydantic import BaseModel
9
9
 
10
10
  from kerykeion.kr_types import (
11
+ AxialCusps,
11
12
  LunarPhaseEmoji,
12
13
  LunarPhaseName,
13
14
  Planet,
@@ -57,7 +58,7 @@ class KerykeionPointModel(SubscriptableBaseModel):
57
58
  Kerykeion Point Model
58
59
  """
59
60
 
60
- name: Union[Planet, Houses]
61
+ name: Union[Planet, Houses, AxialCusps]
61
62
  quality: Quality
62
63
  element: Element
63
64
  sign: Sign
@@ -97,6 +98,7 @@ class AstrologicalSubjectModel(SubscriptableBaseModel):
97
98
  local_time: float
98
99
  # <-- Deprecated properties
99
100
 
101
+
100
102
  # Planets
101
103
  sun: KerykeionPointModel
102
104
  moon: KerykeionPointModel
@@ -109,6 +111,12 @@ class AstrologicalSubjectModel(SubscriptableBaseModel):
109
111
  neptune: KerykeionPointModel
110
112
  pluto: KerykeionPointModel
111
113
 
114
+ # Axes
115
+ ascendant: KerykeionPointModel
116
+ descendant: KerykeionPointModel
117
+ medium_coeli: KerykeionPointModel
118
+ imum_coeli: KerykeionPointModel
119
+
112
120
  # Optional Planets:
113
121
  chiron: Union[KerykeionPointModel, None]
114
122
  mean_lilith: Union[KerykeionPointModel, None]
@@ -133,15 +141,18 @@ class AstrologicalSubjectModel(SubscriptableBaseModel):
133
141
  mean_south_node: KerykeionPointModel
134
142
  true_south_node: KerykeionPointModel
135
143
 
136
- lunar_phase: LunarPhaseModel
137
- """Lunar phase model"""
138
-
139
144
  planets_names_list: list[Planet]
140
145
  """Ordered list of available planets names"""
141
146
 
147
+ axial_cusps_names_list: list[AxialCusps]
148
+ """Ordered list of available axes names"""
149
+
142
150
  houses_names_list: list[Houses]
143
151
  """Ordered list of houses names"""
144
152
 
153
+ lunar_phase: LunarPhaseModel
154
+ """Lunar phase model"""
155
+
145
156
 
146
157
  class EphemerisDictModel(SubscriptableBaseModel):
147
158
  date: str
@@ -104,10 +104,10 @@ class KerykeionLanguageCelestialPointModel(SubscriptableBaseModel):
104
104
  True_Node: str = Field(title="True Node", description="The name of True Node in the chart, in the language")
105
105
  Mean_Node: str = Field(title="Mean Node", description="The name of Mean Node in the chart, in the language")
106
106
  Chiron: str = Field(title="Chiron", description="The name of Chiron in the chart, in the language")
107
- Asc: str = Field(title="Ascendant", description="The name of Ascendant in the chart, in the language")
108
- Mc: str = Field(title="Medium Coeli", description="The name of Medium Coeli in the chart, in the language")
109
- Dsc: str = Field(title="Descendant", description="The name of Descendant in the chart, in the language")
110
- Ic: str = Field(title="Imum Coeli", description="The name of Imum Coeli in the chart, in the language")
107
+ Ascendant: str = Field(title="Ascendant", description="The name of Ascendant in the chart, in the language")
108
+ Descendant: str = Field(title="Descendant", description="The name of Descendant in the chart, in the language")
109
+ Medium_Coeli: str = Field(title="Medium Coeli", description="The name of Medium Coeli in the chart, in the language")
110
+ Imum_Coeli: str = Field(title="Imum Coeli", description="The name of Imum Coeli in the chart, in the language")
111
111
  Mean_Lilith: str = Field(title="Mean Lilith", description="The name of Mean Lilith in the chart, in the language")
112
112
  True_South_Node: str = Field(title="True South Node", description="The name of True South Node in the chart, in the language")
113
113
  Mean_South_Node: str = Field(title="Mean South Node", description="The name of Mean South Node in the chart, in the language")
@@ -148,7 +148,7 @@ class RelationshipScoreFactory:
148
148
  Args:
149
149
  aspect (dict): Aspect information.
150
150
  """
151
- if {aspect["p1_name"], aspect["p2_name"]} == {"Sun", "First_House"}:
151
+ if {aspect["p1_name"], aspect["p2_name"]} == {"Sun", "Ascendant"}:
152
152
  points = 4
153
153
  self._evaluate_aspect(aspect, points)
154
154
 
@@ -160,7 +160,7 @@ class RelationshipScoreFactory:
160
160
  Args:
161
161
  aspect (dict): Aspect information.
162
162
  """
163
- if {aspect["p1_name"], aspect["p2_name"]} == {"Moon", "First_House"}:
163
+ if {aspect["p1_name"], aspect["p2_name"]} == {"Moon", "Ascendant"}:
164
164
  points = 4
165
165
  self._evaluate_aspect(aspect, points)
166
166
 
kerykeion/report.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from kerykeion import AstrologicalSubject
2
- from terminaltables import AsciiTable
3
- from kerykeion.utilities import get_houses_list, get_available_planets_list
2
+ from simple_ascii_tables import AsciiTable
3
+ from kerykeion.utilities import get_houses_list, get_available_astrological_points_list
4
4
  from typing import Union
5
5
  from kerykeion.kr_types.kr_models import AstrologicalSubjectModel
6
6
 
@@ -54,7 +54,7 @@ class Report:
54
54
  ("R" if planet.retrograde else "-"),
55
55
  planet.house,
56
56
  ]
57
- for planet in get_available_planets_list(self.instance)
57
+ for planet in get_available_astrological_points_list(self.instance)
58
58
  ]
59
59
 
60
60
  self.planets_table = AsciiTable(planets_data).table
@@ -32,10 +32,10 @@
32
32
  "Uranus": "Uranus",
33
33
  "Neptune": "Neptune",
34
34
  "Pluto": "Pluto",
35
- "Asc": "Asc",
36
- "Mc": "Mc",
37
- "Dsc": "Dsc",
38
- "Ic": "Ic",
35
+ "Ascendant": "Asc",
36
+ "Medium_Coeli": "Mc",
37
+ "Descendant": "Dsc",
38
+ "Imum_Coeli": "Ic",
39
39
  "True_Node": "N. Node (T)",
40
40
  "Mean_Node": "N. Node (M)",
41
41
  "Chiron": "Chiron",
@@ -76,10 +76,10 @@
76
76
  "Uranus": "Uranus",
77
77
  "Neptune": "Neptune",
78
78
  "Pluto": "Pluton",
79
- "Asc": "Asc",
80
- "Mc": "Mc",
81
- "Dsc": "Dsc",
82
- "Ic": "Ic",
79
+ "Ascendant": "Asc",
80
+ "Medium_Coeli": "Mc",
81
+ "Descendant": "Dsc",
82
+ "Imum_Coeli": "Ic",
83
83
  "True_Node": "Nœud N. (V)",
84
84
  "Mean_Node": "Nœud N. (M)",
85
85
  "True_South_Node": "Nœud S. (V)",
@@ -120,10 +120,10 @@
120
120
  "Uranus": "Urano",
121
121
  "Neptune": "Netuno",
122
122
  "Pluto": "Plutão",
123
- "Asc": "Asc",
124
- "Mc": "Mc",
125
- "Dsc": "Dsc",
126
- "Ic": "Ic",
123
+ "Ascendant": "Asc",
124
+ "Medium_Coeli": "Mc",
125
+ "Descendant": "Dsc",
126
+ "Imum_Coeli": "Ic",
127
127
  "True_Node": "Nodo N. (V)",
128
128
  "Mean_Node": "Nodo N. (M)",
129
129
  "True_South_Node": "Nodo S. (V)",
@@ -164,10 +164,10 @@
164
164
  "Uranus": "Urano",
165
165
  "Neptune": "Nettuno",
166
166
  "Pluto": "Plutone",
167
- "Asc": "Asc",
168
- "Mc": "Mc",
169
- "Dsc": "Dsc",
170
- "Ic": "Ic",
167
+ "Ascendant": "Asc",
168
+ "Medium_Coeli": "Mc",
169
+ "Descendant": "Dsc",
170
+ "Imum_Coeli": "Ic",
171
171
  "True_Node": "Nodo N. (V)",
172
172
  "Mean_Node": "Nodo N. (M)",
173
173
  "True_South_Node": "Nodo S. (V)",
@@ -208,10 +208,10 @@
208
208
  "Uranus": "天王星",
209
209
  "Neptune": "海王星",
210
210
  "Pluto": "冥王星",
211
- "Asc": "上升點",
212
- "Mc": "上中天",
213
- "Dsc": "下降點",
214
- "Ic": "下中天",
211
+ "Ascendant": "上升點",
212
+ "Medium_Coeli": "上中天",
213
+ "Descendant": "下降點",
214
+ "Imum_Coeli": "下中天",
215
215
  "True_Node": "真北交点",
216
216
  "Mean_Node": "平均北交点",
217
217
  "True_South_Node": "真南交点",
@@ -252,10 +252,10 @@
252
252
  "Uranus": "Urano",
253
253
  "Neptune": "Neptuno",
254
254
  "Pluto": "Plutón",
255
- "Asc": "Asc",
256
- "Mc": "Mc",
257
- "Dsc": "Dsc",
258
- "Ic": "Ic",
255
+ "Ascendant": "Asc",
256
+ "Medium_Coeli": "Mc",
257
+ "Descendant": "Dsc",
258
+ "Imum_Coeli": "Ic",
259
259
  "True_Node": "Nodo N. (V)",
260
260
  "Mean_Node": "Nodo N. (M)",
261
261
  "True_South_Node": "Nodo S. (V)",
@@ -296,10 +296,10 @@
296
296
  "Uranus": "Уран",
297
297
  "Neptune": "Нептун",
298
298
  "Pluto": "Плутон",
299
- "Asc": "Асц",
300
- "Mc": "MC",
301
- "Dsc": "ДСЦ",
302
- "Ic": "IC",
299
+ "Ascendant": "Асц",
300
+ "Medium_Coeli": "MC",
301
+ "Descendant": "ДСЦ",
302
+ "Imum_Coeli": "IC",
303
303
  "True_Node": "С. Узел (И)",
304
304
  "Mean_Node": "С. Узел (С)",
305
305
  "True_South_Node": "Ю. Узел (И)",
@@ -340,10 +340,10 @@
340
340
  "Uranus": "Uranüs",
341
341
  "Neptune": "Neptün",
342
342
  "Pluto": "Plüton",
343
- "Asc": "Yükselen",
344
- "Mc": "MC",
345
- "Dsc": "İK",
346
- "Ic": "IC",
343
+ "Ascendant": "Yükselen",
344
+ "Medium_Coeli": "MC",
345
+ "Descendant": "İK",
346
+ "Imum_Coeli": "IC",
347
347
  "True_Node": "K. Düğümü (T)",
348
348
  "Mean_Node": "K. Düğümü (M)",
349
349
  "Chiron": "Kirony",
@@ -384,10 +384,10 @@
384
384
  "Uranus": "Uranus",
385
385
  "Neptune": "Neptun",
386
386
  "Pluto": "Pluto",
387
- "Asc": "Asz",
388
- "Mc": "MC",
389
- "Dsc": "DSC",
390
- "Ic": "IC",
387
+ "Ascendant": "Asz",
388
+ "Medium_Coeli": "MC",
389
+ "Descendant": "DSC",
390
+ "Imum_Coeli": "IC",
391
391
  "True_Node": "Nordknoten (T)",
392
392
  "Mean_Node": "Nordknoten (M)",
393
393
  "True_South_Node": "Südknoten (T)",
@@ -428,10 +428,10 @@
428
428
  "Uranus": "यूरेनस",
429
429
  "Neptune": "नेपच्यून",
430
430
  "Pluto": "प्लूटो",
431
- "Asc": "आस",
432
- "Mc": "एमसी",
433
- "Dsc": "डीएससी",
434
- "Ic": "आईसी",
431
+ "Ascendant": "आस",
432
+ "Medium_Coeli": "एमसी",
433
+ "Descendant": "डीएससी",
434
+ "Imum_Coeli": "आईसी",
435
435
  "True_Node": "उत्तर नोड (T)",
436
436
  "Mean_Node": "उत्तर नोड (M)",
437
437
  "Chiron": "किरोन",
@@ -651,7 +651,7 @@
651
651
  },
652
652
  {
653
653
  "id": 13,
654
- "name": "First_House",
654
+ "name": "Ascendant",
655
655
  "color": "var(--kerykeion-chart-color-first-house)",
656
656
  "is_active": true,
657
657
  "element_points": 40,
@@ -660,7 +660,7 @@
660
660
  },
661
661
  {
662
662
  "id": 14,
663
- "name": "Tenth_House",
663
+ "name": "Medium_Coeli",
664
664
  "color": "var(--kerykeion-chart-color-tenth-house)",
665
665
  "is_active": true,
666
666
  "element_points": 20,
@@ -669,7 +669,7 @@
669
669
  },
670
670
  {
671
671
  "id": 15,
672
- "name": "Seventh_House",
672
+ "name": "Descendant",
673
673
  "color": "var(--kerykeion-chart-color-seventh-house)",
674
674
  "is_active": false,
675
675
  "element_points": 0,
@@ -678,7 +678,7 @@
678
678
  },
679
679
  {
680
680
  "id": 16,
681
- "name": "Fourth_House",
681
+ "name": "Imum_Coeli",
682
682
  "color": "var(--kerykeion-chart-color-fourth-house)",
683
683
  "is_active": false,
684
684
  "element_points": 0,
kerykeion/utilities.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from kerykeion.kr_types import KerykeionPointModel, KerykeionException, ZodiacSignModel, AstrologicalSubjectModel
2
- from kerykeion.kr_types.kr_literals import LunarPhaseEmoji, LunarPhaseName, PointType, Planet, Houses
2
+ from kerykeion.kr_types.kr_literals import LunarPhaseEmoji, LunarPhaseName, PointType, Planet, Houses, AxialCusps
3
3
  from typing import Union, get_args, TYPE_CHECKING
4
4
  import logging
5
5
  import math
@@ -44,12 +44,20 @@ def get_number_from_name(name: Planet) -> int:
44
44
  return 15
45
45
  elif name == "Mean_Lilith":
46
46
  return 12
47
+ elif name == "Ascendant": # TODO: Is this needed?
48
+ return 9900
49
+ elif name == "Descendant": # TODO: Is this needed?
50
+ return 9901
51
+ elif name == "Medium_Coeli": # TODO: Is this needed?
52
+ return 9902
53
+ elif name == "Imum_Coeli": # TODO: Is this needed?
54
+ return 9903
47
55
  else:
48
56
  raise KerykeionException(f"Error in getting number from name! Name: {name}")
49
57
 
50
58
 
51
59
  def get_kerykeion_point_from_degree(
52
- degree: Union[int, float], name: Union[Planet, Houses], point_type: PointType
60
+ degree: Union[int, float], name: Union[Planet, Houses, AxialCusps], point_type: PointType
53
61
  ) -> KerykeionPointModel:
54
62
  """
55
63
  Returns a KerykeionPointModel object based on the given degree.
@@ -118,29 +126,57 @@ def setup_logging(level: str) -> None:
118
126
  loglevel: int = logging_options.get(level, logging.INFO)
119
127
  logging.basicConfig(format=format, level=loglevel)
120
128
 
121
- def check_if_point_between(
122
- start_point: Union[int, float], end_point: Union[int, float], evaluated_point: Union[int, float]
129
+
130
+ def is_point_between(
131
+ start_point: Union[int, float],
132
+ end_point: Union[int, float],
133
+ evaluated_point: Union[int, float]
123
134
  ) -> bool:
124
135
  """
125
- Finds if a point is between two other in a circle.
136
+ Determines if a point is between two others on a circle, with additional rules:
137
+ - If evaluated_point == start_point, it is considered between.
138
+ - If evaluated_point == end_point, it is NOT considered between.
139
+ - The range between start_point and end_point must not exceed 180°.
126
140
 
127
141
  Args:
128
- - start_point: The first point
129
- - end_point: The second point
130
- - point: The point to check if it is between start_point and end_point
142
+ - start_point: The first point on the circle.
143
+ - end_point: The second point on the circle.
144
+ - evaluated_point: The point to check.
131
145
 
132
146
  Returns:
133
- - True if point is between start_point and end_point, False otherwise
147
+ - True if evaluated_point is between start_point and end_point, False otherwise.
134
148
  """
135
149
 
136
- p1_p2 = math.fmod(end_point - start_point + 360, 360)
137
- p1_p3 = math.fmod(evaluated_point - start_point + 360, 360)
150
+ # Normalize angles to [0, 360)
151
+ start_point = start_point % 360
152
+ end_point = end_point % 360
153
+ evaluated_point = evaluated_point % 360
154
+
155
+ # Compute angular difference
156
+ angular_difference = math.fmod(end_point - start_point + 360, 360)
138
157
 
139
- if (p1_p2 <= 180) != (p1_p3 > p1_p2):
158
+ # Ensure the range is not greater than 180°. Otherwise, it is not truly defined what
159
+ # being located in between two points on a circle actually means.
160
+ if angular_difference > 180:
161
+ raise KerykeionException(f"The angle between start and end point is not allowed to exceed 180°, yet is: {angular_difference}")
162
+
163
+ # Handle explicitly when evaluated_point == start_point. Note: It may happen for mathematical
164
+ # reasons that evaluated_point and start_point deviate very slightly from each other, but
165
+ # should really be same value. This case is captured later below by the term 0 <= p1_p3.
166
+ if evaluated_point == start_point:
140
167
  return True
141
- else:
168
+
169
+ # Handle explicitly when evaluated_point == end_point
170
+ if evaluated_point == end_point:
142
171
  return False
143
172
 
173
+ # Compute angular differences for evaluation
174
+ p1_p3 = math.fmod(evaluated_point - start_point + 360, 360)
175
+
176
+ # Check if point lies in the interval
177
+ return (0 <= p1_p3) and (p1_p3 < angular_difference)
178
+
179
+
144
180
 
145
181
  def get_planet_house(planet_position_degree: Union[int, float], houses_degree_ut_list: list) -> Houses:
146
182
  """
@@ -163,7 +199,8 @@ def get_planet_house(planet_position_degree: Union[int, float], houses_degree_ut
163
199
  for i in range(len(house_names)):
164
200
  start_degree = houses_degree_ut_list[i]
165
201
  end_degree = houses_degree_ut_list[(i + 1) % len(houses_degree_ut_list)]
166
- if check_if_point_between(start_degree, end_degree, planet_position_degree):
202
+
203
+ if is_point_between(start_degree, end_degree, planet_position_degree):
167
204
  return house_names[i]
168
205
 
169
206
  # If no house is found, raise an error
@@ -268,7 +305,7 @@ def get_houses_list(subject: Union["AstrologicalSubject", AstrologicalSubjectMod
268
305
  return houses_absolute_position_list
269
306
 
270
307
 
271
- def get_available_planets_list(subject: Union["AstrologicalSubject", AstrologicalSubjectModel]) -> list[KerykeionPointModel]:
308
+ def get_available_astrological_points_list(subject: Union["AstrologicalSubject", AstrologicalSubjectModel]) -> list[KerykeionPointModel]:
272
309
  """
273
310
  Return the names of the planets in the order of the planets.
274
311
  The names can be used to access the planets from the AstrologicalSubject object with the __getitem__ method or the [] operator.
@@ -277,4 +314,7 @@ def get_available_planets_list(subject: Union["AstrologicalSubject", Astrologica
277
314
  for planet in subject.planets_names_list:
278
315
  planets_absolute_position_list.append(subject[planet.lower()])
279
316
 
317
+ for axis in subject.axial_cusps_names_list:
318
+ planets_absolute_position_list.append(subject[axis.lower()])
319
+
280
320
  return planets_absolute_position_list
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kerykeion
3
- Version: 4.21.0
3
+ Version: 4.22.0
4
4
  Summary: A python library for astrology.
5
5
  Home-page: https://www.kerykeion.net/
6
6
  License: AGPL-3.0
@@ -19,7 +19,6 @@ Classifier: Programming Language :: Python :: 3.9
19
19
  Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
- Classifier: Programming Language :: Python :: 3.13
23
22
  Classifier: Programming Language :: Python :: 3 :: Only
24
23
  Classifier: Topic :: Scientific/Engineering :: Astronomy
25
24
  Classifier: Topic :: Software Development
@@ -28,11 +27,11 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
27
  Classifier: Typing :: Typed
29
28
  Requires-Dist: pydantic (>=2.5,<3.0)
30
29
  Requires-Dist: pyswisseph (>=2.10.3.1,<3.0.0.0)
31
- Requires-Dist: pytz (>=2022.7,<2023.0)
30
+ Requires-Dist: pytz (>=2024.2,<2025.0)
32
31
  Requires-Dist: requests (>=2.32.3,<3.0.0)
33
32
  Requires-Dist: requests-cache (>=1.2.1,<2.0.0)
34
33
  Requires-Dist: scour (>=0.38.2,<0.39.0)
35
- Requires-Dist: terminaltables (>=3.1.10,<4.0.0)
34
+ Requires-Dist: simple-ascii-tables (>=1.0.0,<2.0.0)
36
35
  Project-URL: Repository, https://github.com/g-battaglia/kerykeion
37
36
  Description-Content-Type: text/markdown
38
37
 
@@ -2,41 +2,41 @@ LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
2
2
  kerykeion/__init__.py,sha256=XtKNBNSVsQ-PAbnJfNUcw-femdF4NgQqohMtM0cRH18,639
3
3
  kerykeion/aspects/__init__.py,sha256=9kx_Rx1NJx5SM7nDCSbI79S1neZ3c-q2NvQr-S6A9PY,292
4
4
  kerykeion/aspects/aspects_utils.py,sha256=XyjQvvdrN6-L8QqpecV-mCG9Wb8I9G0S1ZvzXIsQSCk,2977
5
- kerykeion/aspects/natal_aspects.py,sha256=I5HyT9BHUR0r5xlbCj-EYLxvsRWLVi59Jynlpq04-cY,5548
5
+ kerykeion/aspects/natal_aspects.py,sha256=zTB5wIp0B3XdqtM5ktWpD2rw8ITTlR2wpXBOdPwSZmI,6048
6
6
  kerykeion/aspects/synastry_aspects.py,sha256=HtXSVPkiDQmbkqnI7k9IOhCgON59VZXjflqWJdugwyI,4327
7
- kerykeion/astrological_subject.py,sha256=KalMYAY4s-1eaV5-L9YsgJRAZah4MnTwSelQPuRkOQ4,36764
7
+ kerykeion/astrological_subject.py,sha256=OWBpAKP0aavvqNWg_c1dTbGVkd6BM7XMzgIMOVo683A,39157
8
8
  kerykeion/charts/__init__.py,sha256=i9NMZ7LdkllPlqQSi1or9gTobHbROGDKmJhBDO4R0mA,128
9
- kerykeion/charts/charts_utils.py,sha256=Qql2Z_9xPaxQUaH6AOs8F9maYMqpG9DejYY0LKQT4_U,42265
9
+ kerykeion/charts/charts_utils.py,sha256=HjCmBa9TCoAmH5Z20W8BRnQICN3qZOjQcSQ20sLLz7M,41965
10
10
  kerykeion/charts/draw_planets.py,sha256=Uty3zpWYMQZvvK7ZHhlmynCHeL8DIN3qL2ifnBXVciM,17393
11
- kerykeion/charts/kerykeion_chart_svg.py,sha256=1k3TDnngStieOKxY69aaHdjJCrh9wr8FBzT5o6BepRs,43918
12
- kerykeion/charts/templates/aspect_grid_only.xml,sha256=qXR4agGqI7GB_4z8LTSa9Hpgu1ldM9ZDRKGpviBM6a8,70097
13
- kerykeion/charts/templates/chart.xml,sha256=4CJtMrPFYzgSC0hRjYd2ve53IZ5MKjfcRT8GUI0v_Fo,73767
14
- kerykeion/charts/templates/wheel_only.xml,sha256=wna68vE2OtpwBBtpJteNRwYcyqqF0-SicXsR1PpCjtU,71310
11
+ kerykeion/charts/kerykeion_chart_svg.py,sha256=FglYPyeZZUSdWj1CAia1iXveRpKatVlmOfLkvbZu0YE,43871
12
+ kerykeion/charts/templates/aspect_grid_only.xml,sha256=ZiBVeToVmCA8QxYlB_cfnsAO1NNeQAnJ_6rIYkr4F58,70091
13
+ kerykeion/charts/templates/chart.xml,sha256=rUO7kL3z1RZuFjFBwA88xIF2KQFuGOcHQ5Kcw-K4hLY,73761
14
+ kerykeion/charts/templates/wheel_only.xml,sha256=E0JCxcnjTjxuaomw7PQEc_3xRVErj1y2hIOGTrShuhc,71304
15
15
  kerykeion/charts/themes/classic.css,sha256=-b6XllAZmqUDjBwDtIkfzfI3Wtc8AImuGMpfAQ_2wa0,3552
16
16
  kerykeion/charts/themes/dark-high-contrast.css,sha256=9tdyFC-4Ytnv4lrVwKnOjZJ0YNgbRrP_HNnfJRlnbn0,6099
17
17
  kerykeion/charts/themes/dark.css,sha256=ml2lnzQVuS5DhCdoeUrDmMv9kB1nNceRt7hHbOHSbjM,6099
18
18
  kerykeion/charts/themes/light.css,sha256=ALf5U8tQsb6ky0N9R7ZLOHDrfKEXNM-sBR3JIRxFrCI,6092
19
- kerykeion/enums.py,sha256=gzB_GDDLGurQI24L0Ga0xpL3DoU6E4ld-gC2xMeLmC8,1077
20
- kerykeion/ephemeris_data.py,sha256=g52P0jc1Roo8udXW04BOtIBTaOh3Rcp8_ZDw2MJNn_k,8072
19
+ kerykeion/enums.py,sha256=nPXgP_ocsRnRno5H-yunZy3fp-hLZ9aYRaUb-2gBdvw,1199
20
+ kerykeion/ephemeris_data.py,sha256=Cd5TK5nTkFHYU6bkLKjZRfiU4_6AgsWGcwBDrBHKrQk,8096
21
21
  kerykeion/fetch_geonames.py,sha256=e66Nh6yq9A4VjnuvVSiV1TW1IkJ9m3Q2LKPWrkOGgO0,4764
22
22
  kerykeion/kr_types/__init__.py,sha256=jshJOccCQcYZuoOvrILRZH6imy4RBvKpFPujlNLFyGE,295
23
23
  kerykeion/kr_types/chart_types.py,sha256=OlDvjCra7acaBT--B_gqsqOcAwbuKCXmQQyDTDNfy4o,1983
24
24
  kerykeion/kr_types/kerykeion_exception.py,sha256=kE1y0K0rmuz32b4K_ZppSsZ59I2Get0ZkvOkTE5HejI,314
25
- kerykeion/kr_types/kr_literals.py,sha256=LW5OED0FgDNq5PPHW3_zVot4esz1Y8hCM2nJbgIQDF4,3638
26
- kerykeion/kr_types/kr_models.py,sha256=3zRhQ17sWDPN1t5k-GV8VT7Hr2K7mYV8tec6VqMZWig,4314
27
- kerykeion/kr_types/settings_models.py,sha256=oG0fbN9aXzdeBWRKXxy15TFXMR3bU2Be0Ze-wfZi59w,11863
25
+ kerykeion/kr_types/kr_literals.py,sha256=hnbKFC0Wu_ee1VjpXd1GJaE_tC6ALjhbuo7PEW51yQc,3766
26
+ kerykeion/kr_types/kr_models.py,sha256=53VnGY8ie35crNemMusf8iasACHRrM1ZVc0kuZggCes,4593
27
+ kerykeion/kr_types/settings_models.py,sha256=VJ9rt4WzO4xTQRxFrX-9da44-SE2V0v2AH4CI4ygJc4,11894
28
28
  kerykeion/relationship_score/__init__.py,sha256=cLaEBQXQBfyRkv0OaS3ceLROzvWcvKXWiRq0PS6LDjY,114
29
29
  kerykeion/relationship_score/relationship_score.py,sha256=lJkSbHw9nOUaPMrPxqcGhnVQIwAgI52K8BQzXXswb6A,6504
30
- kerykeion/relationship_score/relationship_score_factory.py,sha256=9iqKHyMS9u9mSc8Ub1CHTDfifxBE40qs7PgbtGt7Gxc,10865
31
- kerykeion/report.py,sha256=QEZfadIxmqIugoLHMW0KBhOqCwTywGSDDfpX4NJD6qg,2785
30
+ kerykeion/relationship_score/relationship_score_factory.py,sha256=P_swvpip5luODeByv_qaP1c5IpUqWTqSlEumDJjal7I,10861
31
+ kerykeion/report.py,sha256=snqnrJzb89q2ixL74qS9ksvzNSh_WXtZ_haBOIvHYeY,2814
32
32
  kerykeion/settings/__init__.py,sha256=QQNFCl7sgN27MKaVscqtpPk10HGz4wZS3I_7KEGMaVA,69
33
33
  kerykeion/settings/kerykeion_settings.py,sha256=WZyiC4uwpjnTmoDGWORYLIk9rIpJ3EuLdjFw6eUuylo,2554
34
- kerykeion/settings/kr.config.json,sha256=635bN5jmcj_MzSiGFohuCzRYIUXY0lDMc0ng5f_Egus,21694
34
+ kerykeion/settings/kr.config.json,sha256=TbHMfGX0hXgjLS92RmScjhL1Qq8CUcdyXp1IJVVrJrc,21998
35
35
  kerykeion/sweph/README.md,sha256=L7FtNAJTWtrZNGKa8MX87SjduFYPYxwWhaI5fmtzNZo,73
36
36
  kerykeion/sweph/seas_18.se1,sha256=X9nCqhZU43wJpq61WAdueVQJt9xL2UjrwPqn1Kdoa1s,223002
37
- kerykeion/utilities.py,sha256=4b1QgUR3Z1iFel4FHPPp5Qe2EbPCGQukMqCaW0Y_K6s,9417
38
- kerykeion-4.21.0.dist-info/LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
39
- kerykeion-4.21.0.dist-info/METADATA,sha256=OZyrGRaT8amESSi7HEXrgKpV0Yrd0TWEvNihdmPV_tE,17667
40
- kerykeion-4.21.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
41
- kerykeion-4.21.0.dist-info/entry_points.txt,sha256=5SmANYscFDDTdeovHvGQ-cnj0hdFvGoxPaWLCpyDFnQ,49
42
- kerykeion-4.21.0.dist-info/RECORD,,
37
+ kerykeion/utilities.py,sha256=vuEDWs5Htl2zi6_3flLvlAsFC9YT9LaOQDpRirFf3Cg,11160
38
+ kerykeion-4.22.0.dist-info/LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
39
+ kerykeion-4.22.0.dist-info/METADATA,sha256=7EuN8mUmEb_lpxs4jR4n2alO5vtbgms-2W2dxcW_PoA,17620
40
+ kerykeion-4.22.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
41
+ kerykeion-4.22.0.dist-info/entry_points.txt,sha256=5SmANYscFDDTdeovHvGQ-cnj0hdFvGoxPaWLCpyDFnQ,49
42
+ kerykeion-4.22.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any