Data update

This commit is contained in:
Ingy döt Net 2024-10-16 18:07:41 -07:00
parent 81fd053722
commit 52a6ef48dd
10248 changed files with 63654 additions and 6775 deletions

View file

@ -0,0 +1,103 @@
#include "windows.bi"
#include "file.bi"
Dim As Any Ptr urlmon = Dylibload("URLMON.DLL")
If urlmon = 0 Then
Print "DLL not available in your OS"
End 100
End If
Dim Shared As Function(Byval As Any Ptr, Byval As ZString Ptr, Byval As ZString Ptr, Byval As Any Ptr, Byval As Any Ptr) As Integer UDTF
UDTF = Dylibsymbol(urlmon, "URLDownloadToFileA")
Const As String Q = Chr(34) ' The quote
Dim Shared As Integer BlkSize = 256 * 1024 ' 256k must be enough
Dim Shared As Ubyte Ptr Blk
Blk = Allocate(BlkSize)
Dim Shared As Integer Tasks
Dim Shared As String TaskK()
Function Value(Byref p As Ubyte Ptr, nombre As String) As String
Dim As String nameStr = Q & nombre & Q & ":"
Dim As Integer s = Instr(*Cast(ZString Ptr, p), nameStr)
If s = 0 Then Return ""
p += s + Len(nameStr)
Return Left(*Cast(ZString Ptr, p), Instr(*Cast(ZString Ptr, p), Q) - 1)
End Function
Sub FetchData(category As String)
Dim As String tempfile = Curdir & "/result.json"
Dim As String url
Dim As Integer e, f
Dim As String continuar = ""
Dim As Ubyte Ptr mem = Blk
Do
url = "http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:" & category & "&cmlimit=500&format=json&cmcontinue=" & continuar
e = UDTF(0, url, tempfile, 0, 0)
If e Then
Print "Can't get data from Rosetta API"
End 100
End If
f = Filelen(tempfile)
If mem - Blk + f > BlkSize Then
Print "Insufficient memory to load data"
End 100
End If
Dim As Integer ff = Freefile
Open tempfile For Binary As #ff
Get #ff, , *mem, f
Close #ff
mem[f] = 0
continuar = Value(mem, "cmcontinue")
mem += f
Loop Until continuar = ""
End Sub
Sub ShowUnimplemented(language As String)
Dim As Integer i, j, n
Dim As Ubyte Ptr mem
FetchData(language)
mem = Blk
Print !"\nUnimplemented tasks for the '" & language & "' programming language:"
For i = 0 To Tasks - 1
j = Instr(*Cast(ZString Ptr, mem), TaskK(i))
If j Then
mem += j
Else
n += 1
Print " -" & TaskK(i)
End If
Next
Print "Total is: " & n
End Sub
FetchData("Programming_Tasks")
Tasks = 0
Dim As Ubyte Ptr p = Blk
Dim As Integer i
Do
i = Instr(*Cast(ZString Ptr, p), "title")
If i Then
Tasks += 1
p += i
End If
Loop Until i = 0
Redim TaskK(Tasks - 1)
p = Blk
For i = 0 To Tasks - 1
TaskK(i) = Value(p, "title")
Next
ShowUnimplemented("FreeBASIC")
ShowUnimplemented("C++")
Sleep

View file

@ -1,21 +0,0 @@
ClearAll[ImportAll]
ImportAll[lang_String] :=
Module[{data, continue, cmcontinue, extra, xml, next},
data = {};
continue = True;
cmcontinue = "";
While[continue,
extra = If[cmcontinue =!= "", "&cmcontinue=" <> cmcontinue, ""];
xml = Import["http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:" <> lang <> "&cmlimit=500&format=xml" <> extra, "XML"];
AppendTo[data, Cases[xml, XMLElement["cm", _, {}], \[Infinity]]];
next = Flatten[Cases[xml, {"cmcontinue" -> _}, \[Infinity]]];
If[Length[next] > 0,
next = First[next];
cmcontinue = "cmcontinue" /. next;
,
continue = False;
];
];
Cases[Flatten[data], HoldPattern["title" -> x_] :> x, \[Infinity]]
]
Complement[ImportAll["Programming_Tasks"], ImportAll["Mathematica"]]

View file

