kerykeion 5.0.0a4__py3-none-any.whl → 5.0.0a6__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.

@@ -245,7 +245,6 @@ class KerykeionChartSVG:
245
245
  home_directory = Path.home()
246
246
  self.new_settings_file = new_settings_file
247
247
  self.chart_language = chart_language
248
- self.active_points = active_points
249
248
  self.active_aspects = active_aspects
250
249
  self.chart_type = chart_type
251
250
  self.double_chart_aspect_grid_type = double_chart_aspect_grid_type
@@ -254,16 +253,16 @@ class KerykeionChartSVG:
254
253
  self.aspects_settings = aspects_settings
255
254
 
256
255
  if not active_points:
257
- active_points = first_obj.active_points
256
+ self.active_points = first_obj.active_points
258
257
  else:
259
- active_points = find_common_active_points(
258
+ self.active_points = find_common_active_points(
260
259
  active_points,
261
260
  first_obj.active_points
262
261
  )
263
262
 
264
263
  if second_obj:
265
- active_points = find_common_active_points(
266
- active_points,
264
+ self.active_points = find_common_active_points(
265
+ self.active_points,
267
266
  second_obj.active_points
268
267
  )
269
268
 
@@ -285,7 +284,7 @@ class KerykeionChartSVG:
285
284
  # Configure available planets
286
285
  self.available_planets_setting = []
287
286
  for body in self.planets_settings:
288
- if body["name"] in active_points:
287
+ if body["name"] in self.active_points:
289
288
  body["is_active"] = True
290
289
  self.available_planets_setting.append(body)
291
290
 
@@ -310,7 +309,7 @@ class KerykeionChartSVG:
310
309
  natal_aspects_instance = NatalAspects(
311
310
  self.first_obj,
312
311
  new_settings_file=self.new_settings_file,
313
- active_points=active_points,
312
+ active_points=self.active_points,
314
313
  active_aspects=active_aspects,
315
314
  )
316
315
  self.aspects_list = natal_aspects_instance.relevant_aspects
@@ -342,7 +341,7 @@ class KerykeionChartSVG:
342
341
  raise KerykeionException("First object must be a CompositeSubjectModel instance.")
343
342
 
344
343
  # Calculate aspects
345
- self.aspects_list = NatalAspects(self.first_obj, new_settings_file=self.new_settings_file, active_points=active_points).relevant_aspects
344
+ self.aspects_list = NatalAspects(self.first_obj, new_settings_file=self.new_settings_file, active_points=self.active_points).relevant_aspects
346
345
 
347
346
  # Screen size
348
347
  self.height = self._DEFAULT_HEIGHT
@@ -377,15 +376,13 @@ class KerykeionChartSVG:
377
376
  self.first_obj,
378
377
  self.second_obj,
379
378
  new_settings_file=self.new_settings_file,
380
- active_points=active_points,
379
+ active_points=self.active_points,
381
380
  active_aspects=active_aspects,
382
381
  )
383
382
  self.aspects_list = synastry_aspects_instance.relevant_aspects
384
383
 
385
384
  # Secondary subject available points
386
- self.t_available_kerykeion_celestial_points = []
387
- for body in available_celestial_points_names:
388
- self.t_available_kerykeion_celestial_points.append(self.second_obj.get(body))
385
+ self.t_available_kerykeion_celestial_points = self.available_kerykeion_celestial_points
389
386
 
390
387
  # Screen size
391
388
  self.height = self._DEFAULT_HEIGHT
@@ -424,15 +421,13 @@ class KerykeionChartSVG:
424
421
  self.first_obj,
425
422
  self.second_obj,
426
423
  new_settings_file=self.new_settings_file,
427
- active_points=active_points,
424
+ active_points=self.active_points,
428
425
  active_aspects=active_aspects,
429
426
  )
430
427
  self.aspects_list = synastry_aspects_instance.relevant_aspects
431
428
 
432
429
  # Secondary subject available points
433
- self.t_available_kerykeion_celestial_points = []
434
- for body in available_celestial_points_names:
435
- self.t_available_kerykeion_celestial_points.append(self.second_obj.get(body))
430
+ self.t_available_kerykeion_celestial_points = self.available_kerykeion_celestial_points
436
431
 
