mirror of
https://github.com/migatu/astrololo.git
synced 2026-07-14 21:38:37 +00:00
Silnik efemeryd: EngineProvider + SkyfieldEngine + harness porównawczy
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>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
"""Fabryka silników (LOG-24) — jedyne miejsce znające konkretne implementacje.
|
||||
|
||||
EPHEMERIS_ENGINE = own (domyślnie, permisywny Skyfield) | swisseph (zdalny AGPL).
|
||||
`available_engines()` zwraca to, co da się dziś uruchomić — używane przez
|
||||
harness porównawczy i testy parzystości.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
from app.engine.base import EphemerisEngine
|
||||
|
||||
|
||||
def build_engine(name: str | None = None) -> EphemerisEngine:
|
||||
name = (name or os.getenv("EPHEMERIS_ENGINE", "own")).lower()
|
||||
if name in ("swisseph", "remote", "b"):
|
||||
from app.engine.remote_engine import RemoteEngine
|
||||
|
||||
return RemoteEngine()
|
||||
from app.engine.skyfield_engine import SkyfieldEngine
|
||||
|
||||
return SkyfieldEngine()
|
||||
|
||||
|
||||
def available_engines() -> dict[str, EphemerisEngine]:
|
||||
"""Silniki gotowe do użycia teraz (own zawsze; swisseph jeśli skonfigurowany)."""
|
||||
engines: dict[str, EphemerisEngine] = {"own": build_engine("own")}
|
||||
if os.getenv("ENGINE_SWISSEPH_URL"):
|
||||
engines["swisseph"] = build_engine("swisseph")
|
||||
return engines
|
||||
Reference in New Issue
Block a user