@ -1,13 +0,0 @@
url = "http://rosettacode.org/wiki/Reports:Tasks_not_implemented_in_Mathematica";
html = Import[url, "XMLObject"];
pos = Position[html, XMLElement["div", {"class" -> "mw-content-ltr", "dir" -> "ltr", "lang" -> "en"}, ___]];
pos = First[pos];
data = Extract[html, pos];
pos = Position[data, XMLElement["li", {}, {XMLElement["a", {"shape" -> "rect", "href" -> _, "title" -> x_}, {x_}]}]];
data = Extract[data, pos];
data = data[[All, -1, -1, 2]];
data = {"title", "href"} /. # & /@ %;
data[[All, 2]] = "http://rosettacode.org" <> # & /@ data[[All, 2]];
newb = data[[All, 1]];
data = Hyperlink @@@ data;
data // Column

View file

@ -0,0 +1,20 @@
ClearAll[ImportAll];
ImportAll[lang_String] :=
Module[{data = {}, continue = True, cmcontinue = "", xml},
While[continue,
xml = Import[
"http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:" <>
lang <>
"&cmlimit=500&format=xml&cmcontinue=" <>
cmcontinue,
"XML"];
AppendTo[data, Cases[xml, XMLElement["cm", _, {}], Infinity]];
cmcontinue = Cases[xml, XMLElement["continue", cmcontinue_, {}] :> cmcontinue, Infinity];
If[Length[cmcontinue] > 0,
cmcontinue = Last@First@First@cmcontinue;,(*else*)
cmcontinue = "";];
continue = (cmcontinue != "");];
Return[Cases[data, HoldPattern["title" -> x_] :> x, Infinity]];];
unimplementedTasks =
Complement[ImportAll["Programming_Tasks"], ImportAll["Mathematica"]]

View file

@ -0,0 +1,114 @@
import logging
from typing import Iterable
from typing import NamedTuple
from typing import Set
import requests
from requests.adapters import HTTPAdapter
from requests.adapters import Retry
logging.basicConfig(level=logging.DEBUG)
URL = "https://rosettacode.org/w/api.php"
CM_QUERY = {
"action": "query",
"generator": "categorymembers",
"format": "json",
"formatversion": "2",
"prop": "info",
"inprop": "url|touched",
"gcmlimit": 500,
}
class PageInfo(NamedTuple):
pageid: int
ns: int
title: str
contentmodel: str
pagelanguage: str
pagelanguagehtmlcode: str
pagelanguagedir: str
touched: str
lastrevid: int
length: int
fullurl: str
editurl: str
canonicalurl: str
def get_session() -> requests.Session:
"""Setup a requests.Session with retries."""
retry_strategy = Retry(
total=5,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["HEAD", "GET", "OPTIONS"],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("https://", adapter)
session.mount("http://", adapter)
return session
def category_members(category: str, url: str = URL) -> Iterable[PageInfo]:
params = {**CM_QUERY, "gcmtitle": category}
session = get_session()
response = session.get(url, params=params)
response.raise_for_status()
data = response.json()
for page in data["query"]["pages"]:
yield PageInfo(**{k: v for k, v in page.items() if k in PageInfo._fields})
_continue = data.get("continue", {}).get("gcmcontinue")
while _continue:
params["continue"] = data["continue"]["continue"]
params["gcmcontinue"] = _continue
response = session.get(url, params=params)
response.raise_for_status()
data = response.json()
for page in data["query"]["pages"]:
yield PageInfo(**{k: v for k, v in page.items() if k in PageInfo._fields})
_continue = data.get("continue", {}).get("gcmcontinue")
def lang_tasks(language: str) -> Set[PageInfo]:
return set(category_members(f"Category:{language}"))
def omitted_tasks(language: str) -> Set[PageInfo]:
return set(category_members(f"Category:{language}/Omit"))
def unimplemented_tasks(lang_tasks: Set[PageInfo], omitted: Set[PageInfo]) -> Set[str]:
tasks = set(category_members("Category:Programming Tasks"))
return tasks.difference(lang_tasks).difference(omitted)
def unimplemented_draft_tasks(
lang_tasks: Set[PageInfo], omitted: Set[PageInfo]
) -> Set[str]:
tasks = set(category_members("Category:Draft Programming Tasks"))
return tasks.difference(lang_tasks).difference(omitted)
def display(title: str, pages: Iterable[PageInfo]) -> None:
print(title)
for page in pages:
print(" ", page.title, page.canonicalurl)
print("")
if __name__ == "__main__":
lang = lang_tasks("Python")
omitted = omitted_tasks("Python")
display("Programming Tasks", unimplemented_tasks(lang, omitted))
display("Draft Programming Tasks", unimplemented_draft_tasks(lang, omitted))
display("Omitted Tasks", omitted)