"""Cele două scheme din summaries/06_MODUL_5/07_workshop_6_abundenta.md.
Workshop de psihologie: nu există preț, deci nu există candele. Schemele sunt
structuri — lanțul a fi / a face / a avea, și schema logică a unei strategii,
cea pe care autorul spune că o desenează cu romb de pe vremea Turbo Pascal.
Se generează de aici ca să existe un singur loc unde se schimbă o etichetă și
ca să treacă prin assert-urile de lățime — nu se editează SVG-ul din .md.
Rulează: .venv/bin/python gen/workshop_6_abundenta.py
"""
import re
from pathlib import Path
MD = Path("/workspace/atm-curs-dl/summaries/06_MODUL_5/07_workshop_6_abundenta.md")
GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
INK, MUTED, LINE, FILL = "#333", "#666", "#9bb0c7", "#f7f9fb"
CHAR_W = 5.7 # px/caracter la 12px sans-serif, calibrat ca în audit_diagrams.py
svgs = {}
def fits(txt: str, box_w: float, fs: float = 12.0) -> str:
"""Text care intră în lățimea dată la font-size-ul dat, altfel assert."""
w = len(txt) * CHAR_W * fs / 12.0
assert w <= box_w, f"text de {w:.0f}px în {box_w:.0f}px: {txt!r}"
return txt
# --------------------------------------------------- 1. a fi -> a face -> a avea
# (eticheta, ce e, cele două rânduri de detaliu din transcriere)
VERBE = [
("a FI", "abilitățile + starea emoțională",
["„20% strategie, 80% psihologie — puse", "la pachet ca să obții 100%”"]),
("a FACE", "procesul: execuția strategiei",
["„acțiunea sau procesul care", "înseamnă creștere și dezvoltare\u201d"]),
("a AVEA", "rezultatul: banii",
["„a avea ce este? rezultatul, frate —", "rezultatul e consecința procesului”"]),
]
BOX_W, BOX_H, GAP_X, X0, Y0 = 200, 104, 32, 18, 44
def a_fi_a_face_a_avea() -> str:
w = X0 * 2 + 3 * BOX_W + 2 * GAP_X
p = [f'']
return "\n ".join(p)
# ------------------------------------------------ 2. schema logică a strategiei
# (eticheta nodului, tipul) — tipul contează pentru assert-uri
NODURI = [
("A — condiția de intrare din strategie", "start"),
("s-a format A, exact ca în reguli?", "romb"),
("B — intri, cu stopul pus în același ordin", "pas"),
("prețul face D: se duce la stop?", "romb"),
("E — stopul te scoate: pierdere planificată", "iesire-plan"),
("C — duci poziția la ieșirea din plan", "iesire-bun"),
("nu faci nimic, aștepți următoarea alertă", "iesire-bun"),
]
def schema_logica() -> str:
w, h = 700, 382
p = [f'']
return "\n ".join(p)
svgs["a_fi_a_face_a_avea"] = a_fi_a_face_a_avea()
svgs["schema_logica"] = schema_logica()
# ------------------------------------------------------------------- assert-uri
# 1. textul vorbește despre trei verbe, în ordinea a fi -> a face -> a avea
assert [v[0] for v in VERBE] == ["a FI", "a FACE", "a AVEA"], "ordinea verbelor"
# 2. scurtcircuitul roșu sare exact două casete (de la prima direct la a treia)
assert len(VERBE) == 3, "scurtcircuitul e desenat ca sărind peste exact 2 casete"
# 3. schema logică: exact două rombi (autorul descrie o ramificație de intrare și
# una de ieșire) și exact o singură ieșire etichetată ca pierdere
assert sum(1 for _, t in NODURI if t == "romb") == 2, "textul spune două ramificații"
assert sum(1 for _, t in NODURI if t == "iesire-plan") == 1, \
"legenda spune «o singură pierdere»"
# 4. legenda spune „trei capete de drum" — exact nodurile din care nu mai pleacă
# nicio săgeată (E, C, aștepți)
assert sum(1 for _, t in NODURI if t.startswith("iesire")) == 3, \
"legenda spune trei capete de drum"
# 5. literele din schemă sunt exact cele rostite în transcriere
litere = {s[0] for s, _ in NODURI if s[0].isupper() and s[1] == " "}
assert litere == {"A", "B", "C", "E"}, f"litere desenate: {litere}"
# 6. niciun SVG nu are linie goală (python-markdown ar rupe blocul)
for name, svg in svgs.items():
assert "\n\n" not in svg, f"linie goală în {name}"
assert svg.count("