diff options
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm')
-rw-r--r-- | Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm | 152 |
1 files changed, 85 insertions, 67 deletions
diff --git a/Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm b/Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm index 56eecb45290..688bcfe6966 100644 --- a/Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm +++ b/Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm @@ -1,9 +1,10 @@ use 5.008001; use strict; +use warnings; package Parse::CPAN::Meta; # ABSTRACT: Parse META.yml and META.json CPAN metadata files -our $VERSION = '1.4417_001'; +our $VERSION = '2.150010'; use Exporter; use Carp 'croak'; @@ -50,7 +51,10 @@ sub load_yaml_string { sub load_json_string { my ($class, $string) = @_; - my $data = eval { $class->json_backend()->new->decode($string) }; + require Encode; + # load_json_string takes characters, decode_json expects bytes + my $encoded = Encode::encode('UTF-8', $string, Encode::PERLQQ()); + my $data = eval { $class->json_decoder()->can('decode_json')->($encoded) }; croak $@ if $@; return $data || {}; } @@ -71,10 +75,38 @@ sub yaml_backend { } } +sub json_decoder { + if ($ENV{PERL_CORE}) { + _can_load( 'JSON::PP' => 2.27300 ) + or croak "JSON::PP 2.27300 is not available\n"; + return 'JSON::PP'; + } + if (my $decoder = $ENV{CPAN_META_JSON_DECODER}) { + _can_load( $decoder ) + or croak "Could not load CPAN_META_JSON_DECODER '$decoder'\n"; + $decoder->can('decode_json') + or croak "No decode_json sub provided by CPAN_META_JSON_DECODER '$decoder'\n"; + return $decoder; + } + return $_[0]->json_backend; +} + sub json_backend { - if ($ENV{PERL_CORE} or ! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') { - _can_load( 'JSON::PP' => 2.27103 ) - or croak "JSON::PP 2.27103 is not available\n"; + if ($ENV{PERL_CORE}) { + _can_load( 'JSON::PP' => 2.27300 ) + or croak "JSON::PP 2.27300 is not available\n"; + return 'JSON::PP'; + } + if (my $backend = $ENV{CPAN_META_JSON_BACKEND}) { + _can_load( $backend ) + or croak "Could not load CPAN_META_JSON_BACKEND '$backend'\n"; + $backend->can('new') + or croak "No constructor provided by CPAN_META_JSON_BACKEND '$backend'\n"; + return $backend; + } + if (! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') { + _can_load( 'JSON::PP' => 2.27300 ) + or croak "JSON::PP 2.27300 is not available\n"; return 'JSON::PP'; } else { @@ -93,7 +125,7 @@ sub _slurp { $content = Encode::decode('UTF-8', $content, Encode::PERLQQ()); return $content; } - + sub _can_load { my ($module, $version) = @_; (my $file = $module) =~ s{::}{/}g; @@ -137,27 +169,27 @@ Parse::CPAN::Meta - Parse META.yml and META.json CPAN metadata files =head1 VERSION -version 1.4417 +version 2.150010 =head1 SYNOPSIS ############################################# # In your file - + --- name: My-Distribution version: 1.23 resources: homepage: "http://example.com/dist/My-Distribution" - - + + ############################################# # In your program - + use Parse::CPAN::Meta; - + my $distmeta = Parse::CPAN::Meta->load_file('META.yml'); - + # Reading properties my $name = $distmeta->{name}; my $version = $distmeta->{version}; @@ -213,7 +245,7 @@ C<load_yaml_string>. my $metadata_structure = Parse::CPAN::Meta->load_json_string($json_string); -This method deserializes the given string of JSON and the result. +This method deserializes the given string of JSON and the result. If the source was UTF-8 encoded, the string must be decoded before calling C<load_json_string>. @@ -235,11 +267,22 @@ for details. my $backend = Parse::CPAN::Meta->json_backend; -Returns the module name of the JSON serializer. This will either -be L<JSON::PP> or L<JSON>. Even if C<PERL_JSON_BACKEND> is set, +Returns the module name of the JSON serializer. If C<CPAN_META_JSON_BACKEND> +is set, this will be whatever that's set to. If not, this will either +be L<JSON::PP> or L<JSON>. If C<PERL_JSON_BACKEND> is set, this will return L<JSON> as further delegation is handled by the L<JSON> module. See L</ENVIRONMENT> for details. +=head2 json_decoder + + my $decoder = Parse::CPAN::Meta->json_decoder; + +Returns the module name of the JSON decoder. Unlike L</json_backend>, this +is not necessarily a full L<JSON>-style module, but only something that will +provide a C<decode_json> subroutine. If C<CPAN_META_JSON_DECODER> is set, +this will be whatever that's set to. If not, this will be whatever has +been selected as L</json_backend>. See L</ENVIRONMENT> for more notes. + =head1 FUNCTIONS For maintenance clarity, no functions are exported by default. These functions @@ -261,13 +304,35 @@ Reads the YAML stream from a file instead of a string. =head1 ENVIRONMENT +=head2 CPAN_META_JSON_DECODER + +By default, L<JSON::PP> will be used for deserializing JSON data. If the +C<CPAN_META_JSON_DECODER> environment variable exists, this is expected to +be the name of a loadable module that provides a C<decode_json> subroutine, +which will then be used for deserialization. Relying only on the existence +of said subroutine allows for maximum compatibility, since this API is +provided by all of L<JSON::PP>, L<JSON::XS>, L<Cpanel::JSON::XS>, +L<JSON::MaybeXS>, L<JSON::Tiny>, and L<Mojo::JSON>. + +=head2 CPAN_META_JSON_BACKEND + +By default, L<JSON::PP> will be used for deserializing JSON data. If the +C<CPAN_META_JSON_BACKEND> environment variable exists, this is expected to +be the name of a loadable module that provides the L<JSON> API, since +downstream code expects to be able to call C<new> on this class. As such, +while L<JSON::PP>, L<JSON::XS>, L<Cpanel::JSON::XS> and L<JSON::MaybeXS> will +work for this, to use L<Mojo::JSON> or L<JSON::Tiny> for decoding requires +setting L</CPAN_META_JSON_DECODER>. + =head2 PERL_JSON_BACKEND -By default, L<JSON::PP> will be used for deserializing JSON data. If the +If the C<CPAN_META_JSON_BACKEND> environment variable does not exist, and if C<PERL_JSON_BACKEND> environment variable exists, is true and is not "JSON::PP", then the L<JSON> module (version 2.5 or greater) will be loaded and used to interpret C<PERL_JSON_BACKEND>. If L<JSON> is not installed or is too -old, an exception will be thrown. +old, an exception will be thrown. Note that at the time of writing, the only +useful values are 1, which will tell L<JSON> to guess, or L<JSON::XS> - if +you want to use a newer JSON module, see L</CPAN_META_JSON_BACKEND>. =head2 PERL_YAML_BACKEND @@ -277,74 +342,27 @@ as a module to use for deserialization. The given module must be installed, must load correctly and must implement the C<Load()> function or an exception will be thrown. -=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/Parse-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/Parse-CPAN-Meta> - - git clone https://github.com/Perl-Toolchain-Gang/Parse-CPAN-Meta.git - =head1 AUTHORS =over 4 =item * -Adam Kennedy <adamk@cpan.org> - -=item * - David Golden <dagolden@cpan.org> -=back - -=head1 CONTRIBUTORS - -=for stopwords Graham Knop Joshua ben Jore Karen Etheridge Neil Bowers Ricardo Signes Steffen Mueller - -=over 4 - -=item * - -Graham Knop <haarg@haarg.org> - -=item * - -Joshua ben Jore <jjore@cpan.org> - -=item * - -Karen Etheridge <ether@cpan.org> - -=item * - -Neil Bowers <neil@bowers.com> - =item * Ricardo Signes <rjbs@cpan.org> =item * -Steffen Mueller <smueller@cpan.org> +Adam Kennedy <adamk@cpan.org> =back =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2015 by Adam Kennedy and Contributors. +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. |