datoria tehnica: garda pe dash, si PChart intr-un singur loc
Garda: `Level(p, text, color, "left")` punea tacut "left" in `dash` in loc de `label_at`, iar SVG-ul iesea fara linie punctata si fara nicio eroare - trei agenti au pierdut timp pe asta pe 13.09. Acum `__post_init__` crapa cu mesaj care spune ce argument voiai. Verificat pe cazurile valide si pe cele doua gresite. PChart: era copiat in cinci generatoare, iar copiile divergisera - toate cinci aveau hash-uri diferite si patru pastrau `spread()` cel vechi. Nucleul comun trece in gen/pchart.py; 385 de linii sterse, 11 adaugate. az_executie.py isi pastreaza PChart-ul: varianta lui calculeaza mediile dintr-un istoric dinainte de bara 0 si si le deseneaza singura. Unirea celor doua comportamente ca sa scap de un fisier ar fi riscat cele 10 diagrame de acolo, pentru zero castig. Ia doar `spread` reparat. Reparatia schimba 4 documente, deci PROGRESS gresea cand spunea ca nicio diagrama comisa nu sufera de bug: 08 si 10 se misca cu 0,2 px, dar 07 si 09 aveau etichete la 6 px de linia lor. Verificat cu ochii pe 3 diagrame randate - etichetele stau acum pe linia lor, cu liniuta de legatura unde a trebuit mutata. audit_diagrams: 0 probleme. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
This commit is contained in:
@@ -22,9 +22,25 @@ Două stiluri de desen:
|
||||
candelă se suprapun.
|
||||
"""
|
||||
|
||||
import re
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
def _check_dash(dash: str, cls: str) -> None:
|
||||
"""`dash` e un stroke-dasharray SVG ("4 3", "" etc.), nu o pozitie.
|
||||
|
||||
Garda exista pentru ca `Level(p, text, color, "left")` pune tacut "left"
|
||||
in `dash` in loc de `label_at`, iar SVG-ul iese fara linie punctata si
|
||||
fara nicio eroare. Trei agenti au pierdut timp pe asta pe 13.09.2026.
|
||||
"""
|
||||
if dash and not re.fullmatch(r"[\d.,\s]+", dash):
|
||||
raise ValueError(
|
||||
f"{cls}.dash={dash!r} nu e un stroke-dasharray. "
|
||||
f"Daca voiai pozitia etichetei, argumentul se cheama label_at "
|
||||
f"si se da pe nume: {cls}(..., label_at={dash!r})."
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Candle:
|
||||
o: float
|
||||
@@ -45,6 +61,11 @@ class Level:
|
||||
dash: str = "4 3"
|
||||
label_at: str = "right" # "right" | "left" — unde stă eticheta
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
_check_dash(self.dash, "Level")
|
||||
if self.label_at not in ("right", "left"):
|
||||
raise ValueError(f"Level.label_at={self.label_at!r}, astept 'right' sau 'left'")
|
||||
|
||||
|
||||
@dataclass
|
||||
class Mark:
|
||||
@@ -64,6 +85,9 @@ class MA:
|
||||
dash: str = ""
|
||||
text: str = ""
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
_check_dash(self.dash, "MA")
|
||||
|
||||
|
||||
@dataclass
|
||||
class Chart:
|
||||
|
||||
Reference in New Issue
Block a user