kerykeion 4.25.3__py3-none-any.whl → 4.26.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.
- 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.0.dist-info}/METADATA +127 -117
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0.dist-info}/RECORD +12 -10
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0.dist-info}/LICENSE +0 -0
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0.dist-info}/WHEEL +0 -0
- {kerykeion-4.25.3.dist-info → kerykeion-4.26.0.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.0
|
|
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,77 @@ 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, 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 LLM and AI applications.
|
|
63
61
|
|
|
64
|
-
Here
|
|
62
|
+
Here is an example of a birthchart:
|
|
65
63
|
|
|
66
64
|

|
|
67
65
|
|
|
68
|
-
|
|
66
|
+
**Web API**
|
|
67
|
+
---
|
|
69
68
|
|
|
70
|
-
If you want to use Kerykeion in a web application,
|
|
69
|
+
If you want to use Kerykeion in a web application, you can try the dedicated web API:
|
|
71
70
|
|
|
72
71
|
**[AstrologerAPI](https://rapidapi.com/gbattaglia/api/astrologer/pricing)**
|
|
73
72
|
|
|
74
|
-
It
|
|
75
|
-
|
|
76
|
-
## Donate
|
|
73
|
+
It is [open source](https://github.com/g-battaglia/Astrologer-API) and directly supports this project.
|
|
77
74
|
|
|
78
|
-
|
|
75
|
+
**Donate**
|
|
76
|
+
--
|
|
79
77
|
|
|
80
|
-
If you
|
|
78
|
+
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
79
|
|
|
82
80
|
[](https://ko-fi.com/kerykeion)
|
|
83
81
|
|
|
82
|
+
|
|
83
|
+
## Table of Contents
|
|
84
|
+
- [Installation](#installation)
|
|
85
|
+
- [Basic Usage](#basic-usage)
|
|
86
|
+
- [Generate a SVG Chart](#generate-a-svg-chart)
|
|
87
|
+
- [Birth Chart](#birth-chart)
|
|
88
|
+
- [Synastry Chart](#synastry-chart)
|
|
89
|
+
- [Transit Chart](#transit-chart)
|
|
90
|
+
- [Composite Chart](#composite-chart)
|
|
91
|
+
- [Change the Output Directory](#change-the-output-directory)
|
|
92
|
+
- [Change Language](#change-language)
|
|
93
|
+
- [Report](#report)
|
|
94
|
+
- [Example: Retrieving Aspects](#example-retrieving-aspects)
|
|
95
|
+
- [Ayanamsa (Sidereal Modes)](#ayanamsa-sidereal-modes)
|
|
96
|
+
- [House Systems](#house-systems)
|
|
97
|
+
- [Perspective Type](#perspective-type)
|
|
98
|
+
- [Themes](#themes)
|
|
99
|
+
- [Alternative Initialization](#alternative-initialization)
|
|
100
|
+
- [Lunar Nodes (Rahu \& Ketu)](#lunar-nodes-rahu--ketu)
|
|
101
|
+
- [JSON Support](#json-support)
|
|
102
|
+
- [Auto Generated Documentation](#auto-generated-documentation)
|
|
103
|
+
- [Development](#development)
|
|
104
|
+
- [Integrating Kerykeion into Your Project](#integrating-kerykeion-into-your-project)
|
|
105
|
+
- [License](#license)
|
|
106
|
+
- [Contributing](#contributing)
|
|
107
|
+
|
|
84
108
|
## Installation
|
|
85
109
|
|
|
86
|
-
Kerykeion
|
|
110
|
+
Kerykeion requires **Python 3.9** or higher.
|
|
87
111
|
|
|
88
112
|
```bash
|
|
89
113
|
pip3 install kerykeion
|
|
@@ -91,48 +115,40 @@ pip3 install kerykeion
|
|
|
91
115
|
|
|
92
116
|
## Basic Usage
|
|
93
117
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
Here's an example:
|
|
118
|
+
Below is a simple example illustrating the creation of an astrological subject and retrieving astrological details:
|
|
97
119
|
|
|
98
120
|
```python
|
|
99
|
-
|
|
100
|
-
# Import the main class for creating a kerykeion instance:
|
|
101
121
|
from kerykeion import AstrologicalSubject
|
|
102
122
|
|
|
103
|
-
# Create
|
|
104
|
-
#
|
|
123
|
+
# Create an instance of the AstrologicalSubject class.
|
|
124
|
+
# Arguments: Name, year, month, day, hour, minutes, city, nation
|
|
105
125
|
kanye = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, "Atlanta", "US")
|
|
106
126
|
|
|
107
|
-
#
|
|
108
|
-
# (The position of the planets always starts at 0)
|
|
127
|
+
# Retrieve information about the Sun:
|
|
109
128
|
kanye.sun
|
|
129
|
+
# > {'name': 'Sun', 'quality': 'Mutable', 'element': 'Air', 'sign': 'Gem', 'sign_num': 2, ...}
|
|
110
130
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
# Get information about the first house:
|
|
131
|
+
# Retrieve information about the first house:
|
|
114
132
|
kanye.first_house
|
|
133
|
+
# > {'name': 'First_House', 'quality': 'Cardinal', 'element': 'Water', 'sign': 'Can', ...}
|
|
115
134
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
# Get element of the moon sign:
|
|
135
|
+
# Retrieve the element of the Moon sign:
|
|
119
136
|
kanye.moon.element
|
|
120
|
-
|
|
121
|
-
#> 'Water'
|
|
122
|
-
|
|
137
|
+
# > 'Water'
|
|
123
138
|
```
|
|
124
139
|
|
|
125
|
-
**To avoid
|
|
140
|
+
**To avoid using GeoNames online, specify longitude, latitude, and timezone instead of city and nation:**
|
|
126
141
|
|
|
127
142
|
```python
|
|
128
143
|
kanye = AstrologicalSubject(
|
|
129
|
-
"Kanye", 1977, 6, 8, 8, 45,
|
|
144
|
+
"Kanye", 1977, 6, 8, 8, 45,
|
|
145
|
+
lng=50,
|
|
146
|
+
lat=50,
|
|
147
|
+
tz_str="Europe/Rome",
|
|
148
|
+
city="Rome"
|
|
130
149
|
)
|
|
131
150
|
```
|
|
132
151
|
|
|
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
152
|
## Generate a SVG Chart
|
|
137
153
|
|
|
138
154
|
### Birth Chart
|
|
@@ -140,15 +156,13 @@ If you omit the nation, it will be set to "GB" by default, but the value is not
|
|
|
140
156
|
```python
|
|
141
157
|
from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
142
158
|
|
|
143
|
-
|
|
144
159
|
birth_chart = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, "Atlanta", "US")
|
|
145
160
|
birth_chart_svg = KerykeionChartSVG(birth_chart)
|
|
146
|
-
|
|
147
161
|
birth_chart_svg.makeSVG()
|
|
148
162
|
```
|
|
149
163
|
|
|
150
164
|
The SVG file will be saved in the home directory.
|
|
151
|
-

|
|
152
166
|
|
|
153
167
|
### Synastry Chart
|
|
154
168
|
|
|
@@ -158,13 +172,11 @@ from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
|
158
172
|
first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
|
|
159
173
|
second = AstrologicalSubject("Paul McCartney", 1942, 6, 18, 15, 30, "Liverpool", "GB")
|
|
160
174
|
|
|
161
|
-
# Set the type, it can be Natal, Synastry or Transit
|
|
162
175
|
synastry_chart = KerykeionChartSVG(first, "Synastry", second)
|
|
163
176
|
synastry_chart.makeSVG()
|
|
164
|
-
|
|
165
177
|
```
|
|
166
178
|
|
|
167
|
-

|
|
168
180
|
|
|
169
181
|
|
|
170
182
|
### Transit Chart
|
|
@@ -187,20 +199,21 @@ transit_chart.makeSVG()
|
|
|
187
199
|
from kerykeion import CompositeSubjectFactory, AstrologicalSubject, KerykeionChartSVG
|
|
188
200
|
|
|
189
201
|
angelina = AstrologicalSubject("Angelina Jolie", 1975, 6, 4, 9, 9, "Los Angeles", "US", lng=-118.15, lat=34.03, tz_str="America/Los_Angeles")
|
|
202
|
+
|
|
190
203
|
brad = AstrologicalSubject("Brad Pitt", 1963, 12, 18, 6, 31, "Shawnee", "US", lng=-96.56, lat=35.20, tz_str="America/Chicago")
|
|
191
204
|
|
|
192
|
-
|
|
193
|
-
|
|
205
|
+
factory = CompositeSubjectFactory(angelina, brad)
|
|
206
|
+
composite_model = factory.get_midpoint_composite_subject_model()
|
|
194
207
|
|
|
195
|
-
composite_chart = KerykeionChartSVG(
|
|
208
|
+
composite_chart = KerykeionChartSVG(composite_model, "Composite")
|
|
196
209
|
composite_chart.makeSVG()
|
|
197
210
|
```
|
|
198
211
|
|
|
199
212
|

|
|
200
213
|
|
|
201
|
-
### Change the
|
|
214
|
+
### Change the Output Directory
|
|
202
215
|
|
|
203
|
-
|
|
216
|
+
To save the SVG file in a custom location, specify `new_output_directory`:
|
|
204
217
|
|
|
205
218
|
```python
|
|
206
219
|
from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
@@ -208,23 +221,24 @@ from kerykeion import AstrologicalSubject, KerykeionChartSVG
|
|
|
208
221
|
first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
|
|
209
222
|
second = AstrologicalSubject("Paul McCartney", 1942, 6, 18, 15, 30, "Liverpool", "GB")
|
|
210
223
|
|
|
211
|
-
|
|
212
|
-
|
|
224
|
+
synastry_chart = KerykeionChartSVG(
|
|
225
|
+
first, "Synastry", second,
|
|
226
|
+
new_output_directory="."
|
|
227
|
+
)
|
|
213
228
|
synastry_chart.makeSVG()
|
|
214
229
|
```
|
|
215
230
|
|
|
216
231
|
### Change Language
|
|
217
232
|
|
|
218
|
-
You can
|
|
233
|
+
You can switch chart language by passing `chart_language` to the `AstrologicalSubject` or `KerykeionChartSVG` classes:
|
|
219
234
|
|
|
220
235
|
```python
|
|
221
236
|
first = AstrologicalSubject("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB", chart_language="ES")
|
|
222
237
|
```
|
|
223
|
-
More details [here](https://www.kerykeion.net/docs/examples/chart-language).
|
|
224
238
|
|
|
225
|
-
|
|
239
|
+
More details [here](https://www.kerykeion.net/docs//chart-language).
|
|
226
240
|
|
|
227
|
-
|
|
241
|
+
## Report
|
|
228
242
|
|
|
229
243
|
```python
|
|
230
244
|
from kerykeion import Report, AstrologicalSubject
|
|
@@ -232,7 +246,6 @@ from kerykeion import Report, AstrologicalSubject
|
|
|
232
246
|
kanye = AstrologicalSubject("Kanye", 1977, 6, 8, 8, 45, "Atlanta", "US")
|
|
233
247
|
report = Report(kanye)
|
|
234
248
|
report.print_report()
|
|
235
|
-
|
|
236
249
|
```
|
|
237
250
|
|
|
238
251
|
Returns:
|
|
@@ -280,56 +293,57 @@ Returns:
|
|
|
280
293
|
| Twelfth_House | Gem | 15.68 |
|
|
281
294
|
+----------------+------+----------+
|
|
282
295
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
And if you want to export it to a file:
|
|
296
|
+
To export to a file:
|
|
286
297
|
|
|
287
298
|
```bash
|
|
288
299
|
python3 your_script_name.py > file.txt
|
|
289
300
|
```
|
|
290
301
|
|
|
291
|
-
##
|
|
302
|
+
## Example: Retrieving Aspects
|
|
292
303
|
|
|
293
304
|
```python
|
|
294
|
-
# Get all aspects between two persons:
|
|
295
|
-
|
|
296
305
|
from kerykeion import SynastryAspects, AstrologicalSubject
|
|
306
|
+
|
|
297
307
|
first = AstrologicalSubject("Jack", 1990, 6, 15, 15, 15, "Roma", "IT")
|
|
298
|
-
second = AstrologicalSubject("Jane", 1991, 10, 25, 21,
|
|
308
|
+
second = AstrologicalSubject("Jane", 1991, 10, 25, 21, 0, "Roma", "IT")
|
|
299
309
|
|
|
300
310
|
name = SynastryAspects(first, second)
|
|
301
311
|
aspect_list = name.get_relevant_aspects()
|
|
302
312
|
print(aspect_list[0])
|
|
303
|
-
|
|
304
|
-
#> Generating kerykeion object for Jack...
|
|
305
|
-
#> Generating kerykeion object for Jane...
|
|
306
313
|
#> {'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
314
|
|
|
308
315
|
```
|
|
309
316
|
|
|
310
317
|
## Ayanamsa (Sidereal Modes)
|
|
311
318
|
|
|
312
|
-
By default, the zodiac type is
|
|
313
|
-
You can set the zodiac type to Sidereal and the sidereal mode in the AstrologicalSubject class:
|
|
319
|
+
By default, the zodiac type is **Tropical**. To use **Sidereal**, specify the sidereal mode:
|
|
314
320
|
|
|
315
321
|
```python
|
|
316
|
-
johnny = AstrologicalSubject(
|
|
322
|
+
johnny = AstrologicalSubject(
|
|
323
|
+
"Johnny Depp", 1963, 6, 9, 0, 0,
|
|
324
|
+
"Owensboro", "US",
|
|
325
|
+
zodiac_type="Sidereal",
|
|
326
|
+
sidereal_mode="LAHIRI"
|
|
327
|
+
)
|
|
317
328
|
```
|
|
318
329
|
|
|
319
|
-
More examples [here](https://www.kerykeion.net/docs
|
|
330
|
+
More examples [here](https://www.kerykeion.net/docs//sidereal-modes/).
|
|
320
331
|
|
|
321
332
|
Full list of supported sidereal modes [here](https://www.kerykeion.net/pydocs/kerykeion/kr_types/kr_literals.html#SiderealMode).
|
|
322
333
|
|
|
323
|
-
##
|
|
334
|
+
## House Systems
|
|
324
335
|
|
|
325
|
-
By default,
|
|
326
|
-
You can set the houses system in the AstrologicalSubject class:
|
|
336
|
+
By default, houses are calculated using **Placidus**. Configure a different house system as follows:
|
|
327
337
|
|
|
328
338
|
```python
|
|
329
|
-
johnny = AstrologicalSubject(
|
|
339
|
+
johnny = AstrologicalSubject(
|
|
340
|
+
"Johnny Depp", 1963, 6, 9, 0, 0,
|
|
341
|
+
"Owensboro", "US",
|
|
342
|
+
houses_system="M"
|
|
343
|
+
)
|
|
330
344
|
```
|
|
331
345
|
|
|
332
|
-
More examples [here](https://www.kerykeion.net/docs
|
|
346
|
+
More examples [here](https://www.kerykeion.net/docs//houses-systems/).
|
|
333
347
|
|
|
334
348
|
Full list of supported house systems [here](https://www.kerykeion.net/pydocs/kerykeion/kr_types/kr_literals.html#HousesSystem).
|
|
335
349
|
|
|
@@ -337,28 +351,30 @@ So far all the available houses system in the Swiss Ephemeris are supported but
|
|
|
337
351
|
|
|
338
352
|
## Perspective Type
|
|
339
353
|
|
|
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:
|
|
354
|
+
By default, Kerykeion uses the **Apparent Geocentric** perspective (the most standard in astrology). Other perspectives (e.g., **Heliocentric**) can be set this way:
|
|
343
355
|
|
|
344
356
|
```python
|
|
345
|
-
johnny = AstrologicalSubject(
|
|
357
|
+
johnny = AstrologicalSubject(
|
|
358
|
+
"Johnny Depp", 1963, 6, 9, 0, 0,
|
|
359
|
+
"Owensboro", "US",
|
|
360
|
+
perspective_type="Heliocentric"
|
|
361
|
+
)
|
|
346
362
|
```
|
|
347
363
|
|
|
348
|
-
More examples [here](https://www.kerykeion.net/docs
|
|
364
|
+
More examples [here](https://www.kerykeion.net/docs//perspective-type/).
|
|
349
365
|
|
|
350
366
|
Full list of supported perspective types [here](https://www.kerykeion.net/pydocs/kerykeion/kr_types/kr_literals.html#PerspectiveType).
|
|
351
367
|
|
|
352
368
|
## Themes
|
|
353
369
|
|
|
354
|
-
|
|
370
|
+
Kerykeion provides several chart themes:
|
|
355
371
|
|
|
356
372
|
- **Classic** (default)
|
|
357
373
|
- **Dark**
|
|
358
374
|
- **Dark High Contrast**
|
|
359
375
|
- **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/
|
|
376
|
+
|
|
377
|
+
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
378
|
|
|
363
379
|
Here's an example of how to set the theme:
|
|
364
380
|
|
|
@@ -370,28 +386,26 @@ dark_theme_natal_chart = KerykeionChartSVG(dark_high_contrast_theme_subject, the
|
|
|
370
386
|
dark_theme_natal_chart.makeSVG()
|
|
371
387
|
```
|
|
372
388
|
|
|
373
|
-

|
|
374
390
|
|
|
375
391
|
## Alternative Initialization
|
|
376
392
|
|
|
377
|
-
|
|
393
|
+
Create an `AstrologicalSubject` from a UTC ISO 8601 string:
|
|
378
394
|
|
|
379
395
|
```python
|
|
380
396
|
subject = AstrologicalSubject.get_from_iso_utc_time(
|
|
381
|
-
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US"
|
|
397
|
+
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US"
|
|
398
|
+
)
|
|
382
399
|
```
|
|
383
400
|
|
|
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:
|
|
401
|
+
If you set `online=True`, provide a `geonames_username` to allow city-based geolocation:
|
|
388
402
|
|
|
389
403
|
```python
|
|
390
404
|
from kerykeion.astrological_subject import AstrologicalSubject
|
|
391
405
|
|
|
392
|
-
# Use the static method get_from_iso_utc_time to create an instance of AstrologicalSubject
|
|
393
406
|
subject = AstrologicalSubject.get_from_iso_utc_time(
|
|
394
|
-
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US", online=True
|
|
407
|
+
"Johnny Depp", "1963-06-09T05:00:00Z", "Owensboro", "US", online=True
|
|
408
|
+
)
|
|
395
409
|
```
|
|
396
410
|
|
|
397
411
|
## Lunar Nodes (Rahu & Ketu)
|
|
@@ -427,7 +441,7 @@ To display them, you need to edit the configuration file (kr.config.json).
|
|
|
427
441
|
|
|
428
442
|
## JSON Support
|
|
429
443
|
|
|
430
|
-
|
|
444
|
+
You can serialize the astrological subject (the base data used throughout the library) to JSON:
|
|
431
445
|
|
|
432
446
|
```python
|
|
433
447
|
from kerykeion import AstrologicalSubject
|
|
@@ -437,31 +451,27 @@ johnny = AstrologicalSubject("Johnny Depp", 1963, 6, 9, 0, 0, "Owensboro", "US")
|
|
|
437
451
|
print(johnny.json(dump=False, indent=2))
|
|
438
452
|
```
|
|
439
453
|
|
|
440
|
-
## Documentation
|
|
454
|
+
## Auto Generated Documentation
|
|
441
455
|
|
|
442
|
-
|
|
443
|
-
An auto-generated documentation [is available here](https://www.kerykeion.net/pydocs/kerykeion.html).
|
|
444
|
-
|
|
445
|
-
Sooner or later I'll try to write an extensive documentation.
|
|
456
|
+
You can find auto-generated documentation [here](https://www.kerykeion.net/pydocs/kerykeion.html). Most classes and functions include docstrings.
|
|
446
457
|
|
|
447
458
|
## Development
|
|
448
459
|
|
|
449
|
-
|
|
460
|
+
Clone the repository or download the ZIP via the GitHub interface.
|
|
450
461
|
|
|
451
|
-
##
|
|
462
|
+
## Integrating Kerykeion into Your Project
|
|
452
463
|
|
|
453
|
-
If you
|
|
464
|
+
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
465
|
|
|
455
466
|
## License
|
|
456
467
|
|
|
457
|
-
This project is
|
|
458
|
-
|
|
459
|
-
|
|
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.
|
|
468
|
+
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).
|
|
469
|
+
|
|
470
|
+
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.
|
|
461
471
|
|
|
462
|
-
|
|
472
|
+
Since the AstrologerAPI is an external third-party service, using it does *not* require your code to be open-source.
|
|
463
473
|
|
|
464
474
|
## Contributing
|
|
465
475
|
|
|
466
|
-
Feel free to
|
|
476
|
+
Contributions are welcome! Feel free to submit pull requests or report issues.
|
|
467
477
|
|
|
@@ -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.0.dist-info/LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
|
|
43
|
+
kerykeion-4.26.0.dist-info/METADATA,sha256=YMb3Rdx4S9mtleVxFAQFBO4gvE0yr3VrIoBlac2M6kk,17914
|
|
44
|
+
kerykeion-4.26.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
45
|
+
kerykeion-4.26.0.dist-info/entry_points.txt,sha256=5SmANYscFDDTdeovHvGQ-cnj0hdFvGoxPaWLCpyDFnQ,49
|
|
46
|
+
kerykeion-4.26.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|