437
432
  # Screen size
438
433
  self.height = self._DEFAULT_HEIGHT
@@ -467,15 +462,13 @@ class KerykeionChartSVG:
467
462
  self.first_obj,
468
463
  self.second_obj,
469
464
  new_settings_file=self.new_settings_file,
470
- active_points=active_points,
465
+ active_points=self.active_points,
471
466
  active_aspects=active_aspects,
472
467
  )
473
468
  self.aspects_list = synastry_aspects_instance.relevant_aspects
474
469
 
475
470
  # Secondary subject available points
476
- self.t_available_kerykeion_celestial_points = []
477
- for body in available_celestial_points_names:
478
- self.t_available_kerykeion_celestial_points.append(self.second_obj.get(body))
471
+ self.t_available_kerykeion_celestial_points = self.available_kerykeion_celestial_points
479
472
 
480
473
  # Screen size
481
474
  self.height = self._DEFAULT_HEIGHT
@@ -502,7 +495,7 @@ class KerykeionChartSVG:
502
495
  natal_aspects_instance = NatalAspects(
503
496
  self.first_obj,
504
497
  new_settings_file=self.new_settings_file,
505
- active_points=active_points,
498
+ active_points=self.active_points,
506
499
  active_aspects=active_aspects,
507
500
  )
508
501
  self.aspects_list = natal_aspects_instance.relevant_aspects
@@ -830,12 +823,22 @@ class KerykeionChartSVG:
830
823
 
831
824
  template_dict["bottom_left_0"] = zodiac_info
832
825
  template_dict["bottom_left_1"] = f"{self.language_settings.get('domification', 'Domification')}: {self.language_settings.get('houses_system_' + self.first_obj.houses_system_identifier, self.first_obj.houses_system_name)}"
833
- template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.first_obj.lunar_phase.get("moon_phase", "")}'
834
- template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.first_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
826
+
827
+ # Lunar phase information (optional)
828
+ if self.first_obj.lunar_phase is not None:
829
+ template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.first_obj.lunar_phase.get("moon_phase", "")}'
830
+ template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.first_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
831
+ else:
832
+ template_dict["bottom_left_2"] = ""
833
+ template_dict["bottom_left_3"] = ""
834
+
835
835
  template_dict["bottom_left_4"] = f'{self.language_settings.get("perspective_type", "Perspective")}: {self.language_settings.get(self.first_obj.perspective_type.lower().replace(" ", "_"), self.first_obj.perspective_type)}'
836
836
 
837
837
  # Moon phase section calculations
838
- template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
838
+ if self.first_obj.lunar_phase is not None:
839
+ template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
840
+ else:
841
+ template_dict["makeLunarPhase"] = ""
839
842
 
840
843
  # Houses and planet drawing
841
844
  template_dict["makeMainHousesGrid"] = draw_main_house_grid(
@@ -971,7 +974,10 @@ class KerykeionChartSVG:
971
974
  template_dict["bottom_left_4"] = ""
972
975
 
973
976
  # Moon phase section calculations
974
- template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
977
+ if self.first_obj.lunar_phase is not None:
978
+ template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
979
+ else:
980
+ template_dict["makeLunarPhase"] = ""
975
981
 
976
982
  # Houses and planet drawing
977
983
  template_dict["makeMainHousesGrid"] = draw_main_house_grid(
@@ -1108,12 +1114,22 @@ class KerykeionChartSVG:
1108
1114
 
1109
1115
  template_dict["bottom_left_0"] = zodiac_info
1110
1116
  template_dict["bottom_left_1"] = f"{self.language_settings.get('domification', 'Domification')}: {self.language_settings.get('houses_system_' + self.first_obj.houses_system_identifier, self.first_obj.houses_system_name)}"
1111
- template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.second_obj.lunar_phase.get("moon_phase", "")}' # type: ignore
1112
- template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.second_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
1117
+
1118
+ # Lunar phase information from second object (Transit) (optional)
1119
+ if self.second_obj is not None and hasattr(self.second_obj, 'lunar_phase') and self.second_obj.lunar_phase is not None:
1120
+ template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.second_obj.lunar_phase.get("moon_phase", "")}' # type: ignore
1121
+ template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.second_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.second_obj.lunar_phase.moon_phase_name)}'
1122
+ else:
1123
+ template_dict["bottom_left_2"] = ""
1124
+ template_dict["bottom_left_3"] = ""
1125
+
1113
1126
  template_dict["bottom_left_4"] = f'{self.language_settings.get("perspective_type", "Perspective")}: {self.language_settings.get(self.second_obj.perspective_type.lower().replace(" ", "_"), self.second_obj.perspective_type)}' # type: ignore
