Data update
This commit is contained in:
parent
81fd053722
commit
52a6ef48dd
10248 changed files with 63654 additions and 6775 deletions
|
|
@ -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
|
||||
|
|
@ -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"]]
|
||||
|
|
@ -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
|
||||
|
|
@ -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"]]
|
||||
|
|
@ -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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue