Spaces:
Running
Running
| use 5.006; | |
| use strict; | |
| use warnings; | |
| package CPAN::Meta; | |
| our $VERSION = '2.150010'; | |
| #pod =head1 SYNOPSIS | |
| #pod | |
| #pod use v5.10; | |
| #pod use strict; | |
| #pod use warnings; | |
| #pod use CPAN::Meta; | |
| #pod use Module::Load; | |
| #pod | |
| #pod my $meta = CPAN::Meta->load_file('META.json'); | |
| #pod | |
| #pod printf "testing requirements for %s version %s\n", | |
| #pod $meta->name, | |
| #pod $meta->version; | |
| #pod | |
| #pod my $prereqs = $meta->effective_prereqs; | |
| #pod | |
| #pod for my $phase ( qw/configure runtime build test/ ) { | |
| #pod say "Requirements for $phase:"; | |
| #pod my $reqs = $prereqs->requirements_for($phase, "requires"); | |
| #pod for my $module ( sort $reqs->required_modules ) { | |
| #pod my $status; | |
| #pod if ( eval { load $module unless $module eq 'perl'; 1 } ) { | |
| #pod my $version = $module eq 'perl' ? $] : $module->VERSION; | |
| #pod $status = $reqs->accepts_module($module, $version) | |
| #pod ? "$version ok" : "$version not ok"; | |
| #pod } else { | |
| #pod $status = "missing" | |
| #pod }; | |
| #pod say " $module ($status)"; | |
| #pod } | |
| #pod } | |
| #pod | |
| #pod =head1 DESCRIPTION | |
| #pod | |
| #pod Software distributions released to the CPAN include a F<META.json> or, for | |
| #pod older distributions, F<META.yml>, which describes the distribution, its | |
| #pod contents, and the requirements for building and installing the distribution. | |
| #pod The data structure stored in the F<META.json> file is described in | |
| #pod L<CPAN::Meta::Spec>. | |
| #pod | |
| #pod CPAN::Meta provides a simple class to represent this distribution metadata (or | |
| #pod I<distmeta>), along with some helpful methods for interrogating that data. | |
| #pod | |
| #pod The documentation below is only for the methods of the CPAN::Meta object. For | |
| #pod information on the meaning of individual fields, consult the spec. | |
| #pod | |
| #pod =cut | |
| use Carp qw(carp croak); | |
| use CPAN::Meta::Feature; | |
| use CPAN::Meta::Prereqs; | |
| use CPAN::Meta::Converter; | |
| use CPAN::Meta::Validator; | |
| use Parse::CPAN::Meta 1.4414 (); | |
| BEGIN { *_dclone = \&CPAN::Meta::Converter::_dclone } | |
| #pod =head1 STRING DATA | |
| #pod | |
| #pod The following methods return a single value, which is the value for the | |
| #pod corresponding entry in the distmeta structure. Values should be either undef | |
| #pod or strings. | |
| #pod | |
| #pod =for :list | |
| #pod * abstract | |
| #pod * description | |
| #pod * dynamic_config | |
| #pod * generated_by | |
| #pod * name | |
| #pod * release_status | |
| #pod * version | |
| #pod | |
| #pod =cut | |
| BEGIN { | |
| my @STRING_READERS = qw( | |
| abstract | |
| description | |
| dynamic_config | |
| generated_by | |
| name | |
| release_status | |
| version | |
| ); | |
| no strict 'refs'; | |
| for my $attr (@STRING_READERS) { | |
| *$attr = sub { $_[0]{ $attr } }; | |
| } | |
| } | |
| #pod =head1 LIST DATA | |
| #pod | |
| #pod These methods return lists of string values, which might be represented in the | |
| #pod distmeta structure as arrayrefs or scalars: | |
| #pod | |
| #pod =for :list | |
| #pod * authors | |
| #pod * keywords | |
| #pod * licenses | |
| #pod | |
| #pod The C<authors> and C<licenses> methods may also be called as C<author> and | |
| #pod C<license>, respectively, to match the field name in the distmeta structure. | |
| #pod | |
| #pod =cut | |
| BEGIN { | |
| my @LIST_READERS = qw( | |
| author | |
| keywords | |
| license | |
| ); | |
| no strict 'refs'; | |
| for my $attr (@LIST_READERS) { | |
| *$attr = sub { | |
| my $value = $_[0]{ $attr }; | |
| croak "$attr must be called in list context" | |
| unless wantarray; | |
| return @{ _dclone($value) } if ref $value; | |
| return $value; | |
| }; | |
| } | |
| } | |
| sub authors { $_[0]->author } | |
| sub licenses { $_[0]->license } | |
| #pod =head1 MAP DATA | |
| #pod | |
| #pod These readers return hashrefs of arbitrary unblessed data structures, each | |
| #pod described more fully in the specification: | |
| #pod | |
| #pod =for :list | |
| #pod * meta_spec | |
| #pod * resources | |
| #pod * provides | |
| #pod * no_index | |
| #pod * prereqs | |
| #pod * optional_features | |
| #pod | |
| #pod =cut | |
| BEGIN { | |
| my @MAP_READERS = qw( | |
| meta-spec | |
| resources | |
| provides | |
| no_index | |
| prereqs | |
| optional_features | |
| ); | |
| no strict 'refs'; | |
| for my $attr (@MAP_READERS) { | |
| (my $subname = $attr) =~ s/-/_/; | |
| *$subname = sub { | |
| my $value = $_[0]{ $attr }; | |
| return _dclone($value) if $value; | |
| return {}; | |
| }; | |
| } | |
| } | |
| #pod =head1 CUSTOM DATA | |
| #pod | |
| #pod A list of custom keys are available from the C<custom_keys> method and | |
| #pod particular keys may be retrieved with the C<custom> method. | |
| #pod | |
| #pod say $meta->custom($_) for $meta->custom_keys; | |
| #pod | |
| #pod If a custom key refers to a data structure, a deep clone is returned. | |
| #pod | |
| #pod =cut | |
| sub custom_keys { | |
| return grep { /^x_/i } keys %{$_[0]}; | |
| } | |
| sub custom { | |
| my ($self, $attr) = @_; | |
| my $value = $self->{$attr}; | |
| return _dclone($value) if ref $value; | |
| return $value; | |
| } | |
| #pod =method new | |
| #pod | |
| #pod my $meta = CPAN::Meta->new($distmeta_struct, \%options); | |
| #pod | |
| #pod Returns a valid CPAN::Meta object or dies if the supplied metadata hash | |
| #pod reference fails to validate. Older-format metadata will be up-converted to | |
| #pod version 2 if they validate against the original stated specification. | |
| #pod | |
| #pod It takes an optional hashref of options. Valid options include: | |
| #pod | |
| #pod =over | |
| #pod | |
| #pod =item * | |
| #pod | |
| #pod lazy_validation -- if true, new will attempt to convert the given metadata | |
| #pod to version 2 before attempting to validate it. This means than any | |
| #pod fixable errors will be handled by CPAN::Meta::Converter before validation. | |
| #pod (Note that this might result in invalid optional data being silently | |
| #pod dropped.) The default is false. | |
| #pod | |
| #pod =back | |
| #pod | |
| #pod =cut | |
| sub _new { | |
| my ($class, $struct, $options) = @_; | |
| my $self; | |
| if ( $options->{lazy_validation} ) { | |
| # try to convert to a valid structure; if succeeds, then return it | |
| my $cmc = CPAN::Meta::Converter->new( $struct ); | |
| $self = $cmc->convert( version => 2 ); # valid or dies | |
| return bless $self, $class; | |
| } | |
| else { | |
| # validate original struct | |
| my $cmv = CPAN::Meta::Validator->new( $struct ); | |
| unless ( $cmv->is_valid) { | |
| die "Invalid metadata structure. Errors: " | |
| . join(", ", $cmv->errors) . "\n"; | |
| } | |
| } | |
| # up-convert older spec versions | |
| my $version = $struct->{'meta-spec'}{version} || '1.0'; | |
| if ( $version == 2 ) { | |
| $self = $struct; | |
| } | |
| else { | |
| my $cmc = CPAN::Meta::Converter->new( $struct ); | |
| $self = $cmc->convert( version => 2 ); | |
| } | |
| return bless $self, $class; | |
| } | |
| sub new { | |
| my ($class, $struct, $options) = @_; | |
| my $self = eval { $class->_new($struct, $options) }; | |
| croak($@) if $@; | |
| return $self; | |
| } | |
| #pod =method create | |
| #pod | |
| #pod my $meta = CPAN::Meta->create($distmeta_struct, \%options); | |
| #pod | |
| #pod This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields | |
| #pod will be generated if not provided. This means the metadata structure is | |
| #pod assumed to otherwise follow the latest L<CPAN::Meta::Spec>. | |
| #pod | |
| #pod =cut | |
| sub create { | |
| my ($class, $struct, $options) = @_; | |
| my $version = __PACKAGE__->VERSION || 2; | |
| $struct->{generated_by} ||= __PACKAGE__ . " version $version" ; | |
| $struct->{'meta-spec'}{version} ||= int($version); | |
| my $self = eval { $class->_new($struct, $options) }; | |
| croak ($@) if $@; | |
| return $self; | |
| } | |
| #pod =method load_file | |
| #pod | |
| #pod my $meta = CPAN::Meta->load_file($distmeta_file, \%options); | |
| #pod | |
| #pod Given a pathname to a file containing metadata, this deserializes the file | |
| #pod according to its file suffix and constructs a new C<CPAN::Meta> object, just | |
| #pod like C<new()>. It will die if the deserialized version fails to validate | |
| #pod against its stated specification version. | |
| #pod | |
| #pod It takes the same options as C<new()> but C<lazy_validation> defaults to | |
| #pod true. | |
| #pod | |
| #pod =cut | |
| sub load_file { | |
| my ($class, $file, $options) = @_; | |
| $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; | |
| croak "load_file() requires a valid, readable filename" | |
| unless -r $file; | |
| my $self; | |
| eval { | |
| my $struct = Parse::CPAN::Meta->load_file( $file ); | |
| $self = $class->_new($struct, $options); | |
| }; | |
| croak($@) if $@; | |
| return $self; | |
| } | |
| #pod =method load_yaml_string | |
| #pod | |
| #pod my $meta = CPAN::Meta->load_yaml_string($yaml, \%options); | |
| #pod | |
| #pod This method returns a new CPAN::Meta object using the first document in the | |
| #pod given YAML string. In other respects it is identical to C<load_file()>. | |
| #pod | |
| #pod =cut | |
| sub load_yaml_string { | |
| my ($class, $yaml, $options) = @_; | |
| $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; | |
| my $self; | |
| eval { | |
| my ($struct) = Parse::CPAN::Meta->load_yaml_string( $yaml ); | |
| $self = $class->_new($struct, $options); | |
| }; | |
| croak($@) if $@; | |
| return $self; | |
| } | |
| #pod =method load_json_string | |
| #pod | |
| #pod my $meta = CPAN::Meta->load_json_string($json, \%options); | |
| #pod | |
| #pod This method returns a new CPAN::Meta object using the structure represented by | |
| #pod the given JSON string. In other respects it is identical to C<load_file()>. | |
| #pod | |
| #pod =cut | |
| sub load_json_string { | |
| my ($class, $json, $options) = @_; | |
| $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; | |
| my $self; | |
| eval { | |
| my $struct = Parse::CPAN::Meta->load_json_string( $json ); | |
| $self = $class->_new($struct, $options); | |
| }; | |
| croak($@) if $@; | |
| return $self; | |
| } | |
| #pod =method load_string | |
| #pod | |
| #pod my $meta = CPAN::Meta->load_string($string, \%options); | |
| #pod | |
| #pod If you don't know if a string contains YAML or JSON, this method will use | |
| #pod L<Parse::CPAN::Meta> to guess. In other respects it is identical to | |
| #pod C<load_file()>. | |
| #pod | |
| #pod =cut | |
| sub load_string { | |
| my ($class, $string, $options) = @_; | |
| $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; | |
| my $self; | |
| eval { | |
| my $struct = Parse::CPAN::Meta->load_string( $string ); | |
| $self = $class->_new($struct, $options); | |
| }; | |
| croak($@) if $@; | |
| return $self; | |
| } | |
| #pod =method save | |
| #pod | |
| #pod $meta->save($distmeta_file, \%options); | |
| #pod | |
| #pod Serializes the object as JSON and writes it to the given file. The only valid | |
| #pod option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file | |
| #pod is saved with UTF-8 encoding. | |
| #pod | |
| #pod For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP> | |
| #pod is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or | |
| #pod later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate | |
| #pod backend like L<JSON::XS>. | |
| #pod | |
| #pod For C<version> less than 2, the filename should end in '.yml'. | |
| #pod L<CPAN::Meta::Converter> is used to generate an older metadata structure, which | |
| #pod is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may | |
| #pod set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though | |
| #pod this is not recommended due to subtle incompatibilities between YAML parsers on | |
| #pod CPAN. | |
| #pod | |
| #pod =cut | |
| sub save { | |
| my ($self, $file, $options) = @_; | |
| my $version = $options->{version} || '2'; | |
| my $layer = $] ge '5.008001' ? ':utf8' : ''; | |
| if ( $version ge '2' ) { | |
| carp "'$file' should end in '.json'" | |
| unless $file =~ m{\.json$}; | |
| } | |
| else { | |
| carp "'$file' should end in '.yml'" | |
| unless $file =~ m{\.yml$}; | |
| } | |
| my $data = $self->as_string( $options ); | |
| open my $fh, ">$layer", $file | |
| or die "Error opening '$file' for writing: $!\n"; | |
| print {$fh} $data; | |
| close $fh | |
| or die "Error closing '$file': $!\n"; | |
| return 1; | |
| } | |
| #pod =method meta_spec_version | |
| #pod | |
| #pod This method returns the version part of the C<meta_spec> entry in the distmeta | |
| #pod structure. It is equivalent to: | |
| #pod | |
| #pod $meta->meta_spec->{version}; | |
| #pod | |
| #pod =cut | |
| sub meta_spec_version { | |
| my ($self) = @_; | |
| return $self->meta_spec->{version}; | |
| } | |
| #pod =method effective_prereqs | |
| #pod | |
| #pod my $prereqs = $meta->effective_prereqs; | |
| #pod | |
| #pod my $prereqs = $meta->effective_prereqs( \@feature_identifiers ); | |
| #pod | |
| #pod This method returns a L<CPAN::Meta::Prereqs> object describing all the | |
| #pod prereqs for the distribution. If an arrayref of feature identifiers is given, | |
| #pod the prereqs for the identified features are merged together with the | |
| #pod distribution's core prereqs before the CPAN::Meta::Prereqs object is returned. | |
| #pod | |
| #pod =cut | |
| sub effective_prereqs { | |
| my ($self, $features) = @_; | |
| $features ||= []; | |
| my $prereq = CPAN::Meta::Prereqs->new($self->prereqs); | |
| return $prereq unless @$features; | |
| my @other = map {; $self->feature($_)->prereqs } @$features; | |
| return $prereq->with_merged_prereqs(\@other); | |
| } | |
| #pod =method should_index_file | |
| #pod | |
| #pod ... if $meta->should_index_file( $filename ); | |
| #pod | |
| #pod This method returns true if the given file should be indexed. It decides this | |
| #pod by checking the C<file> and C<directory> keys in the C<no_index> property of | |
| #pod the distmeta structure. Note that neither the version format nor | |
| #pod C<release_status> are considered. | |
| #pod | |
| #pod C<$filename> should be given in unix format. | |
| #pod | |
| #pod =cut | |
| sub should_index_file { | |
| my ($self, $filename) = @_; | |
| for my $no_index_file (@{ $self->no_index->{file} || [] }) { | |
| return if $filename eq $no_index_file; | |
| } | |
| for my $no_index_dir (@{ $self->no_index->{directory} }) { | |
| $no_index_dir =~ s{$}{/} unless $no_index_dir =~ m{/\z}; | |
| return if index($filename, $no_index_dir) == 0; | |
| } | |
| return 1; | |
| } | |
| #pod =method should_index_package | |
| #pod | |
| #pod ... if $meta->should_index_package( $package ); | |
| #pod | |
| #pod This method returns true if the given package should be indexed. It decides | |
| #pod this by checking the C<package> and C<namespace> keys in the C<no_index> | |
| #pod property of the distmeta structure. Note that neither the version format nor | |
| #pod C<release_status> are considered. | |
| #pod | |
| #pod =cut | |
| sub should_index_package { | |
| my ($self, $package) = @_; | |
| for my $no_index_pkg (@{ $self->no_index->{package} || [] }) { | |
| return if $package eq $no_index_pkg; | |
| } | |
| for my $no_index_ns (@{ $self->no_index->{namespace} }) { | |
| return if index($package, "${no_index_ns}::") == 0; | |
| } | |
| return 1; | |
| } | |
| #pod =method features | |
| #pod | |
| #pod my @feature_objects = $meta->features; | |
| #pod | |
| #pod This method returns a list of L<CPAN::Meta::Feature> objects, one for each | |
| #pod optional feature described by the distribution's metadata. | |
| #pod | |
| #pod =cut | |
| sub features { | |
| my ($self) = @_; | |
| my $opt_f = $self->optional_features; | |
| my @features = map {; CPAN::Meta::Feature->new($_ => $opt_f->{ $_ }) } | |
| keys %$opt_f; | |
| return @features; | |
| } | |
| #pod =method feature | |
| #pod | |
| #pod my $feature_object = $meta->feature( $identifier ); | |
| #pod | |
| #pod This method returns a L<CPAN::Meta::Feature> object for the optional feature | |
| #pod with the given identifier. If no feature with that identifier exists, an | |
| #pod exception will be raised. | |
| #pod | |
| #pod =cut | |
| sub feature { | |
| my ($self, $ident) = @_; | |
| croak "no feature named $ident" | |
| unless my $f = $self->optional_features->{ $ident }; | |
| return CPAN::Meta::Feature->new($ident, $f); | |
| } | |
| #pod =method as_struct | |
| #pod | |
| #pod my $copy = $meta->as_struct( \%options ); | |
| #pod | |
| #pod This method returns a deep copy of the object's metadata as an unblessed hash | |
| #pod reference. It takes an optional hashref of options. If the hashref contains | |
| #pod a C<version> argument, the copied metadata will be converted to the version | |
| #pod of the specification and returned. For example: | |
| #pod | |
| #pod my $old_spec = $meta->as_struct( {version => "1.4"} ); | |
| #pod | |
| #pod =cut | |
| sub as_struct { | |
| my ($self, $options) = @_; | |
| my $struct = _dclone($self); | |
| if ( $options->{version} ) { | |
| my $cmc = CPAN::Meta::Converter->new( $struct ); | |
| $struct = $cmc->convert( version => $options->{version} ); | |
| } | |
| return $struct; | |
| } | |
| #pod =method as_string | |
| #pod | |
| #pod my $string = $meta->as_string( \%options ); | |
| #pod | |
| #pod This method returns a serialized copy of the object's metadata as a character | |
| #pod string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref | |
| #pod of options. If the hashref contains a C<version> argument, the copied metadata | |
| #pod will be converted to the version of the specification and returned. For | |
| #pod example: | |
| #pod | |
| #pod my $string = $meta->as_string( {version => "1.4"} ); | |
| #pod | |
| #pod For C<version> greater than or equal to 2, the string will be serialized as | |
| #pod JSON. For C<version> less than 2, the string will be serialized as YAML. In | |
| #pod both cases, the same rules are followed as in the C<save()> method for choosing | |
| #pod a serialization backend. | |
| #pod | |
| #pod The serialized structure will include a C<x_serialization_backend> entry giving | |
| #pod the package and version used to serialize. Any existing key in the given | |
| #pod C<$meta> object will be clobbered. | |
| #pod | |
| #pod =cut | |
| sub as_string { | |
| my ($self, $options) = @_; | |
| my $version = $options->{version} || '2'; | |
| my $struct; | |
| if ( $self->meta_spec_version ne $version ) { | |
| my $cmc = CPAN::Meta::Converter->new( $self->as_struct ); | |
| $struct = $cmc->convert( version => $version ); | |
| } | |
| else { | |
| $struct = $self->as_struct; | |
| } | |
| my ($data, $backend); | |
| if ( $version ge '2' ) { | |
| $backend = Parse::CPAN::Meta->json_backend(); | |
| local $struct->{x_serialization_backend} = sprintf '%s version %s', | |
| $backend, $backend->VERSION; | |
| $data = $backend->new->pretty->canonical->encode($struct); | |
| } | |
| else { | |
| $backend = Parse::CPAN::Meta->yaml_backend(); | |
| local $struct->{x_serialization_backend} = sprintf '%s version %s', | |
| $backend, $backend->VERSION; | |
| $data = eval { no strict 'refs'; &{"$backend\::Dump"}($struct) }; | |
| if ( $@ ) { | |
| croak $backend->can('errstr') ? $backend->errstr : $@ | |
| } | |
| } | |
| return $data; | |
| } | |
| # Used by JSON::PP, etc. for "convert_blessed" | |
| sub TO_JSON { | |
| return { %{ $_[0] } }; | |
| } | |
| 1; | |
| # ABSTRACT: the distribution metadata for a CPAN dist | |
| =pod | |
| =encoding UTF-8 | |
| =head1 NAME | |
| CPAN::Meta - the distribution metadata for a CPAN dist | |
| =head1 VERSION | |
| version 2.150010 | |
| =head1 SYNOPSIS | |
| use v5.10; | |
| use strict; | |
| use warnings; | |
| use CPAN::Meta; | |
| use Module::Load; | |
| my $meta = CPAN::Meta->load_file('META.json'); | |
| printf "testing requirements for %s version %s\n", | |
| $meta->name, | |
| $meta->version; | |
| my $prereqs = $meta->effective_prereqs; | |
| for my $phase ( qw/configure runtime build test/ ) { | |
| say "Requirements for $phase:"; | |
| my $reqs = $prereqs->requirements_for($phase, "requires"); | |
| for my $module ( sort $reqs->required_modules ) { | |
| my $status; | |
| if ( eval { load $module unless $module eq 'perl'; 1 } ) { | |
| my $version = $module eq 'perl' ? $] : $module->VERSION; | |
| $status = $reqs->accepts_module($module, $version) | |
| ? "$version ok" : "$version not ok"; | |
| } else { | |
| $status = "missing" | |
| }; | |
| say " $module ($status)"; | |
| } | |
| } | |
| =head1 DESCRIPTION | |
| Software distributions released to the CPAN include a F<META.json> or, for | |
| older distributions, F<META.yml>, which describes the distribution, its | |
| contents, and the requirements for building and installing the distribution. | |
| The data structure stored in the F<META.json> file is described in | |
| L<CPAN::Meta::Spec>. | |
| CPAN::Meta provides a simple class to represent this distribution metadata (or | |
| I<distmeta>), along with some helpful methods for interrogating that data. | |
| The documentation below is only for the methods of the CPAN::Meta object. For | |
| information on the meaning of individual fields, consult the spec. | |
| =head1 METHODS | |
| =head2 new | |
| my $meta = CPAN::Meta->new($distmeta_struct, \%options); | |
| Returns a valid CPAN::Meta object or dies if the supplied metadata hash | |
| reference fails to validate. Older-format metadata will be up-converted to | |
| version 2 if they validate against the original stated specification. | |
| It takes an optional hashref of options. Valid options include: | |
| =over | |
| =item * | |
| lazy_validation -- if true, new will attempt to convert the given metadata | |
| to version 2 before attempting to validate it. This means than any | |
| fixable errors will be handled by CPAN::Meta::Converter before validation. | |
| (Note that this might result in invalid optional data being silently | |
| dropped.) The default is false. | |
| =back | |
| =head2 create | |
| my $meta = CPAN::Meta->create($distmeta_struct, \%options); | |
| This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields | |
| will be generated if not provided. This means the metadata structure is | |
| assumed to otherwise follow the latest L<CPAN::Meta::Spec>. | |
| =head2 load_file | |
| my $meta = CPAN::Meta->load_file($distmeta_file, \%options); | |
| Given a pathname to a file containing metadata, this deserializes the file | |
| according to its file suffix and constructs a new C<CPAN::Meta> object, just | |
| like C<new()>. It will die if the deserialized version fails to validate | |
| against its stated specification version. | |
| It takes the same options as C<new()> but C<lazy_validation> defaults to | |
| true. | |
| =head2 load_yaml_string | |
| my $meta = CPAN::Meta->load_yaml_string($yaml, \%options); | |
| This method returns a new CPAN::Meta object using the first document in the | |
| given YAML string. In other respects it is identical to C<load_file()>. | |
| =head2 load_json_string | |
| my $meta = CPAN::Meta->load_json_string($json, \%options); | |
| This method returns a new CPAN::Meta object using the structure represented by | |
| the given JSON string. In other respects it is identical to C<load_file()>. | |
| =head2 load_string | |
| my $meta = CPAN::Meta->load_string($string, \%options); | |
| If you don't know if a string contains YAML or JSON, this method will use | |
| L<Parse::CPAN::Meta> to guess. In other respects it is identical to | |
| C<load_file()>. | |
| =head2 save | |
| $meta->save($distmeta_file, \%options); | |
| Serializes the object as JSON and writes it to the given file. The only valid | |
| option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file | |
| is saved with UTF-8 encoding. | |
| For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP> | |
| is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or | |
| later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate | |
| backend like L<JSON::XS>. | |
| For C<version> less than 2, the filename should end in '.yml'. | |
| L<CPAN::Meta::Converter> is used to generate an older metadata structure, which | |
| is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may | |
| set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though | |
| this is not recommended due to subtle incompatibilities between YAML parsers on | |
| CPAN. | |
| =head2 meta_spec_version | |
| This method returns the version part of the C<meta_spec> entry in the distmeta | |
| structure. It is equivalent to: | |
| $meta->meta_spec->{version}; | |
| =head2 effective_prereqs | |
| my $prereqs = $meta->effective_prereqs; | |
| my $prereqs = $meta->effective_prereqs( \@feature_identifiers ); | |
| This method returns a L<CPAN::Meta::Prereqs> object describing all the | |
| prereqs for the distribution. If an arrayref of feature identifiers is given, | |
| the prereqs for the identified features are merged together with the | |
| distribution's core prereqs before the CPAN::Meta::Prereqs object is returned. | |
| =head2 should_index_file | |
| ... if $meta->should_index_file( $filename ); | |
| This method returns true if the given file should be indexed. It decides this | |
| by checking the C<file> and C<directory> keys in the C<no_index> property of | |
| the distmeta structure. Note that neither the version format nor | |
| C<release_status> are considered. | |
| C<$filename> should be given in unix format. | |
| =head2 should_index_package | |
| ... if $meta->should_index_package( $package ); | |
| This method returns true if the given package should be indexed. It decides | |
| this by checking the C<package> and C<namespace> keys in the C<no_index> | |
| property of the distmeta structure. Note that neither the version format nor | |
| C<release_status> are considered. | |
| =head2 features | |
| my @feature_objects = $meta->features; | |
| This method returns a list of L<CPAN::Meta::Feature> objects, one for each | |
| optional feature described by the distribution's metadata. | |
| =head2 feature | |
| my $feature_object = $meta->feature( $identifier ); | |
| This method returns a L<CPAN::Meta::Feature> object for the optional feature | |
| with the given identifier. If no feature with that identifier exists, an | |
| exception will be raised. | |
| =head2 as_struct | |
| my $copy = $meta->as_struct( \%options ); | |
| This method returns a deep copy of the object's metadata as an unblessed hash | |
| reference. It takes an optional hashref of options. If the hashref contains | |
| a C<version> argument, the copied metadata will be converted to the version | |
| of the specification and returned. For example: | |
| my $old_spec = $meta->as_struct( {version => "1.4"} ); | |
| =head2 as_string | |
| my $string = $meta->as_string( \%options ); | |
| This method returns a serialized copy of the object's metadata as a character | |
| string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref | |
| of options. If the hashref contains a C<version> argument, the copied metadata | |
| will be converted to the version of the specification and returned. For | |
| example: | |
| my $string = $meta->as_string( {version => "1.4"} ); | |
| For C<version> greater than or equal to 2, the string will be serialized as | |
| JSON. For C<version> less than 2, the string will be serialized as YAML. In | |
| both cases, the same rules are followed as in the C<save()> method for choosing | |
| a serialization backend. | |
| The serialized structure will include a C<x_serialization_backend> entry giving | |
| the package and version used to serialize. Any existing key in the given | |
| C<$meta> object will be clobbered. | |
| =head1 STRING DATA | |
| The following methods return a single value, which is the value for the | |
| corresponding entry in the distmeta structure. Values should be either undef | |
| or strings. | |
| =over 4 | |
| =item * | |
| abstract | |
| =item * | |
| description | |
| =item * | |
| dynamic_config | |
| =item * | |
| generated_by | |
| =item * | |
| name | |
| =item * | |
| release_status | |
| =item * | |
| version | |
| =back | |
| =head1 LIST DATA | |
| These methods return lists of string values, which might be represented in the | |
| distmeta structure as arrayrefs or scalars: | |
| =over 4 | |
| =item * | |
| authors | |
| =item * | |
| keywords | |
| =item * | |
| licenses | |
| =back | |
| The C<authors> and C<licenses> methods may also be called as C<author> and | |
| C<license>, respectively, to match the field name in the distmeta structure. | |
| =head1 MAP DATA | |
| These readers return hashrefs of arbitrary unblessed data structures, each | |
| described more fully in the specification: | |
| =over 4 | |
| =item * | |
| meta_spec | |
| =item * | |
| resources | |
| =item * | |
| provides | |
| =item * | |
| no_index | |
| =item * | |
| prereqs | |
| =item * | |
| optional_features | |
| =back | |
| =head1 CUSTOM DATA | |
| A list of custom keys are available from the C<custom_keys> method and | |
| particular keys may be retrieved with the C<custom> method. | |
| say $meta->custom($_) for $meta->custom_keys; | |
| If a custom key refers to a data structure, a deep clone is returned. | |
| =for Pod::Coverage TO_JSON abstract author authors custom custom_keys description dynamic_config | |
| generated_by keywords license licenses meta_spec name no_index | |
| optional_features prereqs provides release_status resources version | |
| =head1 BUGS | |
| Please report any bugs or feature using the CPAN Request Tracker. | |
| Bugs can be submitted through the web interface at | |
| L<http://rt.cpan.org/Dist/Display.html?Queue=CPAN-Meta> | |
| When submitting a bug or request, please include a test-file or a patch to an | |
| existing test-file that illustrates the bug or desired feature. | |
| =head1 SEE ALSO | |
| =over 4 | |
| =item * | |
| L<CPAN::Meta::Converter> | |
| =item * | |
| L<CPAN::Meta::Validator> | |
| =back | |
| =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan | |
| =head1 SUPPORT | |
| =head2 Bugs / Feature Requests | |
| Please report any bugs or feature requests through the issue tracker | |
| at L<https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues>. | |
| You will be notified automatically of any progress on your issue. | |
| =head2 Source Code | |
| This is open source software. The code repository is available for | |
| public review and contribution under the terms of the license. | |
| L<https://github.com/Perl-Toolchain-Gang/CPAN-Meta> | |
| git clone https://github.com/Perl-Toolchain-Gang/CPAN-Meta.git | |
| =head1 AUTHORS | |
| =over 4 | |
| =item * | |
| David Golden <[email protected]> | |
| =item * | |
| Ricardo Signes <[email protected]> | |
| =item * | |
| Adam Kennedy <[email protected]> | |
| =back | |
| =head1 CONTRIBUTORS | |
| =for stopwords Ansgar Burchardt Avar Arnfjord Bjarmason Benjamin Noggle Christopher J. Madsen Chuck Adams Cory G Watson Damyan Ivanov David Golden Eric Wilhelm Graham Knop Gregor Hermann Karen Etheridge Kenichi Ishigaki Kent Fredric Ken Williams Lars Dieckow Leon Timmermans majensen Mark Fowler Matt S Trout Michael G. Schwern Mohammad Anwar mohawk2 moznion Niko Tyni Olaf Alders Olivier Mengué Randy Sims Tomohiro Hosaka | |
| =over 4 | |
| =item * | |
| Ansgar Burchardt <[email protected]> | |
| =item * | |
| Avar Arnfjord Bjarmason <[email protected]> | |
| =item * | |
| Benjamin Noggle <[email protected]> | |
| =item * | |
| Christopher J. Madsen <[email protected]> | |
| =item * | |
| Chuck Adams <[email protected]> | |
| =item * | |
| Cory G Watson <[email protected]> | |
| =item * | |
| Damyan Ivanov <[email protected]> | |
| =item * | |
| David Golden <[email protected]> | |
| =item * | |
| Eric Wilhelm <[email protected]> | |
| =item * | |
| Graham Knop <[email protected]> | |
| =item * | |
| Gregor Hermann <[email protected]> | |
| =item * | |
| Karen Etheridge <[email protected]> | |
| =item * | |
| Kenichi Ishigaki <[email protected]> | |
| =item * | |
| Kent Fredric <[email protected]> | |
| =item * | |
| Ken Williams <[email protected]> | |
| =item * | |
| Lars Dieckow <[email protected]> | |
| =item * | |
| Leon Timmermans <[email protected]> | |
| =item * | |
| majensen <[email protected]> | |
| =item * | |
| Mark Fowler <[email protected]> | |
| =item * | |
| Matt S Trout <[email protected]> | |
| =item * | |
| Michael G. Schwern <[email protected]> | |
| =item * | |
| Mohammad S Anwar <[email protected]> | |
| =item * | |
| mohawk2 <[email protected]> | |
| =item * | |
| moznion <[email protected]> | |
| =item * | |
| Niko Tyni <[email protected]> | |
| =item * | |
| Olaf Alders <[email protected]> | |
| =item * | |
| Olivier Mengué <[email protected]> | |
| =item * | |
| Randy Sims <[email protected]> | |
| =item * | |
| Tomohiro Hosaka <[email protected]> | |
| =back | |
| =head1 COPYRIGHT AND LICENSE | |
| This software is copyright (c) 2010 by David Golden, Ricardo Signes, Adam Kennedy and Contributors. | |
| This is free software; you can redistribute it and/or modify it under | |
| the same terms as the Perl 5 programming language system itself. | |
| =cut | |
| __END__ | |
| # vim: ts=2 sts=2 sw=2 et : | |