Skip to content

cvut/committee

Repository files navigation

Committee VI.

Zadání úkolu 6

Vaším úkolem za 5 bodů je vytvořit asynchronní zpracování repozitářů, commitů a příslušného nastavení commit statusů v rámci aplikace committee s použitím knihovny aiohttp.

  • Upravte CLI tak, aby bylo možné zadat libovolný počet repozitářů ke zpracování (pozor, že musíte kontrolovat jejich správnost) pomocí argumentu reposlug.

  • Do implementace CLI nástroje committee doplňte přepínač --async/--no-async (výchozí je ne-asynchronní), se kterým bude zpracování repozitářů a issue probíhat v asynchronním režimu pomocí aiohttp:

    • Pokud je zadáno více repozitářů v argumentech, pak se zpracovávají asynchronně.

    • Získání seznamu commitů z více stránek musí být asynchronní (čeká se synchronně jen na první stránku pro zjištění počtu stránek).

    • Zpracování jednotlivých commitů je asynchronní.

  • Výstup je obdobný tomu z první úlohy s tím, že se v něm mohou objevovat commity (případně chyby) z různých repozitářů a že pořadí jednotlivých commitů při asynchronním zpracování nehraje roli.

    • Před SHA commitu přidejte reposlug repozitáře (viz aktualizované testy).

    • Pro synchronní verzi jsou repozitáře zpracovány v pořadí tak, jak je zadal uživatel.

    • Jinak je očekávaný výstup totožný včetně použití barev a různých módů.

  • Popište tento nový režim v dokumentaci.

  • (nepovinně) Rozšiřte vlastní jednotkové testy o testování práce v asynchronním režimu. Pozor ale, že betamax funguje pouze s knihovnou requests. Pro obecné mockování HTTP komunikace doporučujeme vyzkoušet vcrpy (má trochu jiné API, ale principy zůstávají stejné).

  • Původní funkcionalita musí zůstat zachována. Možností by bylo samozřejmě napsat zcela odděleně asynchronní logiku, ale znovupoužitím a případným upravením existujících částí kódu můžete ušetřit relativně hodně času (například s využitím návrhových vzorů Strategy a/nebo Observer).

Automatické testy

Námi dodané testy z minulých úloh jsou stále závazné. Byly upraveny tak, aby správně testovaly nové výstupy, zpracování více repozitářů a možnost přepínače --async. Testy ale nestestují, že jsou repozitáře, stránky commitů a jednotlivé commity skutečně zpracovávány asynchronně.

Následuje text z minula, který stále platí:

K úloze existuje sada testů. Pro jejich spuštění nainstalujte do virtuálního prostředí balík pytest.

Testy vyžadují určitý setup repozitářů. Pro jeho vytvoření použijte skript test_environment/setup.sh. Je třeba nastavit proměnné prostředí GH_TOKEN a GH_USER. Token musí příslušet danému uživateli a mít scope repo.

Skript využívá program hub, který si nejprve zprovozněte.

Skript vytvoří na GitHubu 3 repozitáře:

  • committee-basic

  • committee-rules

  • committee-radioactive

Pokud by vám to vadilo, použijte testovací účet k tomuto určený.

Commit status nelze na GitHub smazat, tudíž jedinou možností, jak vyčistit případný nepořádek je repozitáře smazat pomocí skriptu test_environment/delete.sh (potřeba scope delete_repo) a vytvořit znovu. Nicméně jsou testy napsané tak, že když jsou správně implementovány přepínače --dry-run a --force, tak lze pouštět testy opakovaně bez nutnosti čistění repozitářů.

Pro spuštění testů si do virtuálního prostředí si nainstalujte pytest, nastavte stejné proměnné prostředí (GH_TOKEN a GH_USER) a spusťte pytest:

(__venv__) $ python -m pip install pytest
(__venv__) $ export GH_USER=anicka
(__venv__) $ export GH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(__venv__) $ python -m pytest -v tests

Testy v souboru test_radioactive_waste.py trvají dlouho a mají potenciál vyřadit vás na hodinu z přístupu ke GitHub API. Když ladíte ostatní testy, doporučujeme je vypínat pomocí přepínače -k:

$ python -m pytest -v -k "not radioactive" test

Testy si můžete zkopírovat k sobě do repozitáře, považujte je za Public Domain. Nepřidávejte ale do repozitáře nikdy konfigurační soubory z tests/fixtures/config, které se v průběhu testů vytváří a obsahují váš token.

Součástí výstupu selhaných testů je i kompletní způsob volání.

ℹ️
Testy proti živému API a závisí tak na daném stavu repozitáře, jsou ukázkou toho, jak se to nemá dělat. Pokud narazíte v testech na problém, nebo nevíte jak dál, zeptejte se. K tomu, jak se to dělá pořádně, se v předmětu dostaneme později.
⚠️
Testy netestují barevnost výstupu. I neobarvený výstup projde testy. Barevnost kontrolujte očima.
⚠️
Splnění testů není nutnou ale pouze postačující podmínkou pro plný počet bodů. Na druhou stranu lze odevzdat i úlohu, která neprojde všemi testy pro získání alespoň adekvátní části bodů.

Odevzdání úkolu

Úkol odevzdáváte tradičně s tagem v0.6 a nahráním nové verze na testovací PyPI. Použijte verzi 0.6 (případně 0.6.x v souladu s tagem).