CPAN-SQLite-0.217/0000755000175600017560000000000013424206717014527 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/0000755000175600017560000000000013424206717014772 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/dot-cpan/0000755000175600017560000000000013424206717016477 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/dot-cpan/CPAN/0000755000175600017560000000000013424206717017220 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/dot-cpan/CPAN/TestConfig.pm0000644000175600017560000000352213424206717021625 0ustar cpantestercpantester# $Id: TestConfig.pm 71 2019-01-15 01:46:34Z stro $ use Cwd; my $cwd = cwd; my $Iswin = $^O eq "MSWin32"; $CPAN::Config = { $Iswin ? () : ( 'make_install_make_command' => q[make], 'mbuild_install_build_command' => q[./Build], ), 'QAZWSX' => q[PLMOKN], 'auto_commit' => q[0], 'build_cache' => q[100], 'build_dir' => qq[$cwd/t/dot-cpan/build], #'bzip2' => q[/bin/bzip2], 'cache_metadata' => q[1], 'colorize_output' => q[0], 'cpan_home' => qq[$cwd/t/dot-cpan], #'curl' => q[], #'ftp' => q[], 'ftp_proxy' => q[], 'getcwd' => q[cwd], #'gpg' => q[/usr/bin/gpg], #'gzip' => q[/bin/gzip], 'histfile' => qq[$cwd/t/dot-cpan/histfile], 'histsize' => q[100], 'http_proxy' => q[], 'inactivity_timeout' => q[0], 'index_expire' => q[1], 'inhibit_startup_message' => q[0], 'keep_source_where' => qq[$cwd/t/dot-cpan/sources], #'lynx' => q[], #'make' => q[/usr/bin/make], 'make_arg' => q[], 'make_install_arg' => q[UNINST=1], 'makepl_arg' => q[], 'mbuild_arg' => q[], 'mbuild_install_arg' => q[--uninst 1], 'mbuildpl_arg' => q[], #'ncftp' => q[], #'ncftpget' => q[], 'no_proxy' => q[], #'pager' => q[less], 'prefer_installer' => q[MB], 'prerequisites_policy' => q[follow], 'scan_cache' => q[atstart], #'shell' => q[/usr/bin/zsh], 'show_upload_date' => q[0], 'sqlite_dbname' => 'cpandb-sqlite', #'tar' => q[/bin/tar], 'term_is_latin' => q[0], 'term_ornaments' => q[0], #'unzip' => q[/usr/bin/unzip], 'urllist' => [qq[file:$cwd/t/cpan]], 'use_sqlite' => q[1], 'wait_list' => [q[wait://ls6.informatik.uni-dortmund.de:1404]], #'wget' => q[/usr/bin/wget], }; __END__ # Local Variables: # mode: cperl # cperl-indent-level: 2 # End: CPAN-SQLite-0.217/t/00-compile.t0000644000175600017560000000574313424206717017035 0ustar cpantestercpantesteruse 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.058 use Test::More; plan tests => 12 + ($ENV{AUTHOR_TESTING} ? 1 : 0); my @module_files = ( 'CPAN/SQLite.pm', 'CPAN/SQLite/DBI.pm', 'CPAN/SQLite/DBI/Index.pm', 'CPAN/SQLite/DBI/Search.pm', 'CPAN/SQLite/Index.pm', 'CPAN/SQLite/Info.pm', 'CPAN/SQLite/META.pm', 'CPAN/SQLite/Populate.pm', 'CPAN/SQLite/Search.pm', 'CPAN/SQLite/State.pm', 'CPAN/SQLite/Util.pm' ); my @scripts = ( 'bin/cpandb' ); # no fake home requested my @switches = ( -d 'blib' ? '-Mblib' : '-Ilib', ); use File::Spec; use IPC::Open3; use IO::Handle; open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; my @warnings; for my $lib (@module_files) { # see L my $stderr = IO::Handle->new; diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} } $^X, @switches, '-e', "require q[$lib]")) if $ENV{PERL_COMPILE_TEST_DEBUG}; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ and not eval { +require blib; blib->VERSION('1.01') }; if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } foreach my $file (@scripts) { SKIP: { open my $fh, '<', $file or warn("Unable to open $file: $!"), next; my $line = <$fh>; close $fh and skip("$file isn't perl", 1) unless $line =~ /^#!\s*(?:\S*perl\S*)((?:\s+-\w*)*)(?:\s*#.*)?$/; @switches = (@switches, split(' ', $1)) if $1; close $fh and skip("$file uses -T; not testable with PERL5LIB", 1) if grep { $_ eq '-T' } @switches and $ENV{PERL5LIB}; my $stderr = IO::Handle->new; diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} } $^X, @switches, '-c', $file)) if $ENV{PERL_COMPILE_TEST_DEBUG}; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-c', $file); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$file compiled ok"); shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ and not eval { +require blib; blib->VERSION('1.01') }; # in older perls, -c output is simply the file portion of the path being tested if (@_warnings = grep { !/\bsyntax OK$/ } grep { chomp; $_ ne (File::Spec->splitpath($file))[2] } @_warnings) { warn @_warnings; push @warnings, @_warnings; } } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', ( Test::More->can('explain') ? Test::More::explain(\@warnings) : join("\n", '', @warnings) ) if $ENV{AUTHOR_TESTING}; CPAN-SQLite-0.217/t/05meta_update.t0000644000175600017560000002136313424206717017621 0ustar cpantestercpantester# $Id: 05meta_update.t 76 2019-01-24 19:50:04Z stro $ use strict; use warnings; use Test::More; use File::Spec; use Cwd; use File::Copy; use File::Path; use Config; use FindBin; use CPAN::DistnameInfo; use CPAN::SQLite::Util qw(download); use lib 't/lib'; use TestSQL qw($mods $auths $dists has_hash_data vcmp); $ENV{'CPAN_SQLITE_DOWNLOAD'} = $ENV{'CPAN_SQLITE_DOWNLOAD_URL'} = undef; my $cwd = cwd; my $path_sep = $Config{path_sep} || ':'; $ENV{PERL5LIB} = join $path_sep, (File::Spec->catdir($cwd, qw(t dot-cpan)), map { File::Spec->catdir($cwd, 'blib', $_) } qw(arch lib)), $ENV{PERL5LIB} || ''; # so that a real $HOME/.cpan isn't used $ENV{HOME} = File::Spec->catdir($cwd, qw(t dot-cpan)); # hack to get tests to pass on Darwin, as File::HomeDir # doesn't use HOME or PERL5LIB to specify where CPAN::MyConfig lives $ENV{CPAN_SQLITE_TESTING} = 1; unshift @INC, File::Spec->catdir($cwd, qw(t dot-cpan)); eval { require CPAN::MyConfig; require CPAN; require CPAN::HandleConfig; require CPAN::Version; }; my $min_cpan_v = '1.88_64'; my $actual_cpan_v = $CPAN::VERSION; # older CPAN::Version's seem to have problems with underscores $min_cpan_v =~ s/_//g; $actual_cpan_v =~ s/_//g if $actual_cpan_v; if ($@ or CPAN::Version->vcmp($actual_cpan_v, $min_cpan_v) < 0) { plan skip_all => qq{Need CPAN.pm version $min_cpan_v or higher}; } else { plan tests => 2768; } # verify that we loaded the right CPAN::Config is($CPAN::Config->{QAZWSX}, 'PLMOKN'); my $home = $CPAN::Config->{cpan_home}; my $db = File::Spec->catfile($home, 'cpandb.sql'); my $sources = $CPAN::Config->{keep_source_where}; is(-e $db, 1, "$db exists"); is(-s $db > 0, 1, "$db has non-zero size"); for my $mod_search (qw(net ^uri::.*da)) { for my $mod (CPAN::Shell->expand("Module", "/$mod_search/")) { my $mod_name = $mod->id; is(defined $mods->{$mod_name}, 1, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } } for my $mod_search (qw(CPAN MP)) { for my $bundle (CPAN::Shell->expand("Bundle", "/$mod_search/")) { my $mod_name = $bundle->id; is(defined $mods->{$mod_name}, 1, $mod_name); like($bundle->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($bundle->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } } for my $dist_search (qw(apache test.*perl)) { for my $dist (CPAN::Shell->expand("Distribution", "/$dist_search/")) { my $id = $dist->id; my $pathname = "authors/id/$id"; my $d = CPAN::DistnameInfo->new($pathname); my $dist_name = $d->dist; is(defined $dists->{$dist_name}, 1, $dist_name); my $cpanid = $dist->author->id; my $download = download($cpanid, $dists->{$dist_name}->{dist_file}); is($id, $download, $download); is($cpanid, $dists->{$dist_name}->{cpanid}, $dists->{$dist_name}->{cpanid}); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } } for my $auth_search (qw(G G\w+A)) { for my $auth (CPAN::Shell->expand("Author", "/$auth_search/")) { my $id = $auth->id; is(defined $auths->{$id}, 1, $id); foreach (qw(fullname email)) { next unless $auths->{$id}->{$_}; is($auth->$_, $auths->{$id}->{$_}, $auths->{$id}->{$_}); } } } { my $mod_name = q{Date::Language}; my $mod = CPAN::Shell->expand("Module", $mod_name); is($mod->id, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } { my $dist_file = q{TimeDate-1.16.tar.gz}; my $dist_name = q{TimeDate}; my $cpanid = q{GBARR}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } for my $mod_search (qw(Apache::)) { for my $mod (CPAN::Shell->expand("Module", "/$mod_search/")) { my $mod_name = $mod->id; is(defined $mods->{$mod_name}, 1, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } } { my $dist_file = q{Apache-GzipChain-1.14.tar.gz}; my $dist_name = q{Apache-GzipChain}; my $cpanid = q{ANDK}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } for my $dist_search (qw(CPAN-Test)) { for my $dist (CPAN::Shell->expand("Distribution", "/$dist_search/")) { my $id = $dist->id; my $pathname = "authors/id/$id"; my $d = CPAN::DistnameInfo->new($pathname); my $dist_name = $d->dist; is(defined $dists->{$dist_name}, 1, $dist_name); my $cpanid = $dist->author->id; my $download = download($cpanid, $dists->{$dist_name}->{dist_file}); is($id, $download, $download); is($cpanid, $dists->{$dist_name}->{cpanid}, $dists->{$dist_name}->{cpanid}); my %mods = map { $_ => 1 } $dist->containsmods; my $mods = $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } } { my $dist_file = q{CPAN-Test-Dummy-Perl5-Make-1.05.tar.gz}; my $dist_name = q{CPAN-Test-Dummy-Perl5-Make}; my $cpanid = q{ANDK}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } foreach my $cpanid (keys %$auths) { my $auth = CPAN::Shell->expand("Author", $cpanid); is($auth->id, $cpanid, "verify '$cpanid'"); foreach (qw(fullname email)) { next unless $auths->{$cpanid}->{$_}; is($auth->$_, $auths->{$cpanid}->{$_}); } } foreach my $mod_name (keys %$mods) { next if $mod_name =~ /^Bundle/; my $mod = CPAN::Shell->expand("Module", $mod_name); is($mod->id, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } foreach my $mod_name (keys %$mods) { next unless ($mod_name =~ /^Bundle::/); my $bundle = CPAN::Shell->expand("Bundle", $mod_name); is($bundle->id, $mod_name); like($bundle->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($bundle->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } for my $dist_name (keys %$dists) { my $dist_file = $dists->{$dist_name}->{dist_file}; my $cpanid = $dists->{$dist_name}->{cpanid}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } my $no_such = 'ZZZ'; foreach my $type (qw(Author Distribution Module)) { my $query = ($type eq 'Distribution') ? "/$no_such/" : $no_such; my $item = CPAN::Shell->expand($type, $query); is($item, undef, "no such $type"); next if $type eq 'Distribution'; $item = CPAN::Shell->expand($type, "/$no_such/"); is($item, undef, "no such $type"); } rmtree($sources) if -d $sources; unlink($db) if -e $db; # Local Variables: # mode: cperl # cperl-indent-level: 2 # End: CPAN-SQLite-0.217/t/03info.t0000644000175600017560000000513013424206717016254 0ustar cpantestercpantester# $Id: 03info.t 71 2019-01-15 01:46:34Z stro $ use strict; use warnings; use Test::More; use Cwd; use File::Spec::Functions; use File::Path; use CPAN::DistnameInfo; use FindBin; use lib "$FindBin::Bin/lib"; use TestSQL qw($mods $auths $dists has_hash_data); use CPAN::SQLite::Info; plan tests => 2929; my $cwd = getcwd; my $CPAN = catdir $cwd, 't', 'cpan'; my $t_dir = catdir $cwd, 't'; my $db_name = 'cpandb.sql'; my $db_dir = $cwd; unlink($db_name) if (-e $db_name); ok(-d $CPAN); use CPAN::SQLite::Info; my $info = CPAN::SQLite::Info->new(CPAN => $CPAN, db_dir => $db_dir); isa_ok($info, 'CPAN::SQLite::Info'); $info->fetch_info(); my $info_dists = $info->{dists}; my $info_mods = $info->{mods}; my $info_auths = $info->{auths}; ok(has_hash_data($info_dists)); ok(has_hash_data($info_mods)); ok(has_hash_data($info_auths)); foreach my $cpanid (keys %$auths) { ok(defined $info_auths->{$cpanid}); foreach (qw(fullname email)) { next unless $auths->{$cpanid}->{$_}; is($info_auths->{$cpanid}->{$_}, $auths->{$cpanid}->{$_}); } } foreach my $dist_name (keys %$dists) { ok(defined $info_dists->{$dist_name}); foreach (qw(dist_vers dist_file dist_abs dist_dslip cpanid)) { next unless $dists->{$dist_name}->{$_}; is($info_dists->{$dist_name}->{$_}, $dists->{$dist_name}->{$_}); } my $modules = $dists->{$dist_name}->{modules}; if (has_hash_data($modules)) { foreach my $key (keys %$modules) { ok(exists $info_dists->{$dist_name}->{modules}->{$key}); next unless $modules->{$key}; is($info_dists->{$dist_name}->{modules}->{$key}, $modules->{$key}); } } } foreach my $mod_name (keys %$mods) { ok(defined $info_mods->{$mod_name}); foreach (qw(mod_abs dist_name mod_vers)) { next unless $mods->{$mod_name}->{$_}; is($info_mods->{$mod_name}->{$_}, $mods->{$mod_name}->{$_}); } } ok(not defined $info->{auths}->{ZZZ}); ok(not defined $info->{mods}->{ZZZ}); ok(not defined $info->{dists}->{ZZZ}); my @tables = qw(dists mods auths info); my $index; my $package = 'CPAN::SQLite::Index'; foreach my $table (@tables) { my $class = $package . '::' . $table; my $this = { info => $info->{$table} }; $index->{$table} = bless $this, $class; } use CPAN::SQLite::DBI qw($tables); my $cdbi = CPAN::SQLite::DBI::Index->new( CPAN => $CPAN, db_name => $db_name, db_dir => $db_dir ); isa_ok($cdbi, 'CPAN::SQLite::DBI::Index'); use CPAN::SQLite::Populate; my $pop = CPAN::SQLite::Populate->new( db_name => $db_name, db_dir => $db_dir, setup => 1, CPAN => $CPAN, index => $index ); isa_ok($pop, 'CPAN::SQLite::Populate'); $pop->populate(); ok(1); CPAN-SQLite-0.217/t/author-critic.t0000644000175600017560000000040713424206717017735 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } use strict; use warnings; use Test::Perl::Critic (-profile => "t/.perlcriticrc") x!! -e "t/.perlcriticrc"; all_critic_ok(); CPAN-SQLite-0.217/t/00-report-prereqs.dd0000644000175600017560000000657113424206717020523 0ustar cpantestercpantesterdo { my $x = { 'configure' => { 'requires' => { 'ExtUtils::MakeMaker' => '0' } }, 'develop' => { 'requires' => { 'Test::CPAN::Meta' => '0', 'Test::CPAN::Meta::JSON' => '0.16', 'Test::EOL' => '0', 'Test::Kwalitee' => '1.21', 'Test::MinimumVersion' => '0', 'Test::More' => '0.88', 'Test::NoTabs' => '0', 'Test::PAUSE::Permissions' => '0', 'Test::Perl::Critic' => '0', 'Test::Pod' => '1.41' } }, 'runtime' => { 'requires' => { 'CPAN' => '0', 'CPAN::DistnameInfo' => '0', 'Compress::Zlib' => '0', 'Cwd' => '0', 'DBI' => '0', 'English' => '0', 'Exporter' => '0', 'File::Basename' => '0', 'File::Find' => '0', 'File::HomeDir' => '0', 'File::Path' => '0', 'File::Spec' => '0', 'File::Spec::Functions' => '0', 'Getopt::Long' => '0', 'HTTP::Tiny' => '0', 'Safe' => '0', 'Scalar::Util' => '0', 'constant' => '0', 'parent' => '0', 'strict' => '0', 'utf8' => '0', 'warnings' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900' }, 'requires' => { 'CPAN::HandleConfig' => '0', 'CPAN::Version' => '0', 'Carp' => '0', 'DBD::SQLite' => '0', 'ExtUtils::MakeMaker' => '0', 'File::Copy' => '0', 'File::Spec' => '0', 'FindBin' => '0', 'IO::Handle' => '0', 'IPC::Open3' => '0', 'Test::Memory::Cycle' => '0', 'Test::More' => '0.94', 'base' => '0', 'lib' => '0' } } }; $x; }CPAN-SQLite-0.217/t/lib/0000755000175600017560000000000013424206717015540 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/lib/TestShellDiag.pm0000644000175600017560000000076013424206717020575 0ustar cpantestercpantester# $Id: TestShellDiag.pm 71 2019-01-15 01:46:34Z stro $ package TestShellDiag; use strict; use warnings; use Test::More (); use CPAN; # CPAN FrontEnd (default: CPAN::Shell) prints some information to STDOUT, which # can brake TAP output and mark some tests as out-of-sequence. To avoid this # problem, myprint and mywarn should be silenced. $CPAN::FrontEnd = 'TestShellDiag'; sub myprint { return Test::More::diag(splice(@_, 1)); } sub mywarn { return Test::More::diag(splice(@_, 1)); } CPAN-SQLite-0.217/t/lib/TestSQL.pm0000644000175600017560000025540313424206717017406 0ustar cpantestercpantester# $Id: TestSQL.pm 71 2019-01-15 01:46:34Z stro $ package TestSQL; use strict; use warnings; use base qw(Exporter); our (@EXPORT_OK, $dists, $mods, $auths); @EXPORT_OK = qw($dists $mods $auths has_hash_data vcmp); $dists = { 'CPAN-Test-Dummy-Perl5-Make' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Make' => 1, 'Bundle::CpanTestDummies' => 1 }, 'dist_vers' => '1.05', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Make-1.05.tar.gz' }, 'Apache-MP3' => { 'modules' => { 'Apache::MP3::L10N::sh' => 1, 'Apache::MP3::L10N::ms' => 1, 'Apache::MP3::L10N::nl_be' => 1, 'Apache::MP3::L10N::no' => 1, 'Apache::MP3' => 1, 'Apache::MP3::L10N::en' => 1, 'Apache::MP3::L10N::uk' => 1, 'Apache::MP3::L10N::nn' => 1, 'Apache::MP3::L10N::sr' => 1, 'Apache::MP3::L10N::hr' => 1, 'Apache::MP3::L10N::zh_tw' => 1, 'Apache::MP3::L10N::ga' => 1, 'Apache::MP3::L10N::tr' => 1, 'Apache::MP3::L10N::nl' => 1, 'Apache::MP3::L10N::sl' => 1, 'Apache::MP3::L10N::ru' => 1, 'Apache::MP3::L10N::fa' => 1, 'Apache::MP3::L10N::ko' => 1, 'Apache::MP3::L10N::is' => 1, 'Apache::MP3::L10N::ca' => 1, 'Apache::MP3::L10N::cs' => 1, 'Apache::MP3::L10N::he' => 1, 'Apache::MP3::Playlist' => 1, 'Apache::MP3::L10N::pl' => 1, 'Apache::MP3::L10N::nb' => 1, 'Apache::MP3::L10N::RightToLeft' => 1, 'Apache::MP3::L10N::fr' => 1, 'Apache::MP3::L10N::nb_no' => 1, 'Apache::MP3::L10N::zh_cn' => 1, 'Apache::MP3::L10N::x_marklar' => 1, 'Apache::MP3::L10N::fi' => 1, 'Apache::MP3::Sorted' => 1, 'Apache::MP3::L10N::nn_no' => 1, 'Apache::MP3::L10N::sk' => 1, 'Apache::MP3::L10N::nl_nl' => 1, 'Apache::MP3::L10N::es' => 1, 'Apache::MP3::L10N::ja' => 1, 'Apache::MP3::L10N' => 1, 'Apache::MP3::L10N::ar' => 1, 'Apache::MP3::L10N::Aliases' => 1, 'Apache::MP3::L10N::it' => 1, 'Apache::MP3::L10N::de' => 1, 'Apache::MP3::L10N::no_no' => 1 }, 'dist_vers' => '4.00', 'cpanid' => 'LDS', 'dist_file' => 'Apache-MP3-4.00.tar.gz' }, 'Devel-Symdump' => { 'modules' => { 'Devel::Symdump::Export' => 1, 'Devel::Symdump' => 1 }, 'dist_vers' => '2.0604', 'cpanid' => 'ANDK', 'dist_file' => 'Devel-Symdump-2.0604.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Make-Zip' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Make::Zip' => 1 }, 'dist_vers' => '1.03', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Make-Zip-1.03.zip' }, 'Convert-ASN1' => { 'modules' => { 'Convert::ASN1' => 1, 'Convert::ASN1::parser' => 1 }, 'dist_vers' => '0.20', 'cpanid' => 'GBARR', 'dist_file' => 'Convert-ASN1-0.20.tar.gz' }, 'Tie-DBI' => { 'modules' => { 'Tie::DBI' => 1, 'Tie::RDBM' => 1 }, 'dist_vers' => '1.02', 'cpanid' => 'LDS', 'dist_file' => 'Tie-DBI-1.02.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Make-CircDepeThree' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Make::CircDepeThree' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Make-CircDepeThree-1.00.tar.gz' }, 'GD' => { 'modules' => { 'GD::Polyline' => 1, 'GD' => 1, 'GD::Simple' => 1 }, 'dist_vers' => '2.35', 'cpanid' => 'LDS', 'dist_file' => 'GD-2.35.tar.gz' }, 'Errno' => { 'modules' => { 'Errno' => 1 }, 'dist_vers' => '1.09', 'cpanid' => 'GBARR', 'dist_file' => 'Errno-1.09.tar.gz' }, 'SHA' => { 'modules' => { 'SHA' => 1 }, 'dist_vers' => '2.01', 'cpanid' => 'GAAS', 'dist_file' => 'SHA-2.01.tar.gz' }, 'Tkx' => { 'modules' => { 'Tkx::MegaConfig' => 1, 'Tkx' => 1, 'Tkx::LabEntry' => 1 }, 'dist_vers' => '1.04', 'cpanid' => 'GAAS', 'dist_file' => 'Tkx-1.04.tar.gz' }, 'Apache-GzipChain' => { 'modules' => { 'Apache::PassFile' => 1, 'Apache::GzipChain' => 1 }, 'dist_vers' => '1.14', 'cpanid' => 'ANDK', 'dist_file' => 'Apache-GzipChain-1.14.tar.gz' }, 'TimeDate' => { 'modules' => { 'Date::Language::Dutch' => 1, 'Date::Language' => 1, 'Date::Language::Afar' => 1, 'Date::Language::Sidama' => 1, 'Date::Language::Amharic' => 1, 'Date::Language::TigrinyaEritrean' => 1, 'Date::Format' => 1, 'Date::Language::Danish' => 1, 'Time::Zone' => 1, 'Date::Language::English' => 1, 'Date::Language::Swedish' => 1, 'Date::Language::Norwegian' => 1, 'Date::Language::Tigrinya' => 1, 'Date::Language::Gedeo' => 1, 'Date::Language::TigrinyaEthiopian' => 1, 'Date::Language::Austrian' => 1, 'Date::Parse' => 1, 'Date::Language::Chinese_GB' => 1, 'Date::Language::French' => 1, 'Date::Language::Brazilian' => 1, 'Date::Language::Somali' => 1, 'Date::Language::Czech' => 1, 'Date::Language::Oromo' => 1, 'Date::Language::German' => 1, 'Date::Language::Italian' => 1, 'Date::Language::Greek' => 1, 'Date::Language::Finnish' => 1 }, 'dist_vers' => '1.16', 'cpanid' => 'GBARR', 'dist_file' => 'TimeDate-1.16.tar.gz' }, 'IPC-SysV' => { 'modules' => { 'IPC::Semaphore' => 1, 'IPC::Msg' => 1, 'IPC::SysV' => 1 }, 'dist_vers' => '1.03', 'cpanid' => 'GBARR', 'dist_file' => 'IPC-SysV-1.03.tar.gz' }, 'Devel-Cycle' => { 'modules' => { 'Devel::Cycle' => 1 }, 'dist_vers' => '1.07', 'cpanid' => 'LDS', 'dist_file' => 'Devel-Cycle-1.07.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Make-CircDepeTwo' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Make::CircDepeTwo' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Make-CircDepeTwo-1.00.tar.gz' }, 'HTML-Parser' => { 'modules' => { 'HTML::LinkExtor' => 1, 'HTML::TokeParser' => 1, 'HTML::HeadParser' => 1, 'HTML::Entities' => 1, 'HTML::Parser' => 1, 'HTML::PullParser' => 1, 'HTML::Filter' => 1 }, 'dist_vers' => '3.55', 'cpanid' => 'GAAS', 'dist_file' => 'HTML-Parser-3.55.tar.gz' }, 'Crypt-CBC' => { 'modules' => { 'Crypt::CBC' => 1 }, 'dist_vers' => '2.22', 'cpanid' => 'LDS', 'dist_file' => 'Crypt-CBC-2.22.tar.gz' }, 'webchat' => { 'modules' => { 'WWW::Chat' => 1 }, 'dist_vers' => '0.05', 'cpanid' => 'GAAS', 'dist_file' => 'webchat-0.05.tar.gz' }, 'Font-AFM' => { 'modules' => { 'Font::Metrics::TimesRoman' => 1, 'Font::Metrics::CourierOblique' => 1, 'Font::Metrics::HelveticaBoldOblique' => 1, 'Font::Metrics::HelveticaBold' => 1, 'Font::Metrics::CourierBold' => 1, 'Font::Metrics::Helvetica' => 1, 'Font::Metrics::HelveticaOblique' => 1, 'Font::Metrics::TimesBoldItalic' => 1, 'Font::Metrics::TimesItalic' => 1, 'Font::AFM' => 1, 'Font::Metrics::CourierBoldOblique' => 1, 'Font::Metrics::TimesBold' => 1, 'Font::Metrics::Courier' => 1 }, 'dist_vers' => '1.19', 'cpanid' => 'GAAS', 'dist_file' => 'Font-AFM-1.19.tar.gz' }, 'pyperl' => { 'modules' => { 'Python::Object' => 1 }, 'dist_vers' => '1.0', 'cpanid' => 'GAAS', 'dist_file' => 'pyperl-1.0.tar.gz' }, 'Convert-BER' => { 'modules' => { 'Convert::BER' => 1, 'Convert::BER::BER' => 1 }, 'dist_vers' => '1.3101', 'cpanid' => 'GBARR', 'dist_file' => 'Convert-BER-1.3101.tar.gz' }, 'MAB2' => { 'modules' => { 'MAB2::Record::pnd' => 1, 'MAB2::Record::swd' => 1, 'Tie::MAB2::Dualdb' => 1, 'MAB2::Record::lokal' => 1, 'MAB2::Record::titel' => 1, 'MAB2::Record::gkd' => 1, 'Tie::MAB2::RecnoViaId' => 1, 'Encode::MAB2table' => 1, 'Tie::MAB2::Dualdb::Recno' => 1, 'Encode::MAB2' => 1, 'Tie::MAB2::Id' => 1, 'Tie::MAB2::Dualdb::Id' => 1, 'MAB2::Record::Base' => 1, 'Tie::MAB2::Recno' => 1 }, 'dist_vers' => '0.06', 'cpanid' => 'ANDK', 'dist_file' => 'MAB2-0.06.tar.gz' }, 'Digest-SHA1' => { 'modules' => { 'Digest::SHA1' => 1 }, 'dist_vers' => '2.11', 'cpanid' => 'GAAS', 'dist_file' => 'Digest-SHA1-2.11.tar.gz' }, 'Perl-Repository-APC' => { 'modules' => { 'Perl::Repository::APC' => 1, 'Perl::Repository::APC::BAP' => 1, 'Perl::Repository::APC2SVN' => 1 }, 'dist_vers' => '1.220', 'cpanid' => 'ANDK', 'dist_file' => 'Perl-Repository-APC-1.220.tar.gz' }, 'UDDI' => { 'modules' => { 'UDDI::SOAP' => 1, 'UDDI' => 1 }, 'dist_vers' => '0.03', 'cpanid' => 'GAAS', 'dist_file' => 'UDDI-0.03.tar.gz' }, 'Data-DumpXML' => { 'modules' => { 'Data::DumpXML' => 1, 'Data::DumpXML::Parser' => 1 }, 'dist_vers' => '1.06', 'cpanid' => 'GAAS', 'dist_file' => 'Data-DumpXML-1.06.tar.gz' }, 'LWPng-alpha' => { 'modules' => { 'LWP::Dump' => 1, 'LWP::Conn::HTTP' => 1, 'LWP::Authen::digest' => 1, 'LWP::Sink::Tee' => 1, 'LWP::UA::Cookies' => 1, 'LWP::MainLoop' => 1, 'LWP::Sink::rot13' => 1, 'LWP::Sink::identity' => 1, 'LWP::StdSched' => 1, 'LWP::Version' => 1, 'LWP::Sink::Monitor' => 1, 'LWP::Sink::base64' => 1, 'LWP::Conn::FILE' => 1, 'LWP::UA' => 1, 'LWP::Conn::FTP' => 1, 'LWP::EventLoop' => 1, 'LWP::Sink::Buffer' => 1, 'LWP::Authen::basic' => 1, 'LWP::Sink::HTML' => 1, 'LWP::Authen' => 1, 'LWP::Sink::_Pipe' => 1, 'LWP::Redirect' => 1, 'URI::Attr' => 1, 'LWP::Conn' => 1, 'LWP::Sink::deflate' => 1, 'LWP::UA::Proxy' => 1, 'LWP::Sink::qp' => 1, 'LWP::Conn::_Cmd' => 1, 'LWP::Sink::IO' => 1, 'LWP::Sink' => 1, 'LWP::Hooks' => 1, 'LWP::Request' => 1, 'LWP::Conn::_Connect' => 1, 'LWP::Server' => 1 }, 'dist_vers' => '0.24', 'cpanid' => 'GAAS', 'dist_file' => 'LWPng-alpha-0.24.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Build-DepeFails' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Build::DepeFails' => 1 }, 'dist_vers' => '1.02', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Build-DepeFails-1.02.tar.gz' }, 'Text-Shellwords' => { 'modules' => { 'Text::Shellwords' => 1 }, 'dist_vers' => '1.08', 'cpanid' => 'LDS', 'dist_file' => 'Text-Shellwords-1.08.tar.gz' }, 'Apache-Session-Counted' => { 'modules' => { 'Apache::Session::Counted' => 1 }, 'dist_vers' => '1.118', 'cpanid' => 'ANDK', 'dist_file' => 'Apache-Session-Counted-1.118.tar.gz' }, 'Regexp' => { 'modules' => { 'Regexp' => 1 }, 'dist_vers' => '0.004', 'cpanid' => 'GBARR', 'dist_file' => 'Regexp-0.004.tar.gz' }, 'URI' => { 'modules' => { 'URI::mailto' => 1, 'URI::QueryParam' => 1, 'URI::file::Mac' => 1, 'URI::rtsp' => 1, 'URI::urn::oid' => 1, 'URI::file' => 1, 'URI::https' => 1, 'URI::sips' => 1, 'URI::file::Base' => 1, 'URI::_generic' => 1, 'URI::rtspu' => 1, 'URI::tn3270' => 1, 'URI::urn::isbn' => 1, 'URI::_login' => 1, 'URI::gopher' => 1, 'URI::rlogin' => 1, 'URI::mms' => 1, 'URI::ldap' => 1, 'URI::Split' => 1, 'URI::data' => 1, 'URI::_server' => 1, 'URI::ldaps' => 1, 'URI::ssh' => 1, 'URI::file::OS2' => 1, 'URI::ftp' => 1, 'URI::WithBase' => 1, 'URI::Escape' => 1, 'URI::file::Win32' => 1, 'URI::_segment' => 1, 'URI::_query' => 1, 'URI::Heuristic' => 1, 'URI::file::QNX' => 1, 'URI::urn' => 1, 'URI::sip' => 1, 'URI::nntp' => 1, 'URI' => 1, 'URI::file::Unix' => 1, 'URI::http' => 1, 'URI::telnet' => 1, 'URI::file::FAT' => 1, 'URI::rsync' => 1, 'URI::ldapi' => 1, 'URI::_ldap' => 1, 'URI::snews' => 1, 'URI::URL' => 1, 'URI::_userpass' => 1, 'URI::pop' => 1, 'URI::news' => 1 }, 'dist_vers' => '1.35', 'cpanid' => 'GAAS', 'dist_file' => 'URI-1.35.tar.gz' }, 'Tie-Dir' => { 'modules' => { 'Tie::Dir' => 1 }, 'dist_vers' => '1.02', 'cpanid' => 'GBARR', 'dist_file' => 'Tie-Dir-1.02.tar.gz' }, 'Bio-SCF' => { 'modules' => { 'Bio::SCF::Arrays' => 1, 'Bio::SCF' => 1 }, 'dist_vers' => '1.01', 'cpanid' => 'LDS', 'dist_file' => 'Bio-SCF-1.01.tar.gz' }, 'Digest-MD2' => { 'modules' => { 'Digest::MD2' => 1 }, 'dist_vers' => '2.03', 'cpanid' => 'GAAS', 'dist_file' => 'Digest-MD2-2.03.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Make-Failearly' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Make::Failearly' => 1 }, 'dist_vers' => '1.02', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Make-Failearly-1.02.tar.gz' }, 'Net-TFTP' => { 'modules' => { 'Net::TFTP' => 1 }, 'dist_vers' => '0.16', 'cpanid' => 'GBARR', 'dist_file' => 'Net-TFTP-0.16.tar.gz' }, 'Digest-HMAC' => { 'modules' => { 'Digest::HMAC_SHA1' => 1, 'Digest::HMAC' => 1, 'Digest::HMAC_MD5' => 1 }, 'dist_vers' => '1.01', 'cpanid' => 'GAAS', 'dist_file' => 'Digest-HMAC-1.01.tar.gz' }, 'Bundle-CPAN' => { 'modules' => { 'Bundle::CPANxxl' => 1, 'Bundle::CPAN' => 1 }, 'dist_vers' => '1.854', 'cpanid' => 'ANDK', 'dist_file' => 'Bundle-CPAN-1.854.tar.gz' }, 'Apache-Stage' => { 'modules' => { 'Apache::Stage' => 1 }, 'dist_vers' => '1.20', 'cpanid' => 'ANDK', 'dist_file' => 'Apache-Stage-1.20.tar.gz' }, 'AcePerl' => { 'modules' => { 'Ace' => 1, 'Ace::Browser::GeneSubs' => 1, 'Ace::Sequence::Multi' => 1, 'Ace::Graphics::Glyph::dot' => 1, 'Ace::Graphics::GlyphFactory' => 1, 'Ace::Graphics::Glyph::anchored_arrow' => 1, 'Ace::Freesubs' => 1, 'Ace::Sequence::Gene' => 1, 'Ace::Sequence::Transcript' => 1, 'Ace::Object::Wormbase' => 1, 'Ace::Graphics::Glyph::primers' => 1, 'Ace::Graphics::Glyph::ex' => 1, 'Ace::Graphics::Glyph::transcript' => 1, 'Ace::Graphics::Glyph::group' => 1, 'Ace::Graphics::Glyph::arrow' => 1, 'Ace::Graphics::Glyph::crossbox' => 1, 'Ace::Sequence::FeatureList' => 1, 'Ace::Model' => 1, 'Ace::Browser::SiteDefs' => 1, 'Ace::Graphics::Glyph::triangle' => 1, 'Ace::Graphics::Glyph::graded_segments' => 1, 'Ace::Sequence' => 1, 'Ace::Sequence::Feature' => 1, 'Ace::Graphics::Glyph::box' => 1, 'Ace::Graphics::Track' => 1, 'Ace::Graphics::Glyph::line' => 1, 'Ace::Browser::SearchSubs' => 1, 'Ace::Object' => 1, 'Ace::Sequence::GappedAlignment' => 1, 'Ace::Graphics::Glyph::span' => 1, 'Ace::Sequence::Homol' => 1, 'Ace::SocketServer' => 1, 'Ace::Graphics::Glyph' => 1, 'Ace::Local' => 1, 'Ace::Graphics::Glyph::toomany' => 1, 'GFF::Filehandle' => 1, 'Ace::Graphics::Glyph::segments' => 1, 'Ace::Graphics::Panel' => 1, 'Ace::Graphics::Fk' => 1, 'Ace::Iterator' => 1, 'Ace::Browser::TreeSubs' => 1, 'Ace::RPC' => 1, 'Ace::Browser::AceSubs' => 1 }, 'dist_vers' => '1.89', 'cpanid' => 'LDS', 'dist_file' => 'AcePerl-1.89.tar.gz' }, 'perlbench' => { 'modules' => { 'PerlBench::Results' => 1, 'MyPodHtml' => 1, 'PerlBench' => 1, 'PerlBench::Stats' => 1 }, 'dist_vers' => '0.93', 'cpanid' => 'GAAS', 'dist_file' => 'perlbench-0.93.tar.gz' }, 'Apache-HeavyCGI' => { 'modules' => { 'Apache::HeavyCGI::Layout' => 1, 'Apache::HeavyCGI::Debug' => 1, 'Apache::HeavyCGI::IfModified' => 1, 'Apache::HeavyCGI::SquidRemoteAddr' => 1, 'Apache::HeavyCGI::Date' => 1, 'Apache::HeavyCGI' => 1, 'Apache::HeavyCGI::Exception' => 1, 'Apache::HeavyCGI::ExePlan' => 1, 'Apache::HeavyCGI::UnmaskQuery' => 1 }, 'dist_vers' => '0.013302', 'cpanid' => 'ANDK', 'dist_file' => 'Apache-HeavyCGI-0.013302.tar.gz' }, 'PostScript-EPSF' => { 'modules' => { 'PostScript::EPSF' => 1 }, 'dist_vers' => '0.01', 'cpanid' => 'GAAS', 'dist_file' => 'PostScript-EPSF-0.01.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Build-Fails' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Build::Fails' => 1 }, 'dist_vers' => '1.03', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Build-Fails-1.03.tar.gz' }, 'IO-Socket-Multicast' => { 'modules' => { 'IO::Socket::Multicast' => 1 }, 'dist_vers' => '1.05', 'cpanid' => 'LDS', 'dist_file' => 'IO-Socket-Multicast-1.05.tar.gz' }, 'IO' => { 'modules' => { 'IO::Seekable' => 1, 'IO::File' => 1, 'IO::Pipe' => 1, 'IO::Handle' => 1, 'IO::Socket::UNIX' => 1, 'IO::Socket::INET' => 1, 'IO' => 1, 'IO::Socket' => 1, 'IO::Select' => 1, 'IO::Poll' => 1, 'IO::Dir' => 1 }, 'dist_vers' => '1.2301', 'cpanid' => 'GBARR', 'dist_file' => 'IO-1.2301.tar.gz' }, 'libwww-perl' => { 'modules' => { 'LWP::Protocol::cpan' => 1, 'LWP::Protocol::ftp' => 1, 'HTTP::Status' => 1, 'File::Listing' => 1, 'LWP::Protocol::http10' => 1, 'HTTP::Cookies::Microsoft' => 1, 'HTTP::Headers' => 1, 'LWP::Protocol::nogo' => 1, 'LWP::Protocol::nntp' => 1, 'HTTP::Daemon' => 1, 'LWP::Protocol::mailto' => 1, 'HTML::Form' => 1, 'LWP::Protocol::gopher' => 1, 'LWP::ConnCache' => 1, 'Net::HTTPS' => 1, 'HTTP::Cookies' => 1, 'HTTP::Message' => 1, 'HTTP::Request::Common' => 1, 'HTTP::Headers::Auth' => 1, 'LWP::Protocol::loopback' => 1, 'HTTP::Response' => 1, 'HTTP::Cookies::Netscape' => 1, 'LWP::Authen::Ntlm' => 1, 'LWP::Authen::Basic' => 1, 'WWW::RobotRules' => 1, 'LWP::Protocol' => 1, 'HTTP::Request' => 1, 'LWP' => 1, 'LWP::MediaTypes' => 1, 'LWP::Protocol::data' => 1, 'HTTP::Negotiate' => 1, 'LWP::Protocol::https' => 1, 'Net::HTTP::NB' => 1, 'LWP::Simple' => 1, 'LWP::DebugFile' => 1, 'Net::HTTP' => 1, 'LWP::RobotUA' => 1, 'LWP::Protocol::file' => 1, 'HTTP::Headers::Util' => 1, 'HTTP::Headers::ETag' => 1, 'LWP::Authen::Digest' => 1, 'LWP::Protocol::http' => 1, 'HTTP::Date' => 1, 'LWP::MemberMixin' => 1, 'LWP::Protocol::GHTTP' => 1, 'LWP::UserAgent' => 1, 'Bundle::LWP' => 1, 'LWP::Debug' => 1, 'LWP::Protocol::https10' => 1, 'WWW::RobotRules::AnyDBM_File' => 1, 'Net::HTTP::Methods' => 1 }, 'dist_vers' => '5.805', 'cpanid' => 'GAAS', 'dist_file' => 'libwww-perl-5.805.tar.gz' }, 'CPAN-Checksums' => { 'modules' => { 'CPAN::Checksums' => 1 }, 'dist_vers' => '1.050', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Checksums-1.050.tar.gz' }, 'libnet' => { 'modules' => { 'Net::FTP::dataconn' => 1, 'Net::FTP' => 1, 'Net::FTP::A' => 1, 'Net::POP3' => 1, 'Net::NNTP' => 1, 'Net::Netrc' => 1, 'Net::Cmd' => 1, 'Net::Config' => 1, 'Net::Time' => 1, 'Net::SMTP' => 1, 'Net::FTP::E' => 1, 'Net::FTP::L' => 1, 'Net::FTP::I' => 1, 'Net::Domain' => 1 }, 'dist_vers' => '1.19', 'cpanid' => 'GBARR', 'dist_file' => 'libnet-1.19.tar.gz' }, 'CPAN-DistnameInfo' => { 'modules' => { 'CPAN::DistnameInfo' => 1 }, 'dist_vers' => '0.06', 'cpanid' => 'GBARR', 'dist_file' => 'CPAN-DistnameInfo-0.06.tar.gz' }, 'MIME-Base64' => { 'modules' => { 'MIME::Base64' => 1, 'MIME::QuotedPrint' => 1 }, 'dist_vers' => '3.07', 'cpanid' => 'GAAS', 'dist_file' => 'MIME-Base64-3.07.tar.gz' }, 'IO-String' => { 'modules' => { 'IO::String' => 1 }, 'dist_vers' => '1.08', 'cpanid' => 'GAAS', 'dist_file' => 'IO-String-1.08.tar.gz' }, 'perl-lisp' => { 'modules' => { 'Lisp::Localize' => 1, 'Lisp::Vector' => 1, 'Lisp::Subr::Perl' => 1, 'Lisp::Printer' => 1, 'Lisp::Subr::All' => 1, 'Lisp::Cons' => 1, 'Lisp::Special' => 1, 'Lisp::String' => 1, 'Lisp::List' => 1, 'Gnus::Newsrc' => 1, 'Lisp::Interpreter' => 1, 'Lisp::Reader' => 1, 'Lisp::Symbol' => 1, 'Lisp::Subr::Core' => 1 }, 'dist_vers' => '0.06', 'cpanid' => 'GAAS', 'dist_file' => 'perl-lisp-0.06.tar.gz' }, 'MD5' => { 'modules' => { 'MD5' => 1 }, 'dist_vers' => '2.03', 'cpanid' => 'GAAS', 'dist_file' => 'MD5-2.03.tar.gz' }, 'MIME-Base64-Perl' => { 'modules' => { 'MIME::Base64::Perl' => 1, 'MIME::QuotedPrint::Perl' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'GAAS', 'dist_file' => 'MIME-Base64-Perl-1.00.tar.gz' }, 'File-CounterFile' => { 'modules' => { 'File::CounterFile' => 1 }, 'dist_vers' => '1.04', 'cpanid' => 'GAAS', 'dist_file' => 'File-CounterFile-1.04.tar.gz' }, 'Devel-SawAmpersand' => { 'modules' => { 'Devel::SawAmpersand' => 1, 'B::FindAmpersand' => 1, 'Devel::FindAmpersand' => 1 }, 'dist_vers' => '0.30', 'cpanid' => 'ANDK', 'dist_file' => 'Devel-SawAmpersand-0.30.tar.gz' }, 'IO-Interface' => { 'modules' => { 'IO::Interface::Simple' => 1, 'IO::Interface' => 1 }, 'dist_vers' => '1.02', 'cpanid' => 'LDS', 'dist_file' => 'IO-Interface-1.02.tar.gz' }, 'Bundle-libnet' => { 'modules' => { 'Bundle::libnet' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'GBARR', 'dist_file' => 'Bundle-libnet-1.00.tar.gz' }, 'Net-PH' => { 'modules' => { 'Net::PH' => 1 }, 'dist_vers' => '2.21', 'cpanid' => 'GBARR', 'dist_file' => 'Net-PH-2.21.tar.gz' }, 'Unicode-String' => { 'modules' => { 'Unicode::String' => 1, 'Unicode::CharName' => 1 }, 'dist_vers' => '2.09', 'cpanid' => 'GAAS', 'dist_file' => 'Unicode-String-2.09.tar.gz' }, 'HTTPD-User-Manage' => { 'modules' => { 'HTTPD::GroupAdmin' => 1, 'HTTPD::UserAdmin::Text' => 1, 'HTTPD::RealmManager' => 1, 'HTTPD::GroupAdmin::Text' => 1, 'HTTPD::Realm' => 1, 'HTTPD::UserAdmin::SQL' => 1, 'HTTPD::UserAdmin' => 1 }, 'dist_vers' => '1.65', 'cpanid' => 'LDS', 'dist_file' => 'HTTPD-User-Manage-1.65.tar.gz' }, 'Unicode-Map8' => { 'modules' => { 'Unicode::Map8' => 1 }, 'dist_vers' => '0.12', 'cpanid' => 'GAAS', 'dist_file' => 'Unicode-Map8-0.12.tar.gz' }, 'Convert-Recode' => { 'modules' => { 'Convert::Recode' => 1 }, 'dist_vers' => '1.04', 'cpanid' => 'GAAS', 'dist_file' => 'Convert-Recode-1.04.tar.gz' }, 'Apache-UploadSvr' => { 'modules' => { 'Apache::UploadSvr::Directory' => 1, 'Apache::UploadSvr::Dictionary' => 1, 'Apache::UploadSvr::User' => 1, 'Apache::UploadSvr' => 1 }, 'dist_vers' => '1.024', 'cpanid' => 'ANDK', 'dist_file' => 'Apache-UploadSvr-1.024.tar.gz' }, 'IO-Sockatmark' => { 'modules' => { 'IO::Sockatmark' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'LDS', 'dist_file' => 'IO-Sockatmark-1.00.tar.gz' }, 'perl-ldap' => { 'modules' => { 'Net::LDAP::LDIF' => 1, 'Net::LDAP::Control::ProxyAuth' => 1, 'Net::LDAP::Filter' => 1, 'Net::LDAP::Control::Paged' => 1, 'Net::LDAP::Message' => 1, 'Net::LDAP::Control::ManageDsaIT' => 1, 'Net::LDAPI' => 1, 'Net::LDAP::Control::PersistentSearch' => 1, 'Net::LDAP::Search' => 1, 'Net::LDAP::Control::SortResult' => 1, 'Net::LDAP::Control' => 1, 'Net::LDAP::Util' => 1, 'LWP::Protocol::ldap' => 1, 'Net::LDAP::Control::VLVResponse' => 1, 'Net::LDAPS' => 1, 'Net::LDAP::Control::EntryChange' => 1, 'Net::LDAP::Constant' => 1, 'Net::LDAP::Entry' => 1, 'Net::LDAP::Control::VLV' => 1, 'Net::LDAP::Schema' => 1, 'Bundle::Net::LDAP' => 1, 'Net::LDAP::Extra' => 1, 'Net::LDAP::ASN' => 1, 'Net::LDAP::Extension::WhoAmI' => 1, 'Net::LDAP::Extension::SetPassword' => 1, 'Net::LDAP::RootDSE' => 1, 'Net::LDAP::Extension' => 1, 'Net::LDAP::Bind' => 1, 'Net::LDAP' => 1, 'Net::LDAP::Control::Sort' => 1, 'Net::LDAP::DSML' => 1 }, 'dist_vers' => '0.33', 'cpanid' => 'GBARR', 'dist_file' => 'perl-ldap-0.33.tar.gz' }, 'Scalar-List-Utils' => { 'modules' => { 'Scalar::Util' => 1, 'List::Util' => 1 }, 'dist_vers' => '1.18', 'cpanid' => 'GBARR', 'dist_file' => 'Scalar-List-Utils-1.18.tar.gz' }, 'Lingua-Shakespeare' => { 'modules' => { 'Lingua::Shakespeare::Play' => 1, 'Lingua::Shakespeare::Character' => 1, 'Lingua::Shakespeare' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'GBARR', 'dist_file' => 'Lingua-Shakespeare-1.00.tar.gz' }, 'Digest-Adler32' => { 'modules' => { 'Digest::Adler32' => 1 }, 'dist_vers' => '0.03', 'cpanid' => 'GAAS', 'dist_file' => 'Digest-Adler32-0.03.tar.gz' }, 'CPAN-Test-Dummy-Perl5-BuildOrMake' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::BuildOrMake' => 1 }, 'dist_vers' => '1.02', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-BuildOrMake-1.02.tar.gz' }, 'Digest-MD5' => { 'modules' => { 'Digest::MD5' => 1 }, 'dist_vers' => '2.36', 'cpanid' => 'GAAS', 'dist_file' => 'Digest-MD5-2.36.tar.gz' }, 'Array-RefElem' => { 'modules' => { 'Array::RefElem' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'GAAS', 'dist_file' => 'Array-RefElem-1.00.tar.gz' }, 'Digest' => { 'modules' => { 'Digest' => 1, 'Digest::file' => 1, 'Digest::base' => 1 }, 'dist_vers' => '1.15', 'cpanid' => 'GAAS', 'dist_file' => 'Digest-1.15.tar.gz' }, 'Module-Install-InstallDirs' => { 'modules' => { 'Module::Install::InstallDirs' => 1 }, 'dist_vers' => '0.01', 'cpanid' => 'GBARR', 'dist_file' => 'Module-Install-InstallDirs-0.01.tar.gz' }, 'Convert-UU' => { 'modules' => { 'Convert::UU' => 1 }, 'dist_vers' => '0.52', 'cpanid' => 'ANDK', 'dist_file' => 'Convert-UU-0.52.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Make-CircDepeOne' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Make::CircDepeOne' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Make-CircDepeOne-1.00.tar.gz' }, 'CPAN-Test-Dummy-Perl5-Build' => { 'modules' => { 'CPAN::Test::Dummy::Perl5::Build' => 1 }, 'dist_vers' => '1.03', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-Test-Dummy-Perl5-Build-1.03.tar.gz' }, 'Norge' => { 'modules' => { 'No::KontoNr' => 1, 'No::PersonNr' => 1, 'No::Sort' => 1, 'No::Dato' => 1 }, 'dist_vers' => '1.08', 'cpanid' => 'GAAS', 'dist_file' => 'Norge-1.08.tar.gz' }, 'rlib' => { 'modules' => { 'rlib' => 1 }, 'dist_vers' => '0.02', 'cpanid' => 'GBARR', 'dist_file' => 'rlib-0.02.tar.gz' }, 'LWP-attic' => { 'modules' => { 'LWP::Socket' => 1, 'LWP::SecureSocket' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'GAAS', 'dist_file' => 'LWP-attic-1.00.tar.gz' }, 'Authen-SASL' => { 'modules' => { 'Authen::SASL::Perl::DIGEST_MD5' => 1, 'Authen::SASL::Perl::CRAM_MD5' => 1, 'Authen::SASL::Perl' => 1, 'Authen::SASL' => 1, 'Authen::SASL::Perl::GSSAPI' => 1, 'Authen::SASL::Perl::ANONYMOUS' => 1, 'Authen::SASL::EXTERNAL' => 1, 'Authen::SASL::CRAM_MD5' => 1, 'Authen::SASL::Perl::PLAIN' => 1, 'Authen::SASL::Perl::LOGIN' => 1, 'Authen::SASL::Perl::EXTERNAL' => 1 }, 'dist_vers' => '2.10', 'cpanid' => 'GBARR', 'dist_file' => 'Authen-SASL-2.10.tar.gz' }, 'Bio-Das' => { 'modules' => { 'Bio::Das' => 1, 'Bio::Das::Request::Dsn' => 1, 'Bio::Das::AGPServer::Daemon' => 1, 'Bio::Das::TypeHandler' => 1, 'Bio::Das::HTTP::Fetch' => 1, 'Bio::Das::AGPServer::SQLStorage::MySQL::DB' => 1, 'Bio::Das::Request::Types' => 1, 'Bio::Das::Request' => 1, 'Bio::Das::Request::Dnas' => 1, 'Bio::Das::DSN' => 1, 'Bio::Das::Stylesheet' => 1, 'Bio::Das::AGPServer::Parser' => 1, 'Bio::Das::Util' => 1, 'Bio::Das::FeatureIterator' => 1, 'Bio::Das::Map' => 1, 'Bio::Das::AGPServer::Config' => 1, 'Bio::Das::Request::Stylesheet' => 1, 'Bio::Das::Request::Entry_points' => 1, 'Bio::Das::Request::Features' => 1, 'Bio::Das::Type' => 1, 'Bio::Das::Request::Sequences' => 1, 'Bio::Das::Segment' => 1, 'Bio::Das::AGPServer::SQLStorage' => 1, 'Bio::Das::Feature' => 1, 'Bio::Das::AGPServer::SQLStorage::CSV::DB' => 1, 'Bio::Das::Request::Feature2Segments' => 1 }, 'dist_vers' => '1.03', 'cpanid' => 'LDS', 'dist_file' => 'Bio-Das-1.03.tar.gz' }, 'Include' => { 'modules' => { 'Include' => 1 }, 'dist_vers' => '1.02a', 'cpanid' => 'GBARR', 'dist_file' => 'Include-1.02a.tar.gz' }, 'Boulder' => { 'modules' => { 'Boulder::Genbank' => 1, 'Boulder::LocusLink' => 1, 'Boulder::Medline' => 1, 'Stone' => 1, 'Boulder::Stream' => 1, 'Boulder::Swissprot' => 1, 'Boulder::String' => 1, 'Boulder::Blast::WU' => 1, 'Stone::Cursor' => 1, 'Stone::GB_Sequence' => 1, 'Boulder::Blast::NCBI' => 1, 'Boulder::Store' => 1, 'Boulder::Blast' => 1 }, 'dist_vers' => '1.30', 'cpanid' => 'LDS', 'dist_file' => 'Boulder-1.30.tar.gz' }, 'Bundle-MP3' => { 'modules' => { 'Bundle::MP3' => 1 }, 'dist_vers' => '1.00', 'cpanid' => 'LDS', 'dist_file' => 'Bundle-MP3-1.00.tar.gz' }, 'CPAN' => { 'modules' => { 'CPAN::Nox' => 1, 'CPAN::FirstTime' => 1, 'CPAN::Tarzip' => 1, 'CPAN::Debug' => 1, 'CPAN::Version' => 1, 'CPAN::Admin' => 1, 'CPAN' => 1, 'CPAN::HandleConfig' => 1 }, 'dist_vers' => '1.8802', 'cpanid' => 'ANDK', 'dist_file' => 'CPAN-1.8802.tar.gz' }, 'DB_File-SV18x-kit' => { 'modules' => { 'DB_File::SV18x' => 1 }, 'dist_vers' => '0.06', 'cpanid' => 'ANDK', 'dist_file' => 'DB_File-SV18x-kit-0.06.tar.gz' }, 'Data-Dump' => { 'modules' => { 'Data::Dump' => 1 }, 'dist_vers' => '1.06', 'cpanid' => 'GAAS', 'dist_file' => 'Data-Dump-1.06.tar.gz' }, 'CGI' => { 'modules' => { 'CGI::Fast' => 1, 'CGI::Cookie' => 1, 'CGI::Util' => 1, 'CGI::Pretty' => 1, 'CGI::Push' => 1, 'CGI' => 1, 'CGI::Carp' => 1 }, 'dist_vers' => '3.25', 'cpanid' => 'LDS', 'dist_file' => 'CGI.pm-3.25.tar.gz' } }; $mods = { 'Apache::MP3::L10N::ms' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Net::LDAP::LDIF' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.16' }, 'URI::QueryParam' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Apache::GzipChain' => { 'dist_name' => 'Apache-GzipChain', 'mod_vers' => '1.14' }, 'Lingua::Shakespeare' => { 'dist_name' => 'Lingua-Shakespeare', 'mod_vers' => '1.00' }, 'Tie::MAB2::Dualdb::Recno' => { 'dist_name' => 'MAB2', 'mod_vers' => '1.006' }, 'Bio::Das::Request' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'CPAN::Test::Dummy::Perl5::Build' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Build', 'mod_vers' => '1.03' }, 'Ace::Graphics::Glyph::crossbox' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'LWP::Sink::base64' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'URI::Split' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'DB_File::SV18x' => { 'dist_name' => 'DB_File-SV18x-kit', 'mod_vers' => '0.06' }, 'Apache::HeavyCGI::SquidRemoteAddr' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '1.005' }, 'Apache::MP3::L10N::ru' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Ace::Graphics::Glyph::triangle' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Net::LDAP::Control::Paged' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.02' }, 'URI::_query' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Apache::MP3::L10N::RightToLeft' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020610' }, 'URI::file::QNX' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'IO::Poll' => { 'dist_name' => 'IO', 'mod_vers' => '0.07' }, 'File::CounterFile' => { 'dist_name' => 'File-CounterFile', 'mod_vers' => '1.04' }, 'Ace::Sequence::Homol' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Lisp::Localize' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'Net::FTP::A' => { 'dist_name' => 'libnet', 'mod_vers' => '1.16' }, 'Apache::MP3::Sorted' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '2.02' }, 'Convert::BER' => { 'dist_name' => 'Convert-BER', 'mod_vers' => '1.31' }, 'Apache::Stage' => { 'dist_name' => 'Apache-Stage', 'mod_vers' => '1.20' }, 'Lingua::Shakespeare::Character' => { 'dist_name' => 'Lingua-Shakespeare', 'mod_vers' => undef }, 'No::Sort' => { 'dist_name' => 'Norge', 'mod_vers' => '1.03' }, 'Apache::HeavyCGI::ExePlan' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '1.010' }, 'Font::Metrics::TimesBold' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'IO::Pipe' => { 'dist_name' => 'IO', 'mod_vers' => '1.13' }, 'Date::Language::Afar' => { 'dist_name' => 'TimeDate', 'mod_vers' => '0.99' }, 'CGI::Util' => { 'dist_name' => 'CGI', 'mod_vers' => '1.5' }, 'LWP::Sink::Tee' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTML::PullParser' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '2.09' }, 'Ace::Freesubs' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.00' }, 'URI::rtsp' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'URI::urn::oid' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'LWP::Socket' => { 'dist_name' => 'LWP-attic', 'mod_vers' => '1.24' }, 'List::Util' => { 'dist_name' => 'Scalar-List-Utils', 'mod_vers' => '1.18' }, 'URI::https' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Tie::RDBM' => { 'dist_name' => 'Tie-DBI', 'mod_vers' => '0.70' }, 'HTTPD::UserAdmin' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.51' }, 'Ace::Graphics::Glyph::transcript' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Net::LDAP::Constant' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.04' }, 'URI::mms' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Net::Netrc' => { 'dist_name' => 'libnet', 'mod_vers' => '2.12' }, 'URI::ssh' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Authen::SASL::Perl::EXTERNAL' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.03' }, 'IO::Interface::Simple' => { 'dist_name' => 'IO-Interface', 'mod_vers' => undef }, 'Boulder::LocusLink' => { 'dist_name' => 'Boulder', 'mod_vers' => '1' }, 'URI::file::Win32' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Apache::MP3::L10N::nb' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Tkx::LabEntry' => { 'dist_name' => 'Tkx', 'mod_vers' => undef }, 'Convert::ASN1' => { 'dist_name' => 'Convert-ASN1', 'mod_vers' => '0.20' }, 'Apache::MP3::L10N::sk' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Lingua::Shakespeare::Play' => { 'dist_name' => 'Lingua-Shakespeare', 'mod_vers' => undef }, 'LWP::Sink' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'LWP::Protocol::GHTTP' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Ace::Iterator' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.51' }, 'Date::Language::Brazilian' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'Net::LDAP::Control::Sort' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.02' }, 'Ace::Sequence::Multi' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'HTTPD::GroupAdmin::Text' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.2' }, 'Authen::SASL' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '2.10' }, 'LWP::UA::Cookies' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'GD::Simple' => { 'dist_name' => 'GD', 'mod_vers' => undef }, 'URI::file::Base' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'GD' => { 'dist_name' => 'GD', 'mod_vers' => '2.35' }, 'Boulder::Blast::NCBI' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.02' }, 'Net::FTP::I' => { 'dist_name' => 'libnet', 'mod_vers' => '1.12' }, 'LWP::Protocol::mailto' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Errno' => { 'dist_name' => 'Errno', 'mod_vers' => '1.09' }, 'Bio::Das::Stylesheet' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '1.00' }, 'HTTP::Message' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.57' }, 'Apache::UploadSvr' => { 'dist_name' => 'Apache-UploadSvr', 'mod_vers' => '1.024' }, 'HTTP::Headers::Auth' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.04' }, 'Ace::Sequence' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.51' }, 'PerlBench::Results' => { 'dist_name' => 'perlbench', 'mod_vers' => undef }, 'Lisp::Printer' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.07' }, 'Date::Language::TigrinyaEritrean' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.00' }, 'Ace::Graphics::Track' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Ace::Object' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.66' }, 'URI::nntp' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Regexp' => { 'dist_name' => 'Regexp', 'mod_vers' => '0.004' }, 'LWP::RobotUA' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.27' }, 'Bundle::Net::LDAP' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.02' }, 'Ace::Local' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.05' }, 'LWP::Conn' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Boulder::Medline' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.02' }, 'LWP::Sink::IO' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Lisp::Cons' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'Authen::SASL::Perl::ANONYMOUS' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.03' }, 'Net::NNTP' => { 'dist_name' => 'libnet', 'mod_vers' => '2.23' }, 'Boulder::Swissprot' => { 'dist_name' => 'Boulder', 'mod_vers' => '1' }, 'IO' => { 'dist_name' => 'IO', 'mod_vers' => '1.23' }, 'Unicode::CharName' => { 'dist_name' => 'Unicode-String', 'mod_vers' => '1.07' }, 'LWP::StdSched' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'LWP::Version' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => '0.24' }, 'Font::Metrics::TimesRoman' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Digest::base' => { 'dist_name' => 'Digest', 'mod_vers' => '1.00' }, 'Apache::HeavyCGI::Date' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '1.003' }, 'LWP::Sink::Buffer' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Font::Metrics::Courier' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Ace::Sequence::Feature' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'UDDI::SOAP' => { 'dist_name' => 'UDDI', 'mod_vers' => undef }, 'CPAN::FirstTime' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400879' }, 'MAB2::Record::titel' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.01' }, 'Font::Metrics::HelveticaOblique' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Apache::MP3::L10N::pl' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'URI::urn' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Stone::GB_Sequence' => { 'dist_name' => 'Boulder', 'mod_vers' => undef }, 'PostScript::EPSF' => { 'dist_name' => 'PostScript-EPSF', 'mod_vers' => '0.01' }, 'URI::sip' => { 'dist_name' => 'URI', 'mod_vers' => '0.10' }, 'Ace::SocketServer' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.01' }, 'Font::Metrics::HelveticaBoldOblique' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'URI::telnet' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Stone' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.30' }, 'Net::LDAP::ASN' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.03' }, 'LWP::Sink::qp' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTTP::Headers::ETag' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.04' }, 'Bio::Das::FeatureIterator' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '0.01' }, 'IPC::Semaphore' => { 'dist_name' => 'IPC-SysV', 'mod_vers' => '1.00' }, 'URI::_ldap' => { 'dist_name' => 'URI', 'mod_vers' => '1.10' }, 'Python::Object' => { 'dist_name' => 'pyperl', 'mod_vers' => '1.00' }, 'IPC::SysV' => { 'dist_name' => 'IPC-SysV', 'mod_vers' => '1.03' }, 'Apache::MP3::L10N::it' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'WWW::RobotRules::AnyDBM_File' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.11' }, 'Apache::HeavyCGI::UnmaskQuery' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '1.011' }, 'URI::pop' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'IO::Socket::INET' => { 'dist_name' => 'IO', 'mod_vers' => '1.31' }, 'Date::Language::Amharic' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.00' }, 'Ace::Sequence::Gene' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Ace::Object::Wormbase' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Data::Dump' => { 'dist_name' => 'Data-Dump', 'mod_vers' => '1.06' }, 'Net::LDAP::Util' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.10' }, 'HTTP::Daemon' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.36' }, 'Net::LDAP::Entry' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.22' }, 'URI::_login' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'SHA' => { 'dist_name' => 'SHA', 'mod_vers' => '2.01' }, 'Ace::Model' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.51' }, 'Boulder::Stream' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.07' }, 'Authen::SASL::CRAM_MD5' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '0.99' }, 'Date::Language::French' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.04' }, 'Bio::Das::Request::Feature2Segments' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'URI::Escape' => { 'dist_name' => 'URI', 'mod_vers' => '3.28' }, 'LWP::Sink::_Pipe' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'UDDI' => { 'dist_name' => 'UDDI', 'mod_vers' => '0.03' }, 'Convert::BER::BER' => { 'dist_name' => 'Convert-BER', 'mod_vers' => '1.31' }, 'No::PersonNr' => { 'dist_name' => 'Norge', 'mod_vers' => '1.17' }, 'Net::HTTP::NB' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '0.03' }, 'Devel::Cycle' => { 'dist_name' => 'Devel-Cycle', 'mod_vers' => '1.07' }, 'Apache::MP3::L10N::x_marklar' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Bio::Das::AGPServer::Parser' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'LWP::Protocol::file' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'GFF::Filehandle' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Lisp::Subr::All' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'Boulder::Blast::WU' => { 'dist_name' => 'Boulder', 'mod_vers' => '1' }, 'URI::snews' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Net::LDAP' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.33' }, 'URI::news' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'HTTPD::RealmManager' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.33' }, 'Tie::MAB2::RecnoViaId' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.30' }, 'Net::LDAP::Control::ManageDsaIT' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'Font::Metrics::Helvetica' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'URI::file::Mac' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Net::LDAPI' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.02' }, 'File::Listing' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.15' }, 'URI::rtspu' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Digest::Adler32' => { 'dist_name' => 'Digest-Adler32', 'mod_vers' => '0.03' }, 'CGI::Carp' => { 'dist_name' => 'CGI', 'mod_vers' => '1.29' }, 'LWP::ConnCache' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '0.01' }, 'Ace::Sequence::FeatureList' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'CPAN::Debug' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400844' }, 'Net::LDAP::Extension::SetPassword' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.02' }, 'Bio::Das::Segment' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '0.9' }, 'LWP::Protocol' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.43' }, 'Boulder::Blast' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.01' }, 'Net::LDAP::DSML' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.12' }, 'Apache::MP3::L10N::ko' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Date::Language::Greek' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.00' }, 'Scalar::Util' => { 'dist_name' => 'Scalar-List-Utils', 'mod_vers' => '1.18' }, 'Apache::MP3::L10N::is' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Apache::HeavyCGI::IfModified' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '1.001' }, 'Font::AFM' => { 'dist_name' => 'Font-AFM', 'mod_vers' => '1.19' }, 'Date::Language::Tigrinya' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.00' }, 'Bio::Das::Request::Dnas' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Net::LDAP::Control::EntryChange' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'Apache::MP3::L10N::nb_no' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'LWP::DebugFile' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Digest::SHA1' => { 'dist_name' => 'Digest-SHA1', 'mod_vers' => '2.11' }, 'LWP::Server' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Date::Language::Czech' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'LWP::Protocol::ftp' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Date::Language' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.10' }, 'Apache::HeavyCGI::Debug' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => undef }, 'CPAN::Version' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400844' }, 'HTTP::Headers' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.64' }, 'MAB2::Record::Base' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.03' }, 'LWP::Protocol::ldap' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '1.10' }, 'Devel::Symdump::Export' => { 'dist_name' => 'Devel-Symdump', 'mod_vers' => undef }, 'IO::File' => { 'dist_name' => 'IO', 'mod_vers' => '1.14' }, 'URI::rlogin' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'MAB2::Record::lokal' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.01' }, 'LWP::Conn::FILE' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Bundle::CpanTestDummies' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make', 'mod_vers' => '1.600967' }, 'Apache::MP3::L10N::sl' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'LWP::EventLoop' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => '0.11' }, 'HTTP::Request' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.40' }, 'MIME::Base64::Perl' => { 'dist_name' => 'MIME-Base64-Perl', 'mod_vers' => '1.00' }, 'Bio::Das' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '1.03' }, 'Net::LDAP::Control::ProxyAuth' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '1.05' }, 'URI::_segment' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Bio::Das::HTTP::Fetch' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '1.11' }, 'HTML::TokeParser' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '2.37' }, 'Digest::HMAC_MD5' => { 'dist_name' => 'Digest-HMAC', 'mod_vers' => '1.01' }, 'Lisp::List' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'HTTPD::UserAdmin::SQL' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.2' }, 'Apache::MP3::L10N::es' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Ace::Graphics::Fk' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Tie::MAB2::Dualdb::Id' => { 'dist_name' => 'MAB2', 'mod_vers' => '1.005' }, 'Authen::SASL::Perl::PLAIN' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.04' }, 'WWW::Chat' => { 'dist_name' => 'webchat', 'mod_vers' => undef }, 'Apache::MP3::L10N::no_no' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'URI::_userpass' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Ace::Browser::AceSubs' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.21' }, 'Net::LDAP::Filter' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.14' }, 'URI::file' => { 'dist_name' => 'URI', 'mod_vers' => '4.19' }, 'LWP::Protocol::nogo' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Date::Language::Norwegian' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'Net::LDAP::Control::VLV' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.03' }, 'Bio::Das::Util' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '0.01' }, 'HTTPD::Realm' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.52' }, 'URI::ldaps' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'IO::Socket' => { 'dist_name' => 'IO', 'mod_vers' => '1.30' }, 'HTML::Parser' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '3.55' }, 'Bio::Das::AGPServer::SQLStorage' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'LWP::Authen::basic' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTML::Filter' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '2.11' }, 'Bio::Das::AGPServer::Daemon' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Authen::SASL::Perl' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.05' }, 'Net::LDAP::Search' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.10' }, 'Digest::MD5' => { 'dist_name' => 'Digest-MD5', 'mod_vers' => '2.36' }, 'CGI::Push' => { 'dist_name' => 'CGI', 'mod_vers' => '1.04' }, 'Apache::MP3::L10N::fr' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Net::Domain' => { 'dist_name' => 'libnet', 'mod_vers' => '2.19' }, 'Devel::Symdump' => { 'dist_name' => 'Devel-Symdump', 'mod_vers' => '2.0604' }, 'Ace::Graphics::Glyph::segments' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Bio::Das::AGPServer::Config' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '1.0' }, 'Bio::Das::Request::Features' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Convert::UU' => { 'dist_name' => 'Convert-UU', 'mod_vers' => '0.52' }, 'LWP::Conn::HTTP' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Tkx::MegaConfig' => { 'dist_name' => 'Tkx', 'mod_vers' => undef }, 'MIME::QuotedPrint::Perl' => { 'dist_name' => 'MIME-Base64-Perl', 'mod_vers' => '1.00' }, 'Authen::SASL::EXTERNAL' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '0.99' }, 'LWP::Protocol::http10' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'HTTP::Cookies::Microsoft' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.07' }, 'Apache::HeavyCGI::Exception' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => undef }, 'CPAN::HandleConfig' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400847' }, 'Bio::Das::DSN' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Net::LDAPS' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.05' }, 'Ace::Graphics::Glyph::group' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Date::Language::TigrinyaEthiopian' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.00' }, 'MAB2::Record::pnd' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.01' }, 'Apache::MP3::L10N::nl' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'HTML::LinkExtor' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '1.33' }, 'Bio::Das::Request::Stylesheet' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Gnus::Newsrc' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.04' }, 'Bio::Das::Feature' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '0.90' }, 'Boulder::Genbank' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.1' }, 'LWP::MediaTypes' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.32' }, 'LWP::Protocol::data' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Ace::Graphics::Glyph::box' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Bio::SCF' => { 'dist_name' => 'Bio-SCF', 'mod_vers' => '1.01' }, 'Encode::MAB2table' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.06' }, 'Date::Language::Swedish' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'PerlBench::Stats' => { 'dist_name' => 'perlbench', 'mod_vers' => undef }, 'LWP::Simple' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.41' }, 'URI::file::Unix' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Ace::Graphics::Glyph::toomany' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Digest::file' => { 'dist_name' => 'Digest', 'mod_vers' => '1.00' }, 'LWP::UA::Proxy' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Net::TFTP' => { 'dist_name' => 'Net-TFTP', 'mod_vers' => '0.16' }, 'Text::Shellwords' => { 'dist_name' => 'Text-Shellwords', 'mod_vers' => '1.08' }, 'LWP::MemberMixin' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'URI::rsync' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'LWP::Hooks' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'LWP::Request' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'LWP::UserAgent' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '2.033' }, 'URI::URL' => { 'dist_name' => 'URI', 'mod_vers' => '5.03' }, 'Net::LDAP::Bind' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '1.02' }, 'Ace::RPC' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.00' }, 'Date::Language::Finnish' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'Ace::Browser::GeneSubs' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Perl::Repository::APC' => { 'dist_name' => 'Perl-Repository-APC', 'mod_vers' => '1.221' }, 'CPAN::Test::Dummy::Perl5::Make::CircDepeOne' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make-CircDepeOne', 'mod_vers' => '1.00' }, 'IO::Socket::UNIX' => { 'dist_name' => 'IO', 'mod_vers' => '1.23' }, 'Ace::Graphics::Glyph::anchored_arrow' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Date::Language::English' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'Lisp::Reader' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.10' }, 'Apache::MP3::L10N::hr' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'IO::Interface' => { 'dist_name' => 'IO-Interface', 'mod_vers' => '1.02' }, 'MIME::QuotedPrint' => { 'dist_name' => 'MIME-Base64', 'mod_vers' => '3.07' }, 'Date::Parse' => { 'dist_name' => 'TimeDate', 'mod_vers' => '2.27' }, 'HTTPD::UserAdmin::Text' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.2' }, 'IO::Sockatmark' => { 'dist_name' => 'IO-Sockatmark', 'mod_vers' => '1.00' }, 'Bio::Das::Request::Entry_points' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'WWW::RobotRules' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.33' }, 'IO::Dir' => { 'dist_name' => 'IO', 'mod_vers' => '1.06' }, 'Tie::MAB2::Recno' => { 'dist_name' => 'MAB2', 'mod_vers' => '1.006' }, 'CGI::Cookie' => { 'dist_name' => 'CGI', 'mod_vers' => '1.27' }, 'Ace::Graphics::Glyph::span' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Authen::SASL::Perl::CRAM_MD5' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.03' }, 'Date::Language::Austrian' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'IPC::Msg' => { 'dist_name' => 'IPC-SysV', 'mod_vers' => '1.00' }, 'Apache::Session::Counted' => { 'dist_name' => 'Apache-Session-Counted', 'mod_vers' => '1.118' }, 'LWP::Authen::Digest' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Bundle::CPAN' => { 'dist_name' => 'Bundle-CPAN', 'mod_vers' => '1.854' }, 'Lisp::String' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'Perl::Repository::APC2SVN' => { 'dist_name' => 'Perl-Repository-APC', 'mod_vers' => '1.220' }, 'CPAN' => { 'dist_name' => 'CPAN', 'mod_vers' => '1.8802' }, 'Font::Metrics::CourierBoldOblique' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'LWP::Protocol::cpan' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Font::Metrics::CourierOblique' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Apache::MP3::L10N::no' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'Ace::Graphics::GlyphFactory' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'CPAN::Checksums' => { 'dist_name' => 'CPAN-Checksums', 'mod_vers' => '1.050' }, 'CPAN::DistnameInfo' => { 'dist_name' => 'CPAN-DistnameInfo', 'mod_vers' => '0.06' }, 'Date::Language::Danish' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'HTTP::Status' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.28' }, 'Time::Zone' => { 'dist_name' => 'TimeDate', 'mod_vers' => '2.22' }, 'Font::Metrics::TimesItalic' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Net::LDAP::Control::SortResult' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'Apache::MP3::L10N::uk' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Ace::Graphics::Glyph::ex' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Apache::MP3::L10N::sr' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Net::FTP' => { 'dist_name' => 'libnet', 'mod_vers' => '2.75' }, 'URI::ldap' => { 'dist_name' => 'URI', 'mod_vers' => '1.11' }, 'Net::POP3' => { 'dist_name' => 'libnet', 'mod_vers' => '2.28' }, 'IO::Socket::Multicast' => { 'dist_name' => 'IO-Socket-Multicast', 'mod_vers' => '1.05' }, 'Apache::MP3::L10N::tr' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'LWP::SecureSocket' => { 'dist_name' => 'LWP-attic', 'mod_vers' => '1.03' }, 'Ace::Browser::SiteDefs' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Data::DumpXML' => { 'dist_name' => 'Data-DumpXML', 'mod_vers' => '1.06' }, 'URI::file::OS2' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Apache::MP3::L10N::ca' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'URI::WithBase' => { 'dist_name' => 'URI', 'mod_vers' => '2.19' }, 'LWP::Authen' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Net::LDAP::Message' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '1.08' }, 'Lisp::Interpreter' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.08' }, 'Data::DumpXML::Parser' => { 'dist_name' => 'Data-DumpXML', 'mod_vers' => '1.01' }, 'Net::LDAP::Control::VLVResponse' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.03' }, 'Net::HTTP' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.00' }, 'URI' => { 'dist_name' => 'URI', 'mod_vers' => '1.35' }, 'Apache::MP3::L10N::fi' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'CPAN::Test::Dummy::Perl5::Make' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make', 'mod_vers' => '1.05' }, 'CPAN::Test::Dummy::Perl5::Build::Fails' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Build-Fails', 'mod_vers' => '1.03' }, 'CGI::Fast' => { 'dist_name' => 'CGI', 'mod_vers' => '1.07' }, 'Font::Metrics::HelveticaBold' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Ace::Graphics::Glyph::dot' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'CGI' => { 'dist_name' => 'CGI', 'mod_vers' => '3.25' }, 'Bio::Das::AGPServer::SQLStorage::MySQL::DB' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Apache::MP3' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '3.06' }, 'LWP::MainLoop' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'URI::sips' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Authen::SASL::Perl::LOGIN' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.03' }, 'Module::Install::InstallDirs' => { 'dist_name' => 'Module-Install-InstallDirs', 'mod_vers' => '0.01' }, 'MD5' => { 'dist_name' => 'MD5', 'mod_vers' => '2.03' }, 'Convert::ASN1::parser' => { 'dist_name' => 'Convert-ASN1', 'mod_vers' => undef }, 'Crypt::CBC' => { 'dist_name' => 'Crypt-CBC', 'mod_vers' => '2.22' }, 'Net::FTP::E' => { 'dist_name' => 'libnet', 'mod_vers' => '0.01' }, 'IO::Select' => { 'dist_name' => 'IO', 'mod_vers' => '1.17' }, 'Date::Language::Dutch' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.02' }, 'URI::ftp' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Bio::Das::TypeHandler' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Net::PH' => { 'dist_name' => 'Net-PH', 'mod_vers' => '2.21' }, 'No::Dato' => { 'dist_name' => 'Norge', 'mod_vers' => '1.10' }, 'Ace::Graphics::Glyph::line' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Apache::UploadSvr::Dictionary' => { 'dist_name' => 'Apache-UploadSvr', 'mod_vers' => '1.002' }, 'LWP::Protocol::https' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Apache::UploadSvr::Directory' => { 'dist_name' => 'Apache-UploadSvr', 'mod_vers' => '1.004' }, 'Ace::Graphics::Glyph' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Net::LDAP::Extra' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'Ace::Graphics::Panel' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'HTTP::Date' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.47' }, 'Net::Config' => { 'dist_name' => 'libnet', 'mod_vers' => '1.10' }, 'Net::LDAP::Extension::WhoAmI' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'CPAN::Test::Dummy::Perl5::Make::CircDepeTwo' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make-CircDepeTwo', 'mod_vers' => '1.00' }, 'Apache::MP3::L10N::de' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Date::Language::German' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.02' }, 'Bio::Das::AGPServer::SQLStorage::CSV::DB' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Net::HTTP::Methods' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.02' }, 'Ace' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.89' }, 'LWP::Dump' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Apache::MP3::L10N::nl_be' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'MyPodHtml' => { 'dist_name' => 'perlbench', 'mod_vers' => '1.0503' }, 'Unicode::String' => { 'dist_name' => 'Unicode-String', 'mod_vers' => '2.09' }, 'Ace::Sequence::Transcript' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Ace::Graphics::Glyph::primers' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'LWP::Sink::rot13' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Apache::MP3::L10N::nn' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'Net::FTP::dataconn' => { 'dist_name' => 'libnet', 'mod_vers' => '0.11' }, 'Tie::DBI' => { 'dist_name' => 'Tie-DBI', 'mod_vers' => '1.02' }, 'Apache::MP3::L10N::ga' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Font::Metrics::TimesBoldItalic' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'LWP::UA' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => '1.30' }, 'CPAN::Test::Dummy::Perl5::Make::CircDepeThree' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make-CircDepeThree', 'mod_vers' => '1.00' }, 'Ace::Graphics::Glyph::graded_segments' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'IO::Handle' => { 'dist_name' => 'IO', 'mod_vers' => '1.27' }, 'LWP::Redirect' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Font::Metrics::CourierBold' => { 'dist_name' => 'Font-AFM', 'mod_vers' => undef }, 'Date::Format' => { 'dist_name' => 'TimeDate', 'mod_vers' => '2.22' }, 'URI::Heuristic' => { 'dist_name' => 'URI', 'mod_vers' => '4.17' }, 'HTML::Entities' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '1.35' }, 'URI::Attr' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => '1.07' }, 'Net::LDAP::Schema' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.9903' }, 'URI::http' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'LWP::Conn::_Cmd' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Apache::MP3::L10N' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020601' }, 'Lisp::Special' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'LWP::Protocol::https10' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Lisp::Subr::Core' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.08' }, 'Digest::HMAC' => { 'dist_name' => 'Digest-HMAC', 'mod_vers' => '1.01' }, 'IO::Seekable' => { 'dist_name' => 'IO', 'mod_vers' => '1.10' }, 'CPAN::Test::Dummy::Perl5::BuildOrMake' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-BuildOrMake', 'mod_vers' => '1.02' }, 'B::FindAmpersand' => { 'dist_name' => 'Devel-SawAmpersand', 'mod_vers' => '0.04' }, 'Bundle::MP3' => { 'dist_name' => 'Bundle-MP3', 'mod_vers' => '1.00' }, 'URI::_generic' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Lisp::Symbol' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.06' }, 'LWP::Sink::Monitor' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTML::HeadParser' => { 'dist_name' => 'HTML-Parser', 'mod_vers' => '2.22' }, 'URI::_server' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'HTTP::Cookies' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.39' }, 'HTTP::Request::Common' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.26' }, 'Digest::HMAC_SHA1' => { 'dist_name' => 'Digest-HMAC', 'mod_vers' => '1.01' }, 'Digest::MD2' => { 'dist_name' => 'Digest-MD2', 'mod_vers' => '2.03' }, 'Bio::Das::Map' => { 'dist_name' => 'Bio-Das', 'mod_vers' => '1.01' }, 'HTTP::Response' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.53' }, 'LWP::Protocol::loopback' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Net::LDAP::Extension' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '1.01' }, 'Bio::Das::Request::Sequences' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Bio::SCF::Arrays' => { 'dist_name' => 'Bio-SCF', 'mod_vers' => undef }, 'Apache::MP3::L10N::he' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Apache::MP3::Playlist' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '1.05' }, 'Net::Cmd' => { 'dist_name' => 'libnet', 'mod_vers' => '2.26' }, 'Net::LDAP::Control::PersistentSearch' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'Digest' => { 'dist_name' => 'Digest', 'mod_vers' => '1.15' }, 'Stone::Cursor' => { 'dist_name' => 'Boulder', 'mod_vers' => undef }, 'Date::Language::Gedeo' => { 'dist_name' => 'TimeDate', 'mod_vers' => '0.99' }, 'No::KontoNr' => { 'dist_name' => 'Norge', 'mod_vers' => '1.09' }, 'Bundle::CPANxxl' => { 'dist_name' => 'Bundle-CPAN', 'mod_vers' => '0.1' }, 'IO::String' => { 'dist_name' => 'IO-String', 'mod_vers' => '1.08' }, 'Unicode::Map8' => { 'dist_name' => 'Unicode-Map8', 'mod_vers' => '0.12' }, 'Lisp::Vector' => { 'dist_name' => 'perl-lisp', 'mod_vers' => undef }, 'LWP::Sink::deflate' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTTP::Headers::Util' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.13' }, 'Apache::PassFile' => { 'dist_name' => 'Apache-GzipChain', 'mod_vers' => '0.05' }, 'HTTPD::GroupAdmin' => { 'dist_name' => 'HTTPD-User-Manage', 'mod_vers' => '1.5' }, 'Net::Time' => { 'dist_name' => 'libnet', 'mod_vers' => '2.10' }, 'Apache::HeavyCGI' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '0.013302' }, 'Net::LDAP::RootDSE' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.01' }, 'Apache::MP3::L10N::ar' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'LWP::Debug' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'URI::ldapi' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Tie::MAB2::Id' => { 'dist_name' => 'MAB2', 'mod_vers' => '1.005' }, 'LWP::Conn::_Connect' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'CPAN::Test::Dummy::Perl5::Make::Failearly' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make-Failearly', 'mod_vers' => '1.02' }, 'Ace::Browser::TreeSubs' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'Date::Language::Italian' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'Apache::MP3::L10N::sh' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'Bio::Das::Request::Dsn' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'LWP::Authen::digest' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'Authen::SASL::Perl::GSSAPI' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '0.02' }, 'CPAN::Admin' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400844' }, 'Devel::SawAmpersand' => { 'dist_name' => 'Devel-SawAmpersand', 'mod_vers' => '0.30' }, 'Net::LDAP::Control' => { 'dist_name' => 'perl-ldap', 'mod_vers' => '0.05' }, 'URI::urn::isbn' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Net::HTTPS' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.00' }, 'Tkx' => { 'dist_name' => 'Tkx', 'mod_vers' => '1.04' }, 'Apache::MP3::L10N::zh_tw' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Lisp::Subr::Perl' => { 'dist_name' => 'perl-lisp', 'mod_vers' => '1.04' }, 'PerlBench' => { 'dist_name' => 'perlbench', 'mod_vers' => '0.93' }, 'URI::data' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Array::RefElem' => { 'dist_name' => 'Array-RefElem', 'mod_vers' => '1.00' }, 'Encode::MAB2' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.06' }, 'LWP::Authen::Ntlm' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '0.05' }, 'Net::FTP::L' => { 'dist_name' => 'libnet', 'mod_vers' => '0.01' }, 'Apache::MP3::L10N::fa' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Apache::MP3::L10N::cs' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Ace::Browser::SearchSubs' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.30' }, 'Ace::Sequence::GappedAlignment' => { 'dist_name' => 'AcePerl', 'mod_vers' => '1.20' }, 'Perl::Repository::APC::BAP' => { 'dist_name' => 'Perl-Repository-APC', 'mod_vers' => '1.220' }, 'GD::Polyline' => { 'dist_name' => 'GD', 'mod_vers' => '0.2' }, 'Boulder::Store' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.20' }, 'Authen::SASL::Perl::DIGEST_MD5' => { 'dist_name' => 'Authen-SASL', 'mod_vers' => '1.05' }, 'Apache::MP3::L10N::zh_cn' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'CPAN::Tarzip' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400858' }, 'Apache::MP3::L10N::nn_no' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'Apache::HeavyCGI::Layout' => { 'dist_name' => 'Apache-HeavyCGI', 'mod_vers' => '1.002' }, 'Apache::MP3::L10N::nl_nl' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => undef }, 'MAB2::Record::gkd' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.01' }, 'URI::file::FAT' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Date::Language::Chinese_GB' => { 'dist_name' => 'TimeDate', 'mod_vers' => '1.01' }, 'Apache::MP3::L10N::ja' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020612' }, 'Net::SMTP' => { 'dist_name' => 'libnet', 'mod_vers' => '2.29' }, 'MIME::Base64' => { 'dist_name' => 'MIME-Base64', 'mod_vers' => '3.07' }, 'Apache::MP3::L10N::Aliases' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '1.01' }, 'URI::mailto' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'CGI::Pretty' => { 'dist_name' => 'CGI', 'mod_vers' => '1.08' }, 'Date::Language::Sidama' => { 'dist_name' => 'TimeDate', 'mod_vers' => '0.99' }, 'Convert::Recode' => { 'dist_name' => 'Convert-Recode', 'mod_vers' => '1.04' }, 'Apache::MP3::L10N::en' => { 'dist_name' => 'Apache-MP3', 'mod_vers' => '20020611' }, 'LWP::Protocol::nntp' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Tie::Dir' => { 'dist_name' => 'Tie-Dir', 'mod_vers' => '1.02' }, 'LWP::Sink::identity' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTML::Form' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.054' }, 'LWP::Protocol::gopher' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Ace::Graphics::Glyph::arrow' => { 'dist_name' => 'AcePerl', 'mod_vers' => undef }, 'CPAN::Nox' => { 'dist_name' => 'CPAN', 'mod_vers' => '5.400844' }, 'URI::tn3270' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'URI::gopher' => { 'dist_name' => 'URI', 'mod_vers' => undef }, 'Devel::FindAmpersand' => { 'dist_name' => 'Devel-SawAmpersand', 'mod_vers' => undef }, 'Boulder::String' => { 'dist_name' => 'Boulder', 'mod_vers' => '1.01' }, 'CPAN::Test::Dummy::Perl5::Build::DepeFails' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Build-DepeFails', 'mod_vers' => '1.02' }, 'LWP::Conn::FTP' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'HTTP::Cookies::Netscape' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.26' }, 'Bio::Das::Type' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'LWP::Authen::Basic' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Date::Language::Oromo' => { 'dist_name' => 'TimeDate', 'mod_vers' => '0.99' }, 'CPAN::Test::Dummy::Perl5::Make::Zip' => { 'dist_name' => 'CPAN-Test-Dummy-Perl5-Make-Zip', 'mod_vers' => '1.03' }, 'LWP' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '5.805' }, 'LWP::Sink::HTML' => { 'dist_name' => 'LWPng-alpha', 'mod_vers' => undef }, 'MAB2::Record::swd' => { 'dist_name' => 'MAB2', 'mod_vers' => '0.01' }, 'HTTP::Negotiate' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.16' }, 'Bio::Das::Request::Types' => { 'dist_name' => 'Bio-Das', 'mod_vers' => undef }, 'Apache::UploadSvr::User' => { 'dist_name' => 'Apache-UploadSvr', 'mod_vers' => '1.002' }, 'rlib' => { 'dist_name' => 'rlib', 'mod_vers' => '0.02' }, 'Tie::MAB2::Dualdb' => { 'dist_name' => 'MAB2', 'mod_vers' => undef }, 'LWP::Protocol::http' => { 'dist_name' => 'libwww-perl', 'mod_vers' => undef }, 'Include' => { 'dist_name' => 'Include', 'mod_vers' => '1.02' }, 'Bundle::libnet' => { 'dist_name' => 'Bundle-libnet', 'mod_vers' => '1.00' }, 'Bundle::LWP' => { 'dist_name' => 'libwww-perl', 'mod_vers' => '1.11' }, 'Date::Language::Somali' => { 'dist_name' => 'TimeDate', 'mod_vers' => '0.99' } }; $auths = { 'LDS' => { 'email' => 'lstein@cshl.edu', 'fullname' => 'Lincoln D. Stein' }, 'GAAS' => { 'email' => 'gisle@ActiveState.com', 'fullname' => 'Gisle Aas' }, 'ANDK' => { 'email' => 'andreas.koenig@anima.de', 'fullname' => 'Andreas J. Koenig' }, 'GBARR' => { 'email' => 'gbarr@pobox.com', 'fullname' => 'Graham Barr' } }; sub has_hash_data { my $data = shift; return unless (defined $data and ref($data) eq 'HASH'); return (scalar keys %$data > 0) ? 1 : 0; } sub vcmp { my ($v1, $v2) = @_; # for some reason, on darwin, with some versions, # a trailing 0 in the version numbers causes some # tests to fail. Strip these out for now. if ($v1 =~ /^[0-9,\.]+$/) { $v1 = $v1 + 0; } if ($v2 =~ /^[0-9,\.]+$/) { $v2 = $v2 + 0; } return TestSQL::Version->vcmp($v1, $v2); } # This is borrowed essentially verbatim from CPAN::Version # It's included here so as to not demand a CPAN.pm upgrade package TestSQL::Version; use strict; our $VERSION = 0.1; no warnings; # CPAN::Version::vcmp courtesy Jost Krieger sub vcmp { my ($self, $l, $r) = @_; return 0 if $l eq $r; # short circuit for quicker success for ($l, $r) { next unless tr/.// > 1; s/^v?/v/; 1 while s/\.0+(\d)/.$1/; } if ($l =~ /^v/ <=> $r =~ /^v/) { for ($l, $r) { next if /^v/; $_ = $self->float2vv($_); } } return ( ($l ne "undef") <=> ($r ne "undef") || ($] >= 5.006 && $l =~ /^v/ && $r =~ /^v/ && $self->vstring($l) cmp $self->vstring($r)) || $l <=> $r || $l cmp $r ); } sub vgt { my ($self, $l, $r) = @_; $self->vcmp($l, $r) > 0; } sub vlt { my ($self, $l, $r) = @_; 0 + ($self->vcmp($l, $r) < 0); } sub vstring { my ($self, $n) = @_; $n =~ s/^v// or die "CPAN::Search::Lite::Version::vstring() called with invalid arg [$n]"; { no warnings; pack "U*", split /\./, $n; } } # vv => visible vstring sub float2vv { my ($self, $n) = @_; my ($rev) = int($n); $rev ||= 0; my ($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits to limit # architecture influence $mantissa ||= 0; $mantissa .= "0" while length($mantissa) % 3; my $ret = "v" . $rev; while ($mantissa) { $mantissa =~ s/(\d{1,3})// or die "Panic: length>0 but not a digit? mantissa[$mantissa]"; $ret .= "." . int($1); } # warn "n[$n]ret[$ret]"; $ret; } sub readable { my ($self, $n) = @_; $n =~ /^([\w\-\+\.]+)/; return $1 if defined $1 && length($1) > 0; # if the first user reaches version v43, he will be treated as "+". # We'll have to decide about a new rule here then, depending on what # will be the prevailing versioning behavior then. if ($] < 5.006) { # or whenever v-strings were introduced # we get them wrong anyway, whatever we do, because 5.005 will # have already interpreted 0.2.4 to be "0.24". So even if he # indexer sends us something like "v0.2.4" we compare wrongly. # And if they say v1.2, then the old perl takes it as "v12" warn("Suspicious version string seen [$n]\n"); return $n; } my $better = sprintf "v%vd", $n; return $better; } 1; CPAN-SQLite-0.217/t/lib/TestShell.pm0000644000175600017560000000062113424206717020004 0ustar cpantestercpantester# $Id: TestShell.pm 71 2019-01-15 01:46:34Z stro $ package TestShell; use strict; use warnings; use CPAN; # CPAN FrontEnd (default: CPAN::Shell) prints some information to STDOUT, which # can brake TAP output and mark some tests as out-of-sequence. To avoid this # problem, myprint and mywarn should be silenced. $CPAN::FrontEnd = 'TestShell'; sub myprint { return; } sub mywarn { return; } CPAN-SQLite-0.217/t/author-pod-syntax.t0000644000175600017560000000045413424206717020570 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use strict; use warnings; use Test::More; use Test::Pod 1.41; all_pod_files_ok(); CPAN-SQLite-0.217/t/08circular_references.t0000644000175600017560000000415213424206717021336 0ustar cpantestercpantester# $Id: 08circular_references.t 73 2019-01-23 22:29:38Z stro $ use strict; use warnings; use Test::Memory::Cycle; use Test::More; use Cwd; use File::Spec::Functions; use File::Path; use CPAN::DistnameInfo; use FindBin; use lib "$FindBin::Bin/lib"; use TestSQL qw($mods $auths $dists has_hash_data); use CPAN::SQLite::Info; use TestShell; plan tests => 22; my $cwd = getcwd; my $CPAN = catdir $cwd, 't', 'cpan'; my $db_dir = catdir $cwd, 't', 'cpan-t-08'; my $log_dir = $db_dir; my $filename = 'cpansql.db'; my $filepath = catfile $db_dir, $filename; unlink $filepath if -e $filepath; mkdir $db_dir; ok(-d $CPAN); use_ok 'CPAN::SQLite::Info'; ok my $info = CPAN::SQLite::Info->new( 'CPAN' => $CPAN, 'db_dir' => $db_dir, 'db_name' => $filename, ); isa_ok($info, 'CPAN::SQLite::Info'); $info->fetch_info(); memory_cycle_ok($info); use_ok 'CPAN::SQLite::DBI::Index'; ok my $cdbi = CPAN::SQLite::DBI::Index->new( CPAN => $CPAN, db_name => $filename, db_dir => $db_dir, ); isa_ok($cdbi, 'CPAN::SQLite::DBI::Index'); # Check for circular references on Index level use_ok 'CPAN::SQLite::Index'; my $index = CPAN::SQLite::Index->new( 'CPAN' => $CPAN, 'db_dir' => $db_dir, 'db_name' => $filename, 'setup' => 1, ); isa_ok($index, 'CPAN::SQLite::Index'); memory_cycle_ok($index); ok $index->fetch_info() => 'fetch_info'; memory_cycle_ok($index); ok $index->populate() => 'populate'; memory_cycle_ok($index); # Now, that the populate is run, we can run state # Check for circlular references on State level use_ok 'CPAN::SQLite::State'; my $state = CPAN::SQLite::State->new( db_name => $filename, db_dir => $db_dir, CPAN => $CPAN, index => $index->{'index'}, ); isa_ok($state, 'CPAN::SQLite::State'); $state->state(); memory_cycle_ok($state); # Check for circular references on Populate level use_ok 'CPAN::SQLite::Populate'; my $pop = CPAN::SQLite::Populate->new( db_name => $filename, db_dir => $db_dir, setup => 1, CPAN => $CPAN, index => $index->{'index'}, ); isa_ok($pop, 'CPAN::SQLite::Populate'); $pop->populate(); memory_cycle_ok($pop); ok(1); done_testing(); CPAN-SQLite-0.217/t/release-changes_has_content.t0000644000175600017560000000230713424206717022574 0ustar cpantestercpantester BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } use Test::More tests => 2; note 'Checking Changes'; my $changes_file = 'Changes'; my $newver = '0.217'; my $trial_token = '-TRIAL'; my $encoding = 'UTF-8'; SKIP: { ok(-e $changes_file, "$changes_file file exists") or skip 'Changes is missing', 1; ok(_get_changes($newver), "$changes_file has content for $newver"); } done_testing; sub _get_changes { my $newver = shift; # parse changelog to find commit message open(my $fh, '<', $changes_file) or die "cannot open $changes_file: $!"; my $changelog = join('', <$fh>); if ($encoding) { require Encode; $changelog = Encode::decode($encoding, $changelog, Encode::FB_CROAK()); } close $fh; my @content = grep { /^$newver(?:$trial_token)?(?:\s+|$)/ ... /^\S/ } # from newver to un-indented split /\n/, $changelog; shift @content; # drop the version line # drop unindented last line and trailing blank lines pop @content while ( @content && $content[-1] =~ /^(?:\S|\s*$)/ ); # return number of non-blank lines return scalar @content; } CPAN-SQLite-0.217/t/release-distmeta.t0000644000175600017560000000040113424206717020402 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } # This file was automatically generated by Dist::Zilla::Plugin::MetaTests. use Test::CPAN::Meta; meta_yaml_ok(); CPAN-SQLite-0.217/t/04search_everything.t0000644000175600017560000000232713424206717021040 0ustar cpantestercpantester# $Id: 04search_everything.t 71 2019-01-15 01:46:34Z stro $ use strict; use warnings; use Test::More; use Cwd; use CPAN::SQLite::Search; use FindBin; use File::Spec::Functions; use lib "$FindBin::Bin/lib"; use TestSQL qw($dists $mods $auths vcmp); use CPAN::SQLite::DBI::Search; use CPAN::SQLite::DBI qw($dbh); my $cwd = getcwd; my $CPAN = catfile $cwd, 't', 'cpan'; plan tests => 14; my $db_name = 'cpandb.sql'; my $db_dir = $cwd; my $cdbi = CPAN::SQLite::DBI::Search->new( db_name => $db_name, db_dir => $db_dir ); my $query = CPAN::SQLite::Search->new( db_name => $db_name, db_dir => $db_dir ); ok(defined $query); isa_ok($query, 'CPAN::SQLite::Search'); my $results; my $everything = q{.}; my $all_res_qty = { 'author' => 4, 'dist' => 92, 'module' => 544, }; for my $mode (qw(author dist module)) { { my $type = 'name'; $query->query(mode => $mode, $type => $everything); $results = $query->{results}; ok(not defined $results); } { my $type = 'query'; $query->query(mode => $mode, $type => $everything); $results = $query->{results}; ok(defined $results); isa_ok($results, 'ARRAY'); is(scalar @{$results}, $all_res_qty->{$mode}, 'Correct number of query results'); } } CPAN-SQLite-0.217/t/testrules.yml0000644000175600017560000000062513424206717017552 0ustar cpantestercpantester--- seq: # tests that are not parallel-ready (will run in isolation) - seq: - ** - t/02drop.t - t/03info.t - t/04search.t - t/04search_everything.t - t/05meta_new.t - t/05meta_update.t # tests that can run in parallel - par: # wildcard for everything else - ** CPAN-SQLite-0.217/t/04search.t0000644000175600017560000001101313424206717016564 0ustar cpantestercpantester# $Id: 04search.t 71 2019-01-15 01:46:34Z stro $ use strict; use warnings; use Test::More; use Cwd; use CPAN::SQLite::Search; use FindBin; use File::Spec::Functions; use lib "$FindBin::Bin/lib"; use TestSQL qw($dists $mods $auths vcmp); use CPAN::SQLite::DBI::Search; use CPAN::SQLite::DBI qw($dbh); my $cwd = getcwd; my $CPAN = catfile $cwd, 't', 'cpan'; plan tests => 2668; my $db_name = 'cpandb.sql'; my $db_dir = $cwd; my $cdbi = CPAN::SQLite::DBI::Search->new( db_name => $db_name, db_dir => $db_dir ); my $query = CPAN::SQLite::Search->new( db_name => $db_name, db_dir => $db_dir ); ok(defined $query); isa_ok($query, 'CPAN::SQLite::Search'); my $results; for my $cpanid (keys %$auths) { $query->query(mode => 'author', name => $cpanid); $results = $query->{results}; ok(defined $results); is($results->{cpanid}, $cpanid); for (qw(fullname email)) { is($results->{$_}, $auths->{$cpanid}->{$_}); } } for my $dist_name (keys %$dists) { $query->query(mode => 'dist', name => $dist_name); $results = $query->{results}; ok(defined $results); is($results->{dist_name}, $dist_name); foreach (qw(dist_file dist_abs dist_dslip cpanid)) { next unless $dists->{$dist_name}->{$_}; is($results->{$_}, $dists->{$dist_name}->{$_}); } next unless $dists->{$dist_name}->{dist_vers}; is(vcmp($results->{dist_vers}, $dists->{$dist_name}->{dist_vers}), 0); } foreach my $mod_name (keys %$mods) { $query->query(mode => 'module', name => $mod_name); $results = $query->{results}; ok(defined $results); is($results->{mod_name}, $mod_name); foreach (qw(mod_abs dist_name)) { next unless $mods->{$mod_name}->{$_}; is($results->{$_}, $mods->{$mod_name}->{$_}); } next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($results->{mod_vers}, $mods->{$mod_name}->{mod_vers}), 0); } my %keys = map { $_ => 1 } qw(email fullname); for my $auth_search (qw(G G\w+A)) { my $auth_searches = []; for my $cpanid (keys %$auths) { next unless ($cpanid =~ /$auth_search/i or $auths->{$cpanid}->{fullname} =~ /$auth_search/i); push @$auth_searches, { cpanid => $cpanid, %{ $auths->{$cpanid} } }; } $query->query(mode => 'author', query => $auth_search); $results = $query->{results}; ok(defined $results); isa_ok($results, 'ARRAY'); is(scalar @$results, scalar @$auth_searches); compare_arrays($results, $auth_searches, \%keys); } %keys = map { $_ => 1 } qw(dist_vers cpanid dist_file); for my $dist_search (qw(apache test.*perl)) { my $dist_searches = []; for my $dist_name (keys %$dists) { next unless $dist_name =~ /$dist_search/i; push @$dist_searches, { dist_name => $dist_name, %{ $dists->{$dist_name} } }; } $query->query(mode => 'dist', query => $dist_search); $results = $query->{results}; ok(defined $results); isa_ok($results, 'ARRAY'); is(scalar @$results, scalar @$dist_searches); compare_arrays($results, $dist_searches, \%keys); } %keys = map { $_ => 1 } qw(dist_name mod_vers); for my $mod_search (qw(net ^uri::.*da)) { my $mod_searches = []; for my $mod_name (keys %$mods) { next unless $mod_name =~ /$mod_search/i; push @$mod_searches, { mod_name => $mod_name, %{ $mods->{$mod_name} } }; } $query->query(mode => 'module', query => $mod_search); $results = $query->{results}; ok(defined $results); isa_ok($results, 'ARRAY'); is(scalar @$results, scalar @$mod_searches); compare_arrays($results, $mod_searches, \%keys); } my $no_such = 'ZZZ'; for my $mode (qw(author dist module)) { for my $type (qw(name query)) { $query->query(mode => $mode, $type => $no_such); $results = $query->{results}; ok(not defined $results); } } # compare two array of hashes, disregarding order, with the # hashes having the same keys # the first argument is what's received, the 2nd what's expected # and the third the expected keys that should match sub compare_arrays { my ($x, $y, $keys) = @_; my $N = scalar @$x; for (my $i = 0 ; $i < $N ; $i++) { my $href = $x->[$i]; for my $key (keys %$href) { next unless defined $keys->{$key}; next unless $x->[$i]->{$key}; my $flag = 0; for (my $j = 0 ; $j < $N ; $j++) { if ($y->[$j]->{$key}) { my $test = ($key =~ /vers$/) ? (vcmp($x->[$i]->{$key}, $y->[$j]->{$key}) == 0) : $x->[$i]->{$key} eq $y->[$j]->{$key}; if ($test) { pass("Found matching $key"); $flag++; last; } } } unless ($flag) { fail(qq{Matching $key not found}); } } } } CPAN-SQLite-0.217/t/00-report-prereqs.t0000644000175600017560000001342613424206717020374 0ustar cpantestercpantester#!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.027 use Test::More tests => 1; use ExtUtils::MakeMaker; use File::Spec; # from $version::LAX my $lax_version_re = qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? | (?:\.[0-9]+) (?:_[0-9]+)? ) | (?: v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? | (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? ) )/x; # hide optional CPAN::Meta modules from prereq scanner # and check if they are available my $cpan_meta = "CPAN::Meta"; my $cpan_meta_pre = "CPAN::Meta::Prereqs"; my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic # Verify requirements? my $DO_VERIFY_PREREQS = 1; sub _max { my $max = shift; $max = ( $_ > $max ) ? $_ : $max for @_; return $max; } sub _merge_prereqs { my ($collector, $prereqs) = @_; # CPAN::Meta::Prereqs object if (ref $collector eq $cpan_meta_pre) { return $collector->with_merged_prereqs( CPAN::Meta::Prereqs->new( $prereqs ) ); } # Raw hashrefs for my $phase ( keys %$prereqs ) { for my $type ( keys %{ $prereqs->{$phase} } ) { for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; } } } return $collector; } my @include = qw( ); my @exclude = qw( ); # Add static prereqs to the included modules list my $static_prereqs = do './t/00-report-prereqs.dd'; # Merge all prereqs (either with ::Prereqs or a hashref) my $full_prereqs = _merge_prereqs( ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), $static_prereqs ); # Add dynamic prereqs to the included modules list (if we can) my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; my $cpan_meta_error; if ( $source && $HAS_CPAN_META && (my $meta = eval { CPAN::Meta->load_file($source) } ) ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } else { $cpan_meta_error = $@; # capture error from CPAN::Meta->load_file($source) $source = 'static metadata'; } my @full_reports; my @dep_errors; my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; # Add static includes into a fake section for my $mod (@include) { $req_hash->{other}{modules}{$mod} = 0; } for my $phase ( qw(configure build test runtime develop other) ) { next unless $req_hash->{$phase}; next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); for my $type ( qw(requires recommends suggests conflicts modules) ) { next unless $req_hash->{$phase}{$type}; my $title = ucfirst($phase).' '.ucfirst($type); my @reports = [qw/Module Want Have/]; for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { next if $mod eq 'perl'; next if grep { $_ eq $mod } @exclude; my $file = $mod; $file =~ s{::}{/}g; $file .= ".pm"; my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; my $want = $req_hash->{$phase}{$type}{$mod}; $want = "undef" unless defined $want; $want = "any" if !$want && $want == 0; my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; if ($prefix) { my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); $have = "undef" unless defined $have; push @reports, [$mod, $want, $have]; if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { if ( $have !~ /\A$lax_version_re\z/ ) { push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; } elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { push @dep_errors, "$mod version '$have' is not in required range '$want'"; } } } else { push @reports, [$mod, $want, "missing"]; if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { push @dep_errors, "$mod is not installed ($req_string)"; } } } if ( @reports ) { push @full_reports, "=== $title ===\n\n"; my $ml = _max( map { length $_->[0] } @reports ); my $wl = _max( map { length $_->[1] } @reports ); my $hl = _max( map { length $_->[2] } @reports ); if ($type eq 'modules') { splice @reports, 1, 0, ["-" x $ml, "", "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s\n", -$ml, $_->[0], $hl, $_->[2]) } @reports; } else { splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; } push @full_reports, "\n"; } } } if ( @full_reports ) { diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; } if ( $cpan_meta_error || @dep_errors ) { diag "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n"; } if ( $cpan_meta_error ) { my ($orig_source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; diag "\nCPAN::Meta->load_file('$orig_source') failed with: $cpan_meta_error\n"; } if ( @dep_errors ) { diag join("\n", "\nThe following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass; # vim: ts=4 sts=4 sw=4 et: CPAN-SQLite-0.217/t/00-all_prereqs.t0000644000175600017560000000533113424206717017707 0ustar cpantestercpantester#!perl use strict; use warnings; # This doesn't use Test::More because I don't want to clutter %INC # with modules that aren't prerequisites. my $test = 0; my $tests_completed; sub ok ($$) { my ($ok, $name) = @_; printf "%sok %d - %s\n", ($ok ? '' : 'not '), ++$test, $name; return $ok; } # end ok END { ok(0, 'unknown failure') unless defined $tests_completed; print "1..$tests_completed\n"; } sub get_version { my ($package) = @_; local $@; my $version = eval { $package->VERSION }; defined $version ? $version : 'undef'; } # end get_version TEST: { ok(open(META, ') { last if /^\s*"prereqs" : \{\s*\z/; } # end while ok(defined $_, 'found prereqs') or last TEST; while () { last if /^\s*\},?\s*\z/; ok(/^\s*"(.+)" : \{\s*\z/, "found phase $1") or last TEST; my $phase = $1; while () { last if /^\s*\},?\s*\z/; next if /^\s*"[^"]+"\s*:\s*\{\s*\},?\s*\z/; ok(/^\s*"(.+)" : \{\s*\z/, "found relationship $phase $1") or last TEST; my $rel = $1; while () { last if /^\s*\},?\s*\z/; ok(/^\s*"([^"]+)"\s*:\s*(\S+?),?\s*\z/, "found prereq $1") or last TEST; my ($prereq, $version) = ($1, $2); next if $phase ne 'runtime' or $prereq eq 'perl'; # Need a special case for if.pm, because "require if;" is a syntax error. my $loaded = ($prereq eq 'if') ? eval "require '$prereq.pm'; 1" : eval "require $prereq; 1"; if ($rel eq 'requires') { ok($loaded, "loaded $prereq") or print STDERR "\n# ERROR: Wanted: $prereq $version\n"; } else { ok(1, ($loaded ? 'loaded' : 'failed to load') . " $prereq"); } if ($loaded and not ($version eq '"0"' or eval "'$prereq'->VERSION($version); 1")) { printf STDERR "\n# WARNING: Got: %s %s\n# Wanted: %s %s\n", $prereq, get_version($prereq), $prereq, $version; } } # end while in prerequisites } # end while in relationship } # end while in phase close META; # Print version of all loaded modules: if ($ENV{AUTOMATED_TESTING} or (@ARGV and ($ARGV[0] eq '-v' or $ARGV[0] eq '--verbose'))) { print STDERR "# Listing %INC\n"; my @packages = grep { s/\.pm\Z// and do { s![\\/]!::!g; 1 } } sort keys %INC; my $len = 0; for (@packages) { $len = length if length > $len } $len = 68 if $len > 68; for my $package (@packages) { printf STDERR "# %${len}s %s\n", $package, get_version($package); } } # end if AUTOMATED_TESTING } # end TEST $tests_completed = $test; CPAN-SQLite-0.217/t/02drop.t0000644000175600017560000000133213424206717016264 0ustar cpantestercpantester# $Id: 02drop.t 71 2019-01-15 01:46:34Z stro $ use strict; use warnings; use Test::More; use DBD::SQLite; plan tests => 6; my $db_name = 't/dot-cpan/cpandb.sql'; my $dbh = DBI->connect("DBI:SQLite:$db_name", { RaiseError => 1, AutoCommit => 0 }) or die "Cannot connect to $db_name"; ok $dbh ; isa_ok($dbh, 'DBI::db'); my @tables = qw(mods auths dists info); my $sql = 'SELECT name FROM sqlite_master WHERE type="table" AND name=?'; my $sth = $dbh->prepare($sql); foreach my $table (@tables) { $sth->execute($table); my $results = $sth->fetchrow_array; if ($results) { $dbh->do(qq{drop table $table}); pass('Drop ' . $table); } else { pass('Skip ' . $table); } } $sth->finish; $dbh->disconnect; CPAN-SQLite-0.217/t/07download.t0000644000175600017560000000171413424206717017140 0ustar cpantestercpantester# $Id: 07download.t 73 2019-01-23 22:29:38Z stro $ use strict; use warnings; use Test::More; use Cwd; use File::Spec::Functions; use File::Path; use FindBin; use lib "$FindBin::Bin/lib", 'lib', '../lib'; use TestShell; use CPAN::SQLite::Index; plan tests => 4; my $cwd = getcwd; my $db_dir = catdir $cwd, 't', 'cpan-t-07'; my $CPAN = $db_dir; my $log_dir = $db_dir; my $filename = 'cpansql.db'; my $filepath = catfile $db_dir, $filename; unlink $filepath if -e $filepath; mkdir $db_dir; ok(-d $CPAN); ok(-d $db_dir); my $info = CPAN::SQLite::Index->new( 'CPAN' => $CPAN, 'db_dir' => $db_dir, 'db_name' => $filename, 'urllist' => ['http://search.cpan.org/CPAN/'], ); isa_ok($info, 'CPAN::SQLite::Index'); SKIP: { $ENV{'CPAN_SQLITE_DOWNLOAD'} = 1; $ENV{'CPAN_SQLITE_DOWNLOAD_URL'} = 'http://cpansqlite.trouchelle.com/'; my $rv = $info->download_index(); skip 'Potential connection problems', 1 unless $rv; ok(-e $filepath); } CPAN-SQLite-0.217/t/release-kwalitee.t0000644000175600017560000000050413424206717020401 0ustar cpantestercpantester BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } # this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.12 use strict; use warnings; use Test::More 0.88; use Test::Kwalitee 1.21 'kwalitee_ok'; kwalitee_ok(); done_testing; CPAN-SQLite-0.217/t/05meta_new.t0000644000175600017560000002212713424206717017127 0ustar cpantestercpantester# $Id: 05meta_new.t 76 2019-01-24 19:50:04Z stro $ use strict; use warnings; use Test::More; use File::Spec; use Cwd; use File::Copy; use File::Path; use Config; use FindBin; use CPAN::DistnameInfo; use CPAN::SQLite::Util qw(download); use lib 't/lib'; use TestSQL qw($mods $auths $dists has_hash_data vcmp); use TestShell; $ENV{'CPAN_SQLITE_DOWNLOAD'} = $ENV{'CPAN_SQLITE_DOWNLOAD_URL'} = undef; my $cwd = cwd; my $path_sep = $Config{path_sep} || ':'; $ENV{PERL5LIB} = join $path_sep, (File::Spec->catdir($cwd, qw(t dot-cpan)), map { File::Spec->catdir($cwd, 'blib', $_) } qw(arch lib)), $ENV{PERL5LIB} || ''; # so that a real $HOME/.cpan isn't used $ENV{HOME} = File::Spec->catdir($cwd, qw(t dot-cpan)); # hack to get tests to pass on Darwin, as File::HomeDir # doesn't use HOME or PERL5LIB to specify where CPAN::MyConfig lives $ENV{CPAN_SQLITE_TESTING} = 1; my $from = File::Spec->catfile($cwd, qw(t dot-cpan CPAN TestConfig.pm)); my $to = File::Spec->catfile($cwd, qw(t dot-cpan CPAN MyConfig.pm)); unless (-f $to) { copy($from, $to) or die qq{Cannot cp $from to $to: $!}; } unshift @INC, File::Spec->catdir($cwd, qw(t dot-cpan)); eval { require CPAN::MyConfig; require CPAN; require CPAN::HandleConfig; require CPAN::Version; }; my $min_cpan_v = '1.88_64'; my $actual_cpan_v = $CPAN::VERSION; # older CPAN::Version's seem to have problems with underscores $min_cpan_v =~ s/_//g; $actual_cpan_v =~ s/_//g if $actual_cpan_v; if ($@ or CPAN::Version->vcmp($actual_cpan_v, $min_cpan_v) < 0) { plan skip_all => qq{Need CPAN.pm version $min_cpan_v or higher}; } else { plan tests => 2768; } # verify that we loaded the right CPAN::Config is($CPAN::Config->{QAZWSX}, 'PLMOKN'); my $home = $CPAN::Config->{cpan_home}; my $sources = $CPAN::Config->{keep_source_where}; my @dirs = map { File::Spec->catdir($sources, $_) } qw(authors modules); for (@dirs) { next if -d $_; mkpath($_) or die qq{Cannot mkpath $_: $!}; } my $db = File::Spec->catfile($home, 'cpandb.sql'); unlink($db) if -e $db; { my $mod_name = q{Date::Language}; my $mod = CPAN::Shell->expand("Module", $mod_name); is(-e $db, 1, "$db exists"); is(-s $db > 0, 1, "$db has non-zero size"); is($mod->id, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } { my $dist_file = q{TimeDate-1.16.tar.gz}; my $dist_name = q{TimeDate}; my $cpanid = q{GBARR}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } for my $mod_search (qw(Apache::)) { for my $mod (CPAN::Shell->expand("Module", "/$mod_search/")) { my $mod_name = $mod->id; is(defined $mods->{$mod_name}, 1, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } } { my $dist_file = q{Apache-GzipChain-1.14.tar.gz}; my $dist_name = q{Apache-GzipChain}; my $cpanid = q{ANDK}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } for my $dist_search (qw(CPAN-Test)) { for my $dist (CPAN::Shell->expand("Distribution", "/$dist_search/")) { my $id = $dist->id; my $pathname = "authors/id/$id"; my $d = CPAN::DistnameInfo->new($pathname); my $dist_name = $d->dist; is(defined $dists->{$dist_name}, 1, $dist_name); my $cpanid = $dist->author->id; my $download = download($cpanid, $dists->{$dist_name}->{dist_file}); is($id, $download, $download); is($cpanid, $dists->{$dist_name}->{cpanid}, $dists->{$dist_name}->{cpanid}); my %mods = map { $_ => 1 } $dist->containsmods; my $mods = $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } } { my $dist_file = q{CPAN-Test-Dummy-Perl5-Make-1.05.tar.gz}; my $dist_name = q{CPAN-Test-Dummy-Perl5-Make}; my $cpanid = q{ANDK}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } foreach my $cpanid (keys %$auths) { my $auth = CPAN::Shell->expand("Author", $cpanid); is($auth->id, $cpanid, "verify '$cpanid'"); foreach (qw(fullname email)) { next unless $auths->{$cpanid}->{$_}; is($auth->$_, $auths->{$cpanid}->{$_}); } } foreach my $mod_name (keys %$mods) { next if $mod_name =~ /^Bundle/; my $mod = CPAN::Shell->expand("Module", $mod_name); is($mod->id, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } foreach my $mod_name (keys %$mods) { next unless ($mod_name =~ /^Bundle::/); my $bundle = CPAN::Shell->expand("Bundle", $mod_name); is($bundle->id, $mod_name); like($bundle->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($bundle->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } for my $dist_name (keys %$dists) { my $dist_file = $dists->{$dist_name}->{dist_file}; my $cpanid = $dists->{$dist_name}->{cpanid}; my $query = "$cpanid/$dist_file"; my $dist = CPAN::Shell->expand("Distribution", $query); my $dist_id = download($cpanid, $dists->{$dist_name}->{dist_file}); is($dist->id, $dist_id); is($dist->author->id, $cpanid); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } for my $mod_search (qw(net ^uri::.*da)) { for my $mod (CPAN::Shell->expand("Module", "/$mod_search/")) { my $mod_name = $mod->id; is(defined $mods->{$mod_name}, 1, $mod_name); like($mod->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($mod->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } } for my $mod_search (qw(CPAN MP)) { for my $bundle (CPAN::Shell->expand("Bundle", "/$mod_search/")) { my $mod_name = $bundle->id; is(defined $mods->{$mod_name}, 1, $mod_name); like($bundle->cpan_file, qr/$mods->{$mod_name}->{dist_name}/, $mods->{$mod_name}->{dist_name}); next unless $mods->{$mod_name}->{mod_vers}; is(vcmp($bundle->cpan_version, $mods->{$mod_name}->{mod_vers}), 0, "version $mods->{$mod_name}->{mod_vers} for '$mod_name'"); } } for my $dist_search (qw(apache test.*perl)) { for my $dist (CPAN::Shell->expand("Distribution", "/$dist_search/")) { my $id = $dist->id; my $pathname = "authors/id/$id"; my $d = CPAN::DistnameInfo->new($pathname); my $dist_name = $d->dist; is(defined $dists->{$dist_name}, 1, $dist_name); my $cpanid = $dist->author->id; my $download = download($cpanid, $dists->{$dist_name}->{dist_file}); is($id, $download, $download); is($cpanid, $dists->{$dist_name}->{cpanid}, $dists->{$dist_name}->{cpanid}); my %mods = map { $_ => 1 } $dist->containsmods; foreach my $mod (keys %{ $dists->{$dist_name}->{modules} }) { is($mods{$mod}, 1, $mod); } } } for my $auth_search (qw(G G\w+A)) { for my $auth (CPAN::Shell->expand("Author", "/$auth_search/")) { my $id = $auth->id; is(defined $auths->{$id}, 1, $id); foreach (qw(fullname email)) { next unless $auths->{$id}->{$_}; is($auth->$_, $auths->{$id}->{$_}, $auths->{$id}->{$_}); } } } my $no_such = 'ZZZ'; foreach my $type (qw(Author Distribution Module)) { my $query = ($type eq 'Distribution') ? "/$no_such/" : $no_such; my $item = CPAN::Shell->expand($type, $query); is($item, undef, "no such $type"); next if $type eq 'Distribution'; $item = CPAN::Shell->expand($type, "/$no_such/"); is($item, undef, "no such $type"); } # Local Variables: # mode: cperl # cperl-indent-level: 2 # End: CPAN-SQLite-0.217/t/000-report-versions.t0000644000175600017560000003127013424206717020640 0ustar cpantestercpantester#!perl use warnings; use strict; use Test::More 0.94; # Include a cut-down version of YAML::Tiny so we don't introduce unnecessary # dependencies ourselves. package Local::YAML::Tiny; use strict; use Carp 'croak'; # UTF Support? sub HAVE_UTF8 () { $] >= 5.007003 } BEGIN { if ( HAVE_UTF8 ) { # The string eval helps hide this from Test::MinimumVersion eval "require utf8;"; die "Failed to load UTF-8 support" if $@; } # Class structure require 5.004; $YAML::Tiny::VERSION = '1.40'; # Error storage $YAML::Tiny::errstr = ''; } # Printable characters for escapes my %UNESCAPES = ( z => "\x00", a => "\x07", t => "\x09", n => "\x0a", v => "\x0b", f => "\x0c", r => "\x0d", e => "\x1b", '\\' => '\\', ); ##################################################################### # Implementation # Create an empty YAML::Tiny object sub new { my $class = shift; bless [ @_ ], $class; } # Create an object from a file sub read { my $class = ref $_[0] ? ref shift : shift; # Check the file my $file = shift or return $class->_error( 'You did not specify a file name' ); return $class->_error( "File '$file' does not exist" ) unless -e $file; return $class->_error( "'$file' is a directory, not a file" ) unless -f _; return $class->_error( "Insufficient permissions to read '$file'" ) unless -r _; # Slurp in the file local $/ = undef; local *CFG; unless ( open(CFG, $file) ) { return $class->_error("Failed to open file '$file': $!"); } my $contents = ; unless ( close(CFG) ) { return $class->_error("Failed to close file '$file': $!"); } $class->read_string( $contents ); } # Create an object from a string sub read_string { my $class = ref $_[0] ? ref shift : shift; my $self = bless [], $class; my $string = $_[0]; unless ( defined $string ) { return $self->_error("Did not provide a string to load"); } # Byte order marks # NOTE: Keeping this here to educate maintainers # my %BOM = ( # "\357\273\277" => 'UTF-8', # "\376\377" => 'UTF-16BE', # "\377\376" => 'UTF-16LE', # "\377\376\0\0" => 'UTF-32LE' # "\0\0\376\377" => 'UTF-32BE', # ); if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) { return $self->_error("Stream has a non UTF-8 BOM"); } else { # Strip UTF-8 bom if found, we'll just ignore it $string =~ s/^\357\273\277//; } # Try to decode as utf8 utf8::decode($string) if HAVE_UTF8; # Check for some special cases return $self unless length $string; unless ( $string =~ /[\012\015]+\z/ ) { return $self->_error("Stream does not end with newline character"); } # Split the file into lines my @lines = grep { ! /^\s*(?:\#.*)?\z/ } split /(?:\015{1,2}\012|\015|\012)/, $string; # Strip the initial YAML header @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines; # A nibbling parser while ( @lines ) { # Do we have a document header? if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) { # Handle scalar documents shift @lines; if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) { push @$self, $self->_read_scalar( "$1", [ undef ], \@lines ); next; } } if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) { # A naked document push @$self, undef; while ( @lines and $lines[0] !~ /^---/ ) { shift @lines; } } elsif ( $lines[0] =~ /^\s*\-/ ) { # An array at the root my $document = [ ]; push @$self, $document; $self->_read_array( $document, [ 0 ], \@lines ); } elsif ( $lines[0] =~ /^(\s*)\S/ ) { # A hash at the root my $document = { }; push @$self, $document; $self->_read_hash( $document, [ length($1) ], \@lines ); } else { croak("YAML::Tiny failed to classify the line '$lines[0]'"); } } $self; } # Deparse a scalar string to the actual scalar sub _read_scalar { my ($self, $string, $indent, $lines) = @_; # Trim trailing whitespace $string =~ s/\s*\z//; # Explitic null/undef return undef if $string eq '~'; # Quotes if ( $string =~ /^\'(.*?)\'\z/ ) { return '' unless defined $1; $string = $1; $string =~ s/\'\'/\'/g; return $string; } if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) { # Reusing the variable is a little ugly, # but avoids a new variable and a string copy. $string = $1; $string =~ s/\\"/"/g; $string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex; return $string; } # Special cases if ( $string =~ /^[\'\"!&]/ ) { croak("YAML::Tiny does not support a feature in line '$lines->[0]'"); } return {} if $string eq '{}'; return [] if $string eq '[]'; # Regular unquoted string return $string unless $string =~ /^[>|]/; # Error croak("YAML::Tiny failed to find multi-line scalar content") unless @$lines; # Check the indent depth $lines->[0] =~ /^(\s*)/; $indent->[-1] = length("$1"); if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) { croak("YAML::Tiny found bad indenting in line '$lines->[0]'"); } # Pull the lines my @multiline = (); while ( @$lines ) { $lines->[0] =~ /^(\s*)/; last unless length($1) >= $indent->[-1]; push @multiline, substr(shift(@$lines), length($1)); } my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n"; my $t = (substr($string, 1, 1) eq '-') ? '' : "\n"; return join( $j, @multiline ) . $t; } # Parse an array sub _read_array { my ($self, $array, $indent, $lines) = @_; while ( @$lines ) { # Check for a new document if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { while ( @$lines and $lines->[0] !~ /^---/ ) { shift @$lines; } return 1; } # Check the indent level $lines->[0] =~ /^(\s*)/; if ( length($1) < $indent->[-1] ) { return 1; } elsif ( length($1) > $indent->[-1] ) { croak("YAML::Tiny found bad indenting in line '$lines->[0]'"); } if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) { # Inline nested hash my $indent2 = length("$1"); $lines->[0] =~ s/-/ /; push @$array, { }; $self->_read_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { # Array entry with a value shift @$lines; push @$array, $self->_read_scalar( "$2", [ @$indent, undef ], $lines ); } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) { shift @$lines; unless ( @$lines ) { push @$array, undef; return 1; } if ( $lines->[0] =~ /^(\s*)\-/ ) { my $indent2 = length("$1"); if ( $indent->[-1] == $indent2 ) { # Null array entry push @$array, undef; } else { # Naked indenter push @$array, [ ]; $self->_read_array( $array->[-1], [ @$indent, $indent2 ], $lines ); } } elsif ( $lines->[0] =~ /^(\s*)\S/ ) { push @$array, { }; $self->_read_hash( $array->[-1], [ @$indent, length("$1") ], $lines ); } else { croak("YAML::Tiny failed to classify line '$lines->[0]'"); } } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) { # This is probably a structure like the following... # --- # foo: # - list # bar: value # # ... so lets return and let the hash parser handle it return 1; } else { croak("YAML::Tiny failed to classify line '$lines->[0]'"); } } return 1; } # Parse an array sub _read_hash { my ($self, $hash, $indent, $lines) = @_; while ( @$lines ) { # Check for a new document if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { while ( @$lines and $lines->[0] !~ /^---/ ) { shift @$lines; } return 1; } # Check the indent level $lines->[0] =~ /^(\s*)/; if ( length($1) < $indent->[-1] ) { return 1; } elsif ( length($1) > $indent->[-1] ) { croak("YAML::Tiny found bad indenting in line '$lines->[0]'"); } # Get the key unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+|$)// ) { if ( $lines->[0] =~ /^\s*[?\'\"]/ ) { croak("YAML::Tiny does not support a feature in line '$lines->[0]'"); } croak("YAML::Tiny failed to classify line '$lines->[0]'"); } my $key = $1; # Do we have a value? if ( length $lines->[0] ) { # Yes $hash->{$key} = $self->_read_scalar( shift(@$lines), [ @$indent, undef ], $lines ); } else { # An indent shift @$lines; unless ( @$lines ) { $hash->{$key} = undef; return 1; } if ( $lines->[0] =~ /^(\s*)-/ ) { $hash->{$key} = []; $self->_read_array( $hash->{$key}, [ @$indent, length($1) ], $lines ); } elsif ( $lines->[0] =~ /^(\s*)./ ) { my $indent2 = length("$1"); if ( $indent->[-1] >= $indent2 ) { # Null hash entry $hash->{$key} = undef; } else { $hash->{$key} = {}; $self->_read_hash( $hash->{$key}, [ @$indent, length($1) ], $lines ); } } } } return 1; } # Set error sub _error { $YAML::Tiny::errstr = $_[1]; undef; } # Retrieve error sub errstr { $YAML::Tiny::errstr; } ##################################################################### # Use Scalar::Util if possible, otherwise emulate it BEGIN { eval { require Scalar::Util; }; if ( $@ ) { # Failed to load Scalar::Util eval <<'END_PERL'; sub refaddr { my $pkg = ref($_[0]) or return undef; if (!!UNIVERSAL::can($_[0], 'can')) { bless $_[0], 'Scalar::Util::Fake'; } else { $pkg = undef; } "$_[0]" =~ /0x(\w+)/; my $i = do { local $^W; hex $1 }; bless $_[0], $pkg if defined $pkg; $i; } END_PERL } else { Scalar::Util->import('refaddr'); } } ##################################################################### # main test ##################################################################### package main; BEGIN { # Skip modules that either don't want to be loaded directly, such as # Module::Install, or that mess with the test count, such as the Test::* # modules listed here. # # Moose::Role conflicts if Moose is loaded as well, but Moose::Role is in # the Moose distribution and it's certain that someone who uses # Moose::Role also uses Moose somewhere, so if we disallow Moose::Role, # we'll still get the relevant version number. my %skip = map { $_ => 1 } qw( App::FatPacker Class::Accessor::Classy Devel::Cover Module::Install Moose::Role POE::Loop::Tk Template::Test Test::Kwalitee Test::Pod::Coverage Test::Portability::Files Test::YAML::Meta open ); my $Test = Test::Builder->new; $Test->plan(skip_all => "META.yml could not be found") unless -f 'META.yml' and -r _; my $meta = (Local::YAML::Tiny->read('META.yml'))->[0]; my %requires; for my $require_key (grep { /requires/ } keys %$meta) { my %h = %{ $meta->{$require_key} }; $requires{$_}++ for keys %h; } delete $requires{perl}; diag("Testing with Perl $], $^X"); for my $module (sort keys %requires) { if ($skip{$module}) { note "$module doesn't want to be loaded directly, skipping"; next; } local $SIG{__WARN__} = sub { note "$module: $_[0]" }; require_ok $module or BAIL_OUT("can't load $module"); my $version = $module->VERSION; $version = 'undefined' unless defined $version; diag(" $module version is $version"); } done_testing; } CPAN-SQLite-0.217/t/01basic.t0000644000175600017560000000036313424206717016403 0ustar cpantestercpantester# $Id: 01basic.t 70 2019-01-04 19:39:59Z stro $ use strict; use warnings; use Test::More; plan tests => 4; require_ok('CPAN::SQLite::Index'); require_ok('CPAN::SQLite::Search'); require_ok('CPAN::SQLite'); require_ok('CPAN::SQLite::META'); CPAN-SQLite-0.217/t/release-fixme.t0000644000175600017560000000040513424206717017704 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } # This test is generated by Dist::Zilla::Plugin::Test::Fixme use strict; use warnings; use Test::Fixme; run_tests(); CPAN-SQLite-0.217/t/release-meta-json.t0000644000175600017560000000027313424206717020474 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } use Test::CPAN::Meta::JSON; meta_json_ok(); CPAN-SQLite-0.217/t/author-minimum-version.t0000644000175600017560000000033413424206717021615 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } use Test::More; use Test::MinimumVersion; all_minimum_version_from_metayml_ok(); CPAN-SQLite-0.217/t/06retrieve.t0000644000175600017560000000146113424206717017154 0ustar cpantestercpantester# $Id: 06retrieve.t 73 2019-01-23 22:29:38Z stro $ use strict; use warnings; use Test::More; use Cwd; use File::Spec::Functions; use File::Path; use CPAN::DistnameInfo; use FindBin; use lib "$FindBin::Bin/lib"; use CPAN::SQLite::Index; use TestShell; $ENV{'CPAN_SQLITE_DOWNLOAD'} = $ENV{'CPAN_SQLITE_DOWNLOAD_URL'} = undef; plan tests => 4; my $cwd = getcwd; my $CPAN = catdir $cwd, 't', 'cpan-t-06'; mkdir $CPAN; ok(-d $CPAN); my $info = CPAN::SQLite::Index->new( 'CPAN' => $CPAN, 'db_dir' => $CPAN, 'urllist' => ['http://search.cpan.org/CPAN/'], ); isa_ok($info, 'CPAN::SQLite::Index'); SKIP: { skip 'Potential connection problems', 2 unless $info->fetch_cpan_indices(); ok(-e catfile($CPAN, 'authors', '01mailrc.txt.gz')); ok(-e catfile($CPAN, 'modules', '02packages.details.txt.gz')); } CPAN-SQLite-0.217/t/release-has-version.t0000644000175600017560000000044413424206717021035 0ustar cpantestercpantester#!perl BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } use Test::More; eval "use Test::HasVersion"; plan skip_all => "Test::HasVersion required for testing version numbers" if $@; all_pm_version_ok(); CPAN-SQLite-0.217/t/cpan/0000755000175600017560000000000013424206717015713 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/cpan/modules/0000755000175600017560000000000013424206717017363 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/cpan/modules/02packages.details.txt.gz0000644000175600017560000001455613424206717024122 0ustar cpantestercpantester‹pGE02packages.details.txt´[w⸲€ßûWðpÇÄ@ÈÅo$ä¶6“î9û%KÁ hbl·-:¡ý–l°­›‘lW¯éé„ú(•d]J¥Ò=ò¡Ó9>v?«°†I׃ ?éâ/üíe1)>ÓÙ`9ggŸŸŸÝÆ~wnÏnç£ÙÙ6ôv>LΔ1LV1Š0 B›gé` “Î{¸ ¼ :Šá ‡ñ¾ó)ìð&Œ“3ä}» ýÝ6HªD%À_ß0Nø/òc¼ùö`xгîÃØéŒv8Ü ½Î;Ä«M'w0ù+ûr‚/\í¶0À€ª×ýö3F˜ ¬›=ý¶'Ïél}%øPÀÕà¢Ó·í «g[ý«Ž}á mòç¿Î· ![·¤8˜Jž÷.mûÛ$Øz‰<ªƒÓYƒ^çy…SJ§×wúçŽmw¦ËoßFD›O¯{uÝéLÎ&còÇ=#sRýqƒ¸»þC)Žs‡Ÿ Œ‡üËݽ%<¥ß3¢<À@ÀjƒïF‚xµá8½îÀ6£ Çð½¡.ËÖ/Ñ=N«%²µJôƒhƒV á}m] ʃ¿6íP+òöAïÄÄdM@©|SuÞ¯ µŠÃ$9 êS¼·  üj£šÖ1 Ýk×´ K‘Â]ÔXŸôÍKÅhKzõ†”Ü(Í(š—‡d öM)1²‘´`íÃ&ºÜƒl¨®m—9 ß¸³ZÆd*P“ò„a H!Äœ>½îPkˆœ„+àË)ÅêP¦¡Ç[£†.Ïoÿ”šrq¡OqœŸa¼} ;%Ѷîb~«,þéÂ_;¨¦Eºv9RÈ@ ÞÅ N»DeBf… ( Š 7òÑ: ÝÔ¡D}#»d33Î,5ty ·aÝ·± Lw>F)ËR'gL W»0&‹i«;Ù^È’`CÍúE·€¥wÞéŒÎÈe4ÿç,±r ‹~€ç=Bð{ûðıl¢Ñ``÷%¼£„uüŒ é8c²ºàÊi"áÛn-ÖcäÝ× ¦KÀ6‘pîÃsZÁv3äÓ;é‹Ñ;"KÆÜ–½fÈ Ø“e'[= kÜýµCÞnC Gž§Èa3äK°ÉÇ÷<ŒêÔ–µ >Ä—&{]›‚2"°ÎI$ b¼ž=c!dáÜ·/Ø7YD–Ã>"CZ±pã»mˆyzýZ h ”´ò`K  zƆmí½-c¿£¶@mµ£u[EÛ´Uý›¶Š†Úª~„[ýÓ–±?–@Û¶l¼µz J¥æpú ¿-ü×7ØŽF¯e¥€ØùeP[ÆÛÒ(lI£¨­ê_ õ/à |ÇG] ïZÒ(aݵõm”|´¥Q[ÆNÚêüq[ ][6úzÝ‚øÃOg€@6¯«  6‘uÔÞ/94²‡÷_i€0Ûȇ¿¸9kP›ÅY­küôpç.sZ£2r5ÐH¯×Í '£v–5Y“燧SõõšOFë\‹uã8÷(ðFÛÆ „Ñ +#ÓeŒáoè[.øÌ…,»;(ˆ(¤SÅÖ}©¤ùC$,"@ßíO!-ôaž¹›é˜¼£uS‡2pËûHÍ)s=amŠû}â’Þ9œZ ¹?ÈnÚM÷ä_5pcwÆ×y ;Iö’Ž-òZ¿æq3Òf=“Õ”ÇårNY4D‰kË=}ÊDéÓ3Ñ…izÖ%æ’QâPú^UÔQ¿’¼WéÞaÊ„Lèß`5ÐÅ wñ Ž<Ñ*o“éÔë … üÕn&[´j ·†Apk¸ ÓA¼`kD´¥}fk4²rˆ£8l ˜ t…Ö.h¯á%’ ¦Ú¬O”$ÄníµӈѶhéNwD–¹Ç÷ µWÅ%¶÷†þ ì;j± •¸äå†q‹ƒÆþ-î¿¢0™è¬þ+Ö°Å‚Æhð."ãyÓBþ0Óðš/ tt‘Ï2 ]ô('t¹ p¼B”EÖ¤¦„}WÔiÆIš•阓4£à½“ „¸ eIÆè¤n-Ì)™Þ’¶aJ§ÿŠùº]rÑI(|X= 2eFIû©YL(lêWmÝ%©fÙúÁì­¦ÍDRÃöB) ð|N3Ê FòÀNÝõ{{/•Ï­ËSˆ¥ôx YFS_¥Äó!+‘@ w~ºò¹ñdé’IX½²÷…¡8Îìö†‰ë±~ÊÏ©:º”¼@<‚‘*£M™€7!ZVnÝœRì/”pµK&H¡®.Sè•ñkZ÷y‹$>ðþ•=ì]__ËK4(Ô[#ßÛà‚]+uqq Ô#OJti@AÁZAѶ®›/+šÔÑK€Öb쮩uÿž*ö´ZÝŽönŽCÛÉ)½îÕñ®f"•°Ò_ ¬´ï¶[T Ö½î…m__\–Y)„~Ö¢Þ[ÔU<´¦àƒnlÙC™–__ªÎ´g¤¥Þa¤Ê[»'s€e"ÌÏ‘6ù9—›ïè+¶‹åóóÓ¢§'­a÷J,eEô$?’fzÑ­O™R3HzÆÉx$QMØHÕñÉ*ºÊóáçö¦*„_¦Òm¼°Eäİgátûew‘èF[‹þ´!MÄ e¦LÿZ†HyÐ’@.5 ÷ªAðhÈ<†ï+ W:EÂCÎ5 ÊYÊ‘rªv€¬7Iƒ¹³žœa§½}©Ñd,*ÂL*˜ãDâ|ðйÁnîÊÒ zR¡}w¯˜•i dÚ®BOÚ$ó²Cÿq„eô5;h/ÒéPVCf7üH{y±è¯r’r<ȵººb÷Õ]í•ÍPHz[Ù!ŠNgØ=·í«ós-Êí®>’ÝV¶mGÇ [ äéXb³8þtC=¥Æ(ÁôùSð $; u/7Š)‹Ðú –xâ/ÑVh ™^—×Zze‹n7²T:q–Qf¥·õm´ñ$ë³3ÊðJ’ùhè,!ÛQ’—o‡|ïPÿƒÓÓŠôãÌêêš¶’ÞÓ‡Y³ÞWäRŒíä—å_¤]–üKtKôÓ¹•Ia2 Í‚¤ðã YcžWM&}ŠWÔ¸Ï<Ì;´¾¢$ÆÎJ4¿n¹‰a­/Lë}ågXë ?C£¯£ ‚Øßk6‰ôËr!ƒVá8ÿ%}€^ÛN¿„|êwGtjJL\1§íwû}éd–þâÈ Ò2ª'¢½c׳©-cZ¦ ¤\Ã)ADBÍ’ïÀg \=ma¼ªnf¨ÒØF‡,*GW—h‚õNÝØããß4@dJñøð!`M´ÝºÓÄš©ŽF»$=T/³·è&Ïên74Í |}¸i úŘ’: 1·R© ÚI¢\lãIwkÖ>§R=îQÀ—­&(†ÁJ°Ñ¹9èz›“Ö{E é^£Æ~ ƒ!çÔ¬÷®=aÀ¾ u= ãO¸ná]{ŽÃm+Æv‘¶  P¸%Fjô ½VZö­cì ªQýGÐ]Œ¨K8hÂFi30¥clGñôS'ÒIÐÍ+=›@¬ü£w%_le«ÈRpk&b¥ÖÂÌ"2 }%]ö~%=ñp0zÙ3•˦tpÉ‘*bo…Óû'ânÄòïÅÂìÄýÖ“ÏÆúÄ4ÒØàLÂÊ~/ÇÑÜ4PB§ÈrZËB%Øºè ™)Y*Âøù³Q/ŠãA_ÑDÊA‚¶O“ïSÛ‡­©Ó»ü\!åq:RÍÈ…)kF¡ÌÖd%‹h€rG_¦)j:–V}úòª#´1 Õ&/Ú4¸’†ýO’—ì@êÉŠG%hd~^¼»€: ‰R£UùøÎ‹~”é¯Ê ÞdÍé4#ŽÑûÆ<¤VØ¡/•¡••§}ÉúáìŒV,?0Æ{bÓ~¸$Áøb3M¤Øoß~åÎÐ}HCܤ›Y­‡`—ÐèÏ$^Iôá»Ól %Ó»?.©?ë.À#(?³ÕK-Z€¨ˆ•yÀ¬Aw8dQ¤hXv8åP9ìØwÆò#¢Yé†çZ½{Æz„ÀS›)ÜmZjÑà¡»/E^Cb¬>J©}èÇ P;߯( }­Z†°5¸ÔCÑSY(€2ïàZ³ K,Ò šf6|Ç Ë¾¬ÃšAœ¬@Äewë_°¸sOBÍXXÙ±Ö¹Ii“?æx•°.t_Ÿ‹:b± Á÷4º¬»%¦nuY²ø 2r XS˜$Y†&¶?°È{… †:–uyÉ¢fpb¤hÔÛa –ê|Áun›³è»´Ú¿á+´€IŠ531½I5ºàêô1ÑëJ›5>WÜÈWó™íóa:•°hzk ‚,yÄðšç¥Ç°Uº19E´x4§´*„ *’ñ.øò$M)¾‚­{l^²C© ¶òÏ3¡eeâËìéo©Z:o¹úÉQ-fþFõJ%¨6yÖ¯§ù-)X¢ÆHv"‰Œåî“L¼_ ráDõ}ùi¥FƒÓ  ¢Û«„µdÒ ¨– Q&c•D˜v)AÒðƒÕÁ“#Fƒ×AÒx¹’5I”f*Q&ÖUrWzÊ2>@©¯ŠoeU ‰Ò¯¦Fé=èOÕ¹J=Ð í¢6ëAìsj³Öa´Qž~5dÑë{Û*#eÑ)vk¬ž k8¨@qïd#µ¶ŒµYôp=ß¾'‘ü>O"=Ø{ëam­¶ùXzáƒ9+Úk\A¸æcú Y ˜]'ÍÛ\Ϊìë+w% Qá[ˆ_FrTá™Õ*¡ W»ªÍP9>ü“ìDH±a3}šÞeU*ϲgÀù䩈•IÐË{.e(õ] ¶ u".:ŽŒ÷}b襛MU+¡DýÌT ½=àñ$ø~þ?c”4Úü1ÉLÆ:|Ò*I¤7©æèý<ôñVé’NÓÙ0uJßý7zp˜I‡™æÿ’û ‹ÆÑgƒògEL{†sÉ0qëfn¥7*µé]kaÎÁs9ÔÅ8Žr0ÉCµ0Ô«±’yys_—Fæ>=`lŒ2ÝZç‹QÝZ¤¯Â÷škcëEtæ¬ôÆ&ôÄá:ö1`Ín$JuÄ•§YnKe”§ë+ô°[ðrANJ¨U—P›tƒ¤—ïˆQV'It±7·ùD:$K|6“.éÀûv‚,ÐZhèú¤,hmœ€§eCÒœp<¦tæ?èl0ÁdjéB¯6´¢“Ý"ܾWßæ.{̺Aù(i“; mþc„˜¿/eR9|Üœ4våél¾/?IJ·”Ô7%}‘F$YX¹!ôIÔ…éuŸdB\§”H?7áhû”—®†N1¿GQ¤:mfóœ'I“ñ“4 ¸ÍOSN’TçHòhmÒ" ñØç,æv¢¾­`rš²Äôm9tl2;éøÚK$UXˆ)IûÖ´«g&#ùòPf: ×›!ÎfUS»>M©ÂÌÕö$"cÍiB¶‹yV§MN1WZÚ¸Ó…Ò[ ,+W(Â+K EE,»”&IR–õÑXw¥÷ઠ|¨Ü,ŒÓhû"`•BþC´p¦ŒqïqG8å: %%x®„pó‰&ƒÓ%ôa  ÑrH^?óô^ˌ„:’÷d²=¿åý>ã¿IÝ…„Ehˆq‘«XÊì»?f ÓnÎ$óùb¡Qy#d*cê‰8í£ÈAé;2o;}ñ$ˆ°Óqç*@a‚Ýô&2˜»²1—ö)D,*Áxsæ{²\%3’ç·T›‘ü 1ÚGwÓ²€køU‘÷gr"B½˜¹™]ª&•œºl"¥©ûŽtRòžA}©‚@y¸y=ÞœT‡’r7Ð÷é„X‘÷ºœžJX…Óã-Í›(\µÂÑÊ'zˆ„E˜8¥òœ“$7 á XädþïñøžØ(…L[‚ë[`8Γǫ¦!Öa,જMˆ2ªÓ•OrW«‘Ü÷×Ò#eü@€×‡O¯&g,„ƒ,ãÒ>ÙJ¶4áoÕ ©—?vù¡H@ÎØ…ÙÀ""L&òïôbÕÊW2,HS¸JøIÄËx|ê ÞåHE˜Ômô¤?xVû5DF€²|[ôôÌ È¦–üù‹ƒÈñS¿”2+§MAt¥*U¯/£Q :Ùí ,õ >GH•f‹“÷ðIcˆí~‡%„ã¼o¢Ô3·!‹û*iÁμˆp­Ü4ÑÔ‚ŒCŠö¯H”·ç ÔFšˆaD ‘FÝê!FW `|ûW툧(I(«©6wBv—ò3àÒAHiÉsÎe†S"ûúºÉ÷#Ù‰O#ÄHß7ij+ÍHh‚ø>“5BJ6~™ ~¢@–óS!4›"$±Ç¦ˆG¸‹iDy'zÎ-ø¥IÔ²©’¨`SDeGÞá¯ùR"Š ¯EÂHb~Ò{xŒüT34bÀ±)"R1@|§CëÄÒË õqó>NöÒ©«‰ÀISsRÄ®"‘^t|ìÿµv+ Â0~ÁÇ®»8FcŠÃBYÅ*²·_ôäl~ãÎâGJÛ¤ióɉ{—VX[ž2ĵqV®¼æ­Xkì&Ct•C}ÅŠAÇtâ–ÃR’dTÄ.r€ÀGáÚ€C£ž”4p¡MBÁEB¾YB+XƒŽVjZès4D yM í ìjxØÍàP{ˆÖ jÏšµ Õ·X-t*„È2 ´á­°*EÛÕ qJf%aŒ™ncð{VdMeI?Œ;ߘI[”÷JRe5m %̯÷ùt¹ÏDÆâž¶µÕÈb°CPAN-SQLite-0.217/t/cpan/authors/0000755000175600017560000000000013424206717017400 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/cpan/authors/01mailrc.txt.gz0000644000175600017560000000026113424206717022167 0ustar cpantestercpantester‹pGE01mailrc.txtUÍQ ƒ0 à÷"x€ž@F#‚0ez‚Xƒ†Õv´ÝØñWËËŸüð²Bð^·pLn œ»›‚Ö³“J:*õØoMNVR_‹ í¼ANÞH´ ˜ÛrÞV&É›‡D‰•ñëUØ÷' ´Ð …Ù˜C?ýè? «Ï'Pt⌷jCbqPÚ¸¥6q±Š§WV_!oÚ®ÛCPAN-SQLite-0.217/t/author-no-tabs.t0000644000175600017560000000377413424206717020035 0ustar cpantestercpantester BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.15 use Test::More 0.88; use Test::NoTabs; my @files = ( 'bin/cpandb', 'lib/CPAN/SQLite.pm', 'lib/CPAN/SQLite/DBI.pm', 'lib/CPAN/SQLite/DBI/Index.pm', 'lib/CPAN/SQLite/DBI/Search.pm', 'lib/CPAN/SQLite/Index.pm', 'lib/CPAN/SQLite/Info.pm', 'lib/CPAN/SQLite/META.pm', 'lib/CPAN/SQLite/Populate.pm', 'lib/CPAN/SQLite/Search.pm', 'lib/CPAN/SQLite/State.pm', 'lib/CPAN/SQLite/Util.pm', 't/00-all_prereqs.t', 't/00-compile.t', 't/00-compile/lib_CPAN_SQLite_DBI_Index_pm.t', 't/00-compile/lib_CPAN_SQLite_DBI_Search_pm.t', 't/00-compile/lib_CPAN_SQLite_DBI_pm.t', 't/00-compile/lib_CPAN_SQLite_Index_pm.t', 't/00-compile/lib_CPAN_SQLite_Info_pm.t', 't/00-compile/lib_CPAN_SQLite_META_pm.t', 't/00-compile/lib_CPAN_SQLite_Populate_pm.t', 't/00-compile/lib_CPAN_SQLite_Search_pm.t', 't/00-compile/lib_CPAN_SQLite_State_pm.t', 't/00-compile/lib_CPAN_SQLite_Util_pm.t', 't/00-compile/lib_CPAN_SQLite_pm.t', 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 't/000-report-versions.t', 't/01basic.t', 't/02drop.t', 't/03info.t', 't/04search.t', 't/04search_everything.t', 't/05meta_new.t', 't/05meta_update.t', 't/06retrieve.t', 't/07download.t', 't/08circular_references.t', 't/author-critic.t', 't/author-eol.t', 't/author-minimum-version.t', 't/author-no-tabs.t', 't/author-pod-syntax.t', 't/lib/TestSQL.pm', 't/lib/TestShell.pm', 't/lib/TestShellDiag.pm', 't/release-changes_has_content.t', 't/release-distmeta.t', 't/release-fixme.t', 't/release-has-version.t', 't/release-kwalitee.t', 't/release-meta-json.t', 't/release-pause-permissions.t', 't/testrules.yml' ); notabs_ok($_) foreach @files; done_testing; CPAN-SQLite-0.217/t/release-pause-permissions.t0000644000175600017560000000066313424206717022270 0ustar cpantestercpantester BEGIN { unless ($ENV{RELEASE_TESTING}) { print qq{1..0 # SKIP these tests are for release candidate testing\n}; exit } } use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::PAUSE::Permissions 0.003 use Test::More; BEGIN { plan skip_all => 'Test::PAUSE::Permissions required for testing pause permissions' if $] < 5.010; } use Test::PAUSE::Permissions; all_permissions_ok(); CPAN-SQLite-0.217/t/author-eol.t0000644000175600017560000000402613424206717017240 0ustar cpantestercpantester BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::EOL 0.19 use Test::More 0.88; use Test::EOL; my @files = ( 'bin/cpandb', 'lib/CPAN/SQLite.pm', 'lib/CPAN/SQLite/DBI.pm', 'lib/CPAN/SQLite/DBI/Index.pm', 'lib/CPAN/SQLite/DBI/Search.pm', 'lib/CPAN/SQLite/Index.pm', 'lib/CPAN/SQLite/Info.pm', 'lib/CPAN/SQLite/META.pm', 'lib/CPAN/SQLite/Populate.pm', 'lib/CPAN/SQLite/Search.pm', 'lib/CPAN/SQLite/State.pm', 'lib/CPAN/SQLite/Util.pm', 't/00-all_prereqs.t', 't/00-compile.t', 't/00-compile/lib_CPAN_SQLite_DBI_Index_pm.t', 't/00-compile/lib_CPAN_SQLite_DBI_Search_pm.t', 't/00-compile/lib_CPAN_SQLite_DBI_pm.t', 't/00-compile/lib_CPAN_SQLite_Index_pm.t', 't/00-compile/lib_CPAN_SQLite_Info_pm.t', 't/00-compile/lib_CPAN_SQLite_META_pm.t', 't/00-compile/lib_CPAN_SQLite_Populate_pm.t', 't/00-compile/lib_CPAN_SQLite_Search_pm.t', 't/00-compile/lib_CPAN_SQLite_State_pm.t', 't/00-compile/lib_CPAN_SQLite_Util_pm.t', 't/00-compile/lib_CPAN_SQLite_pm.t', 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 't/000-report-versions.t', 't/01basic.t', 't/02drop.t', 't/03info.t', 't/04search.t', 't/04search_everything.t', 't/05meta_new.t', 't/05meta_update.t', 't/06retrieve.t', 't/07download.t', 't/08circular_references.t', 't/author-critic.t', 't/author-eol.t', 't/author-minimum-version.t', 't/author-no-tabs.t', 't/author-pod-syntax.t', 't/lib/TestSQL.pm', 't/lib/TestShell.pm', 't/lib/TestShellDiag.pm', 't/release-changes_has_content.t', 't/release-distmeta.t', 't/release-fixme.t', 't/release-has-version.t', 't/release-kwalitee.t', 't/release-meta-json.t', 't/release-pause-permissions.t', 't/testrules.yml' ); eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files; done_testing; CPAN-SQLite-0.217/t/00-compile/0000755000175600017560000000000013424206717016637 5ustar cpantestercpantesterCPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_Index_pm.t0000644000175600017560000000043313424206717023437 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/Index.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_State_pm.t0000644000175600017560000000043313424206717023450 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/State.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_META_pm.t0000644000175600017560000000043113424206717023114 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/META.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_DBI_pm.t0000644000175600017560000000042713424206717022771 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/DBI.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_Util_pm.t0000644000175600017560000000043113424206717023303 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/Util.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_Info_pm.t0000644000175600017560000000043113424206717023261 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/Info.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_DBI_Search_pm.t0000644000175600017560000000044513424206717024256 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/DBI/Search.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_Populate_pm.t0000644000175600017560000000044113424206717024160 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/Populate.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_pm.t0000644000175600017560000000041713424206717022312 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_DBI_Index_pm.t0000644000175600017560000000044313424206717024116 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/DBI/Index.pm"); CPAN-SQLite-0.217/t/00-compile/lib_CPAN_SQLite_Search_pm.t0000644000175600017560000000043513424206717023577 0ustar cpantestercpantesteruse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( Test::Compile::PerFile ) version 0.004000 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("CPAN/SQLite/Search.pm"); CPAN-SQLite-0.217/INSTALL0000644000175600017560000000062013424206717015556 0ustar cpantestercpantesterThis package requires the following Perl modules: File::Spec Archive::Tar IO::Zlib CPAN::DistnameInfo DBD::SQLite File::HomeDir Installation follows the standard perl Makefile.PL $MAKE $MAKE test $MAKE install or, if Module::Build is available, perl Build.PL perl Build perl Build test perl Build install See the README file for a quick overview of the useage. CPAN-SQLite-0.217/LICENSE0000644000175600017560000004367713424206717015555 0ustar cpantestercpantesterThis software is copyright (c) 2019 by Serguei Trouchelle. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2019 by Serguei Trouchelle. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2019 by Serguei Trouchelle. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End CPAN-SQLite-0.217/lib/0000755000175600017560000000000013424206717015275 5ustar cpantestercpantesterCPAN-SQLite-0.217/lib/CPAN/0000755000175600017560000000000013424206717016016 5ustar cpantestercpantesterCPAN-SQLite-0.217/lib/CPAN/SQLite/0000755000175600017560000000000013424206717017157 5ustar cpantestercpantesterCPAN-SQLite-0.217/lib/CPAN/SQLite/Index.pm0000644000175600017560000002331013424206717020563 0ustar cpantestercpantester# $Id: Index.pm 79 2019-01-30 02:35:31Z stro $ package CPAN::SQLite::Index; use strict; use warnings; our $VERSION = '0.217'; use English qw/-no_match_vars/; use CPAN::SQLite::Info; use CPAN::SQLite::State; use CPAN::SQLite::Populate; use CPAN::SQLite::DBI qw($tables); use File::Spec::Functions qw(catfile); use File::Basename; use File::Path; use HTTP::Tiny; use Scalar::Util 'weaken'; unless ($ENV{CPAN_SQLITE_NO_LOG_FILES}) { $ENV{CPAN_SQLITE_DEBUG} = 1; } our ($oldout); my $log_file = 'cpan_sqlite_log.' . time; # This is usually already defined in real life, but tests need it to be set $CPAN::FrontEnd ||= "CPAN::Shell"; sub new { my ($class, %args) = @_; if ($args{setup} and $args{reindex}) { die "Reindexing must be done on an exisiting database"; } my $self = { index => undef, state => undef, %args }; return bless $self, $class; } sub download_index { my $self = shift; if ($ENV{'CPAN_SQLITE_DOWNLOAD'}) { $ENV{'CPAN_SQLITE_DOWNLOAD_URL'} = 'http://cpansqlite.trouchelle.com/' unless $ENV{'CPAN_SQLITE_DOWNLOAD_URL'}; } return 0 unless $ENV{'CPAN_SQLITE_DOWNLOAD_URL'}; $CPAN::FrontEnd->myprint("Downloading the compiled index db ... "); if (my $response = HTTP::Tiny->new->mirror($ENV{'CPAN_SQLITE_DOWNLOAD_URL'} => catfile($self->{'db_dir'}, $self->{'db_name'}))) { if ($response->{'success'} and $response->{'status'} and $response->{'status'} eq '200') { if (my $type = $response->{'headers'}->{'content-type'}) { if ($type eq 'application/x-sqlite3') { return 1; } } } } $CPAN::FrontEnd->mywarn('Cannot download the compiled index db'); return 0; } sub index { my $self = shift; my $setup = $self->{'setup'}; if ($setup) { my $db_name = catfile($self->{'db_dir'}, $self->{db_name}); if (-f $db_name) { $CPAN::FrontEnd->myprint("Removing existing $db_name ... "); if (unlink $db_name) { $CPAN::FrontEnd->myprint("Done.\n"); } else { $CPAN::FrontEnd->mywarn("Failed: $!\n"); } } } my $log = catfile($self->{'log_dir'}, $log_file); unless ($ENV{'CPAN_SQLITE_NO_LOG_FILES'}) { $oldout = error_fh($log); } my $log_cleanup = $ENV{'CPAN_SQLITE_LOG_FILES_CLEANUP'}; $log_cleanup = 30 unless defined $log_cleanup; if ($log_cleanup and $log_cleanup =~ /^\d+$/) { if (opendir(my $DIR, $self->{'log_dir'})) { my @files = grep { /cpan_sqlite_log\./ } readdir $DIR; closedir $DIR; @files = grep { -C $_ > $log_cleanup } map { catfile($self->{'log_dir'}, $_) } @files; if (@files) { $CPAN::FrontEnd->myprint('Cleaning old log files ... '); unlink @files; $CPAN::FrontEnd->myprint("Done.\n"); } } } if ($self->download_index()) { return 1; } if ($self->{'update_indices'}) { $CPAN::FrontEnd->myprint('Fetching index files ... '); if ($self->fetch_cpan_indices()) { $CPAN::FrontEnd->myprint("Done.\n"); } else { $CPAN::FrontEnd->mywarn("Failed\n"); return; } } $CPAN::FrontEnd->myprint('Gathering information from index files ... '); if ($self->fetch_info()) { $CPAN::FrontEnd->myprint("Done.\n"); } else { $CPAN::FrontEnd->mywarn("Failed\n"); return; } unless ($setup) { $CPAN::FrontEnd->myprint('Obtaining current state of database ... '); if ($self->state()) { $CPAN::FrontEnd->myprint("Done.\n"); } else { $CPAN::FrontEnd->mywarn("Failed\n"); return; } } $CPAN::FrontEnd->myprint('Populating database tables ... '); if ($self->populate()) { $CPAN::FrontEnd->myprint("Done.\n"); } else { $CPAN::FrontEnd->mywarn("Failed\n"); return; } return 1; } sub fetch_cpan_indices { my $self = shift; my $CPAN = $self->{CPAN}; my $indices = { '01mailrc.txt.gz' => 'authors', '02packages.details.txt.gz' => 'modules', }; foreach my $index (keys %$indices) { my $file = catfile($CPAN, $indices->{$index}, $index); next if (-e $file and -M $file < 1); my $dir = dirname($file); unless (-d $dir) { mkpath($dir, 0, oct(755)) or die "Cannot mkpath $dir: $!"; } my @urllist = @{ $self->{urllist} }; foreach my $cpan (@urllist) { my $from = join '/', ($cpan, $indices->{$index}, $index); if (my $response = HTTP::Tiny->new->get($from)) { if ($response->{'success'}) { if (open(my $FILE, '>', $file)) { binmode $FILE; print $FILE $response->{'content'}; if (close($FILE)) { next; } } } } } unless (-f $file) { $CPAN::FrontEnd->mywarn("Cannot retrieve '$file'"); return; } } return 1; } sub fetch_info { my $self = shift; my %wanted = map { $_ => $self->{$_} } qw(CPAN ignore keep_source_where); my $info = CPAN::SQLite::Info->new(%wanted); $info->fetch_info() or return; my @tables = qw(dists mods auths info); my $index; foreach my $table (@tables) { my $class = __PACKAGE__ . '::' . $table; my $this = { info => $info->{$table} }; $index->{$table} = bless $this, $class; } $self->{index} = $index; return 1; } sub state { my $self = shift; my %wanted = map { $_ => $self->{$_} } qw(db_name index setup reindex db_dir); my $state = CPAN::SQLite::State->new(%wanted); $state->state() or return; $self->{state} = $state; return 1; } sub populate { my $self = shift; my %wanted = map { $_ => $self->{$_} } qw(db_name index setup state db_dir); my $db = CPAN::SQLite::Populate->new(%wanted); $db->populate() or return; return 1; } sub error_fh { my $file = shift; open(my $tmp, '>', $file) or die "Cannot open $file: $!"; close $tmp; # Should be open(my $oldout, '>&', \*STDOUT); but it fails on 5.6.2 open(my $oldout, '>&STDOUT'); open(STDOUT, '>', $file) or die "Cannot tie STDOUT to $file: $!"; select STDOUT; $| = 1; return $oldout; } sub DESTROY { unless ($ENV{CPAN_SQLITE_NO_LOG_FILES}) { close STDOUT; open(STDOUT, '>&', $oldout) if $oldout; } return; } 1; =head1 NAME CPAN::SQLite::Index - set up or update database tables. =head1 VERSION version 0.217 =head1 SYNOPSIS my $index = CPAN::SQLite::Index->new(setup => 1); $index->index(); =head1 DESCRIPTION This is the main module used to set up or update the database tables used to store information from the CPAN and ppm indices. The creation of the object my $index = CPAN::SQLite::Index->new(%args); accepts two possible arguments: =over 3 =item * setup =E 1 This (optional) argument specifies that the database is being set up. Any existing tables will be dropped. =item * reindex =E value This (optional) argument specifies distribution names that one would like to reindex in an existing database. These may be specified as either a scalar, for a single distribution, or as an array reference for a list of distributions. =back =head1 DETAILS Calling $index->index(); will start the indexing procedure. Various messages detailing the progress will written to I, which by default will be captured into a file F, where the extension is the C