The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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

LICENSE

Copyright (C) 2015 Shoichi Kaji

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

AUTHOR

Shoichi Kaji <skaji@cpan.org>