summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm')
-rw-r--r--Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm152
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.