kerykeion 4.25.3__py3-none-any.whl → 4.26.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kerykeion might be problematic. Click here for more details.
- kerykeion/__init__.py +1 -0
- kerykeion/aspects/natal_aspects.py +2 -0
- kerykeion/aspects/synastry_aspects.py +2 -0
- kerykeion/aspects/transits_time_range.py +41 -0
- kerykeion/ephemeris_data.py +74 -10
- kerykeion/kr_types/kr_models.py +44 -0
- kerykeion/transits_time_range.py +124 -0
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0rc1.dist-info}/METADATA +95 -115
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0rc1.dist-info}/RECORD +12 -10
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0rc1.dist-info}/LICENSE +0 -0
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0rc1.dist-info}/WHEEL +0 -0
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0rc1.dist-info}/entry_points.txt +0 -0
kerykeion/__init__.py
CHANGED
|
@@ -17,3 +17,4 @@ from .settings import KerykeionSettingsModel, get_settings
|
|
|
17
17
|
from .enums import Planets, Aspects, Signs
|
|
18
18
|
from .ephemeris_data import EphemerisDataFactory
|
|
19
19
|
from .composite_subject_factory import CompositeSubjectFactory
|
|
20
|
+
from .transits_time_range import TransitsTimeRangeFactory
|
|
@@ -100,8 +100,10 @@ class NatalAspects:
|
|
|
100
100
|
if verdict == True:
|
|
101
101
|
aspect_model = AspectModel(
|
|
102
102
|
p1_name=active_points_list[first]["name"],
|
|
103
|
+
p1_owner=self.user.name,
|
|
103
104
|
p1_abs_pos=active_points_list[first]["abs_pos"],
|
|
104
105
|
p2_name=active_points_list[second]["name"],
|
|
106
|
+
p2_owner=self.user.name,
|
|
105
107
|
p2_abs_pos=active_points_list[second]["abs_pos"],
|
|
106
108
|
aspect=name,
|
|
107
109
|
orbit=orbit,
|
|
@@ -93,8 +93,10 @@ class SynastryAspects(NatalAspects):
|
|
|
93
93
|
if verdict == True:
|
|
94
94
|
aspect_model = AspectModel(
|
|
95
95
|
p1_name=first_active_points_list[first]["name"],
|
|
96
|
+
p1_owner=self.first_user.name,
|
|
96
97
|
p1_abs_pos=first_active_points_list[first]["abs_pos"],
|
|
97
98
|
p2_name=second_active_points_list[second]["name"],
|
|
99
|
+
p2_owner=self.second_user.name,
|
|
98
100
|
p2_abs_pos=second_active_points_list[second]["abs_pos"],
|
|
99
101
|
aspect=name,
|
|
100
102
|
orbit=orbit,
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from datetime import datetime, timedelta
|
|
2
|
+
from kerykeion import (
|
|
3
|
+
TransitsTimeRangeFactory,
|
|
4
|
+
EphemerisDataFactory,
|
|
5
|
+
AstrologicalSubject,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
# Create a natal chart for the subject
|
|
9
|
+
person = AstrologicalSubject(
|
|
10
|
+
"Johnny Depp", 1963, 6, 9, 20, 15, "Owensboro", "US"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
# Define the time period for transit calculation
|
|
14
|
+
start_date = datetime.now()
|
|
15
|
+
end_date = datetime.now() + timedelta(days=30)
|
|
16
|
+
|
|
17
|
+
# Create ephemeris data for the specified time period
|
|
18
|
+
ephemeris_factory = EphemerisDataFactory(
|
|
19
|
+
start_datetime=start_date,
|
|
20
|
+
end_datetime=end_date,
|
|
21
|
+
step_type="days",
|
|
22
|
+
step=1,
|
|
23
|
+
lat=person.lat,
|
|
24
|
+
lng=person.lng,
|
|
25
|
+
tz_str=person.tz_str,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
ephemeris_data_points = ephemeris_factory.get_ephemeris_data_as_astrological_subjects()
|
|
29
|
+
|
|
30
|
+
# Calculate transits for the subject
|
|
31
|
+
transit_factory = TransitsTimeRangeFactory(
|
|
32
|
+
natal_chart=person,
|
|
33
|
+
ephemeris_data_points=ephemeris_data_points,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
transit_results = transit_factory.get_transit_moments()
|
|
37
|
+
|
|
38
|
+
# Print example data
|
|
39
|
+
print(transit_results.model_dump()["dates"][2])
|
|
40
|
+
print(transit_results.model_dump()["transits"][2]['date'])
|
|
41
|
+
print(transit_results.model_dump()["transits"][2]['aspects'][0])
|
kerykeion/ephemeris_data.py
CHANGED
|
@@ -4,7 +4,7 @@ from kerykeion.astrological_subject import DEFAULT_HOUSES_SYSTEM_IDENTIFIER, DEF
|
|
|
4
4
|
from kerykeion.kr_types import EphemerisDictModel
|
|
5
5
|
from kerykeion.kr_types import SiderealMode, HousesSystemIdentifier, PerspectiveType, ZodiacType
|
|
6
6
|
from datetime import datetime, timedelta
|
|
7
|
-
from typing import Literal, Union
|
|
7
|
+
from typing import Literal, Union, List
|
|
8
8
|
import logging
|
|
9
9
|
|
|
10
10
|
|
|
@@ -76,17 +76,19 @@ class EphemerisDataFactory:
|
|
|
76
76
|
|
|
77
77
|
self.dates_list = []
|
|
78
78
|
if self.step_type == "days":
|
|
79
|
-
self.dates_list = [self.start_datetime + timedelta(days=i) for i in range((self.end_datetime - self.start_datetime).days)]
|
|
79
|
+
self.dates_list = [self.start_datetime + timedelta(days=i * self.step) for i in range((self.end_datetime - self.start_datetime).days // self.step + 1)]
|
|
80
80
|
if max_days and (len(self.dates_list) > max_days):
|
|
81
81
|
raise ValueError(f"Too many days: {len(self.dates_list)} > {self.max_days}. To prevent this error, set max_days to a higher value or reduce the date range.")
|
|
82
82
|
|
|
83
83
|
elif self.step_type == "hours":
|
|
84
|
-
|
|
84
|
+
hours_diff = (self.end_datetime - self.start_datetime).total_seconds() / 3600
|
|
85
|
+
self.dates_list = [self.start_datetime + timedelta(hours=i * self.step) for i in range(int(hours_diff) // self.step + 1)]
|
|
85
86
|
if max_hours and (len(self.dates_list) > max_hours):
|
|
86
87
|
raise ValueError(f"Too many hours: {len(self.dates_list)} > {self.max_hours}. To prevent this error, set max_hours to a higher value or reduce the date range.")
|
|
87
88
|
|
|
88
89
|
elif self.step_type == "minutes":
|
|
89
|
-
|
|
90
|
+
minutes_diff = (self.end_datetime - self.start_datetime).total_seconds() / 60
|
|
91
|
+
self.dates_list = [self.start_datetime + timedelta(minutes=i * self.step) for i in range(int(minutes_diff) // self.step + 1)]
|
|
90
92
|
if max_minutes and (len(self.dates_list) > max_minutes):
|
|
91
93
|
raise ValueError(f"Too many minutes: {len(self.dates_list)} > {self.max_minutes}. To prevent this error, set max_minutes to a higher value or reduce the date range.")
|
|
92
94
|
|
|
@@ -151,6 +153,55 @@ class EphemerisDataFactory:
|
|
|
151
153
|
|
|
152
154
|
return ephemeris_data_list
|
|
153
155
|
|
|
156
|
+
def get_ephemeris_data_as_astrological_subjects(self, as_model: bool = False) -> List[AstrologicalSubject]:
|
|
157
|
+
"""
|
|
158
|
+
Generate ephemeris data for the specified date range as AstrologicalSubject instances.
|
|
159
|
+
|
|
160
|
+
This method creates a complete AstrologicalSubject object for each date in the date range,
|
|
161
|
+
allowing direct access to all properties and methods of the AstrologicalSubject class.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
- as_model (bool): If True, the AstrologicalSubject instances will be returned as model instances. Default is False.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
- List[AstrologicalSubject]: A list of AstrologicalSubject instances, one for each date in the date range.
|
|
168
|
+
|
|
169
|
+
Example usage:
|
|
170
|
+
subjects = factory.get_ephemeris_data_as_astrological_subjects()
|
|
171
|
+
# Access methods and properties of the first subject
|
|
172
|
+
sun_position = subjects[0].get_sun()
|
|
173
|
+
all_points = subjects[0].get_all_points()
|
|
174
|
+
chart_drawing = subjects[0].draw_chart()
|
|
175
|
+
"""
|
|
176
|
+
subjects_list = []
|
|
177
|
+
for date in self.dates_list:
|
|
178
|
+
subject = AstrologicalSubject(
|
|
179
|
+
year=date.year,
|
|
180
|
+
month=date.month,
|
|
181
|
+
day=date.day,
|
|
182
|
+
hour=date.hour,
|
|
183
|
+
minute=date.minute,
|
|
184
|
+
lng=self.lng,
|
|
185
|
+
lat=self.lat,
|
|
186
|
+
tz_str=self.tz_str,
|
|
187
|
+
city="Placeholder",
|
|
188
|
+
nation="Placeholder",
|
|
189
|
+
online=False,
|
|
190
|
+
disable_chiron_and_lilith=self.disable_chiron_and_lilith,
|
|
191
|
+
zodiac_type=self.zodiac_type,
|
|
192
|
+
sidereal_mode=self.sidereal_mode,
|
|
193
|
+
houses_system_identifier=self.houses_system_identifier,
|
|
194
|
+
perspective_type=self.perspective_type,
|
|
195
|
+
is_dst=self.is_dst,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
if as_model:
|
|
199
|
+
subjects_list.append(subject.model())
|
|
200
|
+
else:
|
|
201
|
+
subjects_list.append(subject)
|
|
202
|
+
|
|
203
|
+
return subjects_list
|
|
204
|
+
|
|
154
205
|
|
|
155
206
|
if "__main__" == __name__:
|
|
156
207
|
start_date = datetime.fromisoformat("2020-01-01")
|
|
@@ -160,7 +211,7 @@ if "__main__" == __name__:
|
|
|
160
211
|
start_datetime=start_date,
|
|
161
212
|
end_datetime=end_date,
|
|
162
213
|
step_type="minutes",
|
|
163
|
-
step=
|
|
214
|
+
step=60, # One hour intervals to make the example more manageable
|
|
164
215
|
lat=37.9838,
|
|
165
216
|
lng=23.7275,
|
|
166
217
|
tz_str="Europe/Athens",
|
|
@@ -170,9 +221,22 @@ if "__main__" == __name__:
|
|
|
170
221
|
max_days=None,
|
|
171
222
|
)
|
|
172
223
|
|
|
224
|
+
# Test original method
|
|
173
225
|
ephemeris_data = factory.get_ephemeris_data(as_model=True)
|
|
174
|
-
print(ephemeris_data
|
|
175
|
-
print(
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
226
|
+
print(f"Number of ephemeris data points: {len(ephemeris_data)}")
|
|
227
|
+
print(f"First data point date: {ephemeris_data[0].date}")
|
|
228
|
+
|
|
229
|
+
# Test new method
|
|
230
|
+
subjects = factory.get_ephemeris_data_as_astrological_subjects()
|
|
231
|
+
print(f"Number of astrological subjects: {len(subjects)}")
|
|
232
|
+
print(f"First subject sun position: {subjects[0].sun}")
|
|
233
|
+
|
|
234
|
+
# Example of accessing more data from the first subject
|
|
235
|
+
first_subject = subjects[0]
|
|
236
|
+
print(f"Sun sign: {first_subject.sun['sign']}")
|
|
237
|
+
|
|
238
|
+
# Compare sun positions from both methods
|
|
239
|
+
for i in range(min(3, len(subjects))):
|
|
240
|
+
print(f"Date: {ephemeris_data[i].date}")
|
|
241
|
+
print(f"Sun position from dict: {ephemeris_data[i].planets[0]['abs_pos']}")
|
|
242
|
+
print("---")
|
kerykeion/kr_types/kr_models.py
CHANGED
|
@@ -169,8 +169,10 @@ class EphemerisDictModel(SubscriptableBaseModel):
|
|
|
169
169
|
|
|
170
170
|
class AspectModel(SubscriptableBaseModel):
|
|
171
171
|
p1_name: str
|
|
172
|
+
p1_owner: str
|
|
172
173
|
p1_abs_pos: float
|
|
173
174
|
p2_name: str
|
|
175
|
+
p2_owner: str
|
|
174
176
|
p2_abs_pos: float
|
|
175
177
|
aspect: str
|
|
176
178
|
orbit: float
|
|
@@ -278,3 +280,45 @@ class CompositeSubjectModel(SubscriptableBaseModel):
|
|
|
278
280
|
class ActiveAspect(TypedDict):
|
|
279
281
|
name: AspectName
|
|
280
282
|
orb: int
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
class TransitMomentModel(SubscriptableBaseModel):
|
|
286
|
+
"""
|
|
287
|
+
Model representing a snapshot of astrological transits at a specific moment in time.
|
|
288
|
+
|
|
289
|
+
Captures all active aspects between moving celestial bodies and
|
|
290
|
+
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
|
+
"""
|
|
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."""
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class TransitsTimeRangeModel(SubscriptableBaseModel):
|
|
305
|
+
"""
|
|
306
|
+
Model representing a collection of transit moments for an astrological subject.
|
|
307
|
+
|
|
308
|
+
This model holds a time series of transit snapshots, allowing analysis of
|
|
309
|
+
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
|
+
"""
|
|
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."""
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from typing import Optional, Union, List
|
|
2
|
+
from datetime import datetime, timedelta
|
|
3
|
+
from kerykeion import AstrologicalSubject, SynastryAspects
|
|
4
|
+
from kerykeion.ephemeris_data import EphemerisDataFactory
|
|
5
|
+
from kerykeion.kr_types.kr_literals import AxialCusps, Planet
|
|
6
|
+
from kerykeion.kr_types.kr_models import ActiveAspect, TransitMomentModel, TransitsTimeRangeModel
|
|
7
|
+
from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS, DEFAULT_ACTIVE_ASPECTS
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TransitsTimeRangeFactory:
|
|
11
|
+
"""
|
|
12
|
+
Factory class for generating astrological transit data over a period of time.
|
|
13
|
+
|
|
14
|
+
This class compares the positions of celestial bodies at different points in time
|
|
15
|
+
with the natal chart of an astrological subject to identify significant aspects
|
|
16
|
+
and produces structured models containing the transit data.
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
natal_chart: The natal chart of the subject for whom transits are calculated.
|
|
20
|
+
ephemeris_data_points: List of ephemeris data points representing planetary positions at different times.
|
|
21
|
+
active_points: List of celestial points to consider when calculating aspects.
|
|
22
|
+
active_aspects: List of aspect types to consider when analyzing planetary relationships.
|
|
23
|
+
settings_file: Path to custom settings file for aspect calculations (optional).
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(
|
|
27
|
+
self,
|
|
28
|
+
natal_chart: AstrologicalSubject,
|
|
29
|
+
ephemeris_data_points: List[AstrologicalSubject],
|
|
30
|
+
active_points: List[Union[AxialCusps, Planet]] = DEFAULT_ACTIVE_POINTS,
|
|
31
|
+
active_aspects: List[ActiveAspect] = DEFAULT_ACTIVE_ASPECTS,
|
|
32
|
+
settings_file: Optional[str] = None
|
|
33
|
+
):
|
|
34
|
+
"""
|
|
35
|
+
Initialize the TransitMomentsFactory with the necessary data.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
natal_chart: The natal chart of the subject for whom transits are calculated.
|
|
39
|
+
ephemeris_data_points: List of ephemeris data points representing planetary positions at different times.
|
|
40
|
+
active_points: List of celestial points to consider when calculating aspects.
|
|
41
|
+
active_aspects: List of aspect types to consider when analyzing planetary relationships.
|
|
42
|
+
settings_file: Path to custom settings file for aspect calculations (optional).
|
|
43
|
+
"""
|
|
44
|
+
self.natal_chart = natal_chart
|
|
45
|
+
self.ephemeris_data_points = ephemeris_data_points
|
|
46
|
+
self.active_points = active_points
|
|
47
|
+
self.active_aspects = active_aspects
|
|
48
|
+
self.settings_file = settings_file
|
|
49
|
+
|
|
50
|
+
def get_transit_moments(self) -> TransitsTimeRangeModel:
|
|
51
|
+
"""
|
|
52
|
+
Generate a model of transit moments for the given subject across all ephemeris data points.
|
|
53
|
+
|
|
54
|
+
This method compares the positions of celestial bodies at different points in time
|
|
55
|
+
with the natal chart of the subject to identify significant aspects and
|
|
56
|
+
compiles them into a structured model for analysis.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
TransitMomentsListModel: A model containing all transit data, including aspects,
|
|
60
|
+
dates, and subject information.
|
|
61
|
+
"""
|
|
62
|
+
transit_moments = []
|
|
63
|
+
|
|
64
|
+
for ephemeris_point in self.ephemeris_data_points:
|
|
65
|
+
# Calculate aspects between transit positions and natal chart
|
|
66
|
+
aspects = SynastryAspects(
|
|
67
|
+
ephemeris_point,
|
|
68
|
+
self.natal_chart,
|
|
69
|
+
active_points=self.active_points,
|
|
70
|
+
active_aspects=self.active_aspects,
|
|
71
|
+
new_settings_file=self.settings_file,
|
|
72
|
+
).relevant_aspects
|
|
73
|
+
|
|
74
|
+
# Create a transit moment for this point in time
|
|
75
|
+
transit_moments.append(
|
|
76
|
+
TransitMomentModel(
|
|
77
|
+
date=ephemeris_point.iso_formatted_utc_datetime,
|
|
78
|
+
aspects=aspects,
|
|
79
|
+
)
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Create and return the complete transits model
|
|
83
|
+
return TransitsTimeRangeModel(
|
|
84
|
+
dates=[point.iso_formatted_utc_datetime for point in self.ephemeris_data_points],
|
|
85
|
+
subject=self.natal_chart.model(),
|
|
86
|
+
transits=transit_moments
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
# Create a natal chart for the subject
|
|
92
|
+
person = AstrologicalSubject(
|
|
93
|
+
"Johnny Depp", 1963, 6, 9, 20, 15, "Owensboro", "US"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# Define the time period for transit calculation
|
|
97
|
+
start_date = datetime.now()
|
|
98
|
+
end_date = datetime.now() + timedelta(days=30)
|
|
99
|
+
|
|
100
|
+
# Create ephemeris data for the specified time period
|
|
101
|
+
ephemeris_factory = EphemerisDataFactory(
|
|
102
|
+
start_datetime=start_date,
|
|
103
|
+
end_datetime=end_date,
|
|
104
|
+
step_type="days",
|
|
105
|
+
step=1,
|
|
106
|
+
lat=person.lat,
|
|
107
|
+
lng=person.lng,
|
|
108
|
+
tz_str=person.tz_str,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
ephemeris_data_points = ephemeris_factory.get_ephemeris_data_as_astrological_subjects()
|
|
112
|
+
|
|
113
|
+
# Calculate transits for the subject
|
|
114
|
+
transit_factory = TransitsTimeRangeFactory(
|
|
115
|
+
natal_chart=person,
|
|
116
|
+
ephemeris_data_points=ephemeris_data_points,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
transit_results = transit_factory.get_transit_moments()
|
|
120
|
+
|
|
121
|
+
# Print example data
|
|
122
|
+
print(transit_results.model_dump()["dates"][2])
|
|
123
|
+
print(transit_results.model_dump()["transits"][2]['date'])
|
|
124
|
+
print(transit_results.model_dump()["transits"][2]['aspects'][0])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: kerykeion
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.26.0rc1
|
|
4
4
|
Summary: A python library for astrology.
|
|
5
5
|
Home-page: https://www.kerykeion.net/
|
|
6
6
|
License: AGPL-3.0
|
|
@@ -37,53 +37,49 @@ Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
|
|
|
37
37
|
Project-URL: Repository, https://github.com/g-battaglia/kerykeion
|
|
38
38
|
Description-Content-Type: text/markdown
|
|
39
39
|
|
|
40
|
-
<h1 align=center>Kerykeion</h1>
|
|
40
|
+
<h1 align="center">Kerykeion</h1>
|
|
41
|
+
|
|
41
42
|
<div align="center">
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
<img src="https://img.shields.io/github/stars/g-battaglia/kerykeion.svg?logo=github" alt="stars">
|
|
44
|
+
<img src="https://img.shields.io/github/forks/g-battaglia/kerykeion.svg?logo=github" alt="forks">
|
|
45
45
|
</div>
|
|
46
46
|
<div align="center">
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
<img src="https://static.pepy.tech/badge/kerykeion/month" alt="PyPI Downloads">
|
|
48
|
+
<img src="https://static.pepy.tech/badge/kerykeion/week" alt="PyPI Downloads">
|
|
49
|
+
<img src="https://img.shields.io/github/contributors/g-battaglia/kerykeion?color=blue&logo=github" alt="contributors">
|
|
50
|
+
<img src="https://img.shields.io/pypi/v/kerykeion?label=pypi%20package" alt="Package version">
|
|
51
|
+
<img src="https://img.shields.io/pypi/pyversions/kerykeion.svg" alt="Supported Python versions">
|
|
52
52
|
</div>
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
Kerykeion is a
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
need in the settings in the utility module.
|
|
60
|
-
It also can generate an SVG of a birthchart, a synastry chart or a transit chart.
|
|
56
|
+
Kerykeion is a Python library for astrology. It computes planetary and house positions, detects aspects (individual, synastry, composite), and generates SVG charts—including birth, synastry, transit, and composite charts. You can also customize which planets to include in your calculations.
|
|
57
|
+
|
|
58
|
+
The main goal of this project is to offer a clean, data-driven approach to astrology, making it accessible and programmable.
|
|
61
59
|
|
|
62
|
-
|
|
60
|
+
Kerykeion also integrates seamlessly with AI applications. It is designed to work well as a backend for chatbots, recommendation systems, or personal assistants that require astrological insights. You can access structured data in JSON format, making it easy to combine with natural language processing models or knowledge-based systems.
|
|
63
61
|
|
|
64
|
-
Here
|
|
62
|
+
Here is an example of a birthchart:
|
|
65
63
|
|
|
66
64
|

|
|
67
65
|
|
|
68
66
|
## Web API
|
|
69
67
|
|
|
70
|
-
If you want to use Kerykeion in a web application,
|
|
68
|
+
If you want to use Kerykeion in a web application, you can try the dedicated web API:
|
|
71
69
|
|
|
72
70
|
**[AstrologerAPI](https://rapidapi.com/gbattaglia/api/astrologer/pricing)**
|
|
73
71
|
|
|
74
|
-
It
|
|
72
|
+
It is [open source](https://github.com/g-battaglia/Astrologer-API) and directly supports this project.
|
|
75
73
|
|
|
76
74
|
## Donate
|
|
77
75
|
|
|
78
|
-
Maintaining this project
|
|
79
|
-
|
|
80
|
-
If you want to support me, you can do it here:
|
|
76
|
+
Maintaining this project requires substantial time and effort. The Astrologer API alone cannot cover the costs of full-time development. If you find Kerykeion valuable and would like to support further development, please consider donating:
|
|
81
77
|
|
|
82
78
|
[](https://ko-fi.com/kerykeion)
|
|
83
79
|
|
|
84
80
|
## Installation
|
|
85
81
|
|
|
86
|
-
Kerykeion
|
|
82
|
+
Kerykeion requires **Python 3.9** or higher.
|
|
87
83
|
|
|
88
84
|
```bash
|
|
89
85
|
pip3 install kerykeion
|
|
@@ -91,48 +87,40 @@ pip3 install kerykeion
|
|
|
91
87
|
|
|
92
88
|
## Basic Usage
|
|
93
89
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
Here's an example:
|
|
90
|
+
Below is a simple example illustrating the creation of an astrological subject and retrieving astrological details:
|
|
97
91
|
|
|
98
92
|
```python
|
|
99
|
-
|
|
100
|
-
# Import the main class for creating a kerykeion instance:
|
|
101
93
|
from kerykeion import AstrologicalSubject
|
|
102
94
|
|
|
103
|
-
# Create
|
|
104
|
-
#
|
|
95
|
+
# Create an instance of the AstrologicalSubject class.
|
|
96
|
+
# Arguments: Name, year, month, day, hour, minutes, city, nation
|
|
105
97
|
kanye = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, "Atlanta", "US")
|
|
106
98
|
|
|
107
|
-
#
|
|
108
|
-
# (The position of the planets always starts at 0)
|
|
99
|
+
# Retrieve information about the Sun:
|
|
109
100
|
kanye.sun
|
|
101
|
+
# > {'name': 'Sun', 'quality': 'Mutable', 'element': 'Air', 'sign': 'Gem', 'sign_num': 2, ...}
|
|
110
102
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
# Get information about the first house:
|
|
103
|
+
# Retrieve information about the first house:
|
|
114
104
|
kanye.first_house
|
|
105
|
+
# > {'name': 'First_House', 'quality': 'Cardinal', 'element': 'Water', 'sign': 'Can', ...}
|
|
115
106
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
# Get element of the moon sign:
|
|
107
|
+
# Retrieve the element of the Moon sign:
|
|
119
108
|
kanye.moon.element
|
|
120
|
-
|
|
121
|
-
#> 'Water'
|
|
122
|
-
|
|
109
|
+
# > 'Water'
|
|
123
110
|
```
|
|
124
111
|
|
|
125
|
-
**To avoid
|
|
112
|
+
**To avoid using GeoNames online, specify longitude, latitude, and timezone instead of city and nation:**
|
|
126
113
|
|
|
127
114
|
```python
|
|
128
115
|
kanye = AstrologicalSubject(
|
|
129
|
-
"Kanye", 1977, 6, 8, 8, 45,
|
|
116
|
+
"Kanye", 1977, 6, 8, 8, 45,
|
|
117
|
+
lng=50,
|
|
118
|
+
lat=50,
|
|
119
|
+
tz_str="Europe/Rome",
|
|
120
|
+
city="Rome"
|
|
130
121
|
)
|
|
131
122
|
```
|
|
132
123
|
|
|
133
|
-
The difference is that you have to pass the longitude, latitude and the timezone string, instead of the city and nation.
|
|
134
|
-
If you omit the nation, it will be set to "GB" by default, but the value is not used for calculations. It's better to set it to the correct value though.
|
|
135
|
-
|
|
136
124
|
## Generate a SVG Chart
|
|
137
125
|
|
|
138
126
|
### Birth Chart
|
|
@@ -140,15 +128,13 @@ If you omit the nation, it will be set to "GB" by default, but the value is not
|
|
|
140
128
|
```python
|
|
141
129
|
from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
142
130
|
|
|
143
|
-
|
|
144
131
|
birth_chart = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, "Atlanta", "US")
|
|
145
132
|
birth_chart_svg = KerykeionChartSVG(birth_chart)
|
|
146
|
-
|
|
147
133
|
birth_chart_svg.makeSVG()
|
|
148
134
|
```
|
|
149
135
|
|
|
150
136
|
The SVG file will be saved in the home directory.
|
|
151
|
-

|
|
152
138
|
|
|
153
139
|
### Synastry Chart
|
|
154
140
|
|
|
@@ -158,13 +144,11 @@ from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
|
158
144
|
first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
|
|
159
145
|
second = AstrologicalSubject("Paul McCartney", 1942, 6, 18, 15, 30, "Liverpool", "GB")
|
|
160
146
|
|
|
161
|
-
# Set the type, it can be Natal, Synastry or Transit
|
|
162
147
|
synastry_chart = KerykeionChartSVG(first, "Synastry", second)
|
|
163
148
|
synastry_chart.makeSVG()
|
|
164
|
-
|
|
165
149
|
```
|
|
166
150
|
|
|
167
|
-

|
|
168
152
|
|
|
169
153
|
|
|
170
154
|
### Transit Chart
|
|
@@ -187,20 +171,21 @@ transit_chart.makeSVG()
|
|
|
187
171
|
from kerykeion import CompositeSubjectFactory, AstrologicalSubject, KerykeionChartSVG
|
|
188
172
|
|
|
189
173
|
angelina = AstrologicalSubject("Angelina Jolie", 1975, 6, 4, 9, 9, "Los Angeles", "US", lng=-118.15, lat=34.03, tz_str="America/Los_Angeles")
|
|
174
|
+
|
|
190
175
|
brad = AstrologicalSubject("Brad Pitt", 1963, 12, 18, 6, 31, "Shawnee", "US", lng=-96.56, lat=35.20, tz_str="America/Chicago")
|
|
191
176
|
|
|
192
|
-
|
|
193
|
-
|
|
177
|
+
factory = CompositeSubjectFactory(angelina, brad)
|
|
178
|
+
composite_model = factory.get_midpoint_composite_subject_model()
|
|
194
179
|
|
|
195
|
-
composite_chart = KerykeionChartSVG(
|
|
180
|
+
composite_chart = KerykeionChartSVG(composite_model, "Composite")
|
|
196
181
|
composite_chart.makeSVG()
|
|
197
182
|
```
|
|
198
183
|
|
|
199
184
|

|
|
200
185
|
|
|
201
|
-
### Change the
|
|
186
|
+
### Change the Output Directory
|
|
202
187
|
|
|
203
|
-
|
|
188
|
+
To save the SVG file in a custom location, specify `new_output_directory`:
|
|
204
189
|
|
|
205
190
|
```python
|
|
206
191
|
from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
@@ -208,23 +193,24 @@ from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
|
208
193
|
first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
|
|
209
194
|
second = AstrologicalSubject("Paul McCartney", 1942, 6, 18, 15, 30, "Liverpool", "GB")
|
|
210
195
|
|
|
211
|
-
|
|
212
|
-
|
|
196
|
+
synastry_chart = KerykeionChartSVG(
|
|
197
|
+
first, "Synastry", second,
|
|
198
|
+
new_output_directory="."
|
|
199
|
+
)
|
|
213
200
|
synastry_chart.makeSVG()
|
|
214
201
|
```
|
|
215
202
|
|
|
216
203
|
### Change Language
|
|
217
204
|
|
|
218
|
-
You can
|
|
205
|
+
You can switch chart language by passing `chart_language` to the `AstrologicalSubject` or `KerykeionChartSVG` classes:
|
|
219
206
|
|
|
220
207
|
```python
|
|
221
208
|
first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB", chart_language="ES")
|
|
222
209
|
```
|
|
223
|
-
More details [here](https://www.kerykeion.net/docs/examples/chart-language).
|
|
224
210
|
|
|
225
|
-
|
|
211
|
+
More details [here](https://www.kerykeion.net/docs//chart-language).
|
|
226
212
|
|
|
227
|
-
|
|
213
|
+
## Report
|
|
228
214
|
|
|
229
215
|
```python
|
|
230
216
|
from kerykeion import Report, AstrologicalSubject
|
|
@@ -232,7 +218,6 @@ from kerykeion import Report, AstrologicalSubject
|
|
|
232
218
|
kanye = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, "Atlanta", "US")
|
|
233
219
|
report = Report(kanye)
|
|
234
220
|
report.print_report()
|
|
235
|
-
|
|
236
221
|
```
|
|
237
222
|
|
|
238
223
|
Returns:
|
|
@@ -280,56 +265,57 @@ Returns:
|
|
|
280
265
|
| Twelfth_House | Gem | 15.68 |
|
|
281
266
|
+----------------+------+----------+
|
|
282
267
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
And if you want to export it to a file:
|
|
268
|
+
To export to a file:
|
|
286
269
|
|
|
287
270
|
```bash
|
|
288
271
|
python3 your_script_name.py > file.txt
|
|
289
272
|
```
|
|
290
273
|
|
|
291
|
-
##
|
|
274
|
+
## Example: Retrieving Aspects
|
|
292
275
|
|
|
293
276
|
```python
|
|
294
|
-
# Get all aspects between two persons:
|
|
295
|
-
|
|
296
277
|
from kerykeion import SynastryAspects, AstrologicalSubject
|
|
278
|
+
|
|
297
279
|
first = AstrologicalSubject("Jack", 1990, 6, 15, 15, 15, "Roma", "IT")
|
|
298
|
-
second = AstrologicalSubject("Jane", 1991, 10, 25, 21,
|
|
280
|
+
second = AstrologicalSubject("Jane", 1991, 10, 25, 21, 0, "Roma", "IT")
|
|
299
281
|
|
|
300
282
|
name = SynastryAspects(first, second)
|
|
301
283
|
aspect_list = name.get_relevant_aspects()
|
|
302
284
|
print(aspect_list[0])
|
|
303
|
-
|
|
304
|
-
#> Generating kerykeion object for Jack...
|
|
305
|
-
#> Generating kerykeion object for Jane...
|
|
306
285
|
#> {'p1_name': 'Sun', 'p1_abs_pos': 84.17867971515636, 'p2_name': 'Sun', 'p2_abs_pos': 211.90472999502984, 'aspect': 'trine', 'orbit': 7.726050279873476, 'aspect_degrees': 120, 'color': '#36d100', 'aid': 6, 'diff': 127.72605027987348, 'p1': 0, 'p2': 0}
|
|
307
286
|
|
|
308
287
|
```
|
|
309
288
|
|
|
310
289
|
## Ayanamsa (Sidereal Modes)
|
|
311
290
|
|
|
312
|
-
By default, the zodiac type is
|
|
313
|
-
You can set the zodiac type to Sidereal and the sidereal mode in the AstrologicalSubject class:
|
|
291
|
+
By default, the zodiac type is **Tropical**. To use **Sidereal**, specify the sidereal mode:
|
|
314
292
|
|
|
315
293
|
```python
|
|
316
|
-
johnny = AstrologicalSubject(
|
|
294
|
+
johnny = AstrologicalSubject(
|
|
295
|
+
"Johnny Depp", 1963, 6, 9, 0, 0,
|
|
296
|
+
"Owensboro", "US",
|
|
297
|
+
zodiac_type="Sidereal",
|
|
298
|
+
sidereal_mode="LAHIRI"
|
|
299
|
+
)
|
|
317
300
|
```
|
|
318
301
|
|
|
319
|
-
More examples [here](https://www.kerykeion.net/docs
|
|
302
|
+
More examples [here](https://www.kerykeion.net/docs//sidereal-modes/).
|
|
320
303
|
|
|
321
304
|
Full list of supported sidereal modes [here](https://www.kerykeion.net/pydocs/kerykeion/kr_types/kr_literals.html#SiderealMode).
|
|
322
305
|
|
|
323
|
-
##
|
|
306
|
+
## House Systems
|
|
324
307
|
|
|
325
|
-
By default,
|
|
326
|
-
You can set the houses system in the AstrologicalSubject class:
|
|
308
|
+
By default, houses are calculated using **Placidus**. Configure a different house system as follows:
|
|
327
309
|
|
|
328
310
|
```python
|
|
329
|
-
johnny = AstrologicalSubject(
|
|
311
|
+
johnny = AstrologicalSubject(
|
|
312
|
+
"Johnny Depp", 1963, 6, 9, 0, 0,
|
|
313
|
+
"Owensboro", "US",
|
|
314
|
+
houses_system="M"
|
|
315
|
+
)
|
|
330
316
|
```
|
|
331
317
|
|
|
332
|
-
More examples [here](https://www.kerykeion.net/docs
|
|
318
|
+
More examples [here](https://www.kerykeion.net/docs//houses-systems/).
|
|
333
319
|
|
|
334
320
|
Full list of supported house systems [here](https://www.kerykeion.net/pydocs/kerykeion/kr_types/kr_literals.html#HousesSystem).
|
|
335
321
|
|
|
@@ -337,28 +323,30 @@ So far all the available houses system in the Swiss Ephemeris are supported but
|
|
|
337
323
|
|
|
338
324
|
## Perspective Type
|
|
339
325
|
|
|
340
|
-
By default,
|
|
341
|
-
The perspective indicates the point of view from which the chart is calculated (Es. Apparent Geocentric, Heliocentric, etc.).
|
|
342
|
-
You can set the perspective type in the AstrologicalSubject class:
|
|
326
|
+
By default, Kerykeion uses the **Apparent Geocentric** perspective (the most standard in astrology). Other perspectives (e.g., **Heliocentric**) can be set this way:
|
|
343
327
|
|
|
344
328
|
```python
|
|
345
|
-
johnny = AstrologicalSubject(
|
|
329
|
+
johnny = AstrologicalSubject(
|
|
330
|
+
"Johnny Depp", 1963, 6, 9, 0, 0,
|
|
331
|
+
"Owensboro", "US",
|
|
332
|
+
perspective_type="Heliocentric"
|
|
333
|
+
)
|
|
346
334
|
```
|
|
347
335
|
|
|
348
|
-
More examples [here](https://www.kerykeion.net/docs
|
|
336
|
+
More examples [here](https://www.kerykeion.net/docs//perspective-type/).
|
|
349
337
|
|
|
350
338
|
Full list of supported perspective types [here](https://www.kerykeion.net/pydocs/kerykeion/kr_types/kr_literals.html#PerspectiveType).
|
|
351
339
|
|
|
352
340
|
## Themes
|
|
353
341
|
|
|
354
|
-
|
|
342
|
+
Kerykeion provides several chart themes:
|
|
355
343
|
|
|
356
344
|
- **Classic** (default)
|
|
357
345
|
- **Dark**
|
|
358
346
|
- **Dark High Contrast**
|
|
359
347
|
- **Light**
|
|
360
|
-
|
|
361
|
-
Each theme offers a distinct visual style, allowing you to choose the one that best suits your preferences or presentation needs. If you prefer more control over the appearance, you can opt not to set any theme, making it easier to customize the chart by overriding the default CSS variables. For more detailed instructions on how to apply themes, check the [documentation](https://www.kerykeion.net/docs/
|
|
348
|
+
|
|
349
|
+
Each theme offers a distinct visual style, allowing you to choose the one that best suits your preferences or presentation needs. If you prefer more control over the appearance, you can opt not to set any theme, making it easier to customize the chart by overriding the default CSS variables. For more detailed instructions on how to apply themes, check the [documentation](https://www.kerykeion.net/docs/theming)
|
|
362
350
|
|
|
363
351
|
Here's an example of how to set the theme:
|
|
364
352
|
|
|
@@ -370,28 +358,26 @@ dark_theme_natal_chart = KerykeionChartSVG(dark_high_contrast_theme_subject, the
|
|
|
370
358
|
dark_theme_natal_chart.makeSVG()
|
|
371
359
|
```
|
|
372
360
|
|
|
373
|
-

|
|
374
362
|
|
|
375
363
|
## Alternative Initialization
|
|
376
364
|
|
|
377
|
-
|
|
365
|
+
Create an `AstrologicalSubject` from a UTC ISO 8601 string:
|
|
378
366
|
|
|
379
367
|
```python
|
|
380
368
|
subject = AstrologicalSubject.get_from_iso_utc_time(
|
|
381
|
-
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US"
|
|
369
|
+
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US"
|
|
370
|
+
)
|
|
382
371
|
```
|
|
383
372
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
The default online/offline mode is set to offline, if you set it online the default latitude and longitude will be ignored and
|
|
387
|
-
calculated from the city and nation. Remember to pass also the geonames_username parameter if you want to use the online mode, like this:
|
|
373
|
+
If you set `online=True`, provide a `geonames_username` to allow city-based geolocation:
|
|
388
374
|
|
|
389
375
|
```python
|
|
390
376
|
from kerykeion.astrological_subject import AstrologicalSubject
|
|
391
377
|
|
|
392
|
-
# Use the static method get_from_iso_utc_time to create an instance of AstrologicalSubject
|
|
393
378
|
subject = AstrologicalSubject.get_from_iso_utc_time(
|
|
394
|
-
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US", online=True
|
|
379
|
+
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US", online=True
|
|
380
|
+
)
|
|
395
381
|
```
|
|
396
382
|
|
|
397
383
|
## Lunar Nodes (Rahu & Ketu)
|
|
@@ -427,7 +413,7 @@ To display them, you need to edit the configuration file (kr.config.json).
|
|
|
427
413
|
|
|
428
414
|
## JSON Support
|
|
429
415
|
|
|
430
|
-
|
|
416
|
+
You can serialize the astrological subject (the base data used throughout the library) to JSON:
|
|
431
417
|
|
|
432
418
|
```python
|
|
433
419
|
from kerykeion import AstrologicalSubject
|
|
@@ -437,31 +423,25 @@ johnny = AstrologicalSubject("Johnny Depp", 1963, 6, 9, 0, 0, "Owensboro", "US")
|
|
|
437
423
|
print(johnny.json(dump=False, indent=2))
|
|
438
424
|
```
|
|
439
425
|
|
|
440
|
-
## Documentation
|
|
441
|
-
|
|
442
|
-
Most of the functions and the classes are self documented by the types and have docstrings.
|
|
443
|
-
An auto-generated documentation [is available here](https://www.kerykeion.net/pydocs/kerykeion.html).
|
|
426
|
+
## Auto Generated Documentation
|
|
444
427
|
|
|
445
|
-
|
|
428
|
+
You can find auto-generated documentation [here](https://www.kerykeion.net/pydocs/kerykeion.html). Most classes and functions include docstrings.
|
|
446
429
|
|
|
447
430
|
## Development
|
|
448
431
|
|
|
449
|
-
|
|
432
|
+
Clone the repository or download the ZIP via the GitHub interface.
|
|
450
433
|
|
|
451
|
-
##
|
|
434
|
+
## Integrating Kerykeion into Your Project
|
|
452
435
|
|
|
453
|
-
If you
|
|
436
|
+
If you would like to incorporate Kerykeion’s astrological features into your application, please reach out via [email](mailto:kerykeion.astrology@gmail.com?subject=Integration%20Request). Whether you need custom features, support, or specialized consulting, I am happy to discuss potential collaborations.
|
|
454
437
|
|
|
455
438
|
## License
|
|
456
439
|
|
|
457
|
-
This project is
|
|
458
|
-
To understand how this impacts your use of the software, please see the [LICENSE](LICENSE) file for details.
|
|
459
|
-
If you have questions, you can reach out to me at my [email](mailto:kerykeion.astrology@gmail.com?subject=Kerykeion) address.
|
|
460
|
-
As a rule of thumb, if you are using this library in a project, you should open source the code of the project with a compatible license.
|
|
440
|
+
This project is covered under the AGPL-3.0 License. For detailed information, please see the [LICENSE](LICENSE) file. If you have questions, feel free to contact me at [kerykeion.astrology@gmail.com](mailto:kerykeion.astrology@gmail.com?subject=Kerykeion).
|
|
461
441
|
|
|
462
|
-
|
|
442
|
+
As a rule of thumb, if you use this library in a project, you should open-source that project under a compatible license. Alternatively, if you wish to keep your source closed, consider using the [AstrologerAPI](https://rapidapi.com/gbattaglia/api/astrologer/), which is AGPL-3.0 compliant and also helps support the project.
|
|
463
443
|
|
|
464
444
|
## Contributing
|
|
465
445
|
|
|
466
|
-
Feel free to
|
|
446
|
+
Contributions are welcome! Feel free to submit pull requests or report issues.
|
|
467
447
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
|
|
2
|
-
kerykeion/__init__.py,sha256=
|
|
2
|
+
kerykeion/__init__.py,sha256=2tiOzdqAj07A-wdHe30Gq3ElPnyWcLtOBodV_8tB37c,760
|
|
3
3
|
kerykeion/aspects/__init__.py,sha256=9kx_Rx1NJx5SM7nDCSbI79S1neZ3c-q2NvQr-S6A9PY,292
|
|
4
4
|
kerykeion/aspects/aspects_utils.py,sha256=Ej-E7Uvfi8x_ydP9dOhzhCp2uSpvX67T_VXuOjEKdoQ,3071
|
|
5
|
-
kerykeion/aspects/natal_aspects.py,sha256=
|
|
6
|
-
kerykeion/aspects/synastry_aspects.py,sha256=
|
|
5
|
+
kerykeion/aspects/natal_aspects.py,sha256=mwAGDPQE56PMoO8qSkJq7DDPb2aIz_0cVt5nfZHoaq0,6759
|
|
6
|
+
kerykeion/aspects/synastry_aspects.py,sha256=9qw5cV1aiGI9vHFi41-2bBc-BfHU56tFPafZI-RQTiY,5155
|
|
7
|
+
kerykeion/aspects/transits_time_range.py,sha256=_8FHnuWVE5A_9iB_uehMBNp9s8x30n-mMyN-X6-pNw8,1156
|
|
7
8
|
kerykeion/astrological_subject.py,sha256=643axkLtIVPkOOTHhB4InHYn3XVEOBZdXLS9B-N7kSQ,36451
|
|
8
9
|
kerykeion/charts/__init__.py,sha256=i9NMZ7LdkllPlqQSi1or9gTobHbROGDKmJhBDO4R0mA,128
|
|
9
10
|
kerykeion/charts/charts_utils.py,sha256=TGmya60LMswUvQMi6irJWaboK6QRWCZ52wv5FMgaUT8,40424
|
|
@@ -18,13 +19,13 @@ kerykeion/charts/themes/dark.css,sha256=ml2lnzQVuS5DhCdoeUrDmMv9kB1nNceRt7hHbOHS
|
|
|
18
19
|
kerykeion/charts/themes/light.css,sha256=ALf5U8tQsb6ky0N9R7ZLOHDrfKEXNM-sBR3JIRxFrCI,6092
|
|
19
20
|
kerykeion/composite_subject_factory.py,sha256=ha66wQzcyJTb6XvJo3ppcZIZfvg4LQbFMLiIOm8Up0c,8245
|
|
20
21
|
kerykeion/enums.py,sha256=nPXgP_ocsRnRno5H-yunZy3fp-hLZ9aYRaUb-2gBdvw,1199
|
|
21
|
-
kerykeion/ephemeris_data.py,sha256=
|
|
22
|
+
kerykeion/ephemeris_data.py,sha256=SAPEuVPv6iB1R95kpVgymOC5P3_fj7E3eqMEhegtJfg,10995
|
|
22
23
|
kerykeion/fetch_geonames.py,sha256=e66Nh6yq9A4VjnuvVSiV1TW1IkJ9m3Q2LKPWrkOGgO0,4764
|
|
23
24
|
kerykeion/kr_types/__init__.py,sha256=jshJOccCQcYZuoOvrILRZH6imy4RBvKpFPujlNLFyGE,295
|
|
24
25
|
kerykeion/kr_types/chart_types.py,sha256=EFXTddX1wwTzbLSDKw_ipg4tbOihTKPEnn2T9ooFSig,2123
|
|
25
26
|
kerykeion/kr_types/kerykeion_exception.py,sha256=kE1y0K0rmuz32b4K_ZppSsZ59I2Get0ZkvOkTE5HejI,314
|
|
26
27
|
kerykeion/kr_types/kr_literals.py,sha256=b1JEgByA8-PWtkM8TdkNb2aePr8dUApI-OH3ciulJF8,4327
|
|
27
|
-
kerykeion/kr_types/kr_models.py,sha256=
|
|
28
|
+
kerykeion/kr_types/kr_models.py,sha256=3ZHc9887zpaftlsetNQ2iEhwzwwF7J7WhjuIUyMAuVU,8347
|
|
28
29
|
kerykeion/kr_types/settings_models.py,sha256=vo_feYdV_DFMw2aDQahe2q8W_OzsmzP0R91wxUxEZzg,11000
|
|
29
30
|
kerykeion/relationship_score/__init__.py,sha256=cLaEBQXQBfyRkv0OaS3ceLROzvWcvKXWiRq0PS6LDjY,114
|
|
30
31
|
kerykeion/relationship_score/relationship_score.py,sha256=lJkSbHw9nOUaPMrPxqcGhnVQIwAgI52K8BQzXXswb6A,6504
|
|
@@ -36,9 +37,10 @@ kerykeion/settings/kerykeion_settings.py,sha256=7GCGUzcctEg5uyWlzRk2YIotJSkCZDOV
|
|
|
36
37
|
kerykeion/settings/kr.config.json,sha256=4ZB7fkM0xiiXDLtxPRVDIVm0lUMYahWQmCVugFe274I,42628
|
|
37
38
|
kerykeion/sweph/README.md,sha256=L7FtNAJTWtrZNGKa8MX87SjduFYPYxwWhaI5fmtzNZo,73
|
|
38
39
|
kerykeion/sweph/seas_18.se1,sha256=X9nCqhZU43wJpq61WAdueVQJt9xL2UjrwPqn1Kdoa1s,223002
|
|
40
|
+
kerykeion/transits_time_range.py,sha256=mOAtJyVrHp1aFUnp9ERJ9z2X6jUcLQN8ECeSupV7F9g,5226
|
|
39
41
|
kerykeion/utilities.py,sha256=sZUFZQJXrMieLPg-0hCTrvfGQaWuPx6cMi-t1kJAxPw,15534
|
|
40
|
-
kerykeion-4.
|
|
41
|
-
kerykeion-4.
|
|
42
|
-
kerykeion-4.
|
|
43
|
-
kerykeion-4.
|
|
44
|
-
kerykeion-4.
|
|
42
|
+
kerykeion-4.26.0rc1.dist-info/LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
|
|
43
|
+
kerykeion-4.26.0rc1.dist-info/METADATA,sha256=txeOgxvMbGH6eYXJ2IFDCM70Rm2Ex9wLoxR-P10sG5U,17098
|
|
44
|
+
kerykeion-4.26.0rc1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
45
|
+
kerykeion-4.26.0rc1.dist-info/entry_points.txt,sha256=5SmANYscFDDTdeovHvGQ-cnj0hdFvGoxPaWLCpyDFnQ,49
|
|
46
|
+
kerykeion-4.26.0rc1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|