1114
1127
 
1115
- # Moon phase section calculations
1116
- template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
1128
+ # Moon phase section calculations - use first_obj for visualization
1129
+ if self.first_obj.lunar_phase is not None:
1130
+ template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
1131
+ else:
1132
+ template_dict["makeLunarPhase"] = ""
1117
1133
 
1118
1134
  # Houses and planet drawing
1119
1135
  template_dict["makeMainHousesGrid"] = draw_main_house_grid(
@@ -1386,7 +1402,7 @@ class KerykeionChartSVG:
1386
1402
  template_dict["makeAspects"] = self._draw_all_transit_aspects_lines(self.main_radius, self.main_radius - 160)
1387
1403
 
1388
1404
  # Chart title
1389
- if self.second_obj.return_type == "Solar":
1405
+ if self.second_obj is not None and hasattr(self.second_obj, 'return_type') and self.second_obj.return_type == "Solar":
1390
1406
  template_dict["stringTitle"] = f"{self.first_obj.name} - {self.language_settings.get('solar_return', 'Solar Return')}"
1391
1407
  else:
1392
1408
  template_dict["stringTitle"] = f"{self.first_obj.name} - {self.language_settings.get('lunar_return', 'Lunar Return')}"
@@ -1401,7 +1417,7 @@ class KerykeionChartSVG:
1401
1417
  return_latitude_string = convert_latitude_coordinate_to_string(self.second_obj.lat, self.language_settings["north"], self.language_settings["south"]) # type: ignore
1402
1418
  return_longitude_string = convert_longitude_coordinate_to_string(self.second_obj.lng, self.language_settings["east"], self.language_settings["west"]) # type: ignore
1403
1419
 
1404
- if self.second_obj.return_type == "Solar":
1420
+ if self.second_obj is not None and hasattr(self.second_obj, 'return_type') and self.second_obj.return_type == "Solar":
1405
1421
  template_dict["top_left_0"] = f"{self.language_settings.get('solar_return', 'Solar Return')}:"
1406
1422
  else:
1407
1423
  template_dict["top_left_0"] = f"{self.language_settings.get('lunar_return', 'Lunar Return')}:"
@@ -1421,12 +1437,22 @@ class KerykeionChartSVG:
1421
1437
 
1422
1438
  template_dict["bottom_left_0"] = zodiac_info
1423
1439
  template_dict["bottom_left_1"] = f"{self.language_settings.get('domification', 'Domification')}: {self.language_settings.get('houses_system_' + self.first_obj.houses_system_identifier, self.first_obj.houses_system_name)}"
1424
- template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.first_obj.lunar_phase.get("moon_phase", "")}'
1425
- template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.first_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
1440
+
1441
+ # Lunar phase information (optional)
1442
+ if self.first_obj.lunar_phase is not None:
1443
+ template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.first_obj.lunar_phase.get("moon_phase", "")}'
1444
+ template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.first_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
1445
+ else:
1446
+ template_dict["bottom_left_2"] = ""
1447
+ template_dict["bottom_left_3"] = ""
1448
+
1426
1449
  template_dict["bottom_left_4"] = f'{self.language_settings.get("perspective_type", "Perspective")}: {self.language_settings.get(self.first_obj.perspective_type.lower().replace(" ", "_"), self.first_obj.perspective_type)}'
1427
1450
 
1428
1451
  # Moon phase section calculations
1429
- template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
1452
+ if self.first_obj.lunar_phase is not None:
1453
+ template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
1454
+ else:
1455
+ template_dict["makeLunarPhase"] = ""
1430
1456
 
1431
1457
  # Houses and planet drawing
1432
1458
  template_dict["makeMainHousesGrid"] = draw_main_house_grid(
@@ -1468,7 +1494,7 @@ class KerykeionChartSVG:
1468
1494
  )
