Acme-CPANAuthors-GitHub
view release on metacpan or search on metacpan
scripts/generate-github-authors.pl view on Meta::CPAN
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use Acme::CPANAuthors::Utils;
use Cwd qw(realpath);
use MetaCPAN::Client;
use FindBin;
my $VERSION = '0.09';
my (%name, %github);
process_authors();
process_releases();
write_file();
exit;
sub process_authors {
my $search = MetaCPAN::Client->new->all('authors');
AUTHOR:
while (my $author = $search->next) {
my $pauseid = $author->pauseid;
next unless $pauseid;
my $name = $author->name // '';
$name{$pauseid} = $name;
for my $website (@{$author->website // []}) {
next unless is_github_site($website);
$github{$pauseid} = $name;
next AUTHOR;
}
for my $profile (@{$author->profile // []}) {
next unless 'github' eq $profile->{name};
$github{$pauseid} = $name;
next AUTHOR;
}
}
}
sub process_releases {
my $search = MetaCPAN::Client->new->release({
all => [
{ maturity => 'released' },
{ status => 'latest' },
{
either => [
{ 'resources.repository.url' => '*github.com/*' },
{ 'resources.repository.web' => '*github.com/*' },
{ 'resources.homepage' => '*github.com/*' },
]
},
]},
{ _source => [qw(author resources)] }
);
while (my $release = $search->next) {
my $pauseid = $release->author // next;
next if exists $github{$pauseid};
my $home = $release->resources->{homepage} // '';
my $repo = $release->resources->{repository} // {};
for my $url ($home, @$repo{qw(url web)}) {
next unless is_github_site($url);
$github{$pauseid} = $name{$pauseid} // '';
last;
}
}
}
sub is_github_site {
return $_[0]
&& $_[0] =~ m[
^ (?:(?:git | https?)://)? (?:[^.]+\.)? github\.com/
]ix;
}
sub write_file {
my $file = "$FindBin::Bin/../lib/Acme/CPANAuthors/GitHub.pm";
open my $fh, '>:encoding(utf-8)', $file or die "$file: $!";
(my $header =<< " __HEADER__") =~ s/^ +//gm;
package Acme::CPANAuthors::GitHub;
use strict;
use warnings;
use utf8;
our \$VERSION = '$VERSION';
\$VERSION = eval \$VERSION;
use Acme::CPANAuthors::Register(
__HEADER__
print $fh $header;
for my $pauseid (sort keys %github) {
printf $fh " q(%s) => q(%s),\n", $pauseid, $github{$pauseid};
}
print $fh <DATA>;
close $fh;
( run in 1.321 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )