feat: aspektarian, deklinacja i antyscja trafiają do raportu i PDF-a
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m13s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m49s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 29s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 20s
build-render / build (push) Successful in 44s
build / build (push) Successful in 54s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m19s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m59s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 34s
Testy / Kontrola składni wszystkich warstw (push) Successful in 25s
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m13s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m49s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 29s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 20s
build-render / build (push) Successful in 44s
build / build (push) Successful in 54s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m19s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m59s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 34s
Testy / Kontrola składni wszystkich warstw (push) Successful in 25s
Zasada: co składamy, dodajemy i wyświetlamy, MA trafiać do finalnego raportu
(«Skompiluj») i do PDF-a — nie tylko na stronę /chart. Do tej pory do raportu i
druku szło samo koło; aspektarian (etap 5) i deklinacja/antyscja (etap 6) były
tylko w podglądzie horoskopu.
RAPORT «Skompiluj» (podgląd): handler /compile liczy teraz wszystkie cztery
rysunki, a szablon je pokazuje (koło, aspektarian, deklinacja, antyscja).
PDF (usługa render) — uogólnienie z jednego rysunku na LISTĘ:
- Kontrakt raportu: `figures = [{svg, caption}]` (uporządkowana). `wheel_svg`
zostaje dla zgodności wstecznej jako pojedynczy rysunek.
- `compile.py`: każdy SVG osobno przez rsvg-convert → PDF (fig0…figN); braki/
błędy pomijane (rysunek nie może wywalić raportu, tekst ważniejszy).
- `latex.py build()`: rysunki w sekcji 3 (po danych, przed natalną) w PODANEJ
kolejności, każdy z podpisem. Jedna reguła składania: keepaspectratio z limitem
szerokości i wysokości — kwadratowe (koło, aspektarian) ogranicza wysokość,
szerokie (deklinacja, antyscja) szerokość, bez zniekształceń.
- `compile_pdf` (prezentacja): renderuje komplet w motywie DRUKU i wysyła jako
`figures`.
Testy: render +5 (kolejność, podpisy, zgodność wsteczna, pomijanie pustych),
prezentacja +3 (raport pokazuje komplet, PDF składa komplet). Render 32,
prezentacja 173.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit was merged in pull request #41.
This commit is contained in:
@@ -132,6 +132,43 @@ def test_wheel_is_optional():
|
||||
assert "includegraphics" in build(_report(), wheel_pdf="wheel.pdf")
|
||||
|
||||
|
||||
# ─────────── wiele rysunków w raporcie (koło + aspektarian + …) ───────────
|
||||
|
||||
def test_all_figures_are_embedded_in_order():
|
||||
"""Co pokazujemy na stronie, ma trafić do PDF-a. Rysunki idą w PODANEJ
|
||||
kolejności — koło, potem aspektarian, deklinacja, antyscja."""
|
||||
figs = [
|
||||
{"pdf": "fig0.pdf", "caption": "Kosmogram"},
|
||||
{"pdf": "fig1.pdf", "caption": "Aspektarian"},
|
||||
{"pdf": "fig2.pdf", "caption": "Wykres deklinacji"},
|
||||
]
|
||||
tex = build(_report(), figures=figs)
|
||||
assert tex.count("includegraphics") == 3
|
||||
assert tex.index("fig0.pdf") < tex.index("fig1.pdf") < tex.index("fig2.pdf")
|
||||
|
||||
|
||||
def test_figure_captions_are_printed_and_escaped():
|
||||
tex = build(_report(), figures=[{"pdf": "fig0.pdf", "caption": "Deklinacja 50%"}])
|
||||
assert "Deklinacja 50\\%" in tex # podpis eskejpowany jak reszta
|
||||
|
||||
|
||||
def test_figures_sit_between_data_and_natal():
|
||||
"""Rysunki nadal w sekcji 3 — po danych, przed interpretacją natalną."""
|
||||
tex = build(_report(), figures=[{"pdf": "fig0.pdf", "caption": "Kosmogram"}])
|
||||
assert tex.index("Data urodzenia") < tex.index("fig0.pdf") < tex.index("Interpretacja natalna")
|
||||
|
||||
|
||||
def test_wheel_pdf_still_works_as_single_figure():
|
||||
"""Zgodność wsteczna: pojedynczy wheel_pdf = jeden rysunek."""
|
||||
tex = build(_report(), wheel_pdf="wheel.pdf")
|
||||
assert tex.count("includegraphics") == 1 and "wheel.pdf" in tex
|
||||
|
||||
|
||||
def test_figure_without_pdf_is_skipped():
|
||||
tex = build(_report(), figures=[{"caption": "brak pliku"}, {"pdf": "fig1.pdf"}])
|
||||
assert tex.count("includegraphics") == 1 and "fig1.pdf" in tex
|
||||
|
||||
|
||||
# ─────────────────── Markdown → LaTeX (nie surowy copy-paste) ─────────────
|
||||
|
||||
from app.latex import markdown_to_latex as md
|
||||
|
||||
Reference in New Issue
Block a user