1469
1495
 
1470
1496
  # Planet grid
1471
- if self.second_obj.return_type == "Solar":
1497
+ if self.second_obj is not None and hasattr(self.second_obj, 'return_type') and self.second_obj.return_type == "Solar":
1472
1498
  first_return_grid_title = f"{self.first_obj.name} ({self.language_settings.get('inner_wheel', 'Inner Wheel')})"
1473
1499
  second_return_grid_title = f"{self.language_settings.get('solar_return', 'Solar Return')} ({self.language_settings.get('outer_wheel', 'Outer Wheel')})"
1474
1500
  else:
@@ -1488,7 +1514,7 @@ class KerykeionChartSVG:
1488
1514
  second_subject_available_kerykeion_celestial_points=self.t_available_kerykeion_celestial_points,
1489
1515
  chart_type=self.chart_type,
1490
1516
  text_color=self.chart_colors_settings["paper_0"],
1491
- celestial_point_language=self.language_settings["celestial_points"]
1517
+ celestial_point_language=self.language_settings["celestial_points"],
1492
1518
  )
1493
1519
 
1494
1520
  house_comparison_factory = HouseComparisonFactory(
@@ -1564,7 +1590,7 @@ class KerykeionChartSVG:
1564
1590
  template_dict["top_left_3"] = f"{self.language_settings['latitude']}: {latitude_string}"
1565
1591
  template_dict["top_left_4"] = f"{self.language_settings['longitude']}: {longitude_string}"
1566
1592
 
1567
- if self.first_obj.return_type == "Solar":
1593
+ if hasattr(self.first_obj, 'return_type') and self.first_obj.return_type == "Solar":
1568
1594
  template_dict["top_left_5"] = f"{self.language_settings['type']}: {self.language_settings.get('solar_return', 'Solar Return')}"
1569
1595
  else:
1570
1596
  template_dict["top_left_5"] = f"{self.language_settings['type']}: {self.language_settings.get('lunar_return', 'Lunar Return')}"
@@ -1579,12 +1605,22 @@ class KerykeionChartSVG:
1579
1605
 
1580
1606
  template_dict["bottom_left_0"] = zodiac_info
1581
1607
  template_dict["bottom_left_1"] = f"{self.language_settings.get('houses_system_' + self.first_obj.houses_system_identifier, self.first_obj.houses_system_name)} {self.language_settings.get('houses', 'Houses')}"
1582
- template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.first_obj.lunar_phase.get("moon_phase", "")}'
1583
- template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.first_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
1608
+
1609
+ # Lunar phase information (optional)
1610
+ if self.first_obj.lunar_phase is not None:
1611
+ template_dict["bottom_left_2"] = f'{self.language_settings.get("lunation_day", "Lunation Day")}: {self.first_obj.lunar_phase.get("moon_phase", "")}'
1612
+ template_dict["bottom_left_3"] = f'{self.language_settings.get("lunar_phase", "Lunar Phase")}: {self.language_settings.get(self.first_obj.lunar_phase.moon_phase_name.lower().replace(" ", "_"), self.first_obj.lunar_phase.moon_phase_name)}'
1613
+ else:
1614
+ template_dict["bottom_left_2"] = ""
1615
+ template_dict["bottom_left_3"] = ""
1616
+
1584
1617
  template_dict["bottom_left_4"] = f'{self.language_settings.get("perspective_type", "Perspective")}: {self.language_settings.get(self.first_obj.perspective_type.lower().replace(" ", "_"), self.first_obj.perspective_type)}'
1585
1618
 
1586
1619
  # Moon phase section calculations
1587
- template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
1620
+ if self.first_obj.lunar_phase is not None:
1621
+ template_dict["makeLunarPhase"] = makeLunarPhase(self.first_obj.lunar_phase["degrees_between_s_m"], self.geolat)
1622
+ else:
1623
+ template_dict["makeLunarPhase"] = ""
1588
1624
 
1589
1625
  # Houses and planet drawing
1590
1626
  template_dict["makeMainHousesGrid"] = draw_main_house_grid(
@@ -1687,9 +1723,9 @@ class KerykeionChartSVG:
1687
1723
 
1688
1724
  self.template = self.makeTemplate(minify, remove_css_variables)
1689
1725
 
1690
- if self.chart_type == "Return" and self.second_obj.return_type == "Lunar":
1726
+ if self.chart_type == "Return" and self.second_obj is not None and hasattr(self.second_obj, 'return_type') and self.second_obj.return_type == "Lunar":
1691
1727
  chartname = self.output_directory / f"{self.first_obj.name} - {self.chart_type} Chart - Lunar Return.svg"
1692
- elif self.chart_type == "Return" and self.second_obj.return_type == "Solar":
1728
+ elif self.chart_type == "Return" and self.second_obj is not None and hasattr(self.second_obj, 'return_type') and self.second_obj.return_type == "Solar":
1693
1729
  chartname = self.output_directory / f"{self.first_obj.name} - {self.chart_type} Chart - Solar Return.svg"
1694
1730
  else:
1695
1731
  chartname = self.output_directory / f"{self.first_obj.name} - {self.chart_type} Chart.svg"
@@ -1841,6 +1877,10 @@ if __name__ == "__main__":
1841
1877
  from kerykeion.planetary_return_factory import PlanetaryReturnFactory
1842
1878
  from kerykeion.astrological_subject_factory import AstrologicalSubjectFactory
1843
1879
 
1880
+ ACTIVE_PLANETS: list[AstrologicalPoint] = [
1881
+ "Sun", "Moon", "Pars_Fortunae", "Mercury", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto", "Chiron", "True_Node"
1882
+ ]
1883
+
1844
1884
  setup_logging(level="info")
1845
1885
 
1846
1886
  subject = AstrologicalSubjectFactory.from_birth_data("John Lennon", 1940, 10, 9, 18, 30, "Liverpool", "GB")
@@ -1852,7 +1892,7 @@ if __name__ == "__main__":
1852
1892
  lng=-118.2437,
1853
1893
  lat=34.0522,
1854
1894
  tz_str="America/Los_Angeles",
1855
- altitude=0,
1895
+ altitude=0
1856
1896
  )
1857
1897
 
1858
1898
  ###
@@ -1861,6 +1901,7 @@ if __name__ == "__main__":
1861
1901
  first_obj=subject,
1862
1902
  chart_language="IT",
1863
1903
  theme="strawberry",
1904
+ active_points=ACTIVE_PLANETS,
1864
1905
  )
1865
1906
  birth_chart.makeSVG() # minify=True, remove_css_variables=True)
1866
1907
 
@@ -1875,7 +1916,7 @@ if __name__ == "__main__":
1875
1916
  second_obj=solar_return,
1876
1917
  chart_language="IT",
1877
1918
  theme="classic",
1878
- active_points=["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Ascendant"],
1919
+ active_points=ACTIVE_PLANETS,
1879
1920
  )
1880
1921
 
1881
1922
  solar_return_chart.makeSVG() # minify=True, remove_css_variables=True)
@@ -1888,7 +1929,7 @@ if __name__ == "__main__":
1888
1929
  second_obj=solar_return,
1889
1930
  chart_language="IT",
1890
1931
  theme="dark",
1891
- active_points=["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn"],
1932
+ active_points=ACTIVE_PLANETS,
1892
1933
  )
1893
1934
 
1894
1935
  single_wheel_return_chart.makeSVG() # minify=True, remove_css_variables=True)
@@ -1905,20 +1946,23 @@ if __name__ == "__main__":
1905
1946
  second_obj=lunar_return,
1906
1947
  chart_language="IT",
1907
1948
  theme="dark",
1908
- active_points=["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn"],
1949
+ active_points=ACTIVE_PLANETS,
1909
1950
  )
1910
1951
  lunar_return_chart.makeSVG() # minify=True, remove_css_variables=True)
1911
1952
 
1912
1953
  ###
1913
1954
  ## Transit Chart
1914
- transit = AstrologicalSubjectFactory.from_current_time()
1955
+ transit = AstrologicalSubjectFactory.from_iso_utc_time(
1956
+ "Transit",
1957
+ "2021-10-04T18:30:00+01:00",
1958
+ )
1915
1959
  transit_chart = KerykeionChartSVG(
1916
1960
  first_obj=subject,
1917
1961
  chart_type="Transit",
1918
1962
  second_obj=transit,
1919
1963
  chart_language="IT",
1920
1964
  theme="dark",
1921
- active_points=["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Ascendant"]
1965
+ active_points=ACTIVE_PLANETS
1922
1966
  )
1923
1967
  transit_chart.makeSVG() # minify=True, remove_css_variables=True)
1924
1968
 
@@ -1931,7 +1975,7 @@ if __name__ == "__main__":
1931
1975
  second_obj=second_subject,
1932
1976
  chart_language="IT",
1933
1977
  theme="dark",
1934
- active_points=["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn"],
1978
+ active_points=ACTIVE_PLANETS
1935
1979
  )
1936
1980
  synastry_chart.makeSVG() # minify=True, remove_css_variables=True)
1937
1981
 
@@ -1944,7 +1988,7 @@ if __name__ == "__main__":
1944
1988
  second_obj=transit,
1945
1989
  chart_language="IT",
1946
1990
  theme="dark",
1947
- active_points=["Sun", "Moon", "Mercury", "Venus", "Mars", "Jupiter", "Saturn", "Ascendant"],
1991
+ active_points=ACTIVE_PLANETS,
1948
1992
  double_chart_aspect_grid_type="table"
1949
1993
  )
1950
1994
  transit_chart_with_grid.makeSVG() # minify=True, remove_css_variables=True)
@@ -370,9 +370,9 @@ OpenAstro.org -->
370
370
  <symbol id="Pars_Fortunae">
371
371
  <g transform="translate(1,2)">
372
372
  <circle cx="11" cy="11" r="9"
373
- style="fill: none; stroke: $planets_color_21; stroke-width: 2px" />
374
- <path d="M 11,2 L 11,20 M 2,11 L 20,11"
375
- style="stroke: $planets_color_21; stroke-width: 2px; fill: none;" />
373
+ style="fill: none; stroke: $planets_color_36; stroke-width: 2px" />
374
+ <path d="M 5,5 L 17,17 M 17,5 L 5,17"
375
+ style="stroke: $planets_color_36; stroke-width: 2px; fill: none;" />
376
376
  </g>
377
377
  </symbol>
378
378
 
@@ -92,6 +92,11 @@
92
92
  --kerykeion-chart-color-fire-percentage: #ff6600;
93
93
  --kerykeion-chart-color-water-percentage: #630e73;
94
94
 
95
+ /* Modalities Percentage */
96
+ --kerykeion-chart-color-cardinal-percentage: var(--kerykeion-chart-color-fire-percentage);
97
+ --kerykeion-chart-color-fixed-percentage: var(--kerykeion-chart-color-earth-percentage);
98
+ --kerykeion-chart-color-mutable-percentage: var(--kerykeion-chart-color-water-percentage);
99
+
95
100
  /* Other */
96
101
  --kerykeion-chart-color-house-number: #f00;
97
102
  }
@@ -134,6 +134,11 @@
134
134
  --kerykeion-chart-color-fire-percentage: var(--kerykeion-color-accent);
135
135
  --kerykeion-chart-color-water-percentage: var(--kerykeion-color-secondary);
136
136
 
137
+ /* Modalities Percentage */
138
+ --kerykeion-chart-color-cardinal-percentage: var(--kerykeion-color-success);
139
+ --kerykeion-chart-color-fixed-percentage: var(--kerykeion-color-warning);
140
+ --kerykeion-chart-color-mutable-percentage: var(--kerykeion-color-error);
141
+
137
142
  /* Aspects */
138
143
  --kerykeion-chart-color-lunar-phase-0: var(--kerykeion-color-black);
139
144
  --kerykeion-chart-color-lunar-phase-1: var(--kerykeion-color-white);
@@ -135,6 +135,11 @@
135
135
  --kerykeion-chart-color-fire-percentage: var(--kerykeion-color-accent);
136
136
  --kerykeion-chart-color-water-percentage: var(--kerykeion-color-secondary);
137
137
 
138
+ /* Modalities Percentage */
139
+ --kerykeion-chart-color-cardinal-percentage: var(--kerykeion-color-success);
140
+ --kerykeion-chart-color-fixed-percentage: var(--kerykeion-color-warning);
141
+ --kerykeion-chart-color-mutable-percentage: var(--kerykeion-color-error);
142
+
138
143
  /* Aspects */
139
144
  --kerykeion-chart-color-lunar-phase-0: var(--kerykeion-color-black);
140
145
  --kerykeion-chart-color-lunar-phase-1: var(--kerykeion-color-white);
@@ -135,6 +135,11 @@
135
135
  --kerykeion-chart-color-fire-percentage: var(--kerykeion-color-accent);
136
136
  --kerykeion-chart-color-water-percentage: var(--kerykeion-color-secondary);
137
137
 
138
+ /* Modalities Percentage */
139
+ --kerykeion-chart-color-cardinal-percentage: var(--kerykeion-color-success);
140
+ --kerykeion-chart-color-fixed-percentage: var(--kerykeion-color-warning);
141
+ --kerykeion-chart-color-mutable-percentage: var(--kerykeion-color-error);
142
+
138
143
  /* Aspects */
139
144
  --kerykeion-chart-color-lunar-phase-0: var(--kerykeion-color-black);
140
145
  --kerykeion-chart-color-lunar-phase-1: var(--kerykeion-color-white);
@@ -134,6 +134,11 @@
134
134
  --kerykeion-chart-color-fire-percentage: var(--kerykeion-color-accent);
135
135
  --kerykeion-chart-color-water-percentage: var(--kerykeion-color-secondary);
136
136
 
137
+ /* Modalities Percentage */
138
+ --kerykeion-chart-color-cardinal-percentage: var(--kerykeion-color-success);
139
+ --kerykeion-chart-color-fixed-percentage: var(--kerykeion-color-warning);
140
+ --kerykeion-chart-color-mutable-percentage: var(--kerykeion-color-error);
141
+
137
142
  /* Aspects */
138
143
  --kerykeion-chart-color-lunar-phase-0: var(--kerykeion-color-black);
139
144
  --kerykeion-chart-color-lunar-phase-1: var(--kerykeion-color-white);
@@ -100,9 +100,9 @@ class AstrologicalBaseModel(SubscriptableBaseModel):
100
100
  perspective_type: PerspectiveType
101
101
 
102
102
  # Common celestial points
103
- # Main planets
104
- sun: KerykeionPointModel
105
- moon: KerykeionPointModel
103
+ # Main planets (all optional to support selective calculations)
104
+ sun: Optional[KerykeionPointModel] = None
105
+ moon: Optional[KerykeionPointModel] = None
106
106
  mercury: Optional[KerykeionPointModel] = None
107
107
  venus: Optional[KerykeionPointModel] = None
108
108
  mars: Optional[KerykeionPointModel] = None
@@ -180,8 +180,8 @@ class AstrologicalBaseModel(SubscriptableBaseModel):
180
180
  houses_names_list: List[Houses] = Field(description="Ordered list of houses names")
181
181
  active_points: List[AstrologicalPoint] = Field(description="List of active points in the chart or aspects calculations.")
182
182
 
183
- # Common lunar phase data
184
- lunar_phase: LunarPhaseModel = Field(description="Lunar phase model")
183
+ # Common lunar phase data (optional)
184
+ lunar_phase: Optional[LunarPhaseModel] = Field(default=None, description="Lunar phase model")
185
185
 
186
186
 
187
187
  class AstrologicalSubjectModel(AstrologicalBaseModel):
@@ -175,6 +175,7 @@ class PlanetaryReturnFactory:
175
175
  nation=self.nation, # type: ignore
176
176
  online=False,
177
177
  altitude=self.altitude,
178
+ active_points=self.subject.active_points,
178
179
  )
179
180
 
180
181
  model_data = solar_return_astrological_subject.model_dump()
@@ -252,10 +252,10 @@
252
252
  "Quaoar": "Quaoar",
253
253
  "Regulus": "Regulus",
254
254
  "Spica": "Spica",
255
- "Pars_Fortunae": "Part de Fortune",
256
- "Pars_Spiritus": "Part d'Esprit",
257
- "Pars_Amoris": "Part d'Amour",
258
- "Pars_Fidei": "Part de Foi",
255
+ "Pars_Fortunae": "Pars Fortunae",
256
+ "Pars_Spiritus": "Pars Spiritus",
257
+ "Pars_Amoris": "Pars Amoris",
258
+ "Pars_Fidei": "Pars Fidei",
259
259
  "Vertex": "Vertex",
