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 )