Výukové materiály: naucse.python.cz, GitHub.
Vaším úkolem za 5 bodů je implementovat funkci gather_acquaintances
, která pomocí asynchronní komunikace s GitHub API (včetně GitHub Search API) ze všech* issues podle zadané specifikace zjistí všechny uživatele, kteří tyto issue komentovali, a to včetně počtu komentářů. Tato funkce nebude mít asynchronní API (tedy nebude async def
, ale jen def
).
💡 Toto je jen pro zjednodušení úkolu a jeho opravování; obecně není dobré kombinovat logiku a ovládání smyčky událostí do jedné funkce.
*) GitHub Search API má limit na 1000 výsledků
Funkce asya.logic.gather_acquaintances
(v projektu MarekSuchanek/asya):
- parametr
search_specs
= slovník obsahující specifikaci vyhledávání issues pro GitHub Search API (možné rovnou používat pro požadavky) - parametr
supervisor
= objekt, na kterém vaše implementace volá příslušné metody v daných částech kódu (tříduAsyaSupervisor
není možné měnit, ale lze "registrovat" vlastní funkce, které se budou volat, není to však vyžadováno - viz dokumentace třídy; zda voláte metody správně, zjistíte například chováním CLI s progressbarem):supervisor.report_issues_search_page(page, number)
- volat před zpracováním dané stránky výsledků hledání issues,page
=dict
s tělem odpovědi,number
= číslo stránkysupervisor.report_issue(issue)
- volat po zpracování daného issue,issue
=dict
s daty issuesupervisor.report_comment(comment)
- volat po zpracování daného komentáře,comment
=dict
s daty komentářesupervisor.report_skip(headers)
- volat v případě přeskočení chyby 404 (dle nastavenískip_404
viz níže),headers
= hlavičky odpovědi způsobující chybusupervisor.report_wait(active, headers)
- volat v případě zahájení/ukončení čekání (dle nastaveníwait_rate_limit
viz níže),active
= flag zahájení (True
) a ukočení (False
),headers
= hlavičky odpovědi způsobující čekání
- vrací slovník, kde klíčem je uživatelské jméno a hodnotou příslušný počet komentářů
>>> gather_acquaintances({'q': 'author:MarekSuchanek'}, supervisor)
{'MarekSuchanek': 7, 'hroncok': 15, 'encukou': 10}
Další požadavky:
- Použijte
asyncio
aaiohttp
pro asynchronní požadavky na GitHub API. - Pro stránkování použijte velikost stránky (parametr
per_page
) nastavenou na objektusupervisor
(pomocísupervisor.per_page
) a to jak pro výsledky issues, tak i komentáře. - Použijte personal access token pro autorizaci požadavků ze
supervisor.token
, je-li nastavený. Token ovlivňuje výsledky a API Rate Limit. - GitHub API endpoint nepište "natvrdo", ale využijte
supervisor.api_endpoint
. - Chybu způsobenou vyčerpáním API Rate Limit řešte podle nastavení příslušného flagu
wait_rate_limit
(pokudTrue
, pak se čeká do vypršení limitu, jinak se vyhodí příslušná vyjímkaAsyaException
). - Chyby způsobené nepřístupností issue/komentářů (404) přeskočte podle nastavení příslušného flagu
skip_404
(pokudTrue
, pak se přeskakuje, jinak se vyhodí příslušná vyjímkaAsyaException
). - V ostatních případech chyby v rámci komunikace se rovněž vyhodí vyjímka
AsyaException
.
Vytvořte nový privátní repozitář s obsahem z MarekSuchanek/asya (release v0.0
), dejte nám cvičícím přístup a pro odevzdání vytvořte tag v0.1
. Úpravy mimo modul asya.logic
(soubor asya/logic.py
) budou ignorovány, ale je vhodné se podívat na dokumentaci a zdrojový kód ostatních modulů.
Za bonusový bod implementujte také klasické synchronní řešení s knihovnou requests
a porovnejte rychlost obou řešení s různými dotazy (a počty výsledků). Použijte stejný formát funkce gather_acquaintances
, pracujte třeba v jiné větvi a řešení otagujte v0.1-alt
.