260
260
  "Anti_Vertex": "Anti-Vertex"
261
261
  }
@@ -382,10 +382,10 @@
382
382
  "Quaoar": "Quaoar",
383
383
  "Regulus": "Régulo",
384
384
  "Spica": "Spica",
385
- "Pars_Fortunae": "Parte da Fortuna",
386
- "Pars_Spiritus": "Parte do Espírito",
387
- "Pars_Amoris": "Parte do Amor",
388
- "Pars_Fidei": "Parte da Fé",
385
+ "Pars_Fortunae": "Pars Fortunae",
386
+ "Pars_Spiritus": "Pars Spiritus",
387
+ "Pars_Amoris": "Pars Amoris",
388
+ "Pars_Fidei": "Pars Fidei",
389
389
  "Vertex": "Vertex",
390
390
  "Anti_Vertex": "Anti-Vertex"
391
391
  }
@@ -512,10 +512,10 @@
512
512
  "Quaoar": "Quaoar",
513
513
  "Regulus": "Regolo",
514
514
  "Spica": "Spica",
515
- "Pars_Fortunae": "Parte di Fortuna",
516
- "Pars_Spiritus": "Parte dello Spirito",
517
- "Pars_Amoris": "Parte dell'Amore",
518
- "Pars_Fidei": "Parte della Fede",
515
+ "Pars_Fortunae": "Pars Fortunae",
516
+ "Pars_Spiritus": "Pars Spiritus",
517
+ "Pars_Amoris": "Pars Amoris",
518
+ "Pars_Fidei": "Pars Fidei",
519
519
  "Vertex": "Vertex",
520
520
  "Anti_Vertex": "Anti-Vertex"
521
521
  }
@@ -772,10 +772,10 @@
772
772
  "Quaoar": "Quaoar",
773
773
  "Regulus": "Régulo",
774
774
  "Spica": "Spica",
775
- "Pars_Fortunae": "Parte de Fortuna",
776
- "Pars_Spiritus": "Parte del Espíritu",
777
- "Pars_Amoris": "Parte del Amor",
778
- "Pars_Fidei": "Parte de la Fe",
775
+ "Pars_Fortunae": "Pars Fortunae",
776
+ "Pars_Spiritus": "Pars Spiritus",
777
+ "Pars_Amoris": "Pars Amoris",
778
+ "Pars_Fidei": "Pars Fidei",
779
779
  "Vertex": "Vertex",
780
780
  "Anti_Vertex": "Anti-Vertex"
781
781
  }
kerykeion/utilities.py CHANGED
@@ -677,18 +677,15 @@ def get_house_number(house_name: Houses) -> int:
677
677
 
678
678
  def find_common_active_points(first_points: list[AstrologicalPoint], second_points: list[AstrologicalPoint]) -> list[AstrologicalPoint]:
679
679
  """
680
- Find the common astrological points between those available in the subject and those requested.
680
+ Find only the elements that are present in both lists.
681
681
 
682
- Args:
683
- first_points: List of points available in the astrological subject
684
- second_points: List of points requested by the user
682
+ Args:
683
+ first_points: List of astrological points
684
+ second_points: List of astrological points
685
685
 
686
- Returns:
687
- List containing only the requested points that are also available in the subject
686
+ Returns:
687
+ List of elements common to both lists (without duplicates, order not guaranteed).
688
688
  """
689
- common_points: list[AstrologicalPoint]
690
- common_points = [point for point in second_points if point in first_points]
691
-
692
- ignored_points = set(second_points) - set(common_points)
689
+ common_points = list(set(first_points) & set(second_points))
693
690
 
694
691
  return common_points
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kerykeion
3
- Version: 5.0.0a4
3
+ Version: 5.0.0a6
4
4
  Summary: A python library for astrology.
5
5
  License: AGPL-3.0
6
6
  Keywords: astrology,ephemeris,astrology library,birtchart,svg,zodiac,zodiac-sing,astronomical-algorithms,synastry,astrology-calculator