RosettaCodeData/bin/rcd-api-tasks

64 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_tasks(
*,
url: str,
request_params: Dict[str, Union[str, int, bool]]
) -> Iterator[str]:
with requests.Session() as session:
tasks = partial(
tasks_titles,
session=session,
url=url,
**request_params)
all_tasks = tasks(cmtitle='Category:Programming_Tasks')
for task in all_tasks:
print(task)
def tasks_titles(
*,
session: requests.Session,
url: str,
**params: Union[str, int, bool]) -> Iterator[str]:
"""Yields tasks 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__':
tasks = all_tasks(
url=URL,
request_params=REQUEST_PARAMETERS)