kerykeion 4.16.1__tar.gz → 4.16.3__tar.gz

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 (38) hide show
  1. {kerykeion-4.16.1 → kerykeion-4.16.3}/PKG-INFO +1 -1
  2. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/charts_utils.py +127 -42
  3. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/kerykeion_chart_svg.py +153 -5
  4. kerykeion-4.16.3/kerykeion/charts/templates/aspect_grid_only.xml +452 -0
  5. kerykeion-4.16.3/kerykeion/charts/templates/wheel_only.xml +499 -0
  6. {kerykeion-4.16.1 → kerykeion-4.16.3}/pyproject.toml +1 -1
  7. {kerykeion-4.16.1 → kerykeion-4.16.3}/LICENSE +0 -0
  8. {kerykeion-4.16.1 → kerykeion-4.16.3}/README.md +0 -0
  9. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/__init__.py +0 -0
  10. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/aspects/__init__.py +0 -0
  11. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/aspects/aspects_utils.py +0 -0
  12. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/aspects/natal_aspects.py +0 -0
  13. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/aspects/synastry_aspects.py +0 -0
  14. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/astrological_subject.py +0 -0
  15. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/__init__.py +0 -0
  16. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/draw_planets.py +0 -0
  17. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/templates/chart.xml +0 -0
  18. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/themes/classic.css +0 -0
  19. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/themes/dark-high-contrast.css +0 -0
  20. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/themes/dark.css +0 -0
  21. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/charts/themes/light.css +0 -0
  22. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/enums.py +0 -0
  23. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/ephemeris_data.py +0 -0
  24. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/fetch_geonames.py +0 -0
  25. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/kr_types/__init__.py +0 -0
  26. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/kr_types/chart_types.py +0 -0
  27. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/kr_types/kerykeion_exception.py +0 -0
  28. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/kr_types/kr_literals.py +0 -0
  29. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/kr_types/kr_models.py +0 -0
  30. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/kr_types/settings_models.py +0 -0
  31. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/relationship_score.py +0 -0
  32. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/report.py +0 -0
  33. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/settings/__init__.py +0 -0
  34. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/settings/kerykeion_settings.py +0 -0
  35. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/settings/kr.config.json +0 -0
  36. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/sweph/README.md +0 -0
  37. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/sweph/seas_18.se1 +0 -0
  38. {kerykeion-4.16.1 → kerykeion-4.16.3}/kerykeion/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kerykeion
3
- Version: 4.16.1
3
+ Version: 4.16.3
4
4
  Summary: A python library for astrology.
5
5
  Home-page: https://www.kerykeion.net/
6
6
  License: AGPL-3.0
