kerykeion 5.0.0a9__py3-none-any.whl → 5.0.0a10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kerykeion might be problematic. Click here for more details.

Files changed (34) hide show
  1. kerykeion/__init__.py +22 -1
  2. kerykeion/aspects/__init__.py +7 -2
  3. kerykeion/aspects/aspects_utils.py +1 -3
  4. kerykeion/aspects/natal_aspects_factory.py +236 -0
  5. kerykeion/aspects/synastry_aspects_factory.py +234 -0
  6. kerykeion/astrological_subject_factory.py +5 -9
  7. kerykeion/charts/charts_utils.py +12 -12
  8. kerykeion/charts/draw_planets.py +3 -4
  9. kerykeion/charts/draw_planets_v2.py +5 -6
  10. kerykeion/charts/kerykeion_chart_svg.py +10 -10
  11. kerykeion/composite_subject_factory.py +1 -1
  12. kerykeion/house_comparison/__init__.py +6 -0
  13. kerykeion/house_comparison/house_comparison_factory.py +1 -1
  14. kerykeion/house_comparison/house_comparison_utils.py +0 -1
  15. kerykeion/kr_types/__init__.py +49 -0
  16. kerykeion/kr_types/kr_models.py +29 -0
  17. kerykeion/kr_types/settings_models.py +9 -1
  18. kerykeion/planetary_return_factory.py +6 -5
  19. kerykeion/relationship_score_factory.py +27 -17
  20. kerykeion/report.py +0 -1
  21. kerykeion/settings/__init__.py +5 -0
  22. kerykeion/settings/config_constants.py +20 -6
  23. kerykeion/settings/kr.config.json +80 -0
  24. kerykeion/transits_time_range.py +4 -4
  25. kerykeion/utilities.py +1 -1
  26. {kerykeion-5.0.0a9.dist-info → kerykeion-5.0.0a10.dist-info}/METADATA +9 -4
  27. kerykeion-5.0.0a10.dist-info/RECORD +53 -0
  28. kerykeion/aspects/natal_aspects.py +0 -181
  29. kerykeion/aspects/synastry_aspects.py +0 -141
  30. kerykeion/aspects/transits_time_range.py +0 -41
  31. kerykeion-5.0.0a9.dist-info/RECORD +0 -55
  32. kerykeion-5.0.0a9.dist-info/entry_points.txt +0 -2
  33. {kerykeion-5.0.0a9.dist-info → kerykeion-5.0.0a10.dist-info}/WHEEL +0 -0
  34. {kerykeion-5.0.0a9.dist-info → kerykeion-5.0.0a10.dist-info}/licenses/LICENSE +0 -0
@@ -85,6 +85,14 @@
85
85
  "Return": "Return",
86
86
  "natal": "Natal",
87
87
  "perspective_type": "Perspective",
