Parse-Distname
view release on metacpan or search on metacpan
xt/walk_through.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use File::Find;
use Parse::Distname;
my $cpan_mirror;
BEGIN {
$cpan_mirror = $ENV{TEST_CPAN_MIRROR}
or plan skip_all => "requires \$ENV{TEST_CPAN_MIRROR} to test";
-d "$cpan_mirror/authors/id/"
or plan skip_all => "\$ENV{TEST_CPAN_MIRROR} seems not a CPAN mirror";
eval "use CPAN::DistnameInfo 0.12; 1"
or plan skip_all => "requires CPAN::DistnameInfo to compare";
}
my %KnownDiff;
{
local $/ = "";
while(<DATA>) {
s/(?:\015\012|\015|\012)/\n/sg;
s/\A#[^\n]*\n//sg;
my ($file, $diff) = split "\n", $_, 2;
chomp $file; chomp $diff;
$file =~ s/\s*\(.+$//; # remove year info
$KnownDiff{$file} = $diff;
}
}
find({
wanted => sub {
my $file = $File::Find::name;
return unless -f $file;
return unless $file =~ /$Parse::Distname::SUFFRE/i;
my $cpan_path = $file;
$cpan_path =~ s|^.+authors/id/||;
my %cd = CPAN::DistnameInfo->new($cpan_path)->properties;
my %pd = Parse::Distname->new($cpan_path)->properties;
# ignore spammers
return if $pd{cpanid} =~ /^(?:DOCRIVERS|FULLHQ|ULTRAHD)$/;
my $ok = 1;
my $diff = '';
for my $key (sort keys %cd) {
if (defined $cd{$key}) {
if (defined $pd{$key}) {
if ($cd{$key} eq $pd{$key}) {
# OK
$diff .= <<"DIFF";
"$key": "$cd{$key}",
DIFF
} else {
$diff .= <<"DIFF";
- "$key": "$cd{$key}",
+ "$key": "$pd{$key}",
DIFF
$ok = 0;
}
} else {
$diff .= <<"DIFF";
- "$key": "$cd{$key}",
+ "$key": null,
DIFF
$ok = 0;
}
}
elsif (defined $pd{$key}) {
$diff .= <<"DIFF";
- "$key": null,
+ "$key": "$pd{$key}",
DIFF
$ok = 0;
}
else {
# both are undef; OK
$diff .= <<"DIFF";
"$key": null,
DIFF
}
}
$diff =~ s/(?:\015\012|\015|\012)/\n/gs;
chomp $diff;
if ($ok) {
pass $file;
} else {
SKIP: {
skip "not portable", 1 if $^O eq 'MSWin32' and $cpan_path =~ /\.\\/;
if (!$KnownDiff{$cpan_path} or $diff ne $KnownDiff{$cpan_path}) {
my $mtime = (stat($file))[9];
my $year = (localtime($mtime))[5] + 1900;
print STDERR "$cpan_path ($year)\n$diff\n\n";
fail $file;
} else {
pass $file;
}
}
}
},
no_chdir => 1,
}, "$cpan_mirror/authors/id/");
done_testing;
__DATA__
D/DP/DPCHRIST/Math-TriangularNumbers-r0_03.tar.gz (2005)
"cpanid": "DPCHRIST",
- "dist": "Math-TriangularNumbers-r",
+ "dist": "Math-TriangularNumbers",
"distvname": "Math-TriangularNumbers-r0_03",
"extension": "tar.gz",
"filename": "Math-TriangularNumbers-r0_03.tar.gz",
"maturity": "released",
"pathname": "D/DP/DPCHRIST/Math-TriangularNumbers-r0_03.tar.gz",
- "version": "0_03",
+ "version": "r0_03",
D/DP/DPCHRIST/Math-TriangularNumbers-r0_02.tar.gz (2005)
"cpanid": "DPCHRIST",
- "dist": "Math-TriangularNumbers-r",
+ "dist": "Math-TriangularNumbers",
"distvname": "Math-TriangularNumbers-r0_02",
"extension": "tar.gz",
"filename": "Math-TriangularNumbers-r0_02.tar.gz",
"maturity": "released",
"pathname": "D/DP/DPCHRIST/Math-TriangularNumbers-r0_02.tar.gz",
- "version": "0_02",
+ "version": "r0_02",
H/HO/HOLCAPEK/0.1.tar.gz (2017)
"cpanid": "HOLCAPEK",
- "dist": "0.1",
+ "dist": "",
"distvname": "0.1",
"extension": "tar.gz",
"filename": "0.1.tar.gz",
"maturity": "released",
"pathname": "H/HO/HOLCAPEK/0.1.tar.gz",
- "version": null,
+ "version": "0.1",
H/HW/HWAT/0.02.tar.gz (2014)
"cpanid": "HWAT",
- "dist": "0.02",
+ "dist": "",
"distvname": "0.02",
"extension": "tar.gz",
"filename": "0.02.tar.gz",
"maturity": "released",
"pathname": "H/HW/HWAT/0.02.tar.gz",
- "version": null,
+ "version": "0.02",
( run in 3.415 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )