···
#! /usr/bin/env nix-shell
#! nix-shell -i "python3 -I" -p "python3.withPackages(p: with p; [ aiohttp rich structlog ])"
+
from argparse import ArgumentParser, Namespace
from collections import defaultdict
+
from collections.abc import Mapping, Sequence
from http import HTTPStatus
+
from typing import Optional
import asyncio, json, logging
import aiohttp, structlog
···
+
async def check(session: aiohttp.ClientSession, manpage: str, url: str) -> HTTPStatus:
with log_context(manpage=manpage, url=url):
async with session.head(url) as resp:
···
+
async def main(urls_path: Path) -> Mapping[HTTPStatus, int]:
logger.info(f"Parsing {urls_path}")
with urls_path.open() as urls_file:
urls = json.load(urls_file)
+
count: defaultdict[HTTPStatus, int] = defaultdict(lambda: 0)
logger.info(f"Checking URLs from {urls_path}")
async with aiohttp.ClientSession() as session:
···
+
def parse_args(args: Optional[Sequence[str]] = None) -> Namespace:
prog = 'check-manpage-urls',
description = 'Check the validity of the manpage URLs linked in the nixpkgs manual',