mirror of
https://github.com/migatu/astrololo.git
synced 2026-07-14 21:38:37 +00:00
e69c0714b9
Pierwszy increment implementacji warstwy logicznej (ścieżka A). LOG-24: interfejs EphemerisEngine z dwoma backendami — SkyfieldEngine (własny, permisywny: Skyfield MIT + dane JPL public domain) oraz RemoteEngine (klient izolowanej usługi swisseph). Fabryka + leniwa inicjalizacja; endpointy /chart/positions i /chart/compare. LOG-01: pozycje obiektów (długość/szerokość ekliptyczna, prędkość, kierunek, formaty: w znaku / absolutny / dziesiętny). LOG-25/28: harness porównawczy (compare.py) z progami tolerancji oraz wspólny kontrakt parzystości; pełen zestaw testów. LOG-27: services/engine-swisseph — osobna, opcjonalna usługa AGPL (pyswisseph, tryb Moshiera), licencjonowana osobno, w compose pod profilem "comparison"; nie wchodzi do zamkniętego produktu. Walidacja: SkyfieldEngine zgadza się ze Swiss Ephemeris co do ~1" dla wszystkich 10 obiektów na horoskopie referencyjnym (30.04.1984, Warszawa); 12 testów przechodzi (silnik B pomijany gdy nieskonfigurowany). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 lines
782 B
Python
25 lines
782 B
Python
"""Interfejs silnika efemeryd (LOG-24).
|
|
|
|
To jest „wymienny silnik liczący". Dziś realizują go: SkyfieldEngine (własny,
|
|
permisywny, in-process) i RemoteEngine (klient izolowanej usługi swisseph, AGPL).
|
|
Warstwa logiczna woła tylko ten interfejs — nie wie, który silnik liczy.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
from app.engine.models import ChartMoment, ObjectPosition
|
|
|
|
|
|
class EphemerisEngine(ABC):
|
|
name: str = "base"
|
|
|
|
@abstractmethod
|
|
def positions(
|
|
self, moment: ChartMoment, objects: list[str] | None = None
|
|
) -> list[ObjectPosition]:
|
|
"""Pozycje obiektów dla danego momentu (LOG-01). None = zestaw domyślny."""
|
|
|
|
def health(self) -> dict:
|
|
return {"engine": self.name, "status": "ok"}
|