summaryrefslogtreecommitdiff
path: root/cpan/Parse-CPAN-Meta
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2009-09-26 16:30:36 +0100
committerNicholas Clark <nick@ccl4.org>2009-09-26 17:51:17 +0100
commit832db5b145e835174f45afb2c497b046dc1fc2ac (patch)
treee046d9888589a25b537faafb690db73be38f9ebe /cpan/Parse-CPAN-Meta
parent23cad4453f3408b97f569bd2fe7084eb4fa99b3c (diff)
downloadperl-832db5b145e835174f45afb2c497b046dc1fc2ac.tar.gz
Move Parse::CPAN::Meta from ext/ to cpan/
Diffstat (limited to 'cpan/Parse-CPAN-Meta')
-rw-r--r--cpan/Parse-CPAN-Meta/Changes38
-rw-r--r--cpan/Parse-CPAN-Meta/lib/Parse/CPAN/Meta.pm437
-rw-r--r--cpan/Parse-CPAN-Meta/t/01_compile.t29
-rw-r--r--cpan/Parse-CPAN-Meta/t/02_basic.t263
-rw-r--r--cpan/Parse-CPAN-Meta/t/03_regression.t622
-rw-r--r--cpan/Parse-CPAN-Meta/t/04_scalar.t40
-rw-r--r--cpan/Parse-CPAN-Meta/t/05_export.t29
-rw-r--r--cpan/Parse-CPAN-Meta/t/11_meta_yml.t405
-rw-r--r--cpan/Parse-CPAN-Meta/t/12_plagger.t136
-rw-r--r--cpan/Parse-CPAN-Meta/t/13_perl_smith.t158
-rw-r--r--cpan/Parse-CPAN-Meta/t/14_yaml_org.t72
-rw-r--r--cpan/Parse-CPAN-Meta/t/15_multibyte.t59
-rw-r--r--cpan/Parse-CPAN-Meta/t/16_nullrefs.t39
-rw-r--r--cpan/Parse-CPAN-Meta/t/17_toolbar.t59
-rw-r--r--cpan/Parse-CPAN-Meta/t/18_tap.t90
-rw-r--r--cpan/Parse-CPAN-Meta/t/19_errors.t43
-rw-r--r--cpan/Parse-CPAN-Meta/t/21_bom.t39
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/HTML-WebDAO.yml8
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/Spreadsheet-Read.yml61
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/Template-Provider-Unicode-Japanese.yml20
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/multibyte.yml22
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/sample.yml28
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/toolbar.yml16
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/utf_16_le_bom.ymlbin0 -> 22 bytes
-rw-r--r--cpan/Parse-CPAN-Meta/t/data/vanilla.yml98
-rw-r--r--cpan/Parse-CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm86
26 files changed, 2897 insertions, 0 deletions
diff --git a/cpan/Parse-CPAN-Meta/Changes b/cpan/Parse-CPAN-Meta/Changes
new file mode 100644
index 0000000000..107b969e3f
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/Changes
@@ -0,0 +1,38 @@
+Changes for Perl programming language extension Parse-CPAN-Meta
+
+1.39 Thu 21 May 2009
+ - Even though utf8 starts at 5.7+ there's no is_utf till
+ 5.8.1 so skip in the tests if needed (ADAMK)
+
+1.38 Sat 16 May 2009
+ - Synchorised version numbers with YAML::Tiny
+ - Code shrinkages to the bloaty Unicode/BOM code
+ - Merging a ton more tests from YAML::Tiny
+ - Added back some pointless options to yaml_ok that keep our
+ codebase closer to YAML::Tiny (which should help with syncing)
+ - Changed exceptions to be closer to YAML::Tiny
+
+0.05 Wed 11 Mar 2009
+ - Upgrade previous release to a stable release.
+
+0.04_01 Tue 3 Mar 2009
+ - Merge Unicode / BOM fixes from YAML::Tiny
+
+0.04 Wed 7 Jan 2009
+ - Matching changes in YAML::Tiny 1.36
+ - Fixing missing feature reported by H.Merijn Brand
+ - Changes to make Padre-CPAN-Meta core-compatible (SMUELLER)++
+
+0.03 Thu 20 Mar 2008
+ - Adding YAML.pm compatibility in scalar context
+
+0.02 Thu 10 Jan 2008
+ - Purging some references to YAML::Tiny that I missed
+
+0.01 Tue 8 Jan 2008
+ - Cloned from YAML::Tiny 1.21
+ - Removed all write functionality
+ - Reduced interface to Load and LoadFile
+ - Removed object-orientation
+ - Removed global $errstr, all errors are exceptions
+ - Applied prototypes to all functions
diff --git a/cpan/Parse-CPAN-Meta/lib/Parse/CPAN/Meta.pm b/cpan/Parse-CPAN-Meta/lib/Parse/CPAN/Meta.pm
new file mode 100644
index 0000000000..a06556e331
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/lib/Parse/CPAN/Meta.pm
@@ -0,0 +1,437 @@
+package Parse::CPAN::Meta;
+
+use strict;
+use Carp 'croak';
+
+# UTF Support?
+sub HAVE_UTF8 () { $] >= 5.007003 }
+BEGIN {
+ if ( HAVE_UTF8 ) {
+ # The string eval helps hide this from Test::MinimumVersion
+ eval "require utf8;";
+ die "Failed to load UTF-8 support" if $@;
+ }
+
+ # Class structure
+ require 5.004;
+ require Exporter;
+ $Parse::CPAN::Meta::VERSION = '1.39';
+ @Parse::CPAN::Meta::ISA = qw{ Exporter };
+ @Parse::CPAN::Meta::EXPORT_OK = qw{ Load LoadFile };
+}
+
+# Prototypes
+sub LoadFile ($);
+sub Load ($);
+sub _scalar ($$$);
+sub _array ($$$);
+sub _hash ($$$);
+
+# Printable characters for escapes
+my %UNESCAPES = (
+ z => "\x00", a => "\x07", t => "\x09",
+ n => "\x0a", v => "\x0b", f => "\x0c",
+ r => "\x0d", e => "\x1b", '\\' => '\\',
+);
+
+
+
+
+
+#####################################################################
+# Implementation
+
+# Create an object from a file
+sub LoadFile ($) {
+ # Check the file
+ my $file = shift;
+ croak('You did not specify a file name') unless $file;
+ croak( "File '$file' does not exist" ) unless -e $file;
+ croak( "'$file' is a directory, not a file" ) unless -f _;
+ croak( "Insufficient permissions to read '$file'" ) unless -r _;
+
+ # Slurp in the file
+ local $/ = undef;
+ local *CFG;
+ unless ( open( CFG, $file ) ) {
+ croak("Failed to open file '$file': $!");
+ }
+ my $yaml = <CFG>;
+ unless ( close(CFG) ) {
+ croak("Failed to close file '$file': $!");
+ }
+
+ # Hand off to the actual parser
+ Load( $yaml );
+}
+
+# Parse a document from a string.
+# Doing checks on $_[0] prevents us having to do a string copy.
+sub Load ($) {
+ my $string = $_[0];
+ unless ( defined $string ) {
+ croak("Did not provide a string to load");
+ }
+
+ # Byte order marks
+ if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) {
+ croak("Stream has a non UTF-8 Unicode Byte Order Mark");
+ } else {
+ # Strip UTF-8 bom if found, we'll just ignore it
+ $string =~ s/^\357\273\277//;
+ }
+
+ # Try to decode as utf8
+ utf8::decode($string) if HAVE_UTF8;
+
+ # Check for some special cases
+ return () unless length $string;
+ unless ( $string =~ /[\012\015]+\z/ ) {
+ croak("Stream does not end with newline character");
+ }
+
+ # Split the file into lines
+ my @lines = grep { ! /^\s*(?:\#.*)?\z/ }
+ split /(?:\015{1,2}\012|\015|\012)/, $string;
+
+ # Strip the initial YAML header
+ @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines;
+
+ # A nibbling parser
+ my @documents = ();
+ while ( @lines ) {
+ # Do we have a document header?
+ if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) {
+ # Handle scalar documents
+ shift @lines;
+ if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) {
+ push @documents, _scalar( "$1", [ undef ], \@lines );
+ next;
+ }
+ }
+
+ if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) {
+ # A naked document
+ push @documents, undef;
+ while ( @lines and $lines[0] !~ /^---/ ) {
+ shift @lines;
+ }
+
+ } elsif ( $lines[0] =~ /^\s*\-/ ) {
+ # An array at the root
+ my $document = [ ];
+ push @documents, $document;
+ _array( $document, [ 0 ], \@lines );
+
+ } elsif ( $lines[0] =~ /^(\s*)\S/ ) {
+ # A hash at the root
+ my $document = { };
+ push @documents, $document;
+ _hash( $document, [ length($1) ], \@lines );
+
+ } else {
+ croak("Parse::CPAN::Meta failed to classify line '$lines[0]'");
+ }
+ }
+
+ if ( wantarray ) {
+ return @documents;
+ } else {
+ return $documents[-1];
+ }
+}
+
+# Deparse a scalar string to the actual scalar
+sub _scalar ($$$) {
+ my ($string, $indent, $lines) = @_;
+
+ # Trim trailing whitespace
+ $string =~ s/\s*\z//;
+
+ # Explitic null/undef
+ return undef if $string eq '~';
+
+ # Quotes
+ if ( $string =~ /^\'(.*?)\'\z/ ) {
+ return '' unless defined $1;
+ $string = $1;
+ $string =~ s/\'\'/\'/g;
+ return $string;
+ }
+ if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) {
+ # Reusing the variable is a little ugly,
+ # but avoids a new variable and a string copy.
+ $string = $1;
+ $string =~ s/\\"/"/g;
+ $string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex;
+ return $string;
+ }
+
+ # Special cases
+ if ( $string =~ /^[\'\"!&]/ ) {
+ croak("Parse::CPAN::Meta does not support a feature in line '$lines->[0]'");
+ }
+ return {} if $string eq '{}';
+ return [] if $string eq '[]';
+
+ # Regular unquoted string
+ return $string unless $string =~ /^[>|]/;
+
+ # Error
+ croak("Parse::CPAN::Meta failed to find multi-line scalar content") unless @$lines;
+
+ # Check the indent depth
+ $lines->[0] =~ /^(\s*)/;
+ $indent->[-1] = length("$1");
+ if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) {
+ croak("Parse::CPAN::Meta found bad indenting in line '$lines->[0]'");
+ }
+
+ # Pull the lines
+ my @multiline = ();
+ while ( @$lines ) {
+ $lines->[0] =~ /^(\s*)/;
+ last unless length($1) >= $indent->[-1];
+ push @multiline, substr(shift(@$lines), length($1));
+ }
+
+ my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n";
+ my $t = (substr($string, 1, 1) eq '-') ? '' : "\n";
+ return join( $j, @multiline ) . $t;
+}
+
+# Parse an array
+sub _array ($$$) {
+ my ($array, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ croak("Parse::CPAN::Meta found bad indenting in line '$lines->[0]'");
+ }
+
+ if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) {
+ # Inline nested hash
+ my $indent2 = length("$1");
+ $lines->[0] =~ s/-/ /;
+ push @$array, { };
+ _hash( $array->[-1], [ @$indent, $indent2 ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) {
+ # Array entry with a value
+ shift @$lines;
+ push @$array, _scalar( "$2", [ @$indent, undef ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) {
+ shift @$lines;
+ unless ( @$lines ) {
+ push @$array, undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)\-/ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] == $indent2 ) {
+ # Null array entry
+ push @$array, undef;
+ } else {
+ # Naked indenter
+ push @$array, [ ];
+ _array( $array->[-1], [ @$indent, $indent2 ], $lines );
+ }
+
+ } elsif ( $lines->[0] =~ /^(\s*)\S/ ) {
+ push @$array, { };
+ _hash( $array->[-1], [ @$indent, length("$1") ], $lines );
+
+ } else {
+ croak("Parse::CPAN::Meta failed to classify line '$lines->[0]'");
+ }
+
+ } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) {
+ # This is probably a structure like the following...
+ # ---
+ # foo:
+ # - list
+ # bar: value
+ #
+ # ... so lets return and let the hash parser handle it
+ return 1;
+
+ } else {
+ croak("Parse::CPAN::Meta failed to classify line '$lines->[0]'");
+ }
+ }
+
+ return 1;
+}
+
+# Parse an array
+sub _hash ($$$) {
+ my ($hash, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ croak("Parse::CPAN::Meta found bad indenting in line '$lines->[0]'");
+ }
+
+ # Get the key
+ unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+|$)// ) {
+ if ( $lines->[0] =~ /^\s*[?\'\"]/ ) {
+ croak("Parse::CPAN::Meta does not support a feature in line '$lines->[0]'");
+ }
+ croak("Parse::CPAN::Meta failed to classify line '$lines->[0]'");
+ }
+ my $key = $1;
+
+ # Do we have a value?
+ if ( length $lines->[0] ) {
+ # Yes
+ $hash->{$key} = _scalar( shift(@$lines), [ @$indent, undef ], $lines );
+ } else {
+ # An indent
+ shift @$lines;
+ unless ( @$lines ) {
+ $hash->{$key} = undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)-/ ) {
+ $hash->{$key} = [];
+ _array( $hash->{$key}, [ @$indent, length($1) ], $lines );
+ } elsif ( $lines->[0] =~ /^(\s*)./ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] >= $indent2 ) {
+ # Null hash entry
+ $hash->{$key} = undef;
+ } else {
+ $hash->{$key} = {};
+ _hash( $hash->{$key}, [ @$indent, length($1) ], $lines );
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Parse::CPAN::Meta - Parse META.yml and other similar CPAN metadata files
+
+=head1 SYNOPSIS
+
+ #############################################
+ # In your file
+
+ ---
+ rootproperty: blah
+ section:
+ one: two
+ three: four
+ Foo: Bar
+ empty: ~
+
+
+
+ #############################################
+ # In your program
+
+ use Parse::CPAN::Meta;
+
+ # Create a YAML file
+ my @yaml = Parse::CPAN::Meta::LoadFile( 'Meta.yml' );
+
+ # Reading properties
+ my $root = $yaml[0]->{rootproperty};
+ my $one = $yaml[0]->{section}->{one};
+ my $Foo = $yaml[0]->{section}->{Foo};
+
+=head1 DESCRIPTION
+
+B<Parse::CPAN::Meta> is a parser for F<META.yml> files, based on the
+parser half of L<YAML::Tiny>.
+
+It supports a basic subset of the full YAML specification, enough to
+implement parsing of typical F<META.yml> files, and other similarly simple
+YAML files.
+
+If you need something with more power, move up to a full YAML parser such
+as L<YAML>, L<YAML::Syck> or L<YAML::LibYAML>.
+
+B<Parse::CPAN::Meta> provides a very simply API of only two functions,
+based on the YAML functions of the same name. Wherever possible,
+identical calling semantics are used.
+
+All error reporting is done with exceptions (die'ing).
+
+=head1 FUNCTIONS
+
+For maintenance clarity, no functions are exported.
+
+=head2 Load
+
+ my @yaml = Load( $string );
+
+Parses a string containing a valid YAML stream into a list of Perl data
+structures.
+
+=head2 LoadFile
+
+ my @yaml = LoadFile( 'META.yml' );
+
+Reads the YAML stream from a file instead of a string.
+
+=head1 SUPPORT
+
+Bugs should be reported via the CPAN bug tracker at
+
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Parse-CPAN-Meta>
+
+=head1 AUTHOR
+
+Adam Kennedy E<lt>adamk@cpan.orgE<gt>
+
+=head1 SEE ALSO
+
+L<YAML>, L<YAML::Syck>, L<Config::Tiny>, L<CSS::Tiny>,
+L<http://use.perl.org/~Alias/journal/29427>, L<http://ali.as/>
+
+=head1 COPYRIGHT
+
+Copyright 2006 - 2009 Adam Kennedy.
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=cut
diff --git a/cpan/Parse-CPAN-Meta/t/01_compile.t b/cpan/Parse-CPAN-Meta/t/01_compile.t
new file mode 100644
index 0000000000..7e64db7917
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/01_compile.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+
+# Load testing for YAML::Tiny
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Test::More tests => 3;
+
+# Check their perl version
+ok( $] >= 5.004, "Your perl is new enough" );
+
+# Does the module load
+use_ok( 'Parse::CPAN::Meta' );
+use_ok( 'Parse::CPAN::Meta::Test' );
diff --git a/cpan/Parse-CPAN-Meta/t/02_basic.t b/cpan/Parse-CPAN-Meta/t/02_basic.t
new file mode 100644
index 0000000000..f6a91c1707
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/02_basic.t
@@ -0,0 +1,263 @@
+#!/usr/bin/perl
+
+# Testing of basic document structures
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(30);
+
+
+
+
+
+#####################################################################
+# Sample Testing
+
+# Test a completely empty document
+yaml_ok(
+ '',
+ [ ],
+ 'empty',
+);
+
+# Just a newline
+### YAML.pm has a bug where it dies on a single newline
+yaml_ok(
+ "\n\n",
+ [ ],
+ 'only_newlines',
+);
+
+# Just a comment
+yaml_ok(
+ "# comment\n",
+ [ ],
+ 'only_comment',
+);
+
+# Empty documents
+yaml_ok(
+ "---\n",
+ [ undef ],
+ 'only_header',
+ noyamlperl => 1,
+);
+yaml_ok(
+ "---\n---\n",
+ [ undef, undef ],
+ 'two_header',
+ noyamlperl => 1,
+);
+yaml_ok(
+ "--- ~\n",
+ [ undef ],
+ 'one_undef',
+ noyamlperl => 1,
+);
+yaml_ok(
+ "--- ~\n",
+ [ undef ],
+ 'one_undef2',
+ noyamlperl => 1,
+);
+yaml_ok(
+ "--- ~\n---\n",
+ [ undef, undef ],
+ 'two_undef',
+ noyamlperl => 1,
+);
+
+# Just a scalar
+yaml_ok(
+ "--- foo\n",
+ [ 'foo' ],
+ 'one_scalar',
+);
+yaml_ok(
+ "--- foo\n",
+ [ 'foo' ],
+ 'one_scalar2',
+);
+yaml_ok(
+ "--- foo\n--- bar\n",
+ [ 'foo', 'bar' ],
+ 'two_scalar',
+);
+
+# Simple lists
+yaml_ok(
+ "---\n- foo\n",
+ [ [ 'foo' ] ],
+ 'one_list1',
+);
+yaml_ok(
+ "---\n- foo\n- bar\n",
+ [ [ 'foo', 'bar' ] ],
+ 'one_list2',
+);
+yaml_ok(
+ "---\n- ~\n- bar\n",
+ [ [ undef, 'bar' ] ],
+ 'one_listundef',
+ noyamlperl => 1,
+);
+
+# Simple hashs
+yaml_ok(
+ "---\nfoo: bar\n",
+ [ { foo => 'bar' } ],
+ 'one_hash1',
+);
+
+yaml_ok(
+ "---\nfoo: bar\nthis: ~\n",
+ [ { this => undef, foo => 'bar' } ],
+ 'one_hash2',
+ noyamlperl => 1,
+);
+
+# Simple array inside a hash with an undef
+yaml_ok(
+ <<'END_YAML',
+---
+foo:
+ - bar
+ - ~
+ - baz
+END_YAML
+ [ { foo => [ 'bar', undef, 'baz' ] } ],
+ 'array_in_hash',
+ noyamlperl => 1,
+);
+
+# Simple hash inside a hash with an undef
+yaml_ok(
+ <<'END_YAML',
+---
+foo: ~
+bar:
+ foo: bar
+END_YAML
+ [ { foo => undef, bar => { foo => 'bar' } } ],
+ 'hash_in_hash',
+ noyamlperl => 1,
+);
+
+# Mixed hash and scalars inside an array
+yaml_ok(
+ <<'END_YAML',
+---
+-
+ foo: ~
+ this: that
+- foo
+- ~
+-
+ foo: bar
+ this: that
+END_YAML
+ [ [
+ { foo => undef, this => 'that' },
+ 'foo',
+ undef,
+ { foo => 'bar', this => 'that' },
+ ] ],
+ 'hash_in_array',
+ noyamlperl => 1,
+);
+
+# Simple single quote
+yaml_ok(
+ "---\n- 'foo'\n",
+ [ [ 'foo' ] ],
+ 'single_quote1',
+);
+yaml_ok(
+ "---\n- ' '\n",
+ [ [ ' ' ] ],
+ 'single_spaces',
+);
+yaml_ok(
+ "---\n- ''\n",
+ [ [ '' ] ],
+ 'single_null',
+);
+
+# Double quotes
+yaml_ok(
+ "--- \" \"\n",
+ [ ' ' ],
+ "only_spaces",
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+yaml_ok(
+ "--- \" foo\"\n--- \"bar \"\n",
+ [ " foo", "bar " ],
+ "leading_trailing_spaces",
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+# Implicit document start
+yaml_ok(
+ "foo: bar\n",
+ [ { foo => 'bar' } ],
+ 'implicit_hash',
+);
+yaml_ok(
+ "- foo\n",
+ [ [ 'foo' ] ],
+ 'implicit_array',
+);
+
+# Inline nested hash
+yaml_ok(
+ <<'END_YAML',
+---
+- ~
+- foo: bar
+ this: that
+- baz
+END_YAML
+ [ [ undef, { foo => 'bar', this => 'that' }, 'baz' ] ],
+ 'inline_nested_hash',
+ noyamlperl => 1,
+);
+
+# Empty comments
+yaml_ok(
+ "---\n- foo\n#\n- bar\n",
+ [ [ 'foo', 'bar' ] ],
+ 'empty_comment_in_list',
+);
+
+yaml_ok(
+ "---\nfoo: bar\n# foo\none: two\n",
+ [ { foo => 'bar', one => 'two' } ],
+ 'empty_comment_in_hash',
+);
+
+# Complex keys
+yaml_ok(
+ "---\na b: c d\n",
+ [ { 'a b' => 'c d' } ],
+ 'key_with_whitespace',
+);
diff --git a/cpan/Parse-CPAN-Meta/t/03_regression.t b/cpan/Parse-CPAN-Meta/t/03_regression.t
new file mode 100644
index 0000000000..e9fb70a8fb
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/03_regression.t
@@ -0,0 +1,622 @@
+#!/usr/bin/perl
+
+# Testing of common META.yml examples
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(37);
+
+
+
+
+
+#####################################################################
+# In META.yml files, some hash keys contain module names
+
+# Hash key legally containing a colon
+yaml_ok(
+ "---\nFoo::Bar: 1\n",
+ [ { 'Foo::Bar' => 1 } ],
+ 'module_hash_key',
+);
+
+# Hash indented
+yaml_ok(
+ "---\n"
+ . " foo: bar\n",
+ [ { foo => "bar" } ],
+ 'hash_indented',
+);
+
+
+
+
+
+#####################################################################
+# Support for literal multi-line scalars
+
+# Declarative multi-line scalar
+yaml_ok(
+ "---\n"
+ . " foo: >\n"
+ . " bar\n"
+ . " baz\n",
+ [ { foo => "bar baz\n" } ],
+ 'simple_multiline',
+);
+
+# Piped multi-line scalar
+yaml_ok(
+ <<'END_YAML',
+---
+- |
+ foo
+ bar
+- 1
+END_YAML
+ [ [ "foo\nbar\n", 1 ] ],
+ 'indented',
+);
+
+# ... with a pointless hyphen
+yaml_ok( <<'END_YAML',
+---
+- |-
+ foo
+ bar
+- 1
+END_YAML
+ [ [ "foo\nbar", 1 ] ],
+ 'indented',
+);
+
+
+
+
+
+#####################################################################
+# Support for YAML version directives
+
+# Simple inline case (comment variant)
+yaml_ok(
+ <<'END_YAML',
+--- #YAML:1.0
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'simple_doctype_comment',
+ nosyck => 1,
+);
+
+# Simple inline case (percent variant)
+yaml_ok(
+ <<'END_YAML',
+--- %YAML:1.0
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'simple_doctype_percent',
+ noyamlpm => 1,
+ noxs => 1,
+ noyamlperl => 1,
+);
+
+# Simple header (comment variant)
+yaml_ok(
+ <<'END_YAML',
+%YAML:1.0
+---
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'predocument_1_0',
+ noyamlpm => 1,
+ nosyck => 1,
+ noxs => 1,
+ noyamlperl => 1,
+);
+
+# Simple inline case (comment variant)
+yaml_ok(
+ <<'END_YAML',
+%YAML 1.1
+---
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'predocument_1_1',
+ noyamlpm => 1,
+ nosyck => 1,
+ noyamlperl => 1,
+);
+
+# Multiple inline documents (comment variant)
+yaml_ok(
+ <<'END_YAML',
+--- #YAML:1.0
+foo: bar
+--- #YAML:1.0
+- 1
+--- #YAML:1.0
+foo: bar
+END_YAML
+ [ { foo => 'bar' }, [ 1 ], { foo => 'bar' } ],
+ 'multi_doctype_comment',
+);
+
+# Simple pre-document case (comment variant)
+yaml_ok(
+ <<'END_YAML',
+%YAML 1.1
+---
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'predocument_percent',
+ noyamlpm => 1,
+ nosyck => 1,
+ noyamlperl => 1,
+);
+
+# Simple pre-document case (comment variant)
+yaml_ok(
+ <<'END_YAML',
+#YAML 1.1
+---
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'predocument_comment',
+);
+
+
+
+
+
+#####################################################################
+# Hitchhiker Scalar
+
+yaml_ok(
+ <<'END_YAML',
+--- 42
+END_YAML
+ [ 42 ],
+ 'hitchhiker scalar',
+ serializes => 1,
+);
+
+
+
+
+
+#####################################################################
+# Null HASH/ARRAY
+
+yaml_ok(
+ <<'END_YAML',
+---
+- foo
+- {}
+- bar
+END_YAML
+ [ [ 'foo', {}, 'bar' ] ],
+ 'null hash in array',
+);
+
+yaml_ok(
+ <<'END_YAML',
+---
+- foo
+- []
+- bar
+END_YAML
+ [ [ 'foo', [], 'bar' ] ],
+ 'null array in array',
+);
+
+yaml_ok(
+ <<'END_YAML',
+---
+foo: {}
+bar: 1
+END_YAML
+ [ { foo => {}, bar => 1 } ],
+ 'null hash in hash',
+);
+
+yaml_ok(
+ <<'END_YAML',
+---
+foo: []
+bar: 1
+END_YAML
+ [ { foo => [], bar => 1 } ],
+ 'null array in hash',
+);
+
+
+
+
+#####################################################################
+# Trailing Whitespace
+
+yaml_ok(
+ <<'END_YAML',
+---
+abstract: Generate fractal curves
+foo: ~
+arr:
+ - foo
+ - ~
+ - 'bar'
+END_YAML
+ [ {
+ abstract => 'Generate fractal curves',
+ foo => undef,
+ arr => [ 'foo', undef, 'bar' ],
+ } ],
+ 'trailing whitespace',
+ noyamlperl => 1,
+);
+
+
+
+
+
+#####################################################################
+# Quote vs Hash
+
+yaml_ok(
+ <<'END_YAML',
+---
+author:
+ - 'mst: Matt S. Trout <mst@shadowcatsystems.co.uk>'
+END_YAML
+ [ { author => [ 'mst: Matt S. Trout <mst@shadowcatsystems.co.uk>' ] } ],
+ 'hash-like quote',
+);
+
+
+
+
+
+#####################################################################
+# Quote and Escaping Idiosyncracies
+
+yaml_ok(
+ <<'END_YAML',
+---
+name1: 'O''Reilly'
+name2: 'O''Reilly O''Tool'
+name3: 'Double '''' Quote'
+END_YAML
+ [ {
+ name1 => "O'Reilly",
+ name2 => "O'Reilly O'Tool",
+ name3 => "Double '' Quote",
+ } ],
+ 'single quote subtleties',
+);
+
+yaml_ok(
+ <<'END_YAML',
+---
+slash1: '\\'
+slash2: '\\foo'
+slash3: '\\foo\\\\'
+END_YAML
+ [ {
+ slash1 => "\\\\",
+ slash2 => "\\\\foo",
+ slash3 => "\\\\foo\\\\\\\\",
+ } ],
+ 'single quote subtleties',
+);
+
+
+
+
+
+#####################################################################
+# Empty Values and Premature EOF
+
+yaml_ok(
+ <<'END_YAML',
+---
+foo: 0
+requires:
+build_requires:
+END_YAML
+ [ { foo => 0, requires => undef, build_requires => undef } ],
+ 'empty hash keys',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+yaml_ok(
+ <<'END_YAML',
+---
+- foo
+-
+-
+END_YAML
+ [ [ 'foo', undef, undef ] ],
+ 'empty array keys',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+
+
+
+
+#####################################################################
+# Comment on the Document Line
+
+yaml_ok(
+ <<'END_YAML',
+--- # Comment
+foo: bar
+END_YAML
+ [ { foo => 'bar' } ],
+ 'comment header',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+
+
+
+
+
+#####################################################################
+# Newlines and tabs
+
+yaml_ok(
+ <<'END_YAML',
+foo: "foo\\\n\tbar"
+END_YAML
+ [ { foo => "foo\\\n\tbar" } ],
+ 'special characters',
+);
+
+
+
+
+
+#####################################################################
+# Confirm we can read the synopsis
+
+yaml_ok(
+ <<'END_YAML',
+---
+rootproperty: blah
+section:
+ one: two
+ three: four
+ Foo: Bar
+ empty: ~
+END_YAML
+ [ {
+ rootproperty => 'blah',
+ section => {
+ one => 'two',
+ three => 'four',
+ Foo => 'Bar',
+ empty => undef,
+ },
+ } ],
+ 'synopsis',
+ noyamlperl => 1,
+);
+
+
+
+
+
+#####################################################################
+# Unprintable Characters
+
+yaml_ok(
+ "--- \"foo\\n\\x00\"\n",
+ [ "foo\n\0" ],
+ 'unprintable',
+);
+
+
+
+
+
+#####################################################################
+# Empty Quote Line
+
+yaml_ok(
+ <<'END_YAML',
+---
+- foo
+#
+- bar
+END_YAML
+ [ [ "foo", "bar" ] ],
+);
+
+
+
+
+
+#####################################################################
+# Indentation after empty hash value
+
+yaml_ok(
+ <<'END_YAML',
+---
+Test:
+ optmods:
+ Bad: 0
+ Foo: 1
+ Long: 0
+ version: 5
+Test_IncludeA:
+ optmods:
+Test_IncludeB:
+ optmods:
+_meta:
+ name: 'test profile'
+ note: 'note this test profile'
+END_YAML
+ [ {
+ Test => {
+ optmods => {
+ Bad => 0,
+ Foo => 1,
+ Long => 0,
+ },
+ version => 5,
+ },
+ Test_IncludeA => {
+ optmods => undef,
+ },
+ Test_IncludeB => {
+ optmods => undef,
+ },
+ _meta => {
+ name => 'test profile',
+ note => 'note this test profile',
+ },
+ } ],
+ 'Indentation after empty hash value',
+ noyamlperl => 1,
+);
+
+
+
+
+
+#####################################################################
+# Spaces in the Key
+
+yaml_ok(
+ <<'END_YAML',
+---
+the key: the value
+END_YAML
+ [ { 'the key' => 'the value' } ],
+);
+
+
+
+
+
+#####################################################################
+# Ticker #32402
+
+# Tests a particular pathological case
+
+yaml_ok(
+ <<'END_YAML',
+---
+- value
+- '><'
+END_YAML
+ [ [ 'value', '><' ] ],
+ 'Pathological >< case',
+);
+
+
+
+
+
+#####################################################################
+# Special Characters
+
+#yaml_ok(
+# <<'END_YAML',
+#---
+#- "Ingy d\xC3\xB6t Net"
+#END_YAML
+# [ [ "Ingy d\xC3\xB6t Net" ] ],
+#);
+
+
+
+
+
+
+######################################################################
+# Non-Indenting Sub-List
+
+yaml_ok(
+ <<'END_YAML',
+---
+foo:
+- list
+bar: value
+END_YAML
+ [ { foo => [ 'list' ], bar => 'value' } ],
+ 'Non-indenting sub-list',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+
+
+
+
+
+#####################################################################
+# Check Multiple-Escaping
+
+# RT #42119: write of two single quotes
+yaml_ok(
+ "--- \"A'B'C\"\n",
+ [ "A'B'C" ],
+ 'Multiple escaping of quote ok',
+);
+
+# Escapes without whitespace
+yaml_ok(
+ "--- A\\B\\C\n",
+ [ "A\\B\\C" ],
+ 'Multiple escaping of escape ok',
+);
+
+# Escapes with whitespace
+yaml_ok(
+ "--- 'A\\B \\C'\n",
+ [ "A\\B \\C" ],
+ 'Multiple escaping of escape with whitespace ok',
+);
+
+
+
+
+
+######################################################################
+# Check illegal characters that are in legal places
+
+yaml_ok(
+ "--- 'Wow!'\n",
+ [ "Wow!" ],
+ 'Bang in a quote',
+);
+yaml_ok(
+ "--- 'This&that'\n",
+ [ "This&that" ],
+ 'Ampersand in a quote',
+);
diff --git a/cpan/Parse-CPAN-Meta/t/04_scalar.t b/cpan/Parse-CPAN-Meta/t/04_scalar.t
new file mode 100644
index 0000000000..7a637c9383
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/04_scalar.t
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+# Testing of basic document structures
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use Test::More tests => 2;
+use Parse::CPAN::Meta ();
+
+my $one = <<'END_YAML';
+---
+- foo
+END_YAML
+
+my $two = <<'END_YAML';
+---
+- foo
+---
+- bar
+END_YAML
+
+my $one_scalar_tiny = Parse::CPAN::Meta::Load( $one );
+my $two_scalar_tiny = Parse::CPAN::Meta::Load( $two );
+
+is_deeply( $one_scalar_tiny, [ 'foo' ], 'one: Parsed correctly' );
+is_deeply( $two_scalar_tiny, [ 'bar' ], 'two: Parsed correctly' );
diff --git a/cpan/Parse-CPAN-Meta/t/05_export.t b/cpan/Parse-CPAN-Meta/t/05_export.t
new file mode 100644
index 0000000000..f82cc91cf6
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/05_export.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+
+# Testing of basic document structures
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use Test::More tests => 4;
+use Parse::CPAN::Meta;
+
+
+
+ok not(defined &main::Load), 'Load is not exported';
+ok not(defined &main::Dump), 'Dump is not exported';
+ok not(defined &main::LoadFile), 'LoadFile is not exported';
+ok not(defined &main::DumpFile), 'DumpFile is not exported';
diff --git a/cpan/Parse-CPAN-Meta/t/11_meta_yml.t b/cpan/Parse-CPAN-Meta/t/11_meta_yml.t
new file mode 100644
index 0000000000..fe95d1abef
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/11_meta_yml.t
@@ -0,0 +1,405 @@
+#!/usr/bin/perl
+
+# Testing of common META.yml examples
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(8, 3);
+
+
+
+
+
+#####################################################################
+# Testing YAML::Tiny's own META.yml file
+
+yaml_ok(
+ <<'END_YAML',
+abstract: Read/Write YAML files with as little code as possible
+author: 'Adam Kennedy <cpan@ali.as>'
+build_requires:
+ File::Spec: 0.80
+ Test::More: 0.47
+distribution_type: module
+generated_by: Module::Install version 0.63
+license: perl
+name: YAML-Tiny
+no_index:
+ directory:
+ - inc
+ - t
+requires:
+ perl: 5.005
+version: 0.03
+END_YAML
+ [ {
+ abstract => 'Read/Write YAML files with as little code as possible',
+ author => 'Adam Kennedy <cpan@ali.as>',
+ build_requires => {
+ 'File::Spec' => '0.80',
+ 'Test::More' => '0.47',
+ },
+ distribution_type => 'module',
+ generated_by => 'Module::Install version 0.63',
+ license => 'perl',
+ name => 'YAML-Tiny',
+ no_index => {
+ directory => [ qw{inc t} ],
+ },
+ requires => {
+ perl => '5.005',
+ },
+ version => '0.03',
+ } ],
+ 'YAML::Tiny',
+);
+
+
+
+
+
+
+#####################################################################
+# Testing a META.yml from a commercial project that crashed
+
+yaml_ok(
+ <<'END_YAML',
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: ITS-SIN-FIDS-Content-XML
+version: 0.01
+version_from: lib/ITS/SIN/FIDS/Content/XML.pm
+installdirs: site
+requires:
+ Test::More: 0.45
+ XML::Simple: 2
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.30
+END_YAML
+ [ {
+ name => 'ITS-SIN-FIDS-Content-XML',
+ version => "0.01",
+ version_from => 'lib/ITS/SIN/FIDS/Content/XML.pm',
+ installdirs => 'site',
+ requires => {
+ 'Test::More' => 0.45,
+ 'XML::Simple' => 2,
+ },
+ distribution_type => 'module',
+ generated_by => 'ExtUtils::MakeMaker version 6.30',
+ } ],
+ 'YAML::Tiny',
+);
+
+
+
+
+
+
+#####################################################################
+# Testing various failing META.yml files from CPAN
+
+yaml_ok(
+ <<'END_YAML',
+---
+abstract: Mii in Nintendo Wii data parser and builder
+author: Toru Yamaguchi <zigorou@cpan.org>
+distribution_type: module
+generated_by: Module::Install version 0.65
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.3.html
+ version: 1.3
+name: Games-Nintendo-Wii-Mii
+no_index:
+ directory:
+ - inc
+ - t
+requires:
+ Carp: 1.03
+ Class::Accessor::Fast: 0.3
+ File::Slurp: 9999.12
+ IO::File: 1.1
+ Readonly: 0
+ Tie::IxHash: 1.21
+ URI: 1.35
+ XML::LibXML: 1.62
+version: 0.02
+END_YAML
+ [ {
+ abstract => 'Mii in Nintendo Wii data parser and builder',
+ author => 'Toru Yamaguchi <zigorou@cpan.org>',
+ distribution_type => 'module',
+ generated_by => 'Module::Install version 0.65',
+ license => 'perl',
+ 'meta-spec' => {
+ url => 'http://module-build.sourceforge.net/META-spec-v1.3.html',
+ version => '1.3',
+ },
+ name => 'Games-Nintendo-Wii-Mii',
+ no_index => {
+ directory => [ qw{ inc t } ],
+ },
+ requires => {
+ 'Carp' => '1.03',
+ 'Class::Accessor::Fast' => '0.3',
+ 'File::Slurp' => '9999.12',
+ 'IO::File' => '1.1',
+ 'Readonly' => '0',
+ 'Tie::IxHash' => '1.21',
+ 'URI' => '1.35',
+ 'XML::LibXML' => '1.62',
+ },
+ version => '0.02',
+ } ],
+ 'Games-Nintendo-Wii-Mii',
+);
+
+yaml_ok(
+ <<'END_YAML',
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: Acme-Time-Baby
+version: 2.106
+version_from: Baby.pm
+installdirs: site
+requires:
+ warnings:
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.17
+END_YAML
+ [ {
+ name => 'Acme-Time-Baby',
+ version => '2.106',
+ version_from => 'Baby.pm',
+ installdirs => 'site',
+ requires => {
+ warnings => undef,
+ },
+ distribution_type => 'module',
+ generated_by => 'ExtUtils::MakeMaker version 6.17',
+ } ],
+ 'Acme-Time-Baby',
+ noyamlperl => 1,
+);
+
+
+
+
+
+#####################################################################
+# File with a YAML header
+
+yaml_ok(
+ <<'END_YAML',
+--- #YAML:1.0
+name: Data-Swap
+version: 0.05
+license: perl
+distribution_type: module
+requires:
+ perl: 5.6.0
+dynamic_config: 0
+END_YAML
+ [ {
+ name => 'Data-Swap',
+ version => '0.05',
+ license => 'perl',
+ distribution_type => 'module',
+ requires => {
+ perl => '5.6.0',
+ },
+ dynamic_config => '0',
+ } ],
+ 'Data-Swap',
+ nosyck => 1,
+);
+
+
+
+
+
+#####################################################################
+# Various files that fail for unknown reasons
+
+SCOPE: {
+ my $content = load_ok(
+ 'Template-Provider-Unicode-Japanese.yml',
+ catfile( test_data_directory(), 'Template-Provider-Unicode-Japanese.yml' ),
+ 100
+ );
+ yaml_ok(
+ $content,
+ [ {
+ abstract => 'Decode all templates by Unicode::Japanese',
+ author => 'Hironori Yoshida C<< <yoshida@cpan.org> >>',
+ distribution_type => 'module',
+ generated_by => 'Module::Install version 0.65',
+ license => 'perl',
+ 'meta-spec' => {
+ url => 'http://module-build.sourceforge.net/META-spec-v1.3.html',
+ version => '1.3',
+ },
+ name => 'Template-Provider-Unicode-Japanese',
+ no_index => {
+ directory => [ qw{ inc t } ],
+ },
+ requires => {
+ 'Template::Config' => 0,
+ 'Unicode::Japanese' => 0,
+ perl => '5.6.0',
+ version => '0',
+ },
+ version => '1.2.1',
+ } ],
+ 'Template-Provider-Unicode-Japanese',
+ noyamlperl => 1,
+ );
+}
+
+SCOPE: {
+ my $content = load_ok(
+ 'HTML-WebDAO.yml',
+ catfile( test_data_directory(), 'HTML-WebDAO.yml' ),
+ 100
+ );
+ yaml_ok(
+ $content,
+ [ {
+ abstract => 'Perl extension for create complex web application',
+ author => [
+ 'Zahatski Aliaksandr, E<lt>zagap@users.sourceforge.netE<gt>',
+ ],
+ license => 'perl',
+ name => 'HTML-WebDAO',
+ version => '0.04',
+ } ],
+ 'HTML-WebDAO',
+ nosyck => 1,
+ );
+}
+
+SCOPE: {
+ my $content = load_ok(
+ 'Spreadsheet-Read.yml',
+ catfile( test_data_directory(), 'Spreadsheet-Read.yml' ),
+ 100
+ );
+ yaml_ok(
+ $content,
+ [ {
+ 'resources' => {
+ 'license' => 'http://dev.perl.org/licenses/'
+ },
+ 'meta-spec' => {
+ 'version' => '1.4',
+ 'url' => 'http://module-build.sourceforge.net/META-spec-v1.4.html'
+ },
+ 'distribution_type' => 'module',
+ 'generated_by' => 'Author',
+ 'version' => 'VERSION',
+ 'name' => 'Read',
+ 'author' => [
+ 'H.Merijn Brand <h.m.brand@xs4all.nl>'
+ ],
+ 'license' => 'perl',
+ 'build_requires' => {
+ 'Test::More' => '0',
+ 'Test::Harness' => '0',
+ 'perl' => '5.006'
+ },
+ 'provides' => {
+ 'Spreadsheet::Read' => {
+ 'version' => 'VERSION',
+ 'file' => 'Read.pm'
+ }
+ },
+ 'optional_features' => [
+ {
+ 'opt_csv' => {
+ 'requires' => {
+ 'Text::CSV_XS' => '0.23'
+ },
+ 'recommends' => {
+ 'Text::CSV_PP' => '1.10',
+ 'Text::CSV_XS' => '0.58',
+ 'Text::CSV' => '1.10'
+ },
+ 'description' => 'Provides parsing of CSV streams'
+ }
+ },
+ {
+ 'opt_excel' => {
+ 'requires' => {
+ 'Spreadsheet::ParseExcel' => '0.26',
+ 'Spreadsheet::ParseExcel::FmtDefault' => '0'
+ },
+ 'recommends' => {
+ 'Spreadsheet::ParseExcel' => '0.42'
+ },
+ 'description' => 'Provides parsing of Microsoft Excel files'
+ }
+ },
+ {
+ 'opt_excelx' => {
+ 'requires' => {
+ 'Spreadsheet::XLSX' => '0.07'
+ },
+ 'description' => 'Provides parsing of Microsoft Excel 2007 files'
+ }
+ },
+ {
+ 'opt_oo' => {
+ 'requires' => {
+ 'Spreadsheet::ReadSXC' => '0.2'
+ },
+ 'description' => 'Provides parsing of OpenOffice spreadsheets'
+ }
+ },
+ {
+ 'opt_tools' => {
+ 'recommends' => {
+ 'Tk::TableMatrix::Spreadsheet' => '0',
+ 'Tk::NoteBook' => '0',
+ 'Tk' => '0'
+ },
+ 'description' => 'Spreadsheet tools'
+ }
+ }
+ ],
+ 'requires' => {
+ 'perl' => '5.006',
+ 'Data::Dumper' => '0',
+ 'Exporter' => '0',
+ 'Carp' => '0'
+ },
+ 'recommends' => {
+ 'perl' => '5.008005',
+ 'IO::Scalar' => '0',
+ 'File::Temp' => '0.14'
+ },
+ 'abstract' => 'Meta-Wrapper for reading spreadsheet data'
+ } ],
+ 'Spreadsheet-Read',
+ noyamlpm => 1,
+ noyamlperl => 1,
+ );
+}
diff --git a/cpan/Parse-CPAN-Meta/t/12_plagger.t b/cpan/Parse-CPAN-Meta/t/12_plagger.t
new file mode 100644
index 0000000000..5e186f3bc6
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/12_plagger.t
@@ -0,0 +1,136 @@
+#!/usr/bin/perl
+
+# Testing Plagger config samples from Miyagawa-san's YAPC::NA 2006 talk
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(2);
+
+
+
+
+
+#####################################################################
+# Example Plagger Configuration 1
+
+yaml_ok(
+ <<'END_YAML',
+plugins:
+ - module: Subscription::Bloglines
+ config:
+ username: you@example.pl
+ password: foobar
+ mark_read: 1
+
+ - module: Publish::Gmail
+ config:
+ mailto: example@gmail.com
+ mailfrom: miyagawa@example.com
+ mailroute:
+ via: smtp
+ host: smtp.example.com
+END_YAML
+ [ { plugins => [
+ {
+ module => 'Subscription::Bloglines',
+ config => {
+ username => 'you@example.pl',
+ password => 'foobar',
+ mark_read => 1,
+ },
+ },
+ {
+ module => 'Publish::Gmail',
+ config => {
+ mailto => 'example@gmail.com',
+ mailfrom => 'miyagawa@example.com',
+ mailroute => {
+ via => 'smtp',
+ host => 'smtp.example.com',
+ },
+ },
+ },
+ ] } ],
+ 'Plagger',
+);
+
+
+
+
+
+#####################################################################
+# Example Plagger Configuration 2
+
+yaml_ok(
+ <<'END_YAML',
+plugins:
+ - module: Subscription::Config
+ config:
+ feed:
+ # Trac's feed for changesets
+ - http://plagger.org/.../rss
+
+ # I don't like to be notified of the same items
+ # more than once
+ - module: Filter::Rule
+ rule:
+ module: Fresh
+ mtime:
+ path: /tmp/rssbot.time
+ autoupdate: 1
+
+ - module: Notify::IRC
+ config:
+ daemon_port: 9999
+ nickname: plaggerbot
+ server_host: chat.freenode.net
+ server_channels:
+ - '#plagger-ja'
+ - '#plagger'
+
+
+END_YAML
+ [ { plugins => [ {
+ module => 'Subscription::Config',
+ config => {
+ feed => [ 'http://plagger.org/.../rss' ],
+ },
+ }, {
+ module => 'Filter::Rule',
+ rule => {
+ module => 'Fresh',
+ mtime => {
+ path => '/tmp/rssbot.time',
+ autoupdate => 1,
+ },
+ },
+ }, {
+ module => 'Notify::IRC',
+ config => {
+ daemon_port => 9999,
+ nickname => 'plaggerbot',
+ server_host => 'chat.freenode.net',
+ server_channels => [
+ '#plagger-ja',
+ '#plagger',
+ ],
+ },
+ } ] } ],
+ 'plagger2',
+);
diff --git a/cpan/Parse-CPAN-Meta/t/13_perl_smith.t b/cpan/Parse-CPAN-Meta/t/13_perl_smith.t
new file mode 100644
index 0000000000..9a8b8be709
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/13_perl_smith.t
@@ -0,0 +1,158 @@
+#!/usr/bin/perl
+
+# Testing of common META.yml examples
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(1, 1);
+
+
+
+
+
+#####################################################################
+# Testing that Perl::Smith config files work
+
+my $vanilla_file = catfile( test_data_directory(), 'vanilla.yml' );
+my $vanilla = load_ok( 'yanilla.yml', $vanilla_file, 1000 );
+
+yaml_ok(
+ $vanilla,
+ [ {
+ package_name => 'VanillaPerl',
+ package_version => 5,
+ download_dir => 'c:\temp\vp_sources',
+ build_dir => 'c:\temp\vp_build',
+ image_dir => 'c:\vanilla-perl',
+ binary => [
+ {
+ name => 'dmake',
+ url => 'http://search.cpan.org/CPAN/authors/id/S/SH/SHAY/dmake-4.5-20060619-SHAY.zip',
+ license => {
+ 'dmake/COPYING' => 'dmake/COPYING',
+ 'dmake/readme/license.txt' => 'dmake/license.txt',
+ },
+ install_to => {
+ 'dmake/dmake.exe' => 'dmake/bin/dmake.exe',
+ 'dmake/startup' => 'dmake/bin/startup',
+ },
+ },
+ {
+ name => 'gcc-core',
+ url => 'http://umn.dl.sourceforge.net/mingw/gcc-core-3.4.5-20060117-1.tar.gz',
+ license => {
+ 'COPYING' => 'gcc/COPYING',
+ 'COPYING.lib' => 'gcc/COPYING.lib',
+ },
+ install_to => 'mingw',
+ },
+ {
+ name => 'gcc-g++',
+ url => 'http://umn.dl.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-1.tar.gz',
+ license => undef,
+ install_to => 'mingw',
+ },
+ {
+ name => 'binutils',
+ url => 'http://umn.dl.sourceforge.net/mingw/binutils-2.16.91-20060119-1.tar.gz',
+ license => {
+ 'Copying' => 'binutils/Copying',
+ 'Copying.lib' => 'binutils/Copying.lib',
+ },
+ install_to => 'mingw',
+ },
+ {
+ name => 'mingw-runtime',
+ url => 'http://umn.dl.sourceforge.net/mingw/mingw-runtime-3.10.tar.gz',
+ license => {
+ 'doc/mingw-runtime/Contributors' => 'mingw/Contributors',
+ 'doc/mingw-runtime/Disclaimer' => 'mingw/Disclaimer',
+ },
+ install_to => 'mingw',
+ },
+ {
+ name => 'w32api',
+ url => 'http://umn.dl.sourceforge.net/mingw/w32api-3.6.tar.gz',
+ license => undef,
+ install_to => 'mingw',
+ extra => {
+ 'extra\README.w32api' => 'licenses\win32api\README.w32api',
+ },
+ }
+ ],
+ source => [
+ {
+ name => 'perl',
+ url => 'http://mirrors.kernel.org/CPAN/src/perl-5.8.8.tar.gz',
+ license => {
+ 'perl-5.8.8/Readme' => 'perl/Readme',
+ 'perl-5.8.8/Artistic' => 'perl/Artistic',
+ 'perl-5.8.8/Copying' => 'perl/Copying',
+ },
+ unpack_to => 'perl',
+ install_to => 'perl',
+ after => {
+ 'extra\Config.pm' => 'lib\CPAN\Config.pm',
+ },
+ }
+ ],
+ modules => [
+ {
+ name => 'Win32::Job',
+ unpack_to => {
+ APIFile => 'Win32API-File',
+ },
+ },
+ {
+ name => 'IO',
+ force => 1,
+ },
+ {
+ name => 'Compress::Zlib',
+ },
+ {
+ name => 'IO::Zlib',
+ },
+ {
+ name => 'Archive::Tar',
+ },
+ {
+ name => 'Net::FTP',
+ extra => {
+ 'extra\libnet.cfg' => 'libnet.cfg',
+ },
+ },
+ ],
+ extra => {
+ 'README' => 'README.txt',
+ 'LICENSE.txt' => 'LICENSE.txt',
+ 'Changes' => 'Release-Notes.txt',
+ 'extra\Config.pm' => 'perl\lib\CPAN\Config.pm',
+ 'extra\links\Perl-Documentation.url' => 'links\Perl Documentation.url',
+ 'extra\links\Perl-Homepage.url' => 'links\Perl Homepage.url',
+ 'extra\links\Perl-Mailing-Lists.url' => 'links\Perl Mailing Lists.url',
+ 'extra\links\Perlmonks-Community-Forum.url' => 'links\Perlmonks Community Forum.url',
+ 'extra\links\Search-CPAN-Modules.url' => 'links\Search CPAN Modules.url',
+ 'extra\links\Vanilla-Perl-Homepage.url' => 'links\Vanilla Perl Homepage.url',
+ },
+ } ],
+ 'vanilla.yml',
+ nosyck => 1,
+ noyamlperl => 1,
+);
diff --git a/cpan/Parse-CPAN-Meta/t/14_yaml_org.t b/cpan/Parse-CPAN-Meta/t/14_yaml_org.t
new file mode 100644
index 0000000000..254bd7a547
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/14_yaml_org.t
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+
+# Testing of common META.yml examples
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(1, 1);
+
+
+
+
+
+#####################################################################
+# Testing that Perl::Smith config files work
+
+my $sample_file = catfile( test_data_directory(), 'sample.yml' );
+my $sample = load_ok( 'sample.yml', $sample_file, 500 );
+
+yaml_ok(
+ $sample,
+ [ {
+ invoice => 34843,
+ date => '2001-01-23',
+ 'bill-to' => {
+ given => 'Chris',
+ family => 'Dumars',
+ address => {
+ lines => "458 Walkman Dr.\nSuite #292\n",
+ city => 'Royal Oak',
+ state => 'MI',
+ postal => 48046,
+ },
+ },
+ product => [
+ {
+ sku => 'BL394D',
+ quantity => '4',
+ description => 'Basketball',
+ price => '450.00',
+ },
+ {
+ sku => 'BL4438H',
+ quantity => '1',
+ description => 'Super Hoop',
+ price => '2392.00',
+ },
+ ],
+ tax => '251.42',
+ total => '4443.52',
+ comments => <<'END_TEXT',
+Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
+END_TEXT
+ } ],
+ 'sample.yml',
+ # nosyck => 1,
+);
diff --git a/cpan/Parse-CPAN-Meta/t/15_multibyte.t b/cpan/Parse-CPAN-Meta/t/15_multibyte.t
new file mode 100644
index 0000000000..cdde728074
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/15_multibyte.t
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+# Testing of META.yml containing AVAR's name
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(0, 1, 4);
+
+
+
+
+
+#####################################################################
+# Testing that Perl::Smith config files work
+
+my $sample_file = catfile( test_data_directory(), 'multibyte.yml' );
+my $sample = load_ok( 'multibyte.yml', $sample_file, 450 );
+
+# Does the string parse to the structure
+my $name = "multibyte";
+my $yaml_copy = $sample;
+my @yaml = eval { Parse::CPAN::Meta::Load( $yaml_copy ); };
+is( $@, '', "$name: Parse::CPAN::Meta::Load parses without error" );
+is( $yaml_copy, $sample, "$name: Parse::CPAN::Meta::Load does not modify the input string" );
+SKIP: {
+ skip( "Shortcutting after failure", 1 ) if $@;
+ is_deeply( $yaml[0]->{build_requires}, {
+ 'Config' => 0,
+ 'Test::More' => 0,
+ 'XSLoader' => 0,
+ }, 'build_requires ok' );
+}
+
+SKIP: {
+ unless ( Parse::CPAN::Meta::HAVE_UTF8() ) {
+ skip("no utf8 support", 1 );
+ }
+ eval { utf8::is_utf8('') };
+ if ( $@ ) {
+ skip("no is_utf8 to test with until 5.8.1", 1);
+ }
+ ok( utf8::is_utf8($yaml[0]->{author}), "utf8 decoded" );
+}
diff --git a/cpan/Parse-CPAN-Meta/t/16_nullrefs.t b/cpan/Parse-CPAN-Meta/t/16_nullrefs.t
new file mode 100644
index 0000000000..fa1c3e9708
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/16_nullrefs.t
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+
+# Testing for null references
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(1);
+
+
+
+
+
+#####################################################################
+# Example Empty References
+
+yaml_ok(
+ <<'END_YAML',
+--- []
+--- {}
+END_YAML
+ [ [], {} ],
+ 'Empty references',
+);
diff --git a/cpan/Parse-CPAN-Meta/t/17_toolbar.t b/cpan/Parse-CPAN-Meta/t/17_toolbar.t
new file mode 100644
index 0000000000..e0d3cf9876
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/17_toolbar.t
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+# Testing of a known-bad file from an editor
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+# use Test::More skip_all => 'Temporarily ignoring failing test';
+use Test::More tests(1, 1);
+
+
+
+
+
+#####################################################################
+# Testing that Perl::Smith config files work
+
+my $toolbar_file = catfile( test_data_directory(), 'toolbar.yml' );
+my $toolbar = load_ok( 'toolbar.yml', $toolbar_file, 100 );
+
+yaml_ok(
+ $toolbar,
+ [ {
+ main_toolbar => [
+ 'item file-new',
+ 'item file-open',
+ 'item file-print#',
+ 'item file-close#',
+ 'item file-save-all',
+ 'item file-save',
+ undef,
+ 'item edit-changes-undo',
+ 'item edit-changes-redo',
+ undef,
+ 'item edit-cut',
+ 'item edit-copy',
+ 'item edit-paste',
+ 'item edit-replace',
+ 'item edit-delete',
+ ]
+ } ],
+ 'toolbar.yml',
+ noyamlperl => 1,
+);
diff --git a/cpan/Parse-CPAN-Meta/t/18_tap.t b/cpan/Parse-CPAN-Meta/t/18_tap.t
new file mode 100644
index 0000000000..62b84f936e
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/18_tap.t
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+
+# Testing relating to functionality in the Test Anything Protocol
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(5, 0, 0);
+use Parse::CPAN::Meta ();
+
+
+
+
+
+#####################################################################
+# TAP Tests
+
+# Make sure we support x-foo keys
+yaml_ok(
+ "---\nx-foo: 1\n",
+ [ { 'x-foo' => 1 } ],
+ 'x-foo key',
+);
+
+# Document ending (hash)
+yaml_ok(
+ "---\n"
+ . " foo: bar\n"
+ . "...\n",
+ [ { foo => "bar" } ],
+ 'document_end_hash',
+ noyamlpm => 1,
+ nosyck => 1,
+ noyamlperl => 1,
+);
+
+# Document ending (array)
+yaml_ok(
+ "---\n"
+ . "- foo\n"
+ . "...\n",
+ [ [ 'foo' ] ],
+ 'document_end_array',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+# Multiple documents (simple)
+yaml_ok(
+ "---\n"
+ . "- foo\n"
+ . "...\n"
+ . "---\n"
+ . "- foo\n"
+ . "...\n",
+ [ [ 'foo' ], [ 'foo' ] ],
+ 'multi_document_simple',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
+
+# Multiple documents (whitespace-separated)
+yaml_ok(
+ "---\n"
+ . "- foo\n"
+ . "...\n"
+ . "\n"
+ . "---\n"
+ . "- foo\n"
+ . "...\n",
+ [ [ 'foo' ], [ 'foo' ] ],
+ 'multi_document_space',
+ noyamlpm => 1,
+ noyamlperl => 1,
+);
diff --git a/cpan/Parse-CPAN-Meta/t/19_errors.t b/cpan/Parse-CPAN-Meta/t/19_errors.t
new file mode 100644
index 0000000000..baa06ad5b2
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/19_errors.t
@@ -0,0 +1,43 @@
+#!/usr/bin/perl
+
+# Testing documents that should fail
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests => 1;
+
+
+
+
+
+#####################################################################
+# Missing Features
+
+# We don't support raw nodes
+yaml_error( <<'END_YAML', 'does not support a feature' );
+---
+version: !!perl/hash:version
+ original: v2.0.2
+ qv: 1
+ version:
+ - 2
+ - 0
+ - 2
+END_YAML
+
diff --git a/cpan/Parse-CPAN-Meta/t/21_bom.t b/cpan/Parse-CPAN-Meta/t/21_bom.t
new file mode 100644
index 0000000000..706cf77c3f
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/21_bom.t
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib/';
+ }
+}
+
+use strict;
+BEGIN {
+ $| = 1;
+ $^W = 1;
+}
+
+use File::Spec::Functions ':ALL';
+use Parse::CPAN::Meta::Test;
+use Test::More tests(0, 1, 3);
+
+
+
+
+
+#####################################################################
+# Testing that Perl::Smith config files work
+
+my $sample_file = catfile( test_data_directory(), 'utf_16_le_bom.yml' );
+my $sample = load_ok( 'utf_16_le_bom.yml', $sample_file, 3 );
+
+# Does the string parse to the structure
+my $name = "utf-16";
+my $yaml_copy = $sample;
+my $yaml = eval { Parse::CPAN::Meta::Load( $yaml_copy ); };
+is( $yaml_copy, $sample, "$name: Parse::CPAN::Meta::Load does not modify the input string" );
+is( $yaml, undef, "file not parsed" );
+ok( $@ =~ "Stream has a non UTF-8 Unicode Byte Order Mark", "correct error" );
diff --git a/cpan/Parse-CPAN-Meta/t/data/HTML-WebDAO.yml b/cpan/Parse-CPAN-Meta/t/data/HTML-WebDAO.yml
new file mode 100644
index 0000000000..c5262ff73c
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/HTML-WebDAO.yml
@@ -0,0 +1,8 @@
+--- #YAML:1.0
+name: HTML-WebDAO
+version: 0.04
+author:
+ - |-
+ Zahatski Aliaksandr, E<lt>zagap@users.sourceforge.netE<gt>
+abstract: Perl extension for create complex web application
+license: perl
diff --git a/cpan/Parse-CPAN-Meta/t/data/Spreadsheet-Read.yml b/cpan/Parse-CPAN-Meta/t/data/Spreadsheet-Read.yml
new file mode 100644
index 0000000000..f402ab8d68
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/Spreadsheet-Read.yml
@@ -0,0 +1,61 @@
+--- #YAML:1.1
+name: Read
+version: VERSION
+abstract: Meta-Wrapper for reading spreadsheet data
+license: perl
+author:
+ - H.Merijn Brand <h.m.brand@xs4all.nl>
+generated_by: Author
+distribution_type: module
+provides:
+ Spreadsheet::Read:
+ file: Read.pm
+ version: VERSION
+requires:
+ perl: 5.006
+ Exporter: 0
+ Carp: 0
+ Data::Dumper: 0
+recommends:
+ perl: 5.008005
+ File::Temp: 0.14
+ IO::Scalar: 0
+build_requires:
+ perl: 5.006
+ Test::Harness: 0
+ Test::More: 0
+optional_features:
+- opt_csv:
+ description: Provides parsing of CSV streams
+ requires:
+ Text::CSV_XS: 0.23
+ recommends:
+ Text::CSV: 1.10
+ Text::CSV_PP: 1.10
+ Text::CSV_XS: 0.58
+- opt_excel:
+ description: Provides parsing of Microsoft Excel files
+ requires:
+ Spreadsheet::ParseExcel: 0.26
+ Spreadsheet::ParseExcel::FmtDefault: 0
+ recommends:
+ Spreadsheet::ParseExcel: 0.42
+- opt_excelx:
+ description: Provides parsing of Microsoft Excel 2007 files
+ requires:
+ Spreadsheet::XLSX: 0.07
+- opt_oo:
+ description: Provides parsing of OpenOffice spreadsheets
+ requires:
+ Spreadsheet::ReadSXC: 0.2
+- opt_tools:
+ description: Spreadsheet tools
+ recommends:
+ Tk: 0
+ Tk::NoteBook: 0
+ Tk::TableMatrix::Spreadsheet: 0
+resources:
+ license: http://dev.perl.org/licenses/
+meta-spec:
+ version: 1.4
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
diff --git a/cpan/Parse-CPAN-Meta/t/data/Template-Provider-Unicode-Japanese.yml b/cpan/Parse-CPAN-Meta/t/data/Template-Provider-Unicode-Japanese.yml
new file mode 100644
index 0000000000..66dae89875
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/Template-Provider-Unicode-Japanese.yml
@@ -0,0 +1,20 @@
+---
+abstract: Decode all templates by Unicode::Japanese
+author: Hironori Yoshida C<< <yoshida@cpan.org> >>
+distribution_type: module
+generated_by: Module::Install version 0.65
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.3.html
+ version: 1.3
+name: Template-Provider-Unicode-Japanese
+no_index:
+ directory:
+ - inc
+ - t
+requires:
+ Template::Config: 0
+ Unicode::Japanese: 0
+ perl: 5.6.0
+ version: 0
+version: 1.2.1
diff --git a/cpan/Parse-CPAN-Meta/t/data/multibyte.yml b/cpan/Parse-CPAN-Meta/t/data/multibyte.yml
new file mode 100644
index 0000000000..91f3459107
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/multibyte.yml
@@ -0,0 +1,22 @@
+---
+abstract: Perl-compatible regular expression engine
+author: "Ævar Arnfjörð Bjarmason <avar@cpan.org>"
+build_requires:
+ Config: 0
+ Test::More: 0
+ XSLoader: 0
+distribution_type: module
+generated_by: Module::Install version 0.65
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.3.html
+ version: 1.3
+name: re-engine-PCRE
+no_index:
+ directory:
+ - inc
+ - t
+requires:
+ perl: 5.9.5
+tests: t/*.t t/*/*.t
+version: 0.10
diff --git a/cpan/Parse-CPAN-Meta/t/data/sample.yml b/cpan/Parse-CPAN-Meta/t/data/sample.yml
new file mode 100644
index 0000000000..bea4f8ad42
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/sample.yml
@@ -0,0 +1,28 @@
+---
+invoice: 34843
+date : 2001-01-23
+bill-to:
+ given : Chris
+ family : Dumars
+ address:
+ lines: |
+ 458 Walkman Dr.
+ Suite #292
+ city : Royal Oak
+ state : MI
+ postal : 48046
+product:
+ - sku : BL394D
+ quantity : 4
+ description : Basketball
+ price : 450.00
+ - sku : BL4438H
+ quantity : 1
+ description : Super Hoop
+ price : 2392.00
+tax : 251.42
+total: 4443.52
+comments: >
+ Late afternoon is best.
+ Backup contact is Nancy
+ Billsmer @ 338-4338.
diff --git a/cpan/Parse-CPAN-Meta/t/data/toolbar.yml b/cpan/Parse-CPAN-Meta/t/data/toolbar.yml
new file mode 100644
index 0000000000..5219248a9b
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/toolbar.yml
@@ -0,0 +1,16 @@
+main_toolbar:
+ - item file-new
+ - item file-open
+ - item file-print#
+ - item file-close#
+ - item file-save-all
+ - item file-save
+ -
+ - item edit-changes-undo
+ - item edit-changes-redo
+ -
+ - item edit-cut
+ - item edit-copy
+ - item edit-paste
+ - item edit-replace
+ - item edit-delete
diff --git a/cpan/Parse-CPAN-Meta/t/data/utf_16_le_bom.yml b/cpan/Parse-CPAN-Meta/t/data/utf_16_le_bom.yml
new file mode 100644
index 0000000000..b9230ebb5a
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/utf_16_le_bom.yml
Binary files differ
diff --git a/cpan/Parse-CPAN-Meta/t/data/vanilla.yml b/cpan/Parse-CPAN-Meta/t/data/vanilla.yml
new file mode 100644
index 0000000000..dc757e1a34
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/data/vanilla.yml
@@ -0,0 +1,98 @@
+# VanillaPerl YAML config file
+---
+# package info
+package_name: VanillaPerl
+package_version: 5
+
+# directories
+download_dir: c:\temp\vp_sources
+build_dir: c:\temp\vp_build
+image_dir: c:\vanilla-perl
+
+# Binary components
+binary:
+ - name: dmake
+ url: http://search.cpan.org/CPAN/authors/id/S/SH/SHAY/dmake-4.5-20060619-SHAY.zip
+ license:
+ dmake/COPYING : dmake/COPYING
+ dmake/readme/license.txt: dmake/license.txt
+ install_to:
+ dmake/dmake.exe: dmake/bin/dmake.exe
+ dmake/startup: dmake/bin/startup
+
+ - name: gcc-core
+ url: http://umn.dl.sourceforge.net/mingw/gcc-core-3.4.5-20060117-1.tar.gz
+ license:
+ COPYING: gcc/COPYING
+ COPYING.lib: gcc/COPYING.lib
+ install_to: mingw
+
+ - name: gcc-g++
+ url: http://umn.dl.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-1.tar.gz
+ license:
+ install_to: mingw
+
+ - name: binutils
+ url: http://umn.dl.sourceforge.net/mingw/binutils-2.16.91-20060119-1.tar.gz
+ license:
+ Copying: binutils/Copying
+ Copying.lib: binutils/Copying.lib
+ install_to: mingw
+
+ - name: mingw-runtime
+ url: http://umn.dl.sourceforge.net/mingw/mingw-runtime-3.10.tar.gz
+ license:
+ doc/mingw-runtime/Contributors: mingw/Contributors
+ doc/mingw-runtime/Disclaimer: mingw/Disclaimer
+ install_to: mingw
+
+ - name: w32api
+ url: http://umn.dl.sourceforge.net/mingw/w32api-3.6.tar.gz
+ license:
+ install_to: mingw
+ extra:
+ extra\README.w32api: licenses\win32api\README.w32api
+
+# Source components
+source:
+ - name: perl
+ url: http://mirrors.kernel.org/CPAN/src/perl-5.8.8.tar.gz
+ license:
+ perl-5.8.8/Readme: perl/Readme
+ perl-5.8.8/Artistic: perl/Artistic
+ perl-5.8.8/Copying: perl/Copying
+ unpack_to: perl
+ install_to: perl
+ after:
+ extra\Config.pm: lib\CPAN\Config.pm
+
+# Additional modules to bundle in site\lib
+modules:
+ # i.e. not used, but gets us the libwin32 dist
+ - name: Win32::Job
+ unpack_to:
+ APIFile: Win32API-File
+ - name: IO
+ force: 1
+ - name: Compress::Zlib
+ - name: IO::Zlib
+ - name: Archive::Tar
+ - name: Net::FTP
+ extra:
+ extra\libnet.cfg: libnet.cfg
+
+# Extra files to be placed
+# Signature.pm: perl\site\lib\Module\Signature.pm
+extra:
+ README: README.txt
+ LICENSE.txt: LICENSE.txt
+ Changes: Release-Notes.txt
+ extra\Config.pm: perl\lib\CPAN\Config.pm
+ # reset this again
+
+ extra\links\Perl-Documentation.url: links\Perl Documentation.url
+ extra\links\Perl-Homepage.url: links\Perl Homepage.url
+ extra\links\Perl-Mailing-Lists.url: links\Perl Mailing Lists.url
+ extra\links\Perlmonks-Community-Forum.url: links\Perlmonks Community Forum.url
+ extra\links\Search-CPAN-Modules.url: links\Search CPAN Modules.url
+ extra\links\Vanilla-Perl-Homepage.url: links\Vanilla Perl Homepage.url
diff --git a/cpan/Parse-CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm b/cpan/Parse-CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm
new file mode 100644
index 0000000000..46f967b7dd
--- /dev/null
+++ b/cpan/Parse-CPAN-Meta/t/lib/Parse/CPAN/Meta/Test.pm
@@ -0,0 +1,86 @@
+package Parse::CPAN::Meta::Test;
+
+use strict;
+use Test::More ();
+use Parse::CPAN::Meta;
+use File::Spec;
+
+use vars qw{@ISA @EXPORT};
+BEGIN {
+ require Exporter;
+ @ISA = qw{ Exporter };
+ @EXPORT = qw{
+ tests yaml_ok yaml_error slurp load_ok
+ test_data_directory
+ };
+}
+
+sub test_data_directory {
+ return(
+ $ENV{PERL_CORE}
+ ? File::Spec->catdir(File::Spec->updir, qw(lib Parse CPAN Meta t data))
+ : File::Spec->catdir(qw(t data))
+ );
+}
+
+# 22 tests per call to yaml_ok
+# 4 tests per call to load_ok
+sub tests {
+ return ( tests => count(@_) );
+}
+
+sub count {
+ my $yaml_ok = shift || 0;
+ my $load_ok = shift || 0;
+ my $single = shift || 0;
+ my $count = $yaml_ok * 3 + $load_ok * 4 + $single;
+ return $count;
+}
+
+sub yaml_ok {
+ my $string = shift;
+ my $array = shift;
+ my $name = shift || 'unnamed';
+
+ # Does the string parse to the structure
+ my $yaml_copy = $string;
+ my @yaml = eval { Parse::CPAN::Meta::Load( $yaml_copy ); };
+ Test::More::is( $@, '', "$name: Parse::CPAN::Meta parses without error" );
+ Test::More::is( $yaml_copy, $string, "$name: Parse::CPAN::Meta does not modify the input string" );
+ SKIP: {
+ Test::More::skip( "Shortcutting after failure", 1 ) if $@;
+ Test::More::is_deeply( \@yaml, $array, "$name: Parse::CPAN::Meta parses correctly" );
+ }
+
+ # Return true as a convenience
+ return 1;
+}
+
+sub yaml_error {
+ my $string = shift;
+ my $yaml = eval { Parse::CPAN::Meta::Load( $string ); };
+ Test::More::like( $@, qr/$_[0]/, "YAML::Tiny throws expected error" );
+}
+
+sub slurp {
+ my $file = shift;
+ local $/ = undef;
+ open( FILE, " $file" ) or die "open($file) failed: $!";
+ my $source = <FILE>;
+ close( FILE ) or die "close($file) failed: $!";
+ $source;
+}
+
+sub load_ok {
+ my $name = shift;
+ my $file = shift;
+ my $size = shift;
+ Test::More::ok( -f $file, "Found $name" ) or Test::More::diag("Searched at '$file'");
+ Test::More::ok( -r $file, "Can read $name" );
+ my $content = slurp( $file );
+ Test::More::ok( (defined $content and ! ref $content), "Loaded $name" );
+ Test::More::ok( ($size < length $content), "Content of $name larger than $size bytes" );
+ return $content;
+}
+
+1;