@@ -514,54 +514,63 @@ def draw_third_circle(
514
514
  return f'<circle cx="{radius}" cy="{radius}" r="{radius - c3}" style="fill: {fill_color}; fill-opacity:.8; stroke: {stroke_color}; stroke-width: 1px" />'
515
515
 
516
516
 
517
- def draw_aspect_grid(stroke_color: str, available_planets_list: list, aspects_list: list) -> str:
517
+ def draw_aspect_grid(
518
+ stroke_color: str,
519
+ available_planets: list,
520
+ aspects: list,
521
+ x_start: int = 380,
522
+ y_start: int = 468,
523
+ ) -> str:
518
524
  """
519
- Draws the aspect grid.
525
+ Draws the aspect grid for the given planets and aspects.
520
526
 
521
527
  Args:
522
- - stroke_color (str): The color of the stroke.
523
- - available_planets_list (list): List of all the planets, they will be actually filtered to so if they have
524
- the "is_active" key set to True inside the function to have the correct list of just the active planets.
525
- - aspects_list (list): List of aspects.
528
+ stroke_color (str): The color of the stroke.
529
+ available_planets (list): List of all planets. Only planets with "is_active" set to True will be used.
530
+ aspects (list): List of aspects.
531
+ x_start (int): The x-coordinate starting point.
532
+ y_start (int): The y-coordinate starting point.
526
533
 
534
+ Returns:
535
+ str: SVG string representing the aspect grid.
527
536
  """
528
-
529
- out = ""
537
+ svg_output = ""
530
538
  style = f"stroke:{stroke_color}; stroke-width: 1px; stroke-opacity:.6; fill:none"
531
- xindent = 380
532
- yindent = 468
533
- box = 14
534
- counter = 0
535
-
536
- actual_planets = []
537
- for planet in available_planets_list:
538
- if planet.is_active:
539
- actual_planets.append(planet)
540
-
541
- first_iteration_revers_planets = actual_planets[::-1]
542
- for index, a in enumerate(first_iteration_revers_planets):
543
- counter += 1
544
- out += f'<rect x="{xindent}" y="{yindent}" width="{box}" height="{box}" style="{style}"/>'
545
- out += f'<use transform="scale(0.4)" x="{(xindent+2)*2.5}" y="{(yindent+1)*2.5}" xlink:href="#{a["name"]}" />'
546
-
547
- xindent = xindent + box
548
- yindent = yindent - box
549
-
550
- xorb = xindent
551
- yorb = yindent + box
552
-
553
- second_iteration_revers_planets = first_iteration_revers_planets[index + 1 :]
554
- for b in second_iteration_revers_planets:
555
- out += f'<rect x="{xorb}" y="{yorb}" width="{box}" height="{box}" style="{style}"/>'
556
- xorb = xorb + box
557
-
558
- for aspect in aspects_list:
559
- if (aspect["p1"] == a["id"] and aspect["p2"] == b["id"]) or (
560
- aspect["p1"] == b["id"] and aspect["p2"] == a["id"]
539
+ box_size = 14
540
+
541
+ # Filter active planets
542
+ active_planets = [planet for planet in available_planets if planet.is_active]
543
+
544
+ # Reverse the list of active planets for the first iteration
545
+ reversed_planets = active_planets[::-1]
546
+
547
+ for index, planet_a in enumerate(reversed_planets):
548
+ # Draw the grid box for the planet
549
+ svg_output += f'<rect x="{x_start}" y="{y_start}" width="{box_size}" height="{box_size}" style="{style}"/>'
550
+ svg_output += f'<use transform="scale(0.4)" x="{(x_start + 2) * 2.5}" y="{(y_start + 1) * 2.5}" xlink:href="#{planet_a["name"]}" />'
551
+
552
+ # Update the starting coordinates for the next box
553
+ x_start += box_size
554
+ y_start -= box_size
555
+
556
+ # Coordinates for the aspect symbols
557
+ x_aspect = x_start
558
+ y_aspect = y_start + box_size
559
+
560
+ # Iterate over the remaining planets
561
+ for planet_b in reversed_planets[index + 1:]:
562
+ # Draw the grid box for the aspect
563
+ svg_output += f'<rect x="{x_aspect}" y="{y_aspect}" width="{box_size}" height="{box_size}" style="{style}"/>'
564
+ x_aspect += box_size
565
+
566
+ # Check for aspects between the planets
567
+ for aspect in aspects:
568
+ if (aspect["p1"] == planet_a["id"] and aspect["p2"] == planet_b["id"]) or (
569
+ aspect["p1"] == planet_b["id"] and aspect["p2"] == planet_a["id"]
561
570
  ):
562
- out += f'<use x="{xorb-box+1}" y="{yorb+1}" xlink:href="#orb{aspect["aspect_degrees"]}" />'
571
+ svg_output += f'<use x="{x_aspect - box_size + 1}" y="{y_aspect + 1}" xlink:href="#orb{aspect["aspect_degrees"]}" />'
563
572
 
564
- return out
573
+ return svg_output
565
574
 
566
575
 
567
576
  def draw_houses_cusps_and_text_number(
@@ -678,7 +687,7 @@ def draw_houses_cusps_and_text_number(
678
687
  return path
679
688
 
680
689
 
681
- def draw_aspect_transit_grid(
690
+ def draw_transit_aspect_list(
682
691
  grid_title: str,
683
692
  aspects_list: Union[list[AspectModel], list[dict]],
684
693
  celestial_point_language: Union[KerykeionLanguageCelestialPointModel, dict],
@@ -752,7 +761,7 @@ def draw_aspect_transit_grid(
752
761
  inner_path += f"</g>"
753
762
  line = line + 14
754
763
 
755
- out = f'<g style="transform: translate(47%, 61%) scale({scale})">'
764
+ out = f'<g style="transform: translate(47%, 59%) scale({scale})">'
756
765
  out += f'<text y="-15" x="0" style="fill: var(--kerykeion-chart-color-paper-0); font-size: 14px;">{grid_title}:</text>'
757
766
  out += inner_path
758
767
  out += "</g>"
@@ -995,4 +1004,80 @@ def draw_planet_grid(
995
1004
  second_line_height += offset_between_lines
996
1005
 
997
1006
  svg_output += end_of_line
1007
+ return svg_output
1008
+
1009
+
1010
+ def draw_transit_aspect_grid(
1011
+ stroke_color: str,
1012
+ available_planets: list,
1013
+ aspects: list,
1014
+ x_indent: int = 50,
1015
+ y_indent: int = 250,
1016
+ box_size: int = 14
1017
+ ) -> str:
1018
+ """
1019
+ Draws the aspect grid for the given planets and aspects. The default args value are specific for a stand alone
1020
+ aspect grid.
1021
+
1022
+ Args:
1023
+ stroke_color (str): The color of the stroke.
1024
+ available_planets (list): List of all planets. Only planets with "is_active" set to True will be used.
1025
+ aspects (list): List of aspects.
1026
+ x_indent (int): The initial x-coordinate starting point.
1027
+ y_indent (int): The initial y-coordinate starting point.
1028
+
1029
+ Returns:
1030
+ str: SVG string representing the aspect grid.
1031
+ """
1032
+ svg_output = ""
1033
+ style = f"stroke:{stroke_color}; stroke-width: 1px; stroke-opacity:.6; fill:none"
1034
+ x_start = x_indent
1035
+ y_start = y_indent
1036
+
1037
+ # Filter active planets
1038
+ active_planets = [planet for planet in available_planets if planet.is_active]
1039
+
1040
+ # Reverse the list of active planets for the first iteration
1041
+ reversed_planets = active_planets[::-1]
1042
+ for index, planet_a in enumerate(reversed_planets):
1043
+ # Draw the grid box for the planet
1044
+ svg_output += f'<rect x="{x_start}" y="{y_start}" width="{box_size}" height="{box_size}" style="{style}"/>'
1045
+ svg_output += f'<use transform="scale(0.4)" x="{(x_start + 2) * 2.5}" y="{(y_start + 1) * 2.5}" xlink:href="#{planet_a["name"]}" />'
1046
+ x_start += box_size
1047
+
1048
+ x_start = x_indent - box_size
1049
+ y_start = y_indent - box_size
1050
+
1051
+ for index, planet_a in enumerate(reversed_planets):
1052
+ # Draw the grid box for the planet
1053
+ svg_output += f'<rect x="{x_start}" y="{y_start}" width="{box_size}" height="{box_size}" style="{style}"/>'
1054
+ svg_output += f'<use transform="scale(0.4)" x="{(x_start + 2) * 2.5}" y="{(y_start + 1) * 2.5}" xlink:href="#{planet_a["name"]}" />'
1055
+ y_start -= box_size
1056
+
1057
+ x_start = x_indent
1058
+ y_start = y_indent
1059
+ y_start = y_start - box_size
1060
+
1061
+ for index, planet_a in enumerate(reversed_planets):
1062
+ # Draw the grid box for the planet
1063
+ svg_output += f'<rect x="{x_start}" y="{y_start}" width="{box_size}" height="{box_size}" style="{style}"/>'
1064
+
1065
+ # Update the starting coordinates for the next box
1066
+ y_start -= box_size
1067
+
1068
+ # Coordinates for the aspect symbols
1069
+ x_aspect = x_start
1070
+ y_aspect = y_start + box_size
1071
+
1072
+ # Iterate over the remaining planets
1073
+ for planet_b in reversed_planets:
1074
+ # Draw the grid box for the aspect
1075
+ svg_output += f'<rect x="{x_aspect}" y="{y_aspect}" width="{box_size}" height="{box_size}" style="{style}"/>'
1076
+ x_aspect += box_size
1077
+
1078
+ # Check for aspects between the planets
1079
+ for aspect in aspects:
1080
+ if (aspect["p1"] == planet_a["id"] and aspect["p2"] == planet_b["id"]):
1081
+ svg_output += f'<use x="{x_aspect - box_size + 1}" y="{y_aspect + 1}" xlink:href="#orb{aspect["aspect_degrees"]}" />'
1082
+
998
1083
  return svg_output
@@ -30,7 +30,8 @@ from kerykeion.charts.charts_utils import (
30
30
  draw_third_circle,
31
31
  draw_aspect_grid,
32
32
  draw_houses_cusps_and_text_number,
33
- draw_aspect_transit_grid,
33
+ draw_transit_aspect_list,
34
+ draw_transit_aspect_grid,
34
35
  draw_moon_phase,
35
36
  draw_house_grid,
36
37
  draw_planet_grid,
@@ -106,6 +107,7 @@ class KerykeionChartSVG:
106
107
  new_output_directory: Union[str, None] = None,
107
108
  new_settings_file: Union[Path, None] = None,
108
109
  theme: Union[KerykeionChartTheme, None] = "classic",
110
+ double_chart_aspect_grid_type: Literal["list", "table"] = "list"
109
111
  ):
110
112
  # Directories:
111
113
  self.homedir = Path.home()
@@ -157,6 +159,9 @@ class KerykeionChartSVG:
157
159
  for body in available_celestial_points_names:
158
160
  self.t_available_kerykeion_celestial_points.append(self.t_user.get(body))
159
161
 
162
+ # Double chart aspect grid type
163
+ self.double_chart_aspect_grid_type = double_chart_aspect_grid_type
164
+
160
165
  # screen size
161
166
  self.height = self._DEFAULT_HEIGHT
162
167
  if self.chart_type == "Synastry" or self.chart_type == "Transit":
@@ -367,7 +372,11 @@ class KerykeionChartSVG:
367
372
  template_dict["first_circle"] = draw_first_circle(self.main_radius, self.chart_colors_settings["zodiac_transit_ring_2"], self.chart_type)
368
373
  template_dict["second_circle"] = draw_second_circle(self.main_radius, self.chart_colors_settings['zodiac_transit_ring_1'], self.chart_colors_settings['paper_1'], self.chart_type)
369
374
  template_dict['third_circle'] = draw_third_circle(self.main_radius, self.chart_colors_settings['zodiac_transit_ring_0'], self.chart_colors_settings['paper_1'], self.chart_type, self.third_circle_radius)
370
- template_dict["makeAspectGrid"] = draw_aspect_transit_grid(self.language_settings["aspects"], self.aspects_list, self.planets_settings, self.aspects_settings)
375
+
376
+ if self.double_chart_aspect_grid_type == "list":
377
+ template_dict["makeAspectGrid"] = draw_transit_aspect_list(self.language_settings["aspects"], self.aspects_list, self.planets_settings, self.aspects_settings)
378
+ else:
379
+ template_dict["makeAspectGrid"] = draw_transit_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list, 550, 450)
371
380
 
372
381
  template_dict["makeAspects"] = self._draw_all_transit_aspects_lines(self.main_radius, self.main_radius - 160)
373
382
  else:
@@ -574,7 +583,7 @@ class KerykeionChartSVG:
574
583
  td = self._create_template_dictionary()
575
584
 
576
585
  DATA_DIR = Path(__file__).parent
577
- xml_svg = DATA_DIR / "templates/chart.xml"
586
+ xml_svg = DATA_DIR / "templates" / "chart.xml"
578
587
 
579
588
  # read template
580
589
  with open(xml_svg, "r", encoding="utf-8", errors="ignore") as f:
@@ -595,7 +604,7 @@ class KerykeionChartSVG:
595
604
  return template
596
605
 
597
606
  def makeSVG(self, minify: bool = False):
598
- """Prints out the SVG file in the specifide folder"""
607
+ """Prints out the SVG file in the specified folder"""
599
608
 
600
609
  if not hasattr(self, "template"):
601
610
  self.template = self.makeTemplate(minify)
@@ -607,6 +616,70 @@ class KerykeionChartSVG:
607
616
 
608
617
  logging.info(f"SVG Generated Correctly in: {self.chartname}")
609
618
 
619
+ def makeWheelOnlyTemplate(self, minify: bool = False):
620
+ """Creates the template for the SVG file with only the wheel"""
621
+
622
+ with open(Path(__file__).parent / "templates" / "wheel_only.xml", "r", encoding="utf-8", errors="ignore") as f:
623
+ template = f.read()
624
+
625
+ template_dict = self._create_template_dictionary()
626
+ template = Template(template).substitute(template_dict)
627
+
628
+ if minify:
629
+ template = scourString(template).replace('"', "'").replace("\n", "").replace("\t","").replace(" ", "").replace(" ", "")
630
+
631
+ else:
632
+ template = template.replace('"', "'")
633
+
634
+ return template
635
+
636
+ def makeWheelOnlySVG(self, minify: bool = False):
637
+ """Prints out the SVG file in the specified folder with only the wheel"""
638
+
639
+ template = self.makeWheelOnlyTemplate(minify)
640
+
641
+ self.chartname = self.output_directory / f"{self.user.name} - {self.chart_type} Chart - Wheel Only.svg"
642
+
643
+ with open(self.chartname, "w", encoding="utf-8", errors="ignore") as output_file:
644
+ output_file.write(template)
645
+
646
+ logging.info(f"SVG Generated Correctly in: {self.chartname}")
647
+
648
+ def makeAspectGridOnlyTemplate(self, minify: bool = False):
649
+ """Creates the template for the SVG file with only the aspect grid"""
650
+
651
+ with open(Path(__file__).parent / "templates" / "aspect_grid_only.xml", "r", encoding="utf-8", errors="ignore") as f:
652
+ template = f.read()
653
+
654
+ template_dict = self._create_template_dictionary()
655
+
656
+ if self.chart_type in ["Transit", "Synastry"]:
657
+ aspects_grid = draw_transit_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list)
658
+ else:
659
+ aspects_grid = draw_aspect_grid(self.chart_colors_settings['paper_0'], self.available_planets_setting, self.aspects_list, x_start=50, y_start=250)
660
+
661
+ template = Template(template).substitute({**template_dict, "makeAspectGrid": aspects_grid})
662
+
663
+ if minify:
664
+ template = scourString(template).replace('"', "'").replace("\n", "").replace("\t","").replace(" ", "").replace(" ", "")
665
+
666
+ else:
667
+ template = template.replace('"', "'")
668
+
669
+ return template
670
+
671
+ def makeAspectGridOnlySVG(self, minify: bool = False):
672
+ """Prints out the SVG file in the specified folder with only the aspect grid"""
673
+
674
+ template = self.makeAspectGridOnlyTemplate(minify)
675
+
676
+ self.chartname = self.output_directory / f"{self.user.name} - {self.chart_type} Chart - Aspect Grid Only.svg"
677
+
678
+ with open(self.chartname, "w", encoding="utf-8", errors="ignore") as output_file:
679
+ output_file.write(template)
680
+
681
+ logging.info(f"SVG Generated Correctly in: {self.chartname}")
682
+
610
683
 
611
684
  if __name__ == "__main__":
612
685
  from kerykeion.utilities import setup_logging
@@ -697,4 +770,79 @@ if __name__ == "__main__":
697
770
  # Light Theme Natal Chart
698
771
  light_theme_subject = AstrologicalSubject("John Lennon - Light Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
699
772
  light_theme_natal_chart = KerykeionChartSVG(light_theme_subject, theme="light")
700
- light_theme_natal_chart.makeSVG()
773
+ light_theme_natal_chart.makeSVG()
774
+
775
+ # Dark Theme External Natal Chart
776
+ dark_theme_external_subject = AstrologicalSubject("John Lennon - Dark Theme External", 1940, 10, 9, 18, 30, "Liverpool", "GB")
777
+ dark_theme_external_chart = KerykeionChartSVG(dark_theme_external_subject, "ExternalNatal", second, theme="dark")
778
+ dark_theme_external_chart.makeSVG()
779
+
780
+ # Dark Theme Synastry Chart
781
+ dark_theme_synastry_subject = AstrologicalSubject("John Lennon - DTS", 1940, 10, 9, 18, 30, "Liverpool", "GB")
782
+ dark_theme_synastry_chart = KerykeionChartSVG(dark_theme_synastry_subject, "Synastry", second, theme="dark")
783
+ dark_theme_synastry_chart.makeSVG()
784
+
785
+ # Wheel Natal Only Chart
786
+ wheel_only_subject = AstrologicalSubject("John Lennon - Wheel Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
787
+ wheel_only_chart = KerykeionChartSVG(wheel_only_subject)
788
+ wheel_only_chart.makeWheelOnlySVG()
789
+
790
+ # Wheel External Natal Only Chart
791
+ wheel_external_subject = AstrologicalSubject("John Lennon - Wheel External Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
792
+ wheel_external_chart = KerykeionChartSVG(wheel_external_subject, "ExternalNatal", second)
793
+ wheel_external_chart.makeWheelOnlySVG()
794
+
795
+ # Wheel Synastry Only Chart
796
+ wheel_synastry_subject = AstrologicalSubject("John Lennon - Wheel Synastry Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
797
+ wheel_synastry_chart = KerykeionChartSVG(wheel_synastry_subject, "Synastry", second)
798
+ wheel_synastry_chart.makeWheelOnlySVG()
799
+
800
+ # Wheel Transit Only Chart
801
+ wheel_transit_subject = AstrologicalSubject("John Lennon - Wheel Transit Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
802
+ wheel_transit_chart = KerykeionChartSVG(wheel_transit_subject, "Transit", second)
803
+ wheel_transit_chart.makeWheelOnlySVG()
804
+
805
+ # Wheel Sidereal Birth Chart (Lahiri) Dark Theme
806
+ sidereal_dark_subject = AstrologicalSubject("John Lennon Lahiri - Dark Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="LAHIRI")
807
+ sidereal_dark_chart = KerykeionChartSVG(sidereal_dark_subject, theme="dark")
808
+ sidereal_dark_chart.makeWheelOnlySVG()
809
+
810
+ # Wheel Sidereal Birth Chart (Fagan-Bradley) Light Theme
811
+ sidereal_light_subject = AstrologicalSubject("John Lennon Fagan-Bradley - Light Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB", zodiac_type="Sidereal", sidereal_mode="FAGAN_BRADLEY")
812
+ sidereal_light_chart = KerykeionChartSVG(sidereal_light_subject, theme="light")
813
+ sidereal_light_chart.makeWheelOnlySVG()
814
+
815
+ # Aspect Grid Only Natal Chart
816
+ aspect_grid_only_subject = AstrologicalSubject("John Lennon - Aspect Grid Only", 1940, 10, 9, 18, 30, "Liverpool", "GB")
817
+ aspect_grid_only_chart = KerykeionChartSVG(aspect_grid_only_subject)
818
+ aspect_grid_only_chart.makeAspectGridOnlySVG()
819
+
820
+ # Aspect Grid Only Dark Theme Natal Chart
821
+ aspect_grid_dark_subject = AstrologicalSubject("John Lennon - Aspect Grid Dark Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
822
+ aspect_grid_dark_chart = KerykeionChartSVG(aspect_grid_dark_subject, theme="dark")
823
+ aspect_grid_dark_chart.makeAspectGridOnlySVG()
824
+
825
+ # Aspect Grid Only Light Theme Natal Chart
826
+ aspect_grid_light_subject = AstrologicalSubject("John Lennon - Aspect Grid Light Theme", 1940, 10, 9, 18, 30, "Liverpool", "GB")
827
+ aspect_grid_light_chart = KerykeionChartSVG(aspect_grid_light_subject, theme="light")
828
+ aspect_grid_light_chart.makeAspectGridOnlySVG()
829
+
830
+ # Synastry Chart Aspect Grid Only
831
+ aspect_grid_synastry_subject = AstrologicalSubject("John Lennon - Aspect Grid Synastry", 1940, 10, 9, 18, 30, "Liverpool", "GB")
832
+ aspect_grid_synastry_chart = KerykeionChartSVG(aspect_grid_synastry_subject, "Synastry", second)
833
+ aspect_grid_synastry_chart.makeAspectGridOnlySVG()
834
+
835
+ # Transit Chart Aspect Grid Only
836
+ aspect_grid_transit_subject = AstrologicalSubject("John Lennon - Aspect Grid Transit", 1940, 10, 9, 18, 30, "Liverpool", "GB")
837
+ aspect_grid_transit_chart = KerykeionChartSVG(aspect_grid_transit_subject, "Transit", second)
838
+ aspect_grid_transit_chart.makeAspectGridOnlySVG()
839
+
840
+ # Synastry Chart Aspect Grid Only Dark Theme
841
+ aspect_grid_dark_synastry_subject = AstrologicalSubject("John Lennon - Aspect Grid Dark Synastry", 1940, 10, 9, 18, 30, "Liverpool", "GB")
842
+ aspect_grid_dark_synastry_chart = KerykeionChartSVG(aspect_grid_dark_synastry_subject, "Synastry", second, theme="dark")
843
+ aspect_grid_dark_synastry_chart.makeAspectGridOnlySVG()
844
+
845
+ # Transit Chart With draw_transit_aspect_grid table
846
+ transit_chart_with_table_grid_subject = AstrologicalSubject("John Lennon - TCWTG", 1940, 10, 9, 18, 30, "Liverpool", "GB")
847
+ transit_chart_with_table_grid = KerykeionChartSVG(transit_chart_with_table_grid_subject, "Transit", second, double_chart_aspect_grid_type="table", theme="dark")
848
+ transit_chart_with_table_grid.makeSVG()