Skip to content

Instantly share code, notes, and snippets.

@AlexDaniel
Last active February 26, 2018 23:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlexDaniel/c4952b367297bb0b2f615e0669c83170 to your computer and use it in GitHub Desktop.
Save AlexDaniel/c4952b367297bb0b2f615e0669c83170 to your computer and use it in GitHub Desktop.
Reliably works on 2017.11. reliably fails on 2017.12 and later.
use lib ‘data/all-modules/github/sergot/datetime-parse/lib’;
use lib ‘data/all-modules/github/perl6/Perl6-MIME-Base64/lib’;
use lib ‘data/all-modules/github/perl6-community-modules/uri/lib’;
use lib ‘data/all-modules/github/supernovus/perl6-http-status/lib’;
use lib ‘data/all-modules/github/sergot/http-useragent/lib’;
use lib ‘data/all-modules/github/sergot/perl6-encode/lib’;
use lib ‘data/all-modules/github/perlpilot/p6-File-Temp/lib’;
use lib ‘data/all-modules/github/labster/p6-file-directory-tree/lib’;
use lib ‘data/all-modules/cpan/TIMOTIMO/JSON-Fast/lib’;
use lib ‘data/all-modules/github/perl6-community-modules/uri/lib’;
use HTTP::UserAgent;
use URI::Escape;
use JSON::Fast;
# Friendlier descriptions for task categories
my %cat = (
'Programming_Tasks' => 'Task: ',
'Draft_Programming_Tasks' => 'Draft:'
);
my $client = HTTP::UserAgent.new;
my $url = 'http://rosettacode.org/mw';
my $hashfile = './RC_Authors.json';
my %tasks;
# clear screen
#run('clear');
#=begin update
note 'Retreiving task information...';
for %cat.keys -> $category {
mediawiki-query(
$url, 'pages',
:generator<categorymembers>,
:gcmtitle("Category:$category"),
:gcmlimit<350>,
:rawcontinue(),
:prop<title>
).map({
mediawiki-query(
$url, 'pages',
:titles(.<title>),
:prop<revisions>,
:rvprop<user|timestamp>,
:rvstart<2000-01-01T01:01:01Z>,
:rvdir<newer>,
:rvlimit<1>
)}
).map({
say 1 + $++, ' ', %cat{$category}, ' ', .[0]<title>;
%tasks{.[0]<title>}<category> = %cat{$category};
%tasks{.[0]<title>}<author> = .[0]<revisions>[0]<user>;
%tasks{.[0]<title>}<date> = .[0]<revisions>[0]<timestamp>.subst(/'T'.+$/, '')
}
)
}
# Save information to a local file
note "\nTask information saved to local file: {$hashfile.IO.absolute}";
$hashfile.IO.spurt(%tasks.&to-json);
#=end update
sub mediawiki-query ($site, $type, *%query) {
my $url = "$site/api.php?" ~ uri-query-string(
:action<query>, :format<json>, :formatversion<2>, |%query);
my $continue = '';
gather loop {
my $response = $client.get("$url&$continue");
my $data = from-json($response.content);
take $_ for $data.<query>.{$type}.values;
$continue = uri-query-string |($data.<query-continue>{*}».hash.hash or last);
}
}
sub uri-query-string (*%fields) { %fields.map({ "{.key}={uri-escape .value}" }).join("&") }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment