RosettaCodeData/bin/rcd-api-langs
2023-06-30 11:21:59 -04:00

63 lines
1.4 KiB
Python
Executable file

#!/usr/bin/env python3
"""
from: https://codereview.stackexchange.com/q/213026
"""
from functools import partial
from operator import itemgetter
from typing import (
Dict,
Iterator,
Union)
import requests
URL = 'http://www.rosettacode.org/w/api.php'
REQUEST_PARAMETERS = dict(
action='query',
list='categorymembers',
cmlimit=1000,
cmsort='timestamp',
rawcontinue=True,
format='json')
def all_langs(
*,
url: str,
request_params: Dict[str, Union[str, int, bool]]
) -> Iterator[str]:
with requests.Session() as session:
langs = partial(
langs_titles,
session=session,
url=url,
**request_params)
all_langs = langs(cmtitle='Category:Programming_Languages')
for lang in all_langs:
print(lang)
def langs_titles(
*,
session: requests.Session,
url: str,
**params: Union[str, int, bool]) -> Iterator[str]:
"""Yields langs names for a specified category"""
while True:
request = session.get(url, params=params)
data = request.json()
yield from map(itemgetter('title'), data['query']['categorymembers'])
query_continue = data.get('query-continue')
if query_continue is None:
return
params.update(query_continue['categorymembers'])
if __name__ == '__main__':
langs = all_langs(
url=URL,
request_params=REQUEST_PARAMETERS)