An open API service indexing awesome lists of open source software.

https://github.com/cvut/ghia

A task for the advanced Python class (MI-PYT)
https://github.com/cvut/ghia

click flask github-issues github-webhook-handler pytest python-package python3 requests webhook-service

Last synced: 17 days ago
JSON representation

A task for the advanced Python class (MI-PYT)

Awesome Lists containing this project

README

          

= GHIA VI.
:toc:
:note-caption: :information_source:
:warning-caption: :warning:

== Zadání úkolu 6

Vaším úkolem za 5 bodů je vytvořit asynchronní zpracování repozitářů,
issues a jejich oštítkování v rámci aplikace `ghia` s použitím
knihovny https://aiohttp.readthedocs.io/en/stable/[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 `ghia` doplňte přepínač ``-x``/``--async``, se kterým bude zpracování
repozitářů a issue probíhat v asynchronním režimu pomocí https://aiohttp.readthedocs.io/[aiohttp]:
** Pokud je zadáno více repozitářů v argumentech, pak se zpracovávají asynchronně.
** Získání seznamu issue 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 issue je asynchronní.
* Výstup je obdobný tomu z první úlohy s tím (viz níže), že se v něm mohou objevovat issue (případně chyby)
z různých repozitářů a že pořadí jednotlivých issue při asynchronním zpracování nehraje roli. Vypisujte
vždy zpracování jednoho issue najednou tak, aby název a odkaz na issue byl následován změnami daného issue
a nedošlo ke smíchání s jinými issue.
* 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 https://vcrpy.readthedocs.io/[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).

image::screenshots/screen_changes.png[Screenshot - changes]

image::screenshots/screen_fallback_label.png[Screenshot - fallback label]

image::screenshots/screen_error_repo.png[Screenshot - error repo]

image::screenshots/screen_error_issue.png[Screenshot - error issue]

== Automatické testy

Námi dodané testy z minulých úloh jsou stále závazné.

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

WARNING: Testy **netestují splnění tohoto úkolu**,
Testují pouze to, že se nic nerozbilo
a že funguje spuštění pomocí příkazů výše.

NOTE: Před spuštěním testů předpokládejte, že je váš balíček nainstalován.
Toho můžete docílit například pomocí `python setup.py develop`
nebo `pip install -e.`

K úkolu na moduly jsou dodány extra testy ve složce `test_module`, které simulují reálnou instalaci
vašeho balíčku `ghia` z naklonovaného repozitáře i z testovací PyPI. Navíc testují
i další náležitosti požadované v tomto zadání (sdist bez warningů, submoduly, závislosti,
klíčová slova a další metadata). Tyto testy vyžadují nastavené proměnné prostředí
`CTU_USERNAME` a `GHIA_REPO` pro získání vaší verze ghia (pipem a gitem). V rámci
testů spouští subprocesy a pokud se na vašem OS jmenují jinak nebo jsou v jiné cestě, než
standardně na Linuxu, budete muset upravit soubor `fixtures/test_config.cfg`. V případě
potřeby založte issue. Tyto testy nepracují s aktuálním kódem „kolem nich“, ale s tím, co
je dostupné přes PyPI (publikováno) a GitHub (napushováno). Testy spustíte pomocí:

[source,console]
$ python -m pytest -v test_module

K úloze existuje sada integračních/akceptačních testů (k úlohám na click+requests a flask).
Pro jejich spuštění nainstalujte do virtuálního prostředí balík `pytest`.

Testy vyžadují určitý setup repozitáře v rámci organizace MI-PYT-ghia, do
které budete pozváni po zaslání emailu s Vaším GitHub účtem některému ze
cvičících. Pro jeho vytvoření použijte skript `setup.sh` z adresáře `tests_environment`.
Je třeba nastavit proměnné prostředí `GITHUB_TOKEN` a `GITHUB_USER`.
Token musí příslušet danému uživateli a mít scope `repo`.
Skript je potřeba spouštět z adresáře `tests_environment`.

Skript využívá program https://hub.github.com/[hub],
který si *nejprve zprovozněte*. Potřebujete alepsoň verzi 2.8.3.
Skript je otestován na Linux i
Windows (pomocí https://gitforwindows.org[git bash]).

[source,console]
$ cd tests_environment
$ export GITHUB_USER=anicka
$ export GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ ./setup.sh

Testy jsou napsané tak, že pokud váš program funguje dle zadání,
dají se pouštět opakovaně. Pokud ale dle zadání nefunguje,
je třeba smazat repozitář a vytvořit jej s issues znova pomocí
skriptu `tests_environment/delete.sh` (potřeba scope `delete_repo`).
Vytváření repozitáře s issues může trvat jednotky minut. Pokud
bude správně fungovat strategie `change`, pak poslední test v souboru
`test_behavior.py` (se jménem `test_reset`) zajistí nastavení na
úvodní a nebude již potřeba mazat repozitář a vytvářet jej znova.

Pro spuštění testů nastavte stejné proměnné prostředí (`GITHUB_TOKEN`
a `GITHUB_USER`).

[source,console]
$ export GITHUB_USER=anicka
$ export GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ python -m pytest -v tests

Testy si můžete zkopírovat k sobě do repozitáře, považujte je za Public Domain.
Nepřidejte ale do repozitáře omylem soubor `auth.real.cfg`,
který se v průběhu testů dočasně vytváří a obsahuje váš token.

NOTE: Testy proti živému API, navíc napsané tak,
že se jednotlivé testy navzájem ovlivňují, 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.

WARNING: Testy netestují barevnost výstupu. I neobarvený výstup projde testy.
Barevnost kontrolujte očima. Implementace, která projde testy, **není** automaticky
hodnocena plným počtem 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).