88
+ "location": "Location",
89
+ "day_of_week": "Day of Week",
90
+ "elements": "Elements",
91
+ "qualities": "Qualities",
92
+ "cardinal": "Cardinal",
93
+ "fixed": "Fixed",
94
+ "mutable": "Mutable",
95
+ "birth_chart": "Birth Chart",
88
96
  "celestial_points": {
89
97
  "Sun": "Sun",
90
98
  "Moon": "Moon",
@@ -215,6 +223,14 @@
215
223
  "Return": "Révolution",
216
224
  "natal": "Radix",
217
225
  "perspective_type": "Perspective",
226
+ "location": "Lieu",
227
+ "day_of_week": "Jour de la semaine",
228
+ "elements": "Éléments",
229
+ "qualities": "Qualités",
230
+ "cardinal": "Cardinal",
231
+ "fixed": "Fixe",
232
+ "mutable": "Mutable",
233
+ "birth_chart": "Thème Natal",
218
234
  "celestial_points": {
219
235
  "Sun": "Soleil",
220
236
  "Moon": "Lune",
@@ -345,6 +361,14 @@
345
361
  "return_point": "Ponto (ret.)",
346
362
  "natal": "Natal",
347
363
  "perspective_type": "Perspectiva",
364
+ "location": "Localização",
365
+ "day_of_week": "Dia da semana",
366
+ "elements": "Elementos",
367
+ "qualities": "Qualidades",
368
+ "cardinal": "Cardinal",
369
+ "fixed": "Fixo",
370
+ "mutable": "Mutável",
371
+ "birth_chart": "Mapa Natal",
348
372
  "celestial_points": {
349
373
  "Sun": "Sol",
350
374
  "Moon": "Lua",
@@ -475,6 +499,14 @@
475
499
  "Return": "Ritorno",
476
500
  "natal": "Radix",
477
501
  "perspective_type": "Prospettiva",
502
+ "location": "Località",
503
+ "day_of_week": "Giorno della settimana",
504
+ "elements": "Elementi",
505
+ "qualities": "Qualità",
506
+ "cardinal": "Cardinale",
507
+ "fixed": "Fisso",
508
+ "mutable": "Mutevole",
509
+ "birth_chart": "Tema Natale",
478
510
  "celestial_points": {
479
511
  "Sun": "Sole",
480
512
  "Moon": "Luna",
@@ -605,6 +637,14 @@
605
637
  "Return": "回归",
606
638
  "natal": "本命",
607
639
  "perspective_type": "视角",
640
+ "location": "位置",
641
+ "day_of_week": "星期",
642
+ "elements": "元素",
643
+ "qualities": "性质",
644
+ "cardinal": "本位",
645
+ "fixed": "固定",
646
+ "mutable": "变动",
647
+ "birth_chart": "出生图",
608
648
  "celestial_points": {
609
649
  "Sun": "太陽",
610
650
  "Moon": "月亮",
@@ -735,6 +775,14 @@
735
775
  "return_point": "Punto (rev.)",
736
776
  "natal": "Radix",
737
777
  "perspective_type": "Perspectiva",
778
+ "location": "Ubicación",
779
+ "day_of_week": "Día de la semana",
780
+ "elements": "Elementos",
781
+ "qualities": "Cualidades",
782
+ "cardinal": "Cardinal",
783
+ "fixed": "Fijo",
784
+ "mutable": "Mutable",
785
+ "birth_chart": "Carta Natal",
738
786
  "celestial_points": {
739
787
  "Sun": "Sol",
740
788
  "Moon": "Luna",
@@ -865,6 +913,14 @@
865
913
  "Return": "Возвращение",
866
914
  "natal": "Радикс",
867
915
  "perspective_type": "Перспектива",
916
+ "location": "Местоположение",
917
+ "day_of_week": "День недели",
918
+ "elements": "Стихии",
919
+ "qualities": "Качества",
920
+ "cardinal": "Кардинальный",
921
+ "fixed": "Фиксированный",
922
+ "mutable": "Мутабельный",
923
+ "birth_chart": "Натальная Карта",
868
924
  "celestial_points": {
869
925
  "Sun": "Солнце",
870
926
  "Moon": "Луна",
@@ -995,6 +1051,14 @@
995
1051
  "Return": "Dönüş",
996
1052
  "natal": "Doğum haritası",
997
1053
  "perspective_type": "Perspektif",
1054
+ "location": "Konum",
1055
+ "day_of_week": "Haftanın günü",
1056
+ "elements": "Elementler",
1057
+ "qualities": "Nitelikler",
1058
+ "cardinal": "Kardinal",
1059
+ "fixed": "Sabit",
1060
+ "mutable": "Değişken",
1061
+ "birth_chart": "Doğum Haritası",
998
1062
  "celestial_points": {
999
1063
  "Sun": "Güneş",
1000
1064
  "Moon": "Ay",
@@ -1125,6 +1189,14 @@
1125
1189
  "return_point": "Rückkehrpunkt",
1126
1190
  "natal": "Radix",
1127
1191
  "perspective_type": "Perspektive",
1192
+ "location": "Ort",
1193
+ "day_of_week": "Wochentag",
1194
+ "elements": "Elemente",
1195
+ "qualities": "Qualitäten",
1196
+ "cardinal": "Kardinal",
1197
+ "fixed": "Fix",
1198
+ "mutable": "Veränderlich",
1199
+ "birth_chart": "Geburtshoroskop",
1128
1200
  "celestial_points": {
1129
1201
  "Sun": "Sonne",
1130
1202
  "Moon": "Mond",
@@ -1255,6 +1327,14 @@
1255
1327
  "return_point": "पुनरागमन बिंदु",
1256
1328
  "natal": "जन्म कुंडली",
1257
1329
  "perspective_type": "दृष्टिकोण",
1330
+ "location": "स्थान",
1331
+ "day_of_week": "सप्ताह का दिन",
1332
+ "elements": "तत्व",
1333
+ "qualities": "गुण",
1334
+ "cardinal": "चल",
1335
+ "fixed": "स्थिर",
1336
+ "mutable": "द्विस्वभाव",
1337
+ "birth_chart": "जन्म चार्ट",
1258
1338
  "celestial_points": {
1259
1339
  "Sun": "सूर्य",
1260
1340
  "Moon": "चंद्रमा",
@@ -1,8 +1,8 @@
1
- from typing import Optional, Union, List
1
+ from typing import Union, List
2
2
  from datetime import datetime, timedelta
3
3
  from kerykeion.kr_types.kr_models import AstrologicalSubjectModel
4
4
  from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
5
- from kerykeion.aspects import SynastryAspects
5
+ from kerykeion.aspects import SynastryAspectsFactory
6
6
  from kerykeion.ephemeris_data import EphemerisDataFactory
7
7
  from kerykeion.kr_types.kr_literals import AstrologicalPoint
8
8
  from kerykeion.kr_types.kr_models import ActiveAspect, TransitMomentModel, TransitsTimeRangeModel
@@ -67,7 +67,7 @@ class TransitsTimeRangeFactory:
67
67
 
68
68
  for ephemeris_point in self.ephemeris_data_points:
69
69
  # Calculate aspects between transit positions and natal chart
70
- aspects = SynastryAspects(
70
+ aspects = SynastryAspectsFactory.from_subjects(
71
71
  ephemeris_point,
72
72
  self.natal_chart,
73
73
  active_points=self.active_points,
@@ -86,7 +86,7 @@ class TransitsTimeRangeFactory:
86
86
  # Create and return the complete transits model
87
87
  return TransitsTimeRangeModel(
88
88
  dates=[point.iso_formatted_utc_datetime for point in self.ephemeris_data_points],
89
- subject=self.natal_chart.model(),
89
+ subject=self.natal_chart,
90
90
  transits=transit_moments
91
91
  )
92
92
 
kerykeion/utilities.py CHANGED
@@ -15,7 +15,7 @@ import re
15
15
  from datetime import datetime
16
16
 
17
17
  if TYPE_CHECKING:
18
- from kerykeion import AstrologicalSubjectFactory
18
+ pass
19
19
 
20
20
 
21
21
  def get_number_from_name(name: AstrologicalPoint) -> int:
@@ -1,23 +1,28 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kerykeion
3
- Version: 5.0.0a9
4
- Summary: A python library for astrology.
3
+ Version: 5.0.0a10
4
+ Summary: A Python library for astrological calculations, including natal charts, houses, planetary aspects, and SVG chart generation.
5
5
  Project-URL: Homepage, https://www.kerykeion.net/
6
6
  Project-URL: Repository, https://github.com/g-battaglia/kerykeion
7
7
  Author-email: Giacomo Battaglia <kerykeion.astrology@gmail.com>
8
8
  License: AGPL-3.0
9
9
  License-File: LICENSE
10
- Keywords: astrology,astrology library,astrology-calculator,astronomical-algorithms,birtchart,ephemeris,svg,synastry,zodiac,zodiac-sing
10
+ Keywords: astrology,astrology calculations,astrology calculator,astrology library,astrology transits,astronomical algorithms,birth chart,ephemeris,houses of astrology,natal chart,planetary aspects,svg charts,synastry,zodiac,zodiac signs
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Information Technology
14
- Classifier: License :: OSI Approved :: GNU General Public License (GPL)
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
15
16
  Classifier: Operating System :: OS Independent
16
17
  Classifier: Programming Language :: Python :: 3 :: Only
17
18
  Classifier: Programming Language :: Python :: 3.9
18
19
  Classifier: Programming Language :: Python :: 3.10
19
20
  Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Religion
20
24
  Classifier: Topic :: Scientific/Engineering :: Astronomy
25
+ Classifier: Topic :: Scientific/Engineering :: Visualization
21
26
  Classifier: Topic :: Software Development
22
27
  Classifier: Topic :: Software Development :: Libraries
23
28
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
@@ -0,0 +1,53 @@
1
+ kerykeion/__init__.py,sha256=ZpSRhsyTQxKC1l2Q6MmZYKRcOTto0nFUqHAeoyidc1U,1408
2
+ kerykeion/astrological_subject_factory.py,sha256=06iqUm9qEKYp4yHouvorNx7MnZ3afy3jopFu-jIbG_o,52153
3
+ kerykeion/composite_subject_factory.py,sha256=kO0pSPDSAn-JaP1quFzqOnN-NzF6mS_ZH-bKcj2rutE,7536
4
+ kerykeion/enums.py,sha256=nPXgP_ocsRnRno5H-yunZy3fp-hLZ9aYRaUb-2gBdvw,1199
5
+ kerykeion/ephemeris_data.py,sha256=h56Y4FCTYPcIzSnDiKNXYzEpeiqU554ccUmfXENigls,10750
6
+ kerykeion/fetch_geonames.py,sha256=e66Nh6yq9A4VjnuvVSiV1TW1IkJ9m3Q2LKPWrkOGgO0,4764
7
+ kerykeion/planetary_return_factory.py,sha256=LZjsHOB-lqNMidrq1x7eHnajU7yQKbbvQ1CYMuew4SM,11470
8
+ kerykeion/relationship_score_factory.py,sha256=qifW_rLioJtA5yFyydKyx8DTP9FDjMN-TNnNe3sxV2c,9265
9
+ kerykeion/report.py,sha256=Sc97N8amg6d3nw6wBVwBBzLa3gPP0NW7QNTsD91xJIo,2802
10
+ kerykeion/transits_time_range.py,sha256=E0RDTHZA4etjQtumu3WVx0jH6Tt5idZ0aw42ykCluOY,5515
11
+ kerykeion/utilities.py,sha256=a-E_hl546GqFH_4psawQLAhxrAPktnkIPK2K1PAjqnU,22173
12
+ kerykeion/aspects/__init__.py,sha256=i1hg04VL15s-LVGOHuTWJsicv_HNwT3b2v6_-16s6A4,394
13
+ kerykeion/aspects/aspects_utils.py,sha256=mOj2AqVGnY2vsGsezPfxI_crPJsN54p8qjpmCk5iupM,3093
14
+ kerykeion/aspects/natal_aspects_factory.py,sha256=Ct3MWR0u4CI2h_hYfqgOJDLBeBmBnrG7lOrkN2NVrGg,9538
15
+ kerykeion/aspects/synastry_aspects_factory.py,sha256=2dmstveidX3ZkKFQYkGS143v_1EnadCCU59VFlUl1L8,10072
16
+ kerykeion/charts/__init__.py,sha256=i9NMZ7LdkllPlqQSi1or9gTobHbROGDKmJhBDO4R0mA,128
17
+ kerykeion/charts/charts_utils.py,sha256=_z-lA7ibIQ5vhr1NxpzJFyPmMp-Sh1iyYxuO56DDO4w,62922
18
+ kerykeion/charts/draw_planets.py,sha256=lxxuML0xUthOqyHXEzJrH4pvqdiwZ73dtzS5ZrdTqEo,17650
19
+ kerykeion/charts/draw_planets_v2.py,sha256=nKDRIApXTYoMeYPBhFk9Bh6pxr2jD_kX4-4I_GSiowM,28155
20
+ kerykeion/charts/draw_planets_v3.py,sha256=3nrpef56qBsc0hfCOGdfCOr-61C2c5aWcRSiBcQiAuo,25811
21
+ kerykeion/charts/kerykeion_chart_svg.py,sha256=-7_CZUZT7Zfey2AS_RPusVUZm87tO64ShYL49LtL1QM,97768
22
+ kerykeion/charts/templates/aspect_grid_only.xml,sha256=lBHBj5bS5klGnv7QMuFxQjhlE6VZRaOgW93akLgRjX4,70055
23
+ kerykeion/charts/templates/chart.xml,sha256=r3a_csMqcoqeOnDA3YCD-iUxdqgRw5GV1GOf1Cp0e_E,79940
24
+ kerykeion/charts/templates/wheel_only.xml,sha256=0P8kpdsmKdFFso892v5r5WTp4GZSZApgh4mj4BTDNkg,71388
25
+ kerykeion/charts/themes/classic.css,sha256=LYYYWQHNG7-vuPCq8F2EPl3LauWXVrY3Q_tpwM0klgo,4660
26
+ kerykeion/charts/themes/dark-high-contrast.css,sha256=YW5X5-M0dz5Vy2oz-JyDNXJYHSmV83lYCodydC-KS1A,7506
27
+ kerykeion/charts/themes/dark.css,sha256=XVspznDRNMXsFzk7hY7IB7AI58alPAV_-CgV3gCKyzg,7581
28
+ kerykeion/charts/themes/light.css,sha256=5eyUzhVlRjG6lPHKnprLum0HuRtPIJhMBzpGfzoTjnQ,7590
29
+ kerykeion/charts/themes/strawberry.css,sha256=UtcfRsCT-M9OZs_SoclWGZ0jDJiWvQjHTeI4M1jf7pQ,8314
30
+ kerykeion/house_comparison/__init__.py,sha256=6FYHyQY3nUJifZ2kEVCHB8cN3TjFA1q2yhmeRwJlias,238
31
+ kerykeion/house_comparison/house_comparison_factory.py,sha256=Vn4_Hviy20_nsSf_vjEKZ9h-QsJDFtapM1Wydvwgx4w,3345
32
+ kerykeion/house_comparison/house_comparison_models.py,sha256=R9EW5F3fiIKIm8qrwTxtXhNOGDpf1-Lh9hbM1uK83oE,1549
33
+ kerykeion/house_comparison/house_comparison_utils.py,sha256=Q5pdP7hmUEB3cqE7QkOYNu_laQ1Nj83Fmn_F8YJkKik,3773
34
+ kerykeion/kr_types/__init__.py,sha256=dePcQY5rrgtUENhqnjcVx6j7iQJPo_1rmD0bLeIO3HA,1384
35
+ kerykeion/kr_types/chart_types.py,sha256=ofMYk7NRalSsdQcLVkpCbOb-dhdjYHEqIb_WPLtD0rM,2429
36
+ kerykeion/kr_types/kerykeion_exception.py,sha256=kE1y0K0rmuz32b4K_ZppSsZ59I2Get0ZkvOkTE5HejI,314
37
+ kerykeion/kr_types/kr_literals.py,sha256=4kJhzm_0LERiJEJks0KgDyThueMZj_F1OK2Far5SMZc,4870
38
+ kerykeion/kr_types/kr_models.py,sha256=lOEUi2G0VmzzK37FxyYh0QPwsCLLN4XovxQq2La9VS4,10705
39
+ kerykeion/kr_types/settings_models.py,sha256=Llosnvw-6NHJMbdKltPHQDLR-Ltn7ZpWkjEbLJ2C6AY,17488
40
+ kerykeion/settings/__init__.py,sha256=NYCwcvEfn9qJ498fv1H_Gix8e-crJ3CruV13A-e2CnI,134
41
+ kerykeion/settings/config_constants.py,sha256=hxDZnFKWFhGrYMejDISbYT-phUk1Qqfvt-4wBG79rGA,2233
42
+ kerykeion/settings/kerykeion_settings.py,sha256=umd8TZy-8ywowsd4TTkhwxSLLyX3xYj3A1zvNsTV_Y8,2955
43
+ kerykeion/settings/kr.config.json,sha256=bvvhi8W-u9YHTbg9O8UyfOwclhLd8Mh8oobI1qHIgp4,58497
44
+ kerykeion/settings/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ kerykeion/settings/legacy/legacy_celestial_points_settings.py,sha256=YMvHhY8IQ_nNHf1-9JCSgRzTMQJaxXZfROztEhlP4Ac,6870
46
+ kerykeion/settings/legacy/legacy_chart_aspects_settings.py,sha256=tO4tgPgPP07_wu9f8SXyJQ9WrTh3iWz4YvBS2axCGU8,1650
47
+ kerykeion/settings/legacy/legacy_color_settings.py,sha256=gBUmGSNvvLzRYbdVtzwTDnMwWoh4tOCyT_9Q6aQRv_s,2620
48
+ kerykeion/sweph/README.md,sha256=L7FtNAJTWtrZNGKa8MX87SjduFYPYxwWhaI5fmtzNZo,73
49
+ kerykeion/sweph/seas_18.se1,sha256=X9nCqhZU43wJpq61WAdueVQJt9xL2UjrwPqn1Kdoa1s,223002
50
+ kerykeion-5.0.0a10.dist-info/METADATA,sha256=ac1Zt-A-Unhnhl1tO-kkqnRzoDskJkKf285gvf10BuE,25544
51
+ kerykeion-5.0.0a10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ kerykeion-5.0.0a10.dist-info/licenses/LICENSE,sha256=UTLH8EdbAsgQei4PA2PnBCPGLSZkq5J-dhkyJuXgWQU,34273
53
+ kerykeion-5.0.0a10.dist-info/RECORD,,
@@ -1,181 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- This is part of Kerykeion (C) 2025 Giacomo Battaglia
4
- """
5
-
6
- import logging
7
- from dataclasses import dataclass, field
8
- from functools import cached_property
9
- from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
10
- from kerykeion.settings.kerykeion_settings import get_settings
11
- from kerykeion.aspects.aspects_utils import planet_id_decoder, get_aspect_from_two_points, get_active_points_list
12
- from kerykeion.kr_types.kr_models import AstrologicalSubjectModel, AspectModel, ActiveAspect, CompositeSubjectModel, PlanetReturnModel
13
- from kerykeion.kr_types.kr_literals import AstrologicalPoint
14
- from kerykeion.kr_types.settings_models import KerykeionSettingsModel
15
- from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS, DEFAULT_ACTIVE_ASPECTS, DEFAULT_AXIS_ORBIT
16
- from kerykeion.settings.legacy.legacy_celestial_points_settings import DEFAULT_CELESTIAL_POINTS_SETTINGS
17
- from kerykeion.settings.legacy.legacy_chart_aspects_settings import DEFAULT_CHART_ASPECTS_SETTINGS
18
- from kerykeion.utilities import find_common_active_points
19
- from pathlib import Path
20
- from typing import Union, List, Optional
21
-
22
-
23
- AXES_LIST = [
24
- "Ascendant",
25
- "Medium_Coeli",
26
- "Descendant",
27
- "Imum_Coeli",
28
- ]
29
-
30
-
31
- @dataclass
32
- class NatalAspects:
33
- """
34
- Generates an object with all the aspects of a birthcart.
35
- """
36
-
37
- user: Union[AstrologicalSubjectModel, CompositeSubjectModel, PlanetReturnModel]
38
- new_settings_file: Union[Path, KerykeionSettingsModel, dict, None] = None
39
- active_points: Optional[List[AstrologicalPoint]] = field(default_factory=lambda: None)
40
- active_aspects: List[ActiveAspect] = field(default_factory=lambda: DEFAULT_ACTIVE_ASPECTS)
41
-
42
- def __post_init__(self):
43
- self.settings = get_settings(self.new_settings_file)
44
-
45
- self.celestial_points = DEFAULT_CELESTIAL_POINTS_SETTINGS
46
- self.aspects_settings = DEFAULT_CHART_ASPECTS_SETTINGS
47
- self.axes_orbit_settings = DEFAULT_AXIS_ORBIT
48
-
49
- if not self.active_points:
50
- self.active_points = self.user.active_points
51
- else:
52
- self.active_points = find_common_active_points(
53
- self.user.active_points,
54
- self.active_points,
55
- )
56
-
57
-
58
- @cached_property
59
- def all_aspects(self):
60
- """
61
- Return all the aspects of the points in the natal chart in a dictionary,
62
- first all the individual aspects of each planet, second the aspects
63
- without repetitions.
64
- """
65
-
66
- active_points_list = get_active_points_list(self.user, self.active_points)
67
-
68
- # ---> TODO: Clean this up
69
- filtered_settings = []
70
- for a in self.aspects_settings:
71
- for aspect in self.active_aspects:
72
- if a["name"] == aspect["name"]:
73
- a["orb"] = aspect["orb"] # Assign the aspect's orb
74
- filtered_settings.append(a)
75
- break # Exit the inner loop once a match is found
76
- self.aspects_settings = filtered_settings
77
- # <--- TODO: Clean this up
78
-
79
- self.all_aspects_list = []
80
- for first in range(len(active_points_list)):
81
- # Generates the aspects list without repetitions
82
- for second in range(first + 1, len(active_points_list)):
83
- # AC/DC, MC/IC and North/South nodes are always in opposition
84
- opposite_pairs = {
85
- ("Ascendant", "Descendant"),
86
- ("Descendant", "Ascendant"),
87
- ("Medium_Coeli", "Imum_Coeli"),
88
- ("Imum_Coeli", "Medium_Coeli"),
89
- ("True_Node", "True_South_Node"),
90
- ("Mean_Node", "Mean_South_Node"),
91
- ("True_South_Node", "True_Node"),
92
- ("Mean_South_Node", "Mean_Node"),
93
- }
94
- if (active_points_list[first]["name"], active_points_list[second]["name"]) in opposite_pairs:
95
- continue
96
-
97
- aspect = get_aspect_from_two_points(
98
- self.aspects_settings,
99
- active_points_list[first]["abs_pos"],
100
- active_points_list[second]["abs_pos"]
101
- )
102
-
103
- verdict = aspect["verdict"]
104
- name = aspect["name"]
105
- orbit = aspect["orbit"]
106
- aspect_degrees = aspect["aspect_degrees"]
107
- diff = aspect["diff"]
108
-
109
- if verdict == True:
110
- aspect_model = AspectModel(
111
- p1_name=active_points_list[first]["name"],
112
- p1_owner=self.user.name,
113
- p1_abs_pos=active_points_list[first]["abs_pos"],
114
- p2_name=active_points_list[second]["name"],
115
- p2_owner=self.user.name,
116
- p2_abs_pos=active_points_list[second]["abs_pos"],
117
- aspect=name,
118
- orbit=orbit,
119
- aspect_degrees=aspect_degrees,
120
- diff=diff,
121
- p1=planet_id_decoder(self.celestial_points, active_points_list[first]["name"]),
122
- p2=planet_id_decoder(self.celestial_points, active_points_list[second]["name"]),
123
- )
124
- self.all_aspects_list.append(aspect_model)
125
-
126
- return self.all_aspects_list
127
-
128
- @cached_property
129
- def relevant_aspects(self):
130
- """
131
- Filters the aspects list with the desired points, in this case
132
- the most important are hardcoded.
133
- Set the list with set_points and creating a list with the names
134
- or the numbers of the houses.
135
- The relevant aspects are the ones that are set as looping in the available_aspects list.
136
- """
137
-
138
- logging.debug("Relevant aspects not already calculated, calculating now...")
139
- self.all_aspects
140
-
141
- axes_list = AXES_LIST
142
- counter = 0
143
-
144
- # Remove aspects where the orbits exceed the maximum orb thresholds specified in the settings
145
- # (specified usually in kr.config.json file)
146
- aspects_filtered = self.all_aspects
147
- aspects_list_subtract = []
148
- for a in aspects_filtered:
149
- counter += 1
150
- name_p1 = str(a["p1_name"])
151
- name_p2 = str(a["p2_name"])
152
-
153
- if name_p1 in axes_list:
154
- if abs(a["orbit"]) >= self.axes_orbit_settings:
155
- aspects_list_subtract.append(a)
156
-
157
- elif name_p2 in axes_list:
158
- if abs(a["orbit"]) >= self.axes_orbit_settings:
159
- aspects_list_subtract.append(a)
160
-
161
- self.aspects = [item for item in aspects_filtered if item not in aspects_list_subtract]
162
-
163
- return self.aspects
164
-
165
-
166
- if __name__ == "__main__":
167
- from kerykeion.utilities import setup_logging
168
-
169
- setup_logging(level="debug")
170
-
171
- johnny = AstrologicalSubjectFactory.from_birth_data("Johnny Depp", 1963, 6, 9, 0, 0, 0, "Owensboro", "US")
172
-
173
- # All aspects as a list of dictionaries
174
- aspects = NatalAspects(johnny)
175
- #print([a.model_dump() for a in aspects.all_aspects])
176
-
177
- print("\n")
178
-
179
- # Relevant aspects as a list of dictionaries
180
- aspects = NatalAspects(johnny)
181
- print([a.model_dump() for a in aspects.relevant_aspects])
@@ -1,141 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- This is part of Kerykeion (C) 2025 Giacomo Battaglia
4
- """
5
-
6
- from pathlib import Path
7
- from typing import Union
8
- from functools import cached_property
9
- from typing import TYPE_CHECKING
10
-
11
- from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
12
- from kerykeion.aspects.natal_aspects import NatalAspects
13
- from kerykeion.settings.kerykeion_settings import get_settings
14
- from kerykeion.aspects.aspects_utils import planet_id_decoder, get_aspect_from_two_points, get_active_points_list
15
- from kerykeion.kr_types.kr_models import AstrologicalSubjectModel, AspectModel, ActiveAspect, CompositeSubjectModel, PlanetReturnModel
16
- from kerykeion.kr_types.settings_models import KerykeionSettingsModel
17
- from kerykeion.settings.config_constants import DEFAULT_ACTIVE_ASPECTS, DEFAULT_AXIS_ORBIT
18
- from kerykeion.settings.legacy.legacy_celestial_points_settings import DEFAULT_CELESTIAL_POINTS_SETTINGS
19
- from kerykeion.settings.legacy.legacy_chart_aspects_settings import DEFAULT_CHART_ASPECTS_SETTINGS
20
- from kerykeion.kr_types.kr_literals import AstrologicalPoint
21
- from kerykeion.utilities import find_common_active_points
22
- from typing import Union, List, Optional
23
-
24
-
25
- class SynastryAspects(NatalAspects):
26
- """
27
- Generates an object with all the aspects between two persons.
28
- """
29
-
30
- def __init__(
31
- self,
32
- kr_object_one: Union[AstrologicalSubjectModel, CompositeSubjectModel, PlanetReturnModel],
33
- kr_object_two: Union[AstrologicalSubjectModel, CompositeSubjectModel, PlanetReturnModel],
34
- new_settings_file: Union[Path, KerykeionSettingsModel, dict, None] = None,
35
- active_points: Optional[list[AstrologicalPoint]] = None,
36
- active_aspects: List[ActiveAspect] = DEFAULT_ACTIVE_ASPECTS,
37
- ):
38
- # Subjects
39
- self.first_user = kr_object_one
40
- self.second_user = kr_object_two
41
-
42
- # Settings
43
- self.new_settings_file = new_settings_file
44
- self.settings = get_settings(self.new_settings_file)
45
-
46
- self.celestial_points = DEFAULT_CELESTIAL_POINTS_SETTINGS
47
- self.aspects_settings = DEFAULT_CHART_ASPECTS_SETTINGS
48
- self.axes_orbit_settings = DEFAULT_AXIS_ORBIT
49
- self.active_points = active_points
50
- self.active_aspects = active_aspects
51
-
52
- # Private variables of the aspects
53
- self._all_aspects: Union[list, None] = None
54
- self._relevant_aspects: Union[list, None] = None
55
-
56
- if not self.active_points:
57
- self.active_points = self.first_user.active_points
58
- else:
59
- self.active_points = find_common_active_points(
60
- self.first_user.active_points,
61
- self.active_points,
62
- )
63
-
64
- self.active_points = find_common_active_points(
65
- self.second_user.active_points,
66
- self.active_points,
67
- )
68
-
69
- @cached_property
70
- def all_aspects(self):
71
- """
72
- Return all the aspects of the points in the natal chart in a dictionary,
73
- first all the individual aspects of each planet, second the aspects
74
- whiteout repetitions.
75
- """
76
-
77
- if self._all_aspects is not None:
78
- return self._all_aspects
79
-
80
- # Celestial Points Lists
81
- first_active_points_list = get_active_points_list(self.first_user, self.active_points)
82
- second_active_points_list = get_active_points_list(self.second_user, self.active_points)
83
-
84
- # ---> TODO: Clean this up
85
- filtered_settings = []
86
- for a in self.aspects_settings:
87
- for aspect in self.active_aspects:
88
- if a["name"] == aspect["name"]:
89
- a["orb"] = aspect["orb"] # Assign the aspect's orb
90
- filtered_settings.append(a)
91
- self.aspects_settings = filtered_settings
92
- # <--- TODO: Clean this up
93
-
94
- self.all_aspects_list = []
95
- for first in range(len(first_active_points_list)):
96
- # Generates the aspects list whitout repetitions
97
- for second in range(len(second_active_points_list)):
98
- aspect = get_aspect_from_two_points(
99
- self.aspects_settings,
100
- first_active_points_list[first]["abs_pos"],
101
- second_active_points_list[second]["abs_pos"],
102
- )
103
-
104
- verdict = aspect["verdict"]
105
- name = aspect["name"]
106
- orbit = aspect["orbit"]
107
- aspect_degrees = aspect["aspect_degrees"]
108
- diff = aspect["diff"]
109
-
110
- if verdict == True:
111
- aspect_model = AspectModel(
112
- p1_name=first_active_points_list[first]["name"],
113
- p1_owner=self.first_user.name,
114
- p1_abs_pos=first_active_points_list[first]["abs_pos"],
115
- p2_name=second_active_points_list[second]["name"],
116
- p2_owner=self.second_user.name,
117
- p2_abs_pos=second_active_points_list[second]["abs_pos"],
118
- aspect=name,
119
- orbit=orbit,
120
- aspect_degrees=aspect_degrees,
121
- diff=diff,
122
- p1=planet_id_decoder(self.celestial_points, first_active_points_list[first]["name"]),
123
- p2=planet_id_decoder(self.celestial_points, second_active_points_list[second]["name"]),
124
- )
125
- self.all_aspects_list.append(aspect_model)
126
-
127
- return self.all_aspects_list
128
-
129
-
130
- if __name__ == "__main__":
131
- from kerykeion.utilities import setup_logging
132
-
133
- setup_logging(level="debug")
134
-
135
- john = AstrologicalSubjectFactory.from_birth_data("John", 1940, 10, 9, 10, 30, "Liverpool", "GB")
136
- yoko = AstrologicalSubjectFactory.from_birth_data("Yoko", 1933, 2, 18, 10, 30, "Tokyo", "JP")
137
-
138
- synastry_aspects = SynastryAspects(john, yoko)
139
-
140
- # All aspects as a list of dictionaries
141
- print([aspect.dict() for aspect in synastry_aspects.all_aspects])
@@ -1,41 +0,0 @@
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 = AstrologicalSubjectFactory.from_birth_data(
10
- "Johnny Depp", 1963, 6, 9, 20, 15, 0, "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])