Rosetta Code/Find unimplemented tasks: Difference between revisions
Content deleted Content added
Thundergnat (talk | contribs) m →{{header|Ring}}: Remove vanity tags |
→{{header|Python}}: Added solutions using mwclient and Requests |
||
Line 1,423: | Line 1,423: | ||
== {{header|Python}} == |
== {{header|Python}} == |
||
===mwclient=== |
|||
Using XML. |
|||
<lang python>""" |
|||
Given the name of a language on Rosetta Code, |
|||
finds all tasks which are not implemented in that language. |
|||
""" |
|||
from operator import attrgetter |
|||
from typing import Iterator |
|||
import mwclient |
|||
URL = 'www.rosettacode.org' |
|||
API_PATH = '/mw/' |
|||
def unimplemented_tasks(language: str, |
|||
*, |
|||
url: str, |
|||
api_path: str) -> Iterator[str]: |
|||
"""Yields all unimplemented tasks for a specified language""" |
|||
site = mwclient.Site(url, path=api_path) |
|||
all_tasks = site.categories['Programming Tasks'] |
|||
language_tasks = site.categories[language] |
|||
name = attrgetter('name') |
|||
all_tasks_names = map(name, all_tasks) |
|||
language_tasks_names = set(map(name, language_tasks)) |
|||
for task in all_tasks_names: |
|||
if task not in language_tasks_names: |
|||
yield task |
|||
if __name__ == '__main__': |
|||
tasks = unimplemented_tasks('Python', url=URL, api_path=API_PATH) |
|||
print(*tasks, sep='\n') |
|||
</lang> |
|||
===Requests=== |
|||
<lang python>""" |
|||
Given the name of a language on Rosetta Code, |
|||
finds all tasks which are not implemented in that language. |
|||
""" |
|||
from functools import partial |
|||
from operator import itemgetter |
|||
from typing import (Dict, |
|||
Iterator, |
|||
Union) |
|||
import requests |
|||
URL = 'http://www.rosettacode.org/mw/api.php' |
|||
REQUEST_PARAMETERS = dict(action='query', |
|||
list='categorymembers', |
|||
cmlimit=500, |
|||
rawcontinue=True, |
|||
format='json') |
|||
def unimplemented_tasks(language: str, |
|||
*, |
|||
url: str, |
|||
request_params: Dict[str, Union[str, int, bool]] |
|||
) -> Iterator[str]: |
|||
"""Yields all unimplemented tasks for a specified language""" |
|||
with requests.Session() as session: |
|||
tasks = partial(tasks_titles, |
|||
session=session, |
|||
url=url, |
|||
**request_params) |
|||
all_tasks = tasks(cmtitle='Category:Programming_Tasks') |
|||
language_tasks = set(tasks(cmtitle=f'Category:{language}')) |
|||
for task in all_tasks: |
|||
if task not in language_tasks: |
|||
yield 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 = unimplemented_tasks('Python', |
|||
url=URL, |
|||
request_params=REQUEST_PARAMETERS) |
|||
print(*tasks, sep='\n') |
|||
</lang> |
|||
===urllib=== |
|||
<lang python>import xml.dom.minidom |
<lang python>import xml.dom.minidom |