{"id":19092184,"url":"https://github.com/cvut/ghia","last_synced_at":"2026-03-10T19:32:24.591Z","repository":{"id":92206460,"uuid":"209604274","full_name":"cvut/ghia","owner":"cvut","description":"A task for the advanced Python class (MI-PYT)","archived":false,"fork":false,"pushed_at":"2019-12-30T17:18:26.000Z","size":197,"stargazers_count":4,"open_issues_count":0,"forks_count":4,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-04-30T12:17:29.889Z","etag":null,"topics":["click","flask","github-issues","github-webhook-handler","pytest","python-package","python3","requests","webhook-service"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cvut.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-09-19T16:48:30.000Z","updated_at":"2019-12-04T08:14:57.000Z","dependencies_parsed_at":"2023-04-07T08:04:54.263Z","dependency_job_id":null,"html_url":"https://github.com/cvut/ghia","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/cvut/ghia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvut%2Fghia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvut%2Fghia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvut%2Fghia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvut%2Fghia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cvut","download_url":"https://codeload.github.com/cvut/ghia/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cvut%2Fghia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30350076,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:55:29.454Z","status":"ssl_error","status_checked_at":"2026-03-10T15:54:58.440Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["click","flask","github-issues","github-webhook-handler","pytest","python-package","python3","requests","webhook-service"],"created_at":"2024-11-09T03:18:29.467Z","updated_at":"2026-03-10T19:32:24.571Z","avatar_url":"https://github.com/cvut.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"= GHIA VI.\n:toc:\n:note-caption: :information_source:\n:warning-caption: :warning:\n\n== Zadání úkolu 6\n\nVaším úkolem za 5 bodů je vytvořit asynchronní zpracování repozitářů,\nissues a jejich oštítkování v rámci aplikace `ghia` s použitím\nknihovny https://aiohttp.readthedocs.io/en/stable/[aiohttp].\n\n* Upravte CLI tak, aby bylo možné zadat libovolný počet repozitářů ke zpracování (pozor, že\n  musíte kontrolovat jejich správnost) pomocí argumentu ``reposlug``.\n* Do implementace CLI nástroje `ghia` doplňte přepínač ``-x``/``--async``, se kterým bude zpracování\n  repozitářů a issue probíhat v asynchronním režimu pomocí https://aiohttp.readthedocs.io/[aiohttp]:\n** Pokud je zadáno více repozitářů v argumentech, pak se zpracovávají asynchronně.\n** Získání seznamu issue z více stránek musí být asynchronní (čeká se synchronně jen\n   na první stránku pro zjištění počtu stránek).\n** Zpracování jednotlivých issue je asynchronní.\n* 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)\n  z různých repozitářů a že pořadí jednotlivých issue při asynchronním zpracování nehraje roli. Vypisujte\n  vždy zpracování jednoho issue najednou tak, aby název a odkaz na issue byl následován změnami daného issue\n  a nedošlo ke smíchání s jinými issue.\n* Popište tento nový režim v dokumentaci.\n* (nepovinně) Rozšiřte vlastní jednotkové testy o testování práce v asynchronním režimu.\n  Pozor ale, že betamax funguje pouze s knihovnou requests. Pro obecné mockování HTTP komunikace doporučujeme\n  vyzkoušet https://vcrpy.readthedocs.io/[vcrpy] (má trochu jiné API, ale principy zůstávají stejné).\n* Původní funkcionalita musí zůstat zachována. Možností by bylo samozřejmě napsat zcela odděleně\n  asynchronní logiku, ale znovupoužitím a případným upravením existujících částí kódu můžete\n  ušetřit relativně hodně času (například s využitím návrhových vzorů Strategy a/nebo Observer).\n\nimage::screenshots/screen_changes.png[Screenshot - changes]\n\nimage::screenshots/screen_fallback_label.png[Screenshot - fallback label]\n\nimage::screenshots/screen_error_repo.png[Screenshot - error repo]\n\nimage::screenshots/screen_error_issue.png[Screenshot - error issue]\n\n== Automatické testy\n\nNámi dodané testy z minulých úloh jsou stále závazné.\n\nNásleduje text z minula, který stále platí:\n\nWARNING: Testy **netestují splnění tohoto úkolu**,\nTestují pouze to, že se nic nerozbilo\na že funguje spuštění pomocí příkazů výše.\n\nNOTE: Před spuštěním testů předpokládejte, že je váš balíček nainstalován.\nToho můžete docílit například pomocí `python setup.py develop`\nnebo `pip install -e.`\n\nK úkolu na moduly jsou dodány extra testy ve složce `test_module`, které simulují reálnou instalaci\nvašeho balíčku `ghia` z naklonovaného repozitáře i z testovací PyPI. Navíc testují\ni další náležitosti požadované v tomto zadání (sdist bez warningů, submoduly, závislosti,\nklíčová slova a další metadata). Tyto testy vyžadují nastavené proměnné prostředí\n`CTU_USERNAME` a `GHIA_REPO` pro získání vaší verze ghia (pipem a gitem). V rámci\ntestů spouští subprocesy a pokud se na vašem OS jmenují jinak nebo jsou v jiné cestě, než\nstandardně na Linuxu, budete muset upravit soubor `fixtures/test_config.cfg`. V případě\npotřeby založte issue. Tyto testy nepracují s aktuálním kódem „kolem nich“, ale s tím, co\nje dostupné přes PyPI (publikováno) a GitHub (napushováno). Testy spustíte pomocí:\n\n[source,console]\n$ python -m pytest -v test_module\n\nK úloze existuje sada integračních/akceptačních testů (k úlohám na click+requests a flask).\nPro jejich spuštění nainstalujte do virtuálního prostředí balík `pytest`.\n\nTesty vyžadují určitý setup repozitáře v rámci organizace MI-PYT-ghia, do\nkteré budete pozváni po zaslání emailu s Vaším GitHub účtem některému ze\ncvičících. Pro jeho vytvoření použijte skript `setup.sh` z adresáře `tests_environment`.\nJe třeba nastavit proměnné prostředí `GITHUB_TOKEN` a `GITHUB_USER`.\nToken musí příslušet danému uživateli a mít scope `repo`.\nSkript je potřeba spouštět z adresáře `tests_environment`.\n\nSkript využívá program https://hub.github.com/[hub],\nkterý si *nejprve zprovozněte*. Potřebujete alepsoň verzi 2.8.3.\nSkript je otestován na Linux i\nWindows (pomocí https://gitforwindows.org[git bash]).\n\n[source,console]\n$ cd tests_environment\n$ export GITHUB_USER=anicka\n$ export GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n$ ./setup.sh\n\nTesty jsou napsané tak, že pokud váš program funguje dle zadání,\ndají se pouštět opakovaně. Pokud ale dle zadání nefunguje,\nje třeba smazat repozitář a vytvořit jej s issues znova pomocí\nskriptu `tests_environment/delete.sh` (potřeba scope `delete_repo`).\nVytváření repozitáře s issues může trvat jednotky minut. Pokud\nbude správně fungovat strategie `change`, pak poslední test v souboru\n`test_behavior.py` (se jménem `test_reset`) zajistí nastavení na\núvodní a nebude již potřeba mazat repozitář a vytvářet jej znova.\n\nPro spuštění testů nastavte stejné proměnné prostředí (`GITHUB_TOKEN`\na `GITHUB_USER`).\n\n[source,console]\n$ export GITHUB_USER=anicka\n$ export GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n$ python -m pytest -v tests\n\nTesty si můžete zkopírovat k sobě do repozitáře, považujte je za Public Domain.\nNepřidejte ale do repozitáře omylem soubor `auth.real.cfg`,\nkterý se v průběhu testů dočasně vytváří a obsahuje váš token.\n\nNOTE: Testy proti živému API, navíc napsané tak,\nže se jednotlivé testy navzájem ovlivňují, jsou ukázkou toho,\njak se to nemá dělat.\nPokud narazíte v testech na problém, nebo nevíte jak dál, zeptejte se.\nK tomu, jak se to dělá pořádně, se v předmětu dostaneme později.\n\nWARNING: Testy netestují barevnost výstupu. I neobarvený výstup projde testy.\nBarevnost kontrolujte očima. Implementace, která projde testy, **není** automaticky\nhodnocena plným počtem bodů.\n\n== Odevzdání úkolu\n\nÚkol odevzdáváte tradičně s tagem `v0.6` a nahráním nové verze na testovací\nPyPI. Použijte verzi 0.6 (případně 0.6.x v souladu s tagem).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcvut%2Fghia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcvut%2Fghia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcvut%2Fghia/lists"}