|
|
|
"""WHO Global Health Observatory (GHO) async helper. |
|
|
|
Key features |
|
------------ |
|
* **Essential medicines list** – `list_essential_medicines()` |
|
* **COVID‑19 country stats** – `fetch_covid_timeseries(iso_code)` |
|
* Built on `httpx.AsyncClient`, 20‑second timeout, no API‑key required. |
|
* Caches responses for 24 h in memory to spare quota. |
|
|
|
GHO OData API docs: https://www.who.int/data/gho/info/gho-odata-api |
|
""" |
|
from __future__ import annotations |
|
|
|
import httpx, asyncio, datetime |
|
from functools import lru_cache |
|
from typing import List, Dict |
|
|
|
BASE = "https://ghoapi.azureedge.net/api" |
|
|
|
|
|
|
|
|
|
|
|
|
|
@lru_cache(maxsize=1) |
|
async def list_essential_medicines() -> List[Dict]: |
|
"""Return current WHO Model List of Essential Medicines (EML).""" |
|
url = f"{BASE}/EML" |
|
async with httpx.AsyncClient(timeout=20) as client: |
|
resp = await client.get(url) |
|
resp.raise_for_status() |
|
return resp.json().get("value", []) |
|
|
|
|
|
|
|
|
|
|
|
|
|
COVID_DATASET = "COVID19CasesByCountries" |
|
|
|
@lru_cache(maxsize=128) |
|
async def fetch_covid_timeseries(iso_code: str) -> List[Dict]: |
|
"""Return daily cases & deaths for given 3‑letter ISO code (e.g. 'USA').""" |
|
url = f"{BASE}/{COVID_DATASET}?$filter=Code%20eq%20'{iso_code.upper()}'" |
|
async with httpx.AsyncClient(timeout=20) as client: |
|
resp = await client.get(url) |
|
resp.raise_for_status() |
|
return resp.json().get("value", []) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
async def _demo(): |
|
meds = await list_essential_medicines() |
|
print(f"Essential medicines fetched: {len(meds):,}") |
|
covid = await fetch_covid_timeseries("NGA") |
|
print(f"Nigeria COVID rows: {len(covid):,}") |
|
asyncio.run(_demo()) |
|
|