NAME

Distribution::Metadata - gather distribution metadata in local

SYNOPSIS

use Distribution::Metadata;

my $info = Distribution::Metadata->new_from_module("LWP::UserAgent");

print $info->name;      # libwww-perl
print $info->version;   # 6.13
print $info->distvname; # libwww-perl-6.13
print $info->author;    # ETHER
print $info->pathname;  # E/ET/ETHER/libwww-perl-6.13.tar.gz

print $info->main_module;         # LWP
print $info->main_module_version; # 6.13
print $info->main_module_file;    # path of LWP.pm

print $info->packlist;       # path of .packlist
print $info->meta_directory; # path of .meta directory
print $info->install_json;   # path of install.json
print $info->mymeta_json;    # path of MYMETA.json

my $files = $info->files; # files which are listed in .packlist

my $install_json_hash = $info->install_json_hash;
my $mymeta_json_hash  = $info->mymeta_json_hash;

DESCRIPTION

(CAUTION: This module is still in development phase. API will change without notice.)

Sometimes we want to know: Where this module comes from? Which distribution does this module belong to?

Since cpanm 1.5000 (released 2011.10.13), it installs not only modules but also their meta data. So we can answer that questions!

Distribution::Metadata gathers distribution metadata in local. That is, this module tries to gather

  • main module name, version, file

  • .packlist file

  • .meta directory

  • install.json file

  • MYMETA.json file

Please note that as mentioned above, this module deeply depends on cpanm behavior. If you install cpan modules by hands or some cpan clients other than cpanm, this module won't work.

HOW IT WORKS

Let me explain how $class->new_from_module($module, inc => $inc) works.

  • Get $module_file by

    Module::Metadata->new_from_module($module, inc => $inc)->filename.
  • Find $packlist in which $module_file is listed.

  • From $packlist pathname (eg: ...auto/LWP/.packlist), determine $main_module and main module search directory $lib.

  • Get $main_module_version by

    Module::Metadata->new_from_module($main_module, inc => [$lib, "$lib/$Config{archname}"])->version
  • Find install.json that has "name" eq $main_module, and provides $main_module with version $main_module_version.

  • Get .meta directory and MYMETA.json with install.json.

CONSTRUCTORS

my $info = $class->new_from_module($module, inc => \@dirs, fill_archlib => $bool)

Create Distribution::Metadata instance from module name.

You can append inc argument to specify module/packlist/meta search paths. Default is \@INC.

Also you can append fill_archlib argument so that archlibs are automatically added to inc if missing.

Please note that, even if the module cannot be found, new_from_module returns a Distribution::Metadata instance. However almost all methods returns false for such objects. If you want to know whether the distribution was found or not, try:

my $info = $class->new_from_module($module);

if ($info->packlist) {
    # found
} else {
    # not found
}
my $info = $class->new_from_file($file, inc => \@dirs, fill_archlib => $bool)

Create Distribution::Metadata instance from file path. You can append inc and fill_archlib arguments too.

Also new_from_file retunes a Distribution::Metadata instance, even if file cannot be found.

METHODS

Please note that the following methods return false when appropriate modules or files cannot be found.

my $name = $info->name (alias: $info->dist)

distribution name (eg: libwww-perl)

my $version = $info->version

distribution version (eg: 6.13)

my $distvname = $info->distvname

distribution vname (eg: libwww-perl-6.13)

my $author = $info->author (alias: $info->cpanid)

distribution author (eg: ETHER)

my $pathname = $info->pathname

distribution pathname (eg: E/ET/ETHER/libwww-perl-6.13.tar.gz)

my $file = $info->packlist

.packlist file path

my $dir = $info->meta_directory

.meta directory path

my $file = $info->install_json

install.json file path

my $file = $info->mymeta_json

MYMETA.json file path

my $main_module = $info->main_module

main module name

my $version = $info->main_module_version

main module version

my $file = $info->main_module_file

main module file path

my $files = $info->files

file paths which is listed in .packlist file, note that paths are acutually Cwd::abs_path()-ed

my $hash = $info->install_json_hash

a hash reference for install.json

my $info = Distribution::Metadata->new_from_module("LWP::UserAgent");
my $install = $info->install_json_hash;
$install->{version};  # 6.13
$install->{dist};     # libwww-perl-6.13
$install->{provides}; # a hash reference of providing modules
...
my $hash = $info->mymeta_json_hash

a hash reference for MYMETA.json

my $info = Distribution::Metadata->new_from_module("LWP::UserAgent");
my $meta = $info->mymeta_hash;
$meta->{version};  # 6.13
$meta->{abstract}; # The World-Wide Web library for Perl
$meta->{prereqs};  # prereq hash
...

SEE ALSO

Module::Metadata

App::cpanminus

COPYRIGHT AND LICENSE

Copyright (C) 2015 Shoichi Kaji <skaji@cpan.org>

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.