Devátý sraz
Datum: 2026-04-09
Lektor: Martin Zelený
Zápis: Dragča Kvasničková
Dnešní sraz proběhl po 14-ti dnech kvůli velikonočním prázdninám. Vrátili jsme se k PR Patricie, lokálně jsme sbuildili quiz-common a otestovali její úpravy, PR byl schválen a uzavřen. Prošli jsme si další PR od Patricie a Niny.
Simulace bugu
Zreprodukovali jsme bug způsobující nesprávné načítání číselných odpovědí. Tento bug je popsaný v Issue #2 Linux quiz YAML is not valid od Davida.
V jednom terminálu jsme si spustili quiz-server, v druhém quiz-admin a načetli kvíz linux_01, kde poslední otázka obsahuje číselné odpovědi. YAML parser to naparsuje na integer, což neodpovídá modelu. Model očekává string, ale místo toho dostal input value=21 (tedy integer), což vede k chybě.
Ale naše quiz_common knihovna byla spravená díky PR #2 od Patricie a my si ji jdeme lokálně otestovat.
Stažení opravené knihovny lokálně
Martin je v adresáři quiz-common, pomocí git branch -vva, zkontroloval, že má lokální větev napojenou na vzdálenou branch PR Patricie. Díky git pull stáhl lokálně změny ze vzdáleného repozitáře. Nakonec pomocí git log ověřil, že historie commitů odpovídá stavu větve na GitHub.
Otestování opravené knihovy lokálně
- jsme stále v adresáři
quiz-common, v branchi s opravenou knihovnou - sbuildeni knihovny:
uv build - vidíme, že v quiz_common přibyl adresář
dist, v něm jsou dva soubory- to jsou tzv. artefakty buildění, jeden z nich má příponu.whltedy wheel, kde je právě zabalená sbuilděná pythoní knihovna. - nyní musíme v adresáři
quiz-adminpřidat cestu ke této knihovně:uv add ../quiz-common/dist/quiz_common-0.1.0-py3-none-any.whl uvnapsalo, že byly nainstalovány 2 balíčky:quiz-commonaquiz-admin. Proč iquiz-admin? Protože se změnila jeho závislost, takuvho taky přebuildil. Odstranil původní verziquiz-common, která se původně brala z internetu a nahradil ji sbuilděnýmquiz-commonze souboru.- git status nám ukázal, že se změnily
pyproject.toml, kde je právě adresa kequiz_commonauv.lock- zde jsou přesně hashe všech závislostí - a to stejné musíme udělat i v adresáři
quiz-server, i tady musíme přidat cestu ke této knihovně:uv add ../quiz-common/dist/quiz_common-0.1.0-py3-none-any.whl - git status nám i zde ukáže změnu v
pyproject.tomlauv.lock. - teď si spustíme
kvíz linux_01a hurá, ono nám to funguje!!!. - PR byl schválen a zamergován a branch byla smazána na GitHub a musíme si uklidit i u sebe.
Lokální úklid:
- přepeneme se na main branch
git checkout main git fetch --prunevidíme, že branch PR byla na GitHub opravdu smazanágit branch -vvanám ukáže tuto branch u nás, a vidíme, že její předloha je pryč, takže teď ji můžeme smazat i u nás. Protože byl PR začleněn pomocísquash and mergea některé commity zmizely, git nám ji nepovolí smazat s přepínačem-d, ale musíme použítgit branch -D <název-větve>
Otestování knihovny naostro
- Knihovnu jsme si otestovali lokálně, PR zamergovali, uzavřeli a změny stáhli k sobě pomocí
git pull. Nášuv addpři lokálním testování zmodifikoval souborypyproject.tomlauv.locka my ty změny chceme dát pryč a to vquiz-admini vquiz-server -
To uděláme pomocí
git restore pyproject.toml uv.lock -
pomocí
uv syncse odstraní lokálně sbuilděnáquiz-commona přidá se závislost z internetu - je zde icommit hash, kterou si můžeme ověřit v adresářiquiz-commonpomocígit log
Nečekaná chyba
-
A tady jsme narazili na chybu,
uv syncodkazoval na starý commit vquiz-commonna GitHub. Při spuštění kvízulinux-01nám zase vyskočil bug s načítáním číselných odpovědí. Ale proč to tak je? -
pomocí
uv treevidíme strom zavislostí auv pip freezenám ukáže přesné verze zavislostí a tady je ten důvod, proč námuv syncodkazovalo na starý commitquiz-common. -
aby byla v
quiz-admini vquiz-serverzávislost na aktuální verziquiz-common, Martin musel v obou repozitářích zadatuv add <https://github.com/quiz-cli/quiz-common.git> -
opět se aktualizovali v obou repozitářích závislosti v souborech
pyproject.tomlauv.lock -
tyto aktualizované závislosti v repozitářích
quiz-adminaquiz-serverMartin commitnul a pushnul na GitHub, po zamergování si potom k sobě pullneme aktuální závislosti.
Fix: send validated quiz data through websocket instead of raw data
Patricie ještě udělala opravu v repozitáři quiz_admin, kterou řeší tento PR #6 – quiz-admin.V původní verzi se volala třída Quiz, předala se jí data naloadovaná z Yamlu a udělal se model, který se ale neuložil. Patricie jej uložila do proměnné validated_quiz, pomocí model_dump() jej poslala přes síť na server a díky tomu, že to prošlo modelem, se uplatnila validační funkce dělající z int str. I tento PR byl schválen a uzavřen.
Server should evaluate answers#9
- Toto issue řeší PR od Niny: PR #9 - quiz-server.
- zjistíme si branche pomocí
git fetch --prunegit branch -vva, abychom se na ni mohli přepnout a změny otestovat - přepli jsem se na branch:
git checkout nb_results - v terminálech jsme si spustili postupně :
quiz server,quiz-admina na němquiz_example.yaml,quiz-clientBob aquiz-clientAlice. -nasimulovali jsme si kvíz se správnými a špatnými odpověďmi, po ukončení kvízu se adminovi zobrazí vyhodnocené odpovědi klientů. Skvělé, funguje to! změny v kódu: - Nina definovala funci
correct_answer(), která u otázky a vytvoří string správných odpovědí - díky
app.state.correct_answer = correct_answer(question)si při každé otázce server uloží správné řešení, aby ho mohl porovnat s odpovědí hráče - upravila funkci
check_answer()ve tříděResults, kam se teď posílá správná odpověď. - vyhodnocení správné odpovědi:
correct = (set(answer.lower().strip()) == set(correct_answer))Odpověď se zbaví bílých znaků na koncích řetězce, převede na malá písmena a převede se na množinu, takže nezáleží na pořadí odpovědí a ignorují se duplicity - PR byl schválen
Důležitý návrh
- na srazu zazněl skvělý návrh, aby se odpověď vyhodnocovala už na straně klienta a ne až na serveru.
Poznámky:
-
pokud akceptujeme v našich PR na GitHub
suggestions, je nutné si potom k sobě změny stáhnout přesgit pull.Pokud bychom to neudělali a lokálně si mezi tím commitli další změnu, nastane konflikt. -
nebudeme dávat PR do tabulky projektu. Ikdyž se naváže PR na issue, v tabulce projektu se PR automaticky přidá. To můžeme vypnout v okně PR, v nastavení záložky
Projekts, oddělat zelenou šipečku , potom se PR v tabulce nezobrazí a zůstanou tam pouzeissues. Proto je důležité vždy PR nalinkovat k issue.