fix(domy): przepnij build_chart na cusps_for — inaczej nowe systemy dają 500
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m30s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m28s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 20s
Testy / Kontrola składni wszystkich warstw (push) Successful in 9s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m30s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m28s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 20s
Testy / Kontrola składni wszystkich warstw (push) Successful in 9s
Rozszerzenie houses.SYSTEMS do ośmiu pozycji odblokowało w chart.py filtr `house_system in H.SYSTEMS`, ale liczenie zostało na H.cusps(), które zna wyłącznie trzy systemy dzielące ekliptykę i dla pozostałych rzuca ValueError. Wybranie campanusa przechodziło więc walidację i dopiero potem wywalało 500. Test parametryzowany po H.SYSTEMS zamyka tę klasę błędu na przyszłość: każdy system ogłoszony na liście musi przejść przez build_chart, więc dopisanie nazwy bez przepięcia liczenia od razu zapali się na czerwono. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -97,7 +97,9 @@ def build_chart(engine: EphemerisEngine, moment: ChartMoment, house_system: str
|
|||||||
asc = H.compute_asc(ramc, eps, moment.lat)
|
asc = H.compute_asc(ramc, eps, moment.lat)
|
||||||
mc = H.compute_mc(ramc, eps)
|
mc = H.compute_mc(ramc, eps)
|
||||||
system = house_system if house_system in H.SYSTEMS else H.WHOLE_SIGN
|
system = house_system if house_system in H.SYSTEMS else H.WHOLE_SIGN
|
||||||
cusp_list = H.cusps(asc, mc, system) # tropikalne — geometria domów jest niezmiennicza
|
# cusps_for, nie cusps: to drugie zna tylko trzy systemy dzielące ekliptykę.
|
||||||
|
# Systemy egzotyczne dzielą inne koła wielkie i potrzebują pełnego (RAMC, ε, φ).
|
||||||
|
cusp_list = H.cusps_for(ramc, eps, moment.lat, system) # tropikalne — geometria domów jest niezmiennicza
|
||||||
|
|
||||||
def _cusps_out(cl: list[float]) -> list[dict]:
|
def _cusps_out(cl: list[float]) -> list[dict]:
|
||||||
"""Cuspy → wiersze pod UI/kosmogram: znak, stopień w znaku, długość, glif."""
|
"""Cuspy → wiersze pod UI/kosmogram: znak, stopień w znaku, długość, glif."""
|
||||||
@@ -132,7 +134,7 @@ def build_chart(engine: EphemerisEngine, moment: ChartMoment, house_system: str
|
|||||||
if len(ordered) > 1:
|
if len(ordered) > 1:
|
||||||
result["house_systems"] = []
|
result["house_systems"] = []
|
||||||
for s in ordered:
|
for s in ordered:
|
||||||
cl = cusp_list if s == system else H.cusps(asc, mc, s)
|
cl = cusp_list if s == system else H.cusps_for(ramc, eps, moment.lat, s)
|
||||||
result["house_systems"].append({"system": s, "cusps": _cusps_out(cl)})
|
result["house_systems"].append({"system": s, "cusps": _cusps_out(cl)})
|
||||||
for pdict, obj in zip(result["positions"], positions):
|
for pdict, obj in zip(result["positions"], positions):
|
||||||
pdict.setdefault("houses", {})[s] = H.assign_house(obj.longitude, cl)
|
pdict.setdefault("houses", {})[s] = H.assign_house(obj.longitude, cl)
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
Waliduje względem astro.com dla horoskopu referencyjnego.
|
Waliduje względem astro.com dla horoskopu referencyjnego.
|
||||||
"""
|
"""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from app.engine import houses as H
|
||||||
from app.engine.chart import build_chart
|
from app.engine.chart import build_chart
|
||||||
|
|
||||||
|
|
||||||
@@ -66,3 +69,24 @@ def test_unknown_extra_system_is_ignored(own_engine, reference_moment):
|
|||||||
chart = build_chart(own_engine, reference_moment, "whole_sign",
|
chart = build_chart(own_engine, reference_moment, "whole_sign",
|
||||||
house_systems=["placidus", "equal"])
|
house_systems=["placidus", "equal"])
|
||||||
assert [h["system"] for h in chart["house_systems"]] == ["whole_sign", "equal"]
|
assert [h["system"] for h in chart["house_systems"]] == ["whole_sign", "equal"]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("system", H.SYSTEMS)
|
||||||
|
def test_every_advertised_system_builds_a_chart(own_engine, reference_moment, system):
|
||||||
|
"""Każdy system z houses.SYSTEMS musi przejść przez build_chart. Pilnuje,
|
||||||
|
żeby rozszerzenie SYSTEMS bez przepięcia chart.py nie dało 500 przy wyborze
|
||||||
|
systemu, który jest na liście, ale nie w użytej funkcji."""
|
||||||
|
chart = build_chart(own_engine, reference_moment, system)
|
||||||
|
assert chart["house_system"] == system
|
||||||
|
assert len(chart["cusps"]) == 12
|
||||||
|
assert all(1 <= p["house"] <= 12 for p in chart["positions"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_multiple_systems_side_by_side_cover_all(own_engine, reference_moment):
|
||||||
|
chart = build_chart(own_engine, reference_moment, H.WHOLE_SIGN,
|
||||||
|
house_systems=list(H.SYSTEMS))
|
||||||
|
blocks = chart["house_systems"]
|
||||||
|
assert blocks[0]["system"] == H.WHOLE_SIGN # prymarny zawsze pierwszy
|
||||||
|
assert {b["system"] for b in blocks} == set(H.SYSTEMS)
|
||||||
|
for p in chart["positions"]:
|
||||||
|
assert set(p["houses"]) == set(H.SYSTEMS)
|
||||||
|
|||||||
Reference in New Issue
Block a user