From 2954a1e969abcc30eff838f86b1e4b5315d5c6ec Mon Sep 17 00:00:00 2001 From: Chris 'BinGOs' Williams Date: Fri, 14 Feb 2014 10:07:20 +0000 Subject: [PATCH] Update CPAN-Meta-YAML to CPAN version 0.011 [DELTA] 0.011 2014-02-13 20:30:30-05:00 America/New_York - Generated from ETHER/YAML-Tiny-1.60.tar.gz --- MANIFEST | 66 +- META.yml | 4 +- Porting/Maintainers.pl | 3 +- Porting/exec-bit.txt | 1 + cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm | 692 +++++++++++++------- cpan/CPAN-Meta-YAML/t/01_api.t | 40 ++ cpan/CPAN-Meta-YAML/t/01_compile.t | 15 +- cpan/CPAN-Meta-YAML/t/02_basic.t | 255 -------- cpan/CPAN-Meta-YAML/t/03_regression.t | 716 --------------------- cpan/CPAN-Meta-YAML/t/05_export.t | 22 - cpan/CPAN-Meta-YAML/t/10_read.t | 112 ++++ cpan/CPAN-Meta-YAML/t/11_meta_yml.t | 396 ------------ cpan/CPAN-Meta-YAML/t/11_read_string.t | 51 ++ cpan/CPAN-Meta-YAML/t/12_plagger.t | 127 ---- cpan/CPAN-Meta-YAML/t/12_write.t | 82 +++ cpan/CPAN-Meta-YAML/t/13_perl_smith.t | 149 ----- cpan/CPAN-Meta-YAML/t/13_write_string.t | 23 + cpan/CPAN-Meta-YAML/t/14_yaml_org.t | 63 -- cpan/CPAN-Meta-YAML/t/15_multibyte.t | 52 -- cpan/CPAN-Meta-YAML/t/16_nullrefs.t | 30 - cpan/CPAN-Meta-YAML/t/17_toolbar.t | 50 -- cpan/CPAN-Meta-YAML/t/18_tap.t | 80 --- cpan/CPAN-Meta-YAML/t/19_errors.t | 73 --- cpan/CPAN-Meta-YAML/t/20_subclass.t | 31 +- cpan/CPAN-Meta-YAML/t/21_bom.t | 34 - cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t | 59 ++ cpan/CPAN-Meta-YAML/t/22_comments.t | 111 ---- cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t | 33 + cpan/CPAN-Meta-YAML/t/31_local_tml.t | 20 + cpan/CPAN-Meta-YAML/t/32_world_tml.t | 11 + cpan/CPAN-Meta-YAML/t/README.md | 157 +++++ cpan/CPAN-Meta-YAML/t/data/HTML-WebDAO.yml | 8 - cpan/CPAN-Meta-YAML/t/data/Spreadsheet-Read.yml | 61 -- .../t/data/Template-Provider-Unicode-Japanese.yml | 20 - cpan/CPAN-Meta-YAML/t/data/{one.yml => ascii.yml} | 0 .../t/data/{sample.yml => latin1.yml} | 2 +- cpan/CPAN-Meta-YAML/t/data/multibyte.yml | 20 - cpan/CPAN-Meta-YAML/t/data/toolbar.yml | 16 - cpan/CPAN-Meta-YAML/t/data/two.yml | 4 - cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml | 2 + cpan/CPAN-Meta-YAML/t/data/vanilla.yml | 98 --- cpan/CPAN-Meta-YAML/t/lib/Test.pm | 310 --------- cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm | 351 ++++++++++ cpan/CPAN-Meta-YAML/t/lib/TestML/Tiny.pm | 312 +++++++++ cpan/CPAN-Meta-YAML/t/lib/TestUtils.pm | 56 ++ cpan/CPAN-Meta-YAML/t/tml | 117 ++++ .../t/tml-local/dump-error/circular.tml | 18 + .../t/tml-local/load-error/document.tml | 5 + .../t/tml-local/load-error/scalar.tml | 51 ++ cpan/CPAN-Meta-YAML/t/tml-local/load-error/tag.tml | 11 + .../t/tml-local/perl-to-yaml/quoting.tml | 26 + .../t/tml-local/yaml-roundtrip/collection.tml | 128 ++++ .../t/tml-local/yaml-roundtrip/comment.tml | 124 ++++ .../t/tml-local/yaml-roundtrip/document.tml | 214 ++++++ .../t/tml-local/yaml-roundtrip/mapping.tml | 178 +++++ .../t/tml-local/yaml-roundtrip/quoting.tml | 134 ++++ .../t/tml-local/yaml-roundtrip/scalar.tml | 135 ++++ .../t/tml-local/yaml-roundtrip/sequence.tml | 104 +++ cpan/CPAN-Meta-YAML/t/tml-spec/basic-data.tml | 24 + cpan/CPAN-Meta-YAML/t/tml-spec/unicode.tml | 440 +++++++++++++ cpan/CPAN-Meta-YAML/t/tml-world/Acme-Time-Baby.tml | 27 + cpan/CPAN-Meta-YAML/t/tml-world/Data-Swap.tml | 25 + .../t/tml-world/Games-Nintendo-Wii-Mii.tml | 57 ++ cpan/CPAN-Meta-YAML/t/tml-world/HTML-WebDAO.tml | 24 + .../t/tml-world/ITS-SIN-FIDS-Content-XML.tml | 30 + cpan/CPAN-Meta-YAML/t/tml-world/Plagger.tml | 101 +++ .../t/tml-world/Spreadsheet-Read.tml | 161 +++++ .../Template-Provider-Unicode-Japanese.tml | 47 ++ cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml | 221 +++++++ cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml | 41 ++ cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml | 41 ++ cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml | 69 ++ 72 files changed, 4393 insertions(+), 2978 deletions(-) create mode 100644 cpan/CPAN-Meta-YAML/t/01_api.t delete mode 100644 cpan/CPAN-Meta-YAML/t/02_basic.t delete mode 100644 cpan/CPAN-Meta-YAML/t/03_regression.t delete mode 100644 cpan/CPAN-Meta-YAML/t/05_export.t create mode 100644 cpan/CPAN-Meta-YAML/t/10_read.t delete mode 100644 cpan/CPAN-Meta-YAML/t/11_meta_yml.t create mode 100644 cpan/CPAN-Meta-YAML/t/11_read_string.t delete mode 100644 cpan/CPAN-Meta-YAML/t/12_plagger.t create mode 100644 cpan/CPAN-Meta-YAML/t/12_write.t delete mode 100644 cpan/CPAN-Meta-YAML/t/13_perl_smith.t create mode 100644 cpan/CPAN-Meta-YAML/t/13_write_string.t delete mode 100644 cpan/CPAN-Meta-YAML/t/14_yaml_org.t delete mode 100644 cpan/CPAN-Meta-YAML/t/15_multibyte.t delete mode 100644 cpan/CPAN-Meta-YAML/t/16_nullrefs.t delete mode 100644 cpan/CPAN-Meta-YAML/t/17_toolbar.t delete mode 100644 cpan/CPAN-Meta-YAML/t/18_tap.t delete mode 100644 cpan/CPAN-Meta-YAML/t/19_errors.t delete mode 100644 cpan/CPAN-Meta-YAML/t/21_bom.t create mode 100644 cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t delete mode 100644 cpan/CPAN-Meta-YAML/t/22_comments.t create mode 100644 cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t create mode 100644 cpan/CPAN-Meta-YAML/t/31_local_tml.t create mode 100644 cpan/CPAN-Meta-YAML/t/32_world_tml.t create mode 100644 cpan/CPAN-Meta-YAML/t/README.md delete mode 100644 cpan/CPAN-Meta-YAML/t/data/HTML-WebDAO.yml delete mode 100644 cpan/CPAN-Meta-YAML/t/data/Spreadsheet-Read.yml delete mode 100644 cpan/CPAN-Meta-YAML/t/data/Template-Provider-Unicode-Japanese.yml rename cpan/CPAN-Meta-YAML/t/data/{one.yml => ascii.yml} (100%) rename cpan/CPAN-Meta-YAML/t/data/{sample.yml => latin1.yml} (96%) delete mode 100644 cpan/CPAN-Meta-YAML/t/data/toolbar.yml delete mode 100644 cpan/CPAN-Meta-YAML/t/data/two.yml create mode 100644 cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml delete mode 100644 cpan/CPAN-Meta-YAML/t/data/vanilla.yml delete mode 100644 cpan/CPAN-Meta-YAML/t/lib/Test.pm create mode 100644 cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm create mode 100644 cpan/CPAN-Meta-YAML/t/lib/TestML/Tiny.pm create mode 100644 cpan/CPAN-Meta-YAML/t/lib/TestUtils.pm create mode 100755 cpan/CPAN-Meta-YAML/t/tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/dump-error/circular.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/load-error/document.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/load-error/scalar.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/load-error/tag.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/perl-to-yaml/quoting.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/collection.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/comment.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/document.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/mapping.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/quoting.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/scalar.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/sequence.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-spec/basic-data.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-spec/unicode.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Acme-Time-Baby.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Data-Swap.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Games-Nintendo-Wii-Mii.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/HTML-WebDAO.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/ITS-SIN-FIDS-Content-XML.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Plagger.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Spreadsheet-Read.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Template-Provider-Unicode-Japanese.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml create mode 100644 cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml diff --git a/MANIFEST b/MANIFEST index 5f75294..e5dab21 100644 --- a/MANIFEST +++ b/MANIFEST @@ -352,33 +352,53 @@ cpan/CPAN-Meta/t/save-load.t cpan/CPAN-Meta/t/strings.t cpan/CPAN-Meta/t/validator.t cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/01_api.t cpan/CPAN-Meta-YAML/t/01_compile.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/02_basic.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/03_regression.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/05_export.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/11_meta_yml.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/12_plagger.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/13_perl_smith.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/14_yaml_org.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/15_multibyte.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/16_nullrefs.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/17_toolbar.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/18_tap.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/19_errors.t CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/10_read.t +cpan/CPAN-Meta-YAML/t/11_read_string.t +cpan/CPAN-Meta-YAML/t/12_write.t +cpan/CPAN-Meta-YAML/t/13_write_string.t cpan/CPAN-Meta-YAML/t/20_subclass.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/21_bom.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/22_comments.t CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/HTML-WebDAO.yml CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t +cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t +cpan/CPAN-Meta-YAML/t/31_local_tml.t +cpan/CPAN-Meta-YAML/t/32_world_tml.t +cpan/CPAN-Meta-YAML/t/data/ascii.yml +cpan/CPAN-Meta-YAML/t/data/latin1.yml cpan/CPAN-Meta-YAML/t/data/multibyte.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/one.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/sample.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/Spreadsheet-Read.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/Template-Provider-Unicode-Japanese.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/toolbar.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/two.yml CPAN-Meta-YAML files cpan/CPAN-Meta-YAML/t/data/utf_16_le_bom.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/vanilla.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/lib/Test.pm CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml +cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm +cpan/CPAN-Meta-YAML/t/lib/TestML/Tiny.pm +cpan/CPAN-Meta-YAML/t/lib/TestUtils.pm +cpan/CPAN-Meta-YAML/t/README.md +cpan/CPAN-Meta-YAML/t/tml +cpan/CPAN-Meta-YAML/t/tml-local/dump-error/circular.tml +cpan/CPAN-Meta-YAML/t/tml-local/load-error/document.tml +cpan/CPAN-Meta-YAML/t/tml-local/load-error/scalar.tml +cpan/CPAN-Meta-YAML/t/tml-local/load-error/tag.tml +cpan/CPAN-Meta-YAML/t/tml-local/perl-to-yaml/quoting.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/collection.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/comment.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/document.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/mapping.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/quoting.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/scalar.tml +cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/sequence.tml +cpan/CPAN-Meta-YAML/t/tml-spec/basic-data.tml +cpan/CPAN-Meta-YAML/t/tml-spec/unicode.tml +cpan/CPAN-Meta-YAML/t/tml-world/Acme-Time-Baby.tml +cpan/CPAN-Meta-YAML/t/tml-world/Data-Swap.tml +cpan/CPAN-Meta-YAML/t/tml-world/Games-Nintendo-Wii-Mii.tml +cpan/CPAN-Meta-YAML/t/tml-world/HTML-WebDAO.tml +cpan/CPAN-Meta-YAML/t/tml-world/ITS-SIN-FIDS-Content-XML.tml +cpan/CPAN-Meta-YAML/t/tml-world/Plagger.tml +cpan/CPAN-Meta-YAML/t/tml-world/Spreadsheet-Read.tml +cpan/CPAN-Meta-YAML/t/tml-world/Template-Provider-Unicode-Japanese.tml +cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml +cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml +cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml +cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml cpan/CPAN/PAUSE2003.pub CPAN public key cpan/CPAN/PAUSE2005.pub CPAN public key cpan/CPAN/PAUSE2007.pub CPAN public key diff --git a/META.yml b/META.yml index 0876252..6387e53 100644 --- a/META.yml +++ b/META.yml @@ -8,7 +8,7 @@ generated_by: 'CPAN::Meta version 2.133380, CPAN::Meta::Converter version 2.1333 license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html - version: 1.4 + version: '1.4' name: perl no_index: directory: @@ -115,4 +115,4 @@ resources: homepage: http://www.perl.org/ license: http://dev.perl.org/licenses/ repository: http://perl5.git.perl.org/ -version: 5.019009 +version: '5.019009' diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl index 719d899..94dfe88 100755 --- a/Porting/Maintainers.pl +++ b/Porting/Maintainers.pl @@ -326,10 +326,11 @@ use File::Glob qw(:case); }, 'CPAN::Meta::YAML' => { - 'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-YAML-0.010.tar.gz', + 'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-YAML-0.011.tar.gz', 'FILES' => q[cpan/CPAN-Meta-YAML], 'EXCLUDED' => [ 't/00-compile.t', + 't/00-report-prereqs.t', 't/04_scalar.t', # requires YAML.pm qr{^xt}, ], diff --git a/Porting/exec-bit.txt b/Porting/exec-bit.txt index e3e7f3c..1dd17ba 100644 --- a/Porting/exec-bit.txt +++ b/Porting/exec-bit.txt @@ -11,6 +11,7 @@ configpm configure.gnu config_h.SH cpan/autodie/t/chmod.t +cpan/CPAN-Meta-YAML/t/tml cpan/Test-Harness/t/source_tests/source.sh cpan/Test-Harness/t/source_tests/source_args.sh installperl diff --git a/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm b/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm index 260f806..b751f95 100644 --- a/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm +++ b/cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm @@ -1,107 +1,221 @@ +use 5.008001; # sane UTF-8 support +use strict; +use warnings; package CPAN::Meta::YAML; -{ - $CPAN::Meta::YAML::VERSION = '0.010'; -} +$CPAN::Meta::YAML::VERSION = '0.011'; BEGIN { $CPAN::Meta::YAML::AUTHORITY = 'cpan:ADAMK'; } -{ +# git description: v1.59-TRIAL-1-g33d9cd2 ; # original $VERSION removed by Doppelgaenger -} -# git description: v1.54-8-g4c3002d +# XXX-INGY is 5.8.1 too old/broken for utf8? +# XXX-XDG Lancaster consensus was that it was sufficient until +# proven otherwise -use strict; -use warnings; +##################################################################### +# The CPAN::Meta::YAML API. +# +# These are the currently documented API functions/methods and +# exports: + +use Exporter; +our @ISA = qw{ Exporter }; +our @EXPORT = qw{ Load Dump }; +our @EXPORT_OK = qw{ LoadFile DumpFile freeze thaw }; + +### +# Functional/Export API: + +sub Dump { + return CPAN::Meta::YAML->new(@_)->_dump_string; +} -# UTF Support? -sub HAVE_UTF8 () { $] >= 5.007003 } +# XXX-INGY Returning last document seems a bad behavior. +# XXX-XDG I think first would seem more natural, but I don't know +# that it's worth changing now +sub Load { + my $self = CPAN::Meta::YAML->_load_string(@_); + if ( wantarray ) { + return @$self; + } else { + # To match YAML.pm, return the last document + return $self->[-1]; + } +} + +# XXX-INGY Do we really need freeze and thaw? +# XXX-XDG I don't think so. I'd support deprecating them. BEGIN { - if ( HAVE_UTF8 ) { - # The string eval helps hide this from Test::MinimumVersion - eval "require utf8;"; - die "Failed to load UTF-8 support" if $@; + *freeze = \&Dump; + *thaw = \&Load; +} + +sub DumpFile { + my $file = shift; + return CPAN::Meta::YAML->new(@_)->_dump_file($file); +} + +sub LoadFile { + my $file = shift; + my $self = CPAN::Meta::YAML->_load_file($file); + if ( wantarray ) { + return @$self; + } else { + # Return only the last document to match YAML.pm, + return $self->[-1]; } +} - # Class structure - require 5.004; - require Exporter; - require Carp; - @CPAN::Meta::YAML::ISA = qw{ Exporter }; - @CPAN::Meta::YAML::EXPORT = qw{ Load Dump }; - @CPAN::Meta::YAML::EXPORT_OK = qw{ LoadFile DumpFile freeze thaw }; - # Error storage - $CPAN::Meta::YAML::errstr = ''; +### +# Object Oriented API: + +# Create an empty CPAN::Meta::YAML object +# XXX-INGY Why do we use ARRAY object? +# NOTE: I get it now, but I think it's confusing and not needed. +# Will change it on a branch later, for review. +# +# XXX-XDG I don't support changing it yet. It's a very well-documented +# "API" of CPAN::Meta::YAML. I'd support deprecating it, but Adam suggested +# we not change it until YAML.pm's own OO API is established so that +# users only have one API change to digest, not two +sub new { + my $class = shift; + bless [ @_ ], $class; +} + +# XXX-INGY It probably doesn't matter, and it's probably too late to +# change, but 'read/write' are the wrong names. Read and Write +# are actions that take data from storage to memory +# characters/strings. These take the data to/from storage to native +# Perl objects, which the terms dump and load are meant. As long as +# this is a legacy quirk to CPAN::Meta::YAML it's ok, but I'd prefer not +# to add new {read,write}_* methods to this API. + +sub read_string { + my $self = shift; + $self->_load_string(@_); +} + +sub write_string { + my $self = shift; + $self->_dump_string(@_); +} + +sub read { + my $self = shift; + $self->_load_file(@_); } -# The character class of all characters we need to escape -# NOTE: Inlined, since it's only used once -# my $RE_ESCAPE = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f\"\n]'; +sub write { + my $self = shift; + $self->_dump_file(@_); +} + + + + +##################################################################### +# Constants # Printed form of the unprintable characters in the lowest range # of ASCII characters, listed by ASCII ordinal position. my @UNPRINTABLE = qw( - z x01 x02 x03 x04 x05 x06 a - x08 t n v f r x0e x0f + 0 x01 x02 x03 x04 x05 x06 a + b t n v f r x0E x0F x10 x11 x12 x13 x14 x15 x16 x17 - x18 x19 x1a e x1c x1d x1e x1f + x18 x19 x1A e x1C x1D x1E x1F ); # Printable characters for escapes my %UNESCAPES = ( - z => "\x00", a => "\x07", t => "\x09", + 0 => "\x00", z => "\x00", N => "\x85", + a => "\x07", b => "\x08", t => "\x09", n => "\x0a", v => "\x0b", f => "\x0c", r => "\x0d", e => "\x1b", '\\' => '\\', ); -# Special magic boolean words +# XXX-INGY +# I(ngy) need to decide if these values should be quoted in +# CPAN::Meta::YAML or not. Probably yes. + +# These 3 values have special meaning when unquoted and using the +# default YAML schema. They need quotes if they are strings. my %QUOTE = map { $_ => 1 } qw{ - null Null NULL - y Y yes Yes YES n N no No NO - true True TRUE false False FALSE - on On ON off Off OFF + null true false }; +# The commented out form is simpler, but overloaded the Perl regex +# engine due to recursion and backtracking problems on strings +# larger than 32,000ish characters. Keep it for reference purposes. +# qr/\"((?:\\.|[^\"])*)\"/ +my $re_capture_double_quoted = qr/\"([^\\"]*(?:\\.[^\\"]*)*)\"/; +my $re_capture_single_quoted = qr/\'([^\']*(?:\'\'[^\']*)*)\'/; +# unquoted re gets trailing space that needs to be stripped +my $re_capture_unquoted_key = qr/([^:]+(?::+\S[^:]*)*)(?=\s*\:(?:\s+|$))/; +my $re_trailing_comment = qr/(?:\s+\#.*)?/; +my $re_key_value_separator = qr/\s*:(?:\s+(?:\#.*)?|$)/; + ##################################################################### -# Implementation +# CPAN::Meta::YAML Implementation. +# +# These are the private methods that do all the work. They may change +# at any time. -# Create an empty CPAN::Meta::YAML object -sub new { - my $class = shift; - bless [ @_ ], $class; -} + +### +# Loader functions: # Create an object from a file -sub read { +sub _load_file { my $class = ref $_[0] ? ref shift : shift; # Check the file - my $file = shift or return $class->_error( 'You did not specify a file name' ); - return $class->_error( "File '$file' does not exist" ) unless -e $file; - return $class->_error( "'$file' is a directory, not a file" ) unless -f _; - return $class->_error( "Insufficient permissions to read '$file'" ) unless -r _; - - # Slurp in the file - local $/ = undef; - local *CFG; - unless ( open(CFG, $file) ) { - return $class->_error("Failed to open file '$file': $!"); + my $file = shift or $class->_error( 'You did not specify a file name' ); + $class->_error( "File '$file' does not exist" ) + unless -e $file; + $class->_error( "'$file' is a directory, not a file" ) + unless -f _; + $class->_error( "Insufficient permissions to read '$file'" ) + unless -r _; + + # Open unbuffered with strict UTF-8 decoding and no translation layers + open( my $fh, "<:unix:encoding(UTF-8)", $file ); + unless ( $fh ) { + $class->_error("Failed to open file '$file': $!"); + } + + # flock if available (or warn if not possible for OS-specific reasons) + if ( _can_flock() ) { + flock( $fh, Fcntl::LOCK_SH() ) + or warn "Couldn't lock '$file' for reading: $!"; + } + + # slurp the contents + my $contents = eval { + use warnings FATAL => 'utf8'; + local $/; + <$fh> + }; + if ( my $err = $@ ) { + $class->_error("Error reading from file '$file': $err"); } - my $contents = ; - unless ( close(CFG) ) { - return $class->_error("Failed to close file '$file': $!"); + + # close the file (release the lock) + unless ( close $fh ) { + $class->_error("Failed to close file '$file': $!"); } - $class->read_string( $contents ); + $class->_load_string( $contents ); } # Create an object from a string -sub read_string { +sub _load_string { my $class = ref $_[0] ? ref shift : shift; my $self = bless [], $class; my $string = $_[0]; @@ -110,30 +224,23 @@ sub read_string { die \"Did not provide a string to load"; } - # Byte order marks - # NOTE: Keeping this here to educate maintainers - # my %BOM = ( - # "\357\273\277" => 'UTF-8', - # "\376\377" => 'UTF-16BE', - # "\377\376" => 'UTF-16LE', - # "\377\376\0\0" => 'UTF-32LE' - # "\0\0\376\377" => 'UTF-32BE', - # ); - if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) { - die \"Stream has a non UTF-8 BOM"; - } else { - # Strip UTF-8 bom if found, we'll just ignore it - $string =~ s/^\357\273\277//; + # Check if Perl has it marked as characters, but it's internally + # inconsistent. E.g. maybe latin1 got read on a :utf8 layer + if ( utf8::is_utf8($string) && ! utf8::valid($string) ) { + die \<<'...'; +Read an invalid UTF-8 string (maybe mixed UTF-8 and 8-bit character set). +Did you decode with lax ":utf8" instead of strict ":encoding(UTF-8)"? +... } - # Try to decode as utf8 - utf8::decode($string) if HAVE_UTF8; + # Ensure Unicode character semantics, even for 0x80-0xff + utf8::upgrade($string); + + # Check for and strip any leading UTF-8 BOM + $string =~ s/^\x{FEFF}//; # Check for some special cases return $self unless length $string; - unless ( $string =~ /[\012\015]+\z/ ) { - die \"Stream does not end with newline character"; - } # Split the file into lines my @lines = grep { ! /^\s*(?:\#.*)?\z/ } @@ -143,15 +250,18 @@ sub read_string { @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines; # A nibbling parser + my $in_document = 0; 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 @$self, $self->_read_scalar( "$1", [ undef ], \@lines ); + push @$self, + $self->_load_scalar( "$1", [ undef ], \@lines ); next; } + $in_document = 1; } if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) { @@ -160,36 +270,64 @@ sub read_string { while ( @lines and $lines[0] !~ /^---/ ) { shift @lines; } + $in_document = 0; - } elsif ( $lines[0] =~ /^\s*\-/ ) { + # XXX The final '-+$' is to look for -- which ends up being an + # error later. + } elsif ( ! $in_document && @$self ) { + # only the first document can be explicit + die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; + } elsif ( $lines[0] =~ /^\s*\-(?:\s|$|-+$)/ ) { # An array at the root my $document = [ ]; push @$self, $document; - $self->_read_array( $document, [ 0 ], \@lines ); + $self->_load_array( $document, [ 0 ], \@lines ); } elsif ( $lines[0] =~ /^(\s*)\S/ ) { # A hash at the root my $document = { }; push @$self, $document; - $self->_read_hash( $document, [ length($1) ], \@lines ); + $self->_load_hash( $document, [ length($1) ], \@lines ); } else { + # Shouldn't get here. @lines have whitespace-only lines + # stripped, and previous match is a line with any + # non-whitespace. So this clause should only be reachable via + # a perlbug where \s is not symmetric with \S + + # uncoverable statement die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; } } }; if ( ref $@ eq 'SCALAR' ) { - return $self->_error(${$@}); + $self->_error(${$@}); } elsif ( $@ ) { - require Carp; - Carp::croak($@); + $self->_error($@); } return $self; } -# Deparse a scalar string to the actual scalar -sub _read_scalar { +sub _unquote_single { + my ($self, $string) = @_; + return '' unless length $string; + $string =~ s/\'\'/\'/g; + return $string; +} + +sub _unquote_double { + my ($self, $string) = @_; + return '' unless length $string; + $string =~ s/\\"/"/g; + $string =~ + s{\\([Nnever\\fartz0b]|x([0-9a-fA-F]{2}))} + {(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}}gex; + return $string; +} + +# Load a YAML scalar string to the actual Perl scalar +sub _load_scalar { my ($self, $string, $indent, $lines) = @_; # Trim trailing whitespace @@ -199,25 +337,13 @@ sub _read_scalar { return undef if $string eq '~'; # Single quote - if ( $string =~ /^\'(.*?)\'(?:\s+\#.*)?\z/ ) { - return '' unless defined $1; - $string = $1; - $string =~ s/\'\'/\'/g; - return $string; + if ( $string =~ /^$re_capture_single_quoted$re_trailing_comment\z/ ) { + return $self->_unquote_single($1); } # Double quote. - # The commented out form is simpler, but overloaded the Perl regex - # engine due to recursion and backtracking problems on strings - # larger than 32,000ish characters. Keep it for reference purposes. - # if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) { - if ( $string =~ /^\"([^\\"]*(?:\\.[^\\"]*)*)\"(?:\s+\#.*)?\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; + if ( $string =~ /^$re_capture_double_quoted$re_trailing_comment\z/ ) { + return $self->_unquote_double($1); } # Special cases @@ -229,13 +355,9 @@ sub _read_scalar { # Regular unquoted string if ( $string !~ /^[>|]/ ) { - if ( - $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ - or - $string =~ /:(?:\s|$)/ - ) { - die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'"; - } + die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'" + if $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or + $string =~ /:(?:\s|$)/; $string =~ s/\s+#.*\z//; return $string; } @@ -263,8 +385,8 @@ sub _read_scalar { return join( $j, @multiline ) . $t; } -# Parse an array -sub _read_array { +# Load an array +sub _load_array { my ($self, $array, $indent, $lines) = @_; while ( @$lines ) { @@ -289,12 +411,7 @@ sub _read_array { my $indent2 = length("$1"); $lines->[0] =~ s/-/ /; push @$array, { }; - $self->_read_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); - - } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { - # Array entry with a value - shift @$lines; - push @$array, $self->_read_scalar( "$2", [ @$indent, undef ], $lines ); + $self->_load_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) { shift @$lines; @@ -310,17 +427,28 @@ sub _read_array { } else { # Naked indenter push @$array, [ ]; - $self->_read_array( $array->[-1], [ @$indent, $indent2 ], $lines ); + $self->_load_array( + $array->[-1], [ @$indent, $indent2 ], $lines + ); } } elsif ( $lines->[0] =~ /^(\s*)\S/ ) { push @$array, { }; - $self->_read_hash( $array->[-1], [ @$indent, length("$1") ], $lines ); + $self->_load_hash( + $array->[-1], [ @$indent, length("$1") ], $lines + ); } else { die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; } + } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { + # Array entry with a value + shift @$lines; + push @$array, $self->_load_scalar( + "$2", [ @$indent, undef ], $lines + ); + } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) { # This is probably a structure like the following... # --- @@ -339,8 +467,8 @@ sub _read_array { return 1; } -# Parse an array -sub _read_hash { +# Load a hash +sub _load_hash { my ($self, $hash, $indent, $lines) = @_; while ( @$lines ) { @@ -360,19 +488,39 @@ sub _read_hash { die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; } - # Get the key - unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+(?:\#.*)?|$)// ) { - if ( $lines->[0] =~ /^\s*[?\'\"]/ ) { - die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"; - } + # Find the key + my $key; + + # Quoted keys + if ( $lines->[0] =~ + s/^\s*$re_capture_single_quoted$re_key_value_separator// + ) { + $key = $self->_unquote_single($1); + } + elsif ( $lines->[0] =~ + s/^\s*$re_capture_double_quoted$re_key_value_separator// + ) { + $key = $self->_unquote_double($1); + } + elsif ( $lines->[0] =~ + s/^\s*$re_capture_unquoted_key$re_key_value_separator// + ) { + $key = $1; + $key =~ s/\s+$//; + } + elsif ( $lines->[0] =~ /^\s*\?/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"; + } + else { die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; } - my $key = $1; # Do we have a value? if ( length $lines->[0] ) { # Yes - $hash->{$key} = $self->_read_scalar( shift(@$lines), [ @$indent, undef ], $lines ); + $hash->{$key} = $self->_load_scalar( + shift(@$lines), [ @$indent, undef ], $lines + ); } else { # An indent shift @$lines; @@ -382,7 +530,9 @@ sub _read_hash { } if ( $lines->[0] =~ /^(\s*)-/ ) { $hash->{$key} = []; - $self->_read_array( $hash->{$key}, [ @$indent, length($1) ], $lines ); + $self->_load_array( + $hash->{$key}, [ @$indent, length($1) ], $lines + ); } elsif ( $lines->[0] =~ /^(\s*)./ ) { my $indent2 = length("$1"); if ( $indent->[-1] >= $indent2 ) { @@ -390,7 +540,9 @@ sub _read_hash { $hash->{$key} = undef; } else { $hash->{$key} = {}; - $self->_read_hash( $hash->{$key}, [ @$indent, length($1) ], $lines ); + $self->_load_hash( + $hash->{$key}, [ @$indent, length($1) ], $lines + ); } } } @@ -399,98 +551,161 @@ sub _read_hash { return 1; } + +### +# Dumper functions: + # Save an object to a file -sub write { +sub _dump_file { my $self = shift; - my $file = shift or return $self->_error('No file name provided'); - # Write it to the file - open( CFG, '>' . $file ) or return $self->_error( - "Failed to open file '$file' for writing: $!" - ); - print CFG $self->write_string; - close CFG; + require Fcntl; + + # Check the file + my $file = shift or $self->_error( 'You did not specify a file name' ); + + my $fh; + # flock if available (or warn if not possible for OS-specific reasons) + if ( _can_flock() ) { + # Open without truncation (truncate comes after lock) + my $flags = Fcntl::O_WRONLY()|Fcntl::O_CREAT(); + sysopen( $fh, $file, $flags ); + unless ( $fh ) { + $self->_error("Failed to open file '$file' for writing: $!"); + } + + # Use no translation and strict UTF-8 + binmode( $fh, ":raw:encoding(UTF-8)"); + + flock( $fh, Fcntl::LOCK_EX() ) + or warn "Couldn't lock '$file' for reading: $!"; + + # truncate and spew contents + truncate $fh, 0; + seek $fh, 0, 0; + } + else { + open $fh, ">:unix:encoding(UTF-8)", $file; + } + + # serialize and spew to the handle + print {$fh} $self->_dump_string; + + # close the file (release the lock) + unless ( close $fh ) { + $self->_error("Failed to close file '$file': $!"); + } return 1; } # Save an object to a string -sub write_string { +sub _dump_string { my $self = shift; - return '' unless @$self; + return '' unless ref $self && @$self; # Iterate over the documents my $indent = 0; my @lines = (); - foreach my $cursor ( @$self ) { - push @lines, '---'; - - # An empty document - if ( ! defined $cursor ) { - # Do nothing - - # A scalar document - } elsif ( ! ref $cursor ) { - $lines[-1] .= ' ' . $self->_write_scalar( $cursor, $indent ); - - # A list at the root - } elsif ( ref $cursor eq 'ARRAY' ) { - unless ( @$cursor ) { - $lines[-1] .= ' []'; - next; - } - push @lines, $self->_write_array( $cursor, $indent, {} ); - # A hash at the root - } elsif ( ref $cursor eq 'HASH' ) { - unless ( %$cursor ) { - $lines[-1] .= ' {}'; - next; - } - push @lines, $self->_write_hash( $cursor, $indent, {} ); + eval { + foreach my $cursor ( @$self ) { + push @lines, '---'; - } else { - Carp::croak("Cannot serialize " . ref($cursor)); + # An empty document + if ( ! defined $cursor ) { + # Do nothing + + # A scalar document + } elsif ( ! ref $cursor ) { + $lines[-1] .= ' ' . $self->_dump_scalar( $cursor ); + + # A list at the root + } elsif ( ref $cursor eq 'ARRAY' ) { + unless ( @$cursor ) { + $lines[-1] .= ' []'; + next; + } + push @lines, $self->_dump_array( $cursor, $indent, {} ); + + # A hash at the root + } elsif ( ref $cursor eq 'HASH' ) { + unless ( %$cursor ) { + $lines[-1] .= ' {}'; + next; + } + push @lines, $self->_dump_hash( $cursor, $indent, {} ); + + } else { + die \("Cannot serialize " . ref($cursor)); + } } + }; + if ( ref $@ eq 'SCALAR' ) { + $self->_error(${$@}); + } elsif ( $@ ) { + $self->_error($@); } join '', map { "$_\n" } @lines; } -sub _write_scalar { +sub _has_internal_string_value { + my $value = shift; + my $b_obj = B::svref_2object(\$value); # for round trip problem + return $b_obj->FLAGS & B::SVf_POK(); +} + +sub _dump_scalar { my $string = $_[1]; + my $is_key = $_[2]; + # Check this before checking length or it winds up looking like a string! + my $has_string_flag = _has_internal_string_value($string); return '~' unless defined $string; return "''" unless length $string; - if ( $string =~ /[\x00-\x08\x0b-\x0d\x0e-\x1f\"\'\n]/ ) { + if (Scalar::Util::looks_like_number($string)) { + # keys and values that have been used as strings get quoted + if ( $is_key || $has_string_flag ) { + return qq['$string']; + } + else { + return $string; + } + } + if ( $string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/ ) { $string =~ s/\\/\\\\/g; $string =~ s/"/\\"/g; $string =~ s/\n/\\n/g; + $string =~ s/[\x85]/\\N/g; $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g; + $string =~ s/([\x7f-\x9f])/'\x' . sprintf("%X",ord($1))/ge; return qq|"$string"|; } - if ( $string =~ /(?:^\W|\s|:\z)/ or $QUOTE{$string} ) { + if ( $string =~ /(?:^[~!@#%&*|>?:,'"`{}\[\]]|^-+$|\s|:\z)/ or + $QUOTE{$string} + ) { return "'$string'"; } return $string; } -sub _write_array { +sub _dump_array { my ($self, $array, $indent, $seen) = @_; if ( $seen->{refaddr($array)}++ ) { - die "CPAN::Meta::YAML does not support circular references"; + die \"CPAN::Meta::YAML does not support circular references"; } my @lines = (); foreach my $el ( @$array ) { my $line = (' ' x $indent) . '-'; my $type = ref $el; if ( ! $type ) { - $line .= ' ' . $self->_write_scalar( $el, $indent + 1 ); + $line .= ' ' . $self->_dump_scalar( $el ); push @lines, $line; } elsif ( $type eq 'ARRAY' ) { if ( @$el ) { push @lines, $line; - push @lines, $self->_write_array( $el, $indent + 1, $seen ); + push @lines, $self->_dump_array( $el, $indent + 1, $seen ); } else { $line .= ' []'; push @lines, $line; @@ -499,38 +714,38 @@ sub _write_array { } elsif ( $type eq 'HASH' ) { if ( keys %$el ) { push @lines, $line; - push @lines, $self->_write_hash( $el, $indent + 1, $seen ); + push @lines, $self->_dump_hash( $el, $indent + 1, $seen ); } else { $line .= ' {}'; push @lines, $line; } } else { - die "CPAN::Meta::YAML does not support $type references"; + die \"CPAN::Meta::YAML does not support $type references"; } } @lines; } -sub _write_hash { +sub _dump_hash { my ($self, $hash, $indent, $seen) = @_; if ( $seen->{refaddr($hash)}++ ) { - die "CPAN::Meta::YAML does not support circular references"; + die \"CPAN::Meta::YAML does not support circular references"; } my @lines = (); foreach my $name ( sort keys %$hash ) { my $el = $hash->{$name}; - my $line = (' ' x $indent) . "$name:"; + my $line = (' ' x $indent) . $self->_dump_scalar($name, 1) . ":"; my $type = ref $el; if ( ! $type ) { - $line .= ' ' . $self->_write_scalar( $el, $indent + 1 ); + $line .= ' ' . $self->_dump_scalar( $el ); push @lines, $line; } elsif ( $type eq 'ARRAY' ) { if ( @$el ) { push @lines, $line; - push @lines, $self->_write_array( $el, $indent + 1, $seen ); + push @lines, $self->_dump_array( $el, $indent + 1, $seen ); } else { $line .= ' []'; push @lines, $line; @@ -539,92 +754,89 @@ sub _write_hash { } elsif ( $type eq 'HASH' ) { if ( keys %$el ) { push @lines, $line; - push @lines, $self->_write_hash( $el, $indent + 1, $seen ); + push @lines, $self->_dump_hash( $el, $indent + 1, $seen ); } else { $line .= ' {}'; push @lines, $line; } } else { - die "CPAN::Meta::YAML does not support $type references"; + die \"CPAN::Meta::YAML does not support $type references"; } } @lines; } + + +##################################################################### +# DEPRECATED API methods: + +# Error storage (DEPRECATED as of 1.57) +our $errstr = ''; + # Set error sub _error { - $CPAN::Meta::YAML::errstr = $_[1]; - undef; + require Carp; + $errstr = $_[1]; + $errstr =~ s/ at \S+ line \d+.*//; + Carp::croak( $errstr ); } # Retrieve error +my $errstr_warned; sub errstr { - $CPAN::Meta::YAML::errstr; + require Carp; + Carp::carp( "CPAN::Meta::YAML->errstr and \$CPAN::Meta::YAML::errstr is deprecated" ) + unless $errstr_warned++; + $errstr; } - ##################################################################### -# YAML Compatibility - -sub Dump { - CPAN::Meta::YAML->new(@_)->write_string; -} - -sub Load { - my $self = CPAN::Meta::YAML->read_string(@_); - unless ( $self ) { - Carp::croak("Failed to load YAML document from string"); - } - if ( wantarray ) { - return @$self; - } else { - # To match YAML.pm, return the last document - return $self->[-1]; - } -} +# Helper functions. Possibly not needed. -BEGIN { - *freeze = *Dump; - *thaw = *Load; -} -sub DumpFile { - my $file = shift; - CPAN::Meta::YAML->new(@_)->write($file); -} +# Use to detect nv or iv +use B; -sub LoadFile { - my $self = CPAN::Meta::YAML->read($_[0]); - unless ( $self ) { - Carp::croak("Failed to load YAML document from '" . ($_[0] || '') . "'"); +# XXX-INGY Is flock CPAN::Meta::YAML's responsibility? +# Some platforms can't flock :-( +# XXX-XDG I think it is. When reading and writing files, we ought +# to be locking whenever possible. People (foolishly) use YAML +# files for things like session storage, which has race issues. +my $HAS_FLOCK; +sub _can_flock { + if ( defined $HAS_FLOCK ) { + return $HAS_FLOCK; } - if ( wantarray ) { - return @$self; - } else { - # Return only the last document to match YAML.pm, - return $self->[-1]; + else { + require Config; + my $c = \%Config::Config; + $HAS_FLOCK = grep { $c->{$_} } qw/d_flock d_fcntl_can_lock d_lockf/; + require Fcntl if $HAS_FLOCK; + return $HAS_FLOCK; } } - - - +# XXX-INGY Is this core in 5.8.1? Can we remove this? +# XXX-XDG Scalar::Util 1.18 didn't land until 5.8.8, so we need this ##################################################################### # Use Scalar::Util if possible, otherwise emulate it BEGIN { local $@; - eval { - require Scalar::Util; - }; - my $v = eval("$Scalar::Util::VERSION") || 0; - if ( $@ or $v < 1.18 ) { + if ( eval { require Scalar::Util } + && $Scalar::Util::VERSION + && eval($Scalar::Util::VERSION) >= 1.18 + ) { + *refaddr = *Scalar::Util::refaddr; + } + else { eval <<'END_PERL'; # Scalar::Util failed to load or too old sub refaddr { @@ -635,21 +847,33 @@ sub refaddr { $pkg = undef; } "$_[0]" =~ /0x(\w+)/; - my $i = do { local $^W; hex $1 }; + my $i = do { no warnings 'portable'; hex $1 }; bless $_[0], $pkg if defined $pkg; $i; } END_PERL - } else { - *refaddr = *Scalar::Util::refaddr; } } + + + 1; +# XXX-INGY Doc notes I'm putting up here. Changing the doc when it's wrong +# but leaving grey area stuff up here. +# +# I would like to change Read/Write to Load/Dump below without +# changing the actual API names. +# +# It might be better to put Load/Dump API in the SYNOPSIS instead of the +# dubious OO API. +# +# null and bool explanations may be outdated. + =pod -=encoding utf-8 +=encoding UTF-8 =head1 NAME @@ -657,7 +881,7 @@ CPAN::Meta::YAML - Read and write a subset of YAML for CPAN Meta files =head1 VERSION -version 0.010 +version 0.011 =head1 SYNOPSIS diff --git a/cpan/CPAN-Meta-YAML/t/01_api.t b/cpan/CPAN-Meta-YAML/t/01_api.t new file mode 100644 index 0000000..3d57c85 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/01_api.t @@ -0,0 +1,40 @@ +# Testing of some API methods; + +use strict; +use warnings; + +use lib 't/lib/'; +use Test::More 0.99; +use TestBridge; +use CPAN::Meta::YAML; + +subtest "default exports" => sub { + ok( defined(&Load), 'Found exported Load function' ); + ok( defined(&Dump), 'Found exported Dump function' ); + ok( \&main::Load == \&CPAN::Meta::YAML::Load, 'Load is CPAN::Meta::YAML' ); + ok( \&main::Dump == \&CPAN::Meta::YAML::Dump, 'Dump is CPAN::Meta::YAML' ); + ok( !defined(&LoadFile), 'LoadFile function not exported' ); + ok( !defined(&DumpFile), 'DumpFile function not exported' ); + ok( !defined(&freeze), 'freeze function not exported' ); + ok( !defined(&thaw), 'thaw functiona not exported' ); +}; + +subtest "all exports" => sub { + package main::all_exports; + use Test::More; + use CPAN::Meta::YAML qw/Load Dump LoadFile DumpFile freeze thaw/; + ok( defined(&Load), 'Found exported Load function' ); + ok( defined(&Dump), 'Found exported Dump function' ); + ok( defined(&LoadFile), 'Found exported LoadFile function' ); + ok( defined(&DumpFile), 'Found exported DumpFile function' ); + ok( defined(&freeze), 'Found exported freeze function' ); + ok( defined(&thaw), 'Found exported thaw functiona' ); +}; + +subtest "constructor and documents" => sub { + my @docs = ( { one => 'two' }, { three => 'four' } ); + ok( my $yaml = CPAN::Meta::YAML->new( @docs ), "constructor" ); + cmp_deeply( [ @$yaml ], \@docs, "the object is an arrayref of documents" ); +}; + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/01_compile.t b/cpan/CPAN-Meta-YAML/t/01_compile.t index d85d9aa..e7b3870 100644 --- a/cpan/CPAN-Meta-YAML/t/01_compile.t +++ b/cpan/CPAN-Meta-YAML/t/01_compile.t @@ -2,18 +2,21 @@ use strict; use warnings; +use lib 't/lib'; BEGIN { $| = 1; - $^W = 1; } -use File::Spec::Functions ':ALL'; -use Test::More tests => 3; +use Test::More 0.99; # Check their perl version -ok( $] >= 5.004, "Your perl is new enough" ); +ok( $] ge '5.008001', "Your perl is new enough" ); # Does the module load -use_ok( 'CPAN::Meta::YAML' ); -use_ok( 't::lib::Test' ); +require_ok( 'CPAN::Meta::YAML' ); +require_ok( 'TestUtils' ); +require_ok( 'TestBridge' ); +require_ok( 'TestML::Tiny' ); + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/02_basic.t b/cpan/CPAN-Meta-YAML/t/02_basic.t deleted file mode 100644 index 1aa3686..0000000 --- a/cpan/CPAN-Meta-YAML/t/02_basic.t +++ /dev/null @@ -1,255 +0,0 @@ -# Testing of basic document structures - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(30); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# 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', - noyamlperl => 1, -); - -# 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/CPAN-Meta-YAML/t/03_regression.t b/cpan/CPAN-Meta-YAML/t/03_regression.t deleted file mode 100644 index f85b2ac..0000000 --- a/cpan/CPAN-Meta-YAML/t/03_regression.t +++ /dev/null @@ -1,716 +0,0 @@ -# Testing of common META.yml examples - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(37, 0, 13); -use CPAN::Meta::YAML qw{ - Load Dump - LoadFile DumpFile - freeze thaw -}; - - - - - -##################################################################### -# Check Exports - -ok( defined(&Load), 'Found exported Load function' ); -ok( defined(&Dump), 'Found exported Dump function' ); -ok( defined(&LoadFile), 'Found exported LoadFile function' ); -ok( defined(&DumpFile), 'Found exported DumpFile function' ); -ok( defined(&freeze), 'Found exported freeze function' ); -ok( defined(&thaw), 'Found exported thaw functiona' ); - - - - - -##################################################################### -# 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 ' -END_YAML - [ { author => [ 'mst: Matt S. Trout ' ] } ], - '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', -); - - - - - -##################################################################### -# Circular Reference Protection - -SCOPE: { - my $foo = { a => 'b' }; - my $bar = [ $foo, 2 ]; - $foo->{c} = $bar; - my $circ = CPAN::Meta::YAML->new( [ $foo, $bar ] ); - isa_ok( $circ, 'CPAN::Meta::YAML' ); - - # When we try to serialize, it should NOT infinite loop - my $string = undef; - $string = eval { $circ->write_string; }; - is( $string, undef, '->write_string does not return a value' ); - ok( $@, 'Error string is defined' ); - ok( - $@ =~ /does not support circular references/, - 'Got the expected error message', - ); -} - - - - - -##################################################################### -# 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', -); - - - - - -###################################################################### -# Check for unescaped boolean keywords - -is_deeply( - CPAN::Meta::YAML->new( 'True' )->write_string, - "--- 'True'\n", - 'Idiomatic trivial boolean string is escaped', -); - -is_deeply( CPAN::Meta::YAML->new( [ qw{ - null Null NULL - y Y yes Yes YES n N no No NO - true True TRUE false False FALSE - on On ON off Off OFF -} ] )->write_string, <<'END_YAML' ); ---- -- 'null' -- 'Null' -- 'NULL' -- 'y' -- 'Y' -- 'yes' -- 'Yes' -- 'YES' -- 'n' -- 'N' -- 'no' -- 'No' -- 'NO' -- 'true' -- 'True' -- 'TRUE' -- 'false' -- 'False' -- 'FALSE' -- 'on' -- 'On' -- 'ON' -- 'off' -- 'Off' -- 'OFF' -END_YAML - - - - - -###################################################################### -# Always quote for scalars ending with : - -is_deeply( - CPAN::Meta::YAML->new( [ 'A:' ] )->write_string, - "---\n- 'A:'\n", - 'Simple scalar ending in a colon is correctly quoted', -); diff --git a/cpan/CPAN-Meta-YAML/t/05_export.t b/cpan/CPAN-Meta-YAML/t/05_export.t deleted file mode 100644 index edb43c8..0000000 --- a/cpan/CPAN-Meta-YAML/t/05_export.t +++ /dev/null @@ -1,22 +0,0 @@ -# Testing of basic document structures - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use Test::More tests => 6; -use CPAN::Meta::YAML; - - - -ok defined &main::Load, 'Load is exported'; -ok defined &main::Dump, 'Dump is exported'; -ok not(defined &main::LoadFile), 'Load is exported'; -ok not(defined &main::DumpFile), 'Dump is exported'; - -ok \&main::Load == \&CPAN::Meta::YAML::Load, 'Load is CPAN::Meta::YAML'; -ok \&main::Dump == \&CPAN::Meta::YAML::Dump, 'Dump is CPAN::Meta::YAML'; diff --git a/cpan/CPAN-Meta-YAML/t/10_read.t b/cpan/CPAN-Meta-YAML/t/10_read.t new file mode 100644 index 0000000..27f83b6 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/10_read.t @@ -0,0 +1,112 @@ +use strict; +use warnings; +use utf8; +use lib 't/lib/'; +use Test::More 0.99; +use TestUtils; +use TestBridge; + +use CPAN::Meta::YAML; + +#--------------------------------------------------------------------------# +# read() should read these files without error +#--------------------------------------------------------------------------# + +my %passes = ( + array => { + file => 'ascii.yml', + perl => [ + [ 'foo' ] + ], + }, + 'multibyte UTF-8' => { + file => 'multibyte.yml', + perl => [ + { author => 'Ævar Arnfjörð Bjarmason ' } + ], + utf8 => 'author', + }, + 'UTF-8 BOM' => { + file => 'utf_8_bom.yml', + perl => [ + { author => 'Ævar Arnfjörð Bjarmason ' } + ], + utf8 => 'author', + }, +); + +for my $key ( sort keys %passes ) { + subtest $key => sub { + my $case = $passes{$key}; + my $file = test_data_file( $case->{file} ); + ok( -f $file, "Found $case->{file}" ); + + my $got = eval { CPAN::Meta::YAML->read( $file ) }; + is( $@, '', "CPAN::Meta::YAML reads without exception" ); + SKIP: { + skip( "Shortcutting after failure", 2 ) if $@; + isa_ok( $got, 'CPAN::Meta::YAML' ) + or diag "ERROR: " . CPAN::Meta::YAML->errstr; + cmp_deeply( $got, $case->{perl}, "CPAN::Meta::YAML parses correctly" ); + } + + if ( $case->{utf8} ) { + ok( utf8::is_utf8( $got->[0]->{$case->{utf8}} ), "utf8 decoded" ); + } + + # test that read method on object is also a constructor + ok( my $got2 = eval { $got->read( $file ) }, "read() object method"); + isnt( $got, $got2, "objects are different" ); + cmp_deeply( $got, $got2, "objects have same content" ); + } +} + +#--------------------------------------------------------------------------# +# read() should fail to read these files and provide expected errors +#--------------------------------------------------------------------------# + +my %errors = ( + 'latin1.yml' => qr/latin1\.yml.*does not map to Unicode/, + 'utf_16_le_bom.yml' => qr/utf_16_le_bom\.yml.*does not map to Unicode/, +); + +for my $key ( sort keys %errors ) { + subtest $key => sub { + my $file = test_data_file( $key ); + ok( -f $file, "Found $key" ); + + my $result = eval { CPAN::Meta::YAML->read( $file ) }; + ok( !$result, "returned false" ); + error_like( $errors{$key}, "Got expected error" ); + }; +} + +# Additional errors without a file to read + +subtest "bad read arguments" => sub { + eval { CPAN::Meta::YAML->read(); }; + error_like(qr/You did not specify a file name/, + "Got expected error: no filename provided to read()" + ); + + eval { CPAN::Meta::YAML->read( test_data_file('nonexistent.yml') ); }; + error_like(qr/File '.*?' does not exist/, + "Got expected error: nonexistent filename provided to read()" + ); + + eval { CPAN::Meta::YAML->read( test_data_directory() ); }; + error_like(qr/'.*?' is a directory, not a file/, + "Got expected error: directory provided to read()" + ); +}; + +done_testing; +# +# This file is part of CPAN-Meta-YAML +# +# This software is copyright (c) 2010 by Adam Kennedy. +# +# This is free software; you can redistribute it and/or modify it under +# the same terms as the Perl 5 programming language system itself. +# +# vim: ts=4 sts=4 sw=4 et: diff --git a/cpan/CPAN-Meta-YAML/t/11_meta_yml.t b/cpan/CPAN-Meta-YAML/t/11_meta_yml.t deleted file mode 100644 index e2604e2..0000000 --- a/cpan/CPAN-Meta-YAML/t/11_meta_yml.t +++ /dev/null @@ -1,396 +0,0 @@ -# Testing of common META.yml examples - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(8, 3); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# Testing CPAN::Meta::YAML's own META.yml file - -yaml_ok( - <<'END_YAML', -abstract: Read/Write YAML files with as little code as possible -author: 'Adam Kennedy ' -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 ', - 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', - } ], - 'CPAN::Meta::YAML', -); - - - - - - -##################################################################### -# 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", # this kludge is to prevent floating point comparison errors - 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', - } ], - 'CPAN::Meta::YAML', -); - - - - - - -##################################################################### -# Testing various failing META.yml files from CPAN - -yaml_ok( - <<'END_YAML', ---- -abstract: Mii in Nintendo Wii data parser and builder -author: Toru Yamaguchi -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 ', - 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<< >>', - 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, Ezagap@users.sourceforge.netE', - ], - 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 ' - ], - '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/CPAN-Meta-YAML/t/11_read_string.t b/cpan/CPAN-Meta-YAML/t/11_read_string.t new file mode 100644 index 0000000..9b00291 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/11_read_string.t @@ -0,0 +1,51 @@ +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestUtils; +use TestBridge; + +use CPAN::Meta::YAML (); + +#--------------------------------------------------------------------------# +# Generally, read_string can be tested with .tml files in t/tml-local/* +# +# This file is for error tests that can't be easily tested via .tml +#--------------------------------------------------------------------------# + +subtest 'read_string without arg' => sub { + eval { CPAN::Meta::YAML->read_string(); }; + error_like(qr/Did not provide a string to load/, + "Got expected error: no string provided to read_string()" + ); +}; + +subtest 'YAML without newline' => sub { + my $str = join("\n" => ('---', '- foo', '---', '- bar', '---')); + my $obj = eval { CPAN::Meta::YAML->read_string($str); }; + is( $@, '', "YAML without newline is OK"); +}; + +subtest 'read_string as object method' => sub { + ok( my $obj = CPAN::Meta::YAML->new( { foo => 'bar' } ), "new YAML object" ); + ok( my $obj2 = $obj->read_string( "---\nfoo: bar\n" ), + "read_string object method" + ); + isnt( $obj, $obj2, "objects are different" ); + cmp_deeply( $obj, $obj2, "objects have same content" ); +}; + +subtest 'invalid UTF-8' => sub { + # get invalid UTF-8 by reading Latin-1 with lax :utf8 layer + my $string = do { + local $SIG{__WARN__} = sub {}; + slurp( test_data_file('latin1.yml'), ":utf8" ); + }; + my $obj = eval { CPAN::Meta::YAML->read_string($string); }; + is( $obj, undef, "read_string should return undef" ); + error_like( qr/invalid UTF-8 string/, + "Got expected error about invalid UTF-8 string" + ); +}; + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/12_plagger.t b/cpan/CPAN-Meta-YAML/t/12_plagger.t deleted file mode 100644 index 86abc3b..0000000 --- a/cpan/CPAN-Meta-YAML/t/12_plagger.t +++ /dev/null @@ -1,127 +0,0 @@ -# Testing Plagger config samples from Miyagawa-san's YAPC::NA 2006 talk - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(2); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# 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/CPAN-Meta-YAML/t/12_write.t b/cpan/CPAN-Meta-YAML/t/12_write.t new file mode 100644 index 0000000..8c7b4be --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/12_write.t @@ -0,0 +1,82 @@ +use utf8; +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestBridge; +use TestUtils; + +use CPAN::Meta::YAML; +use File::Basename qw/basename/; +use File::Temp qw/tempfile/; + +#--------------------------------------------------------------------------# +# Error conditions +#--------------------------------------------------------------------------# + +subtest 'no filename for write()' => sub { + my $obj = CPAN::Meta::YAML->new(); + eval { $obj->write(); }; + error_like( qr/You did not specify a file name/, + "No filename provided to write()" + ); +}; + +#--------------------------------------------------------------------------# +# Test that write uses correct encoding and can round-trip +#--------------------------------------------------------------------------# + +my @cases = ( + { label => "ascii", name => "Mengue" }, + { label => "latin1", name => "Mengué" }, + { label => "wide", name => "あ" }, +); + +my @warnings; +local $SIG{__WARN__} = sub { push @warnings, $_[0] }; + +# CPAN::Meta::YAML doesn't preserve order in the file, so we can't actually check +# file equivalence. We have to see if we can round-trip a data structure +# from Perl to YAML and back. +for my $c ( @cases ) { + subtest "write $c->{label} characters" => sub { + my $data; + @warnings = (); + + # get a tempfile name to write to + my ($fh, $tempfile) = tempfile("YAML-Tiny-test-XXXXXXXX", TMPDIR => 1 ); + my $short_tempfile = basename($tempfile); + close $fh; # avoid locks on windows + + # CPAN::Meta::YAML->write + ok( CPAN::Meta::YAML->new($c)->write($tempfile), + "case $c->{label}: write $short_tempfile" ) + or diag "ERROR: " . CPAN::Meta::YAML->errstr; + + # CPAN::Meta::YAML->read + ok( $data = eval { CPAN::Meta::YAML->read( $tempfile ) }, + "case $c->{label}: read $short_tempfile" ) + or diag "ERROR: " . CPAN::Meta::YAML->errstr; + is( $@, '', "no error caught" ); + SKIP : { + skip "no data read", 1 unless $data; + cmp_deeply( $data, [ $c ], + "case $c->{label}: Perl -> File -> Perl roundtrip" ); + } + + # CPAN::Meta::YAML->read_string on UTF-8 decoded data + ok( $data = eval { CPAN::Meta::YAML->read_string( slurp($tempfile, ":utf8") ) }, + "case $c->{label}: read_string on UTF-8 decoded $short_tempfile" ); + is( $@, '', "no error caught" ); + SKIP : { + skip "no data read", 1 unless $data; + cmp_deeply( $data, [ $c ], + "case $c->{label}: Perl -> File -> Decoded -> Perl roundtrip" ); + } + + is( scalar @warnings, 0, "case $c->{label}: no warnings caught" ) + or diag @warnings; + } +} + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/13_perl_smith.t b/cpan/CPAN-Meta-YAML/t/13_perl_smith.t deleted file mode 100644 index b6e4977..0000000 --- a/cpan/CPAN-Meta-YAML/t/13_perl_smith.t +++ /dev/null @@ -1,149 +0,0 @@ -# Testing of common META.yml examples - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(1, 1); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# 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/CPAN-Meta-YAML/t/13_write_string.t b/cpan/CPAN-Meta-YAML/t/13_write_string.t new file mode 100644 index 0000000..48113d0 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/13_write_string.t @@ -0,0 +1,23 @@ +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestUtils; +use TestBridge; + +use CPAN::Meta::YAML (); + +#--------------------------------------------------------------------------# +# Generally, write_string can be tested with .tml files in t/tml-local/* +# +# This file is for error tests or conditions that can't be easily tested +# via .tml +#--------------------------------------------------------------------------# + +subtest 'write_string as class method' => sub { + my $got = eval { CPAN::Meta::YAML->write_string }; + is( $@, '', "write_string lives" ); + is( $got, '', "returns empty string" ); +}; + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/14_yaml_org.t b/cpan/CPAN-Meta-YAML/t/14_yaml_org.t deleted file mode 100644 index 18b5eb5..0000000 --- a/cpan/CPAN-Meta-YAML/t/14_yaml_org.t +++ /dev/null @@ -1,63 +0,0 @@ -# Testing of common META.yml examples - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(1, 1); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# 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/CPAN-Meta-YAML/t/15_multibyte.t b/cpan/CPAN-Meta-YAML/t/15_multibyte.t deleted file mode 100644 index 0798084..0000000 --- a/cpan/CPAN-Meta-YAML/t/15_multibyte.t +++ /dev/null @@ -1,52 +0,0 @@ -# Testing of META.yml containing AVAR's name - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(0, 1, 6); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# 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 { CPAN::Meta::YAML->read_string( $yaml_copy ); }; -is( $@, '', "$name: CPAN::Meta::YAML parses without error" ); -is( $yaml_copy, $sample, "$name: CPAN::Meta::YAML does not modify the input string" ); -SKIP: { - skip( "Shortcutting after failure", 2 ) if $@; - isa_ok( $yaml, 'CPAN::Meta::YAML' ); - is_deeply( $yaml->[0]->{build_requires}, { - 'Config' => 0, - 'Test::More' => 0, - 'XSLoader' => 0, - }, 'build_requires ok' ); -} - -SKIP: { - unless ( CPAN::Meta::YAML::HAVE_UTF8() ) { - skip("no utf8 support", 2 ); - } - eval { utf8::is_utf8('') }; - if ( $@ ) { - skip("no is_utf8 to test with until 5.8.1", 2); - } - ok( utf8::is_utf8($yaml->[0]->{author}), "utf8 decoded" ); - is( length($yaml->[0]->{author}), 39, "utf8 decoded as characters" ); -} diff --git a/cpan/CPAN-Meta-YAML/t/16_nullrefs.t b/cpan/CPAN-Meta-YAML/t/16_nullrefs.t deleted file mode 100644 index 36bd730..0000000 --- a/cpan/CPAN-Meta-YAML/t/16_nullrefs.t +++ /dev/null @@ -1,30 +0,0 @@ -# Testing for null references - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(1); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# Example Empty References - -yaml_ok( - <<'END_YAML', ---- [] ---- {} -END_YAML - [ [], {} ], - 'Empty references', -); diff --git a/cpan/CPAN-Meta-YAML/t/17_toolbar.t b/cpan/CPAN-Meta-YAML/t/17_toolbar.t deleted file mode 100644 index 31ad6bc..0000000 --- a/cpan/CPAN-Meta-YAML/t/17_toolbar.t +++ /dev/null @@ -1,50 +0,0 @@ -# Testing of a known-bad file from an editor - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -# use Test::More skip_all => 'Temporarily ignoring failing test'; -use Test::More tests(1, 1); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# 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/CPAN-Meta-YAML/t/18_tap.t b/cpan/CPAN-Meta-YAML/t/18_tap.t deleted file mode 100644 index 9c86748..0000000 --- a/cpan/CPAN-Meta-YAML/t/18_tap.t +++ /dev/null @@ -1,80 +0,0 @@ -# Testing relating to functionality in the Test Anything Protocol - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(5, 0, 0); -use CPAN::Meta::YAML (); - - - - - -##################################################################### -# 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/CPAN-Meta-YAML/t/19_errors.t b/cpan/CPAN-Meta-YAML/t/19_errors.t deleted file mode 100644 index cac7714..0000000 --- a/cpan/CPAN-Meta-YAML/t/19_errors.t +++ /dev/null @@ -1,73 +0,0 @@ -# Testing documents that should fail - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests => 20; -use CPAN::Meta::YAML (); - -my $FEATURE = 'does not support a feature'; -my $PLAIN = 'illegal characters in plain scalar'; - - - - - -##################################################################### -# Syntactic Errors - -yaml_error( <<'END_YAML', $FEATURE ); -- 'Multiline -quote' -END_YAML - -yaml_error( <<'END_YAML', $FEATURE ); -- "Multiline -quote" -END_YAML - -yaml_error( <<'END_YAML', $FEATURE ); ---- -version: !!perl/hash:version - original: v2.0.2 - qv: 1 - version: - - 2 - - 0 - - 2 -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -- - 2 -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -foo: - -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -foo: @INC -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -foo: %INC -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -foo: bar: -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -foo: bar: baz -END_YAML - -yaml_error( <<'END_YAML', $PLAIN ); -foo: `perl -V` -END_YAML diff --git a/cpan/CPAN-Meta-YAML/t/20_subclass.t b/cpan/CPAN-Meta-YAML/t/20_subclass.t index 97ee993..9935ca9 100644 --- a/cpan/CPAN-Meta-YAML/t/20_subclass.t +++ b/cpan/CPAN-Meta-YAML/t/20_subclass.t @@ -1,18 +1,11 @@ # Testing documents that should fail - use strict; use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} +use lib 't/lib/'; +use Test::More 0.99; +use TestUtils; use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests => 1; - - @@ -29,14 +22,18 @@ SCOPE: { @ISA = 'CPAN::Meta::YAML'; } - sub _write_scalar { + # XXX-INGY subclasses should not use private methods… or if they + # do they should expect method name changes. + # sub _write_scalar { + + sub _dump_scalar { my $self = shift; my $string = shift; - my $indent = shift; - if ( defined $indent ) { - return "'$indent'"; + my $is_key = shift; + if ( defined $is_key ) { + return scalar reverse $string; } else { - return 'undef'; + return $string; } } @@ -53,4 +50,6 @@ SCOPE: { my $object = Foo->new( { foo => 'bar' } ); -is( $object->write_string, "---\nfoo: '1'\n", 'Subclassing works' ); +is( $object->write_string, "---\noof: bar\n", 'Subclassing works' ); + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/21_bom.t b/cpan/CPAN-Meta-YAML/t/21_bom.t deleted file mode 100644 index 4765fa6..0000000 --- a/cpan/CPAN-Meta-YAML/t/21_bom.t +++ /dev/null @@ -1,34 +0,0 @@ -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(0, 1, 4); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# Testing that Perl::Smith config files work - -my $sample_file = catfile( 't', 'data', '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 { CPAN::Meta::YAML->read_string( $yaml_copy ); }; -is( $@, '', "$name: CPAN::Meta::YAML parses without error" ); -is( $yaml_copy, $sample, "$name: CPAN::Meta::YAML does not modify the input string" ); -SKIP: { - skip( "Shortcutting after failure", 2 ) if $@; - is( $yaml, undef, "file not parsed" ); - is( CPAN::Meta::YAML->errstr, "Stream has a non UTF-8 BOM", "correct error" ); -} diff --git a/cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t b/cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t new file mode 100644 index 0000000..e6a69d3 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t @@ -0,0 +1,59 @@ +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestBridge; +use File::Temp qw(tempfile); + +#--------------------------------------------------------------------------# +# This file test that the YAML.pm compatible Dump/Load/DumpFile/LoadFile +# work as documented +#--------------------------------------------------------------------------# + +use CPAN::Meta::YAML; + +{ + my $scalar = 'this is a string'; + my $arrayref = [ 1 .. 5 ]; + my $hashref = { alpha => 'beta', gamma => 'delta' }; + + my $yamldump = CPAN::Meta::YAML::Dump( $scalar, $arrayref, $hashref ); + my @yamldocsloaded = CPAN::Meta::YAML::Load($yamldump); + cmp_deeply( + [ @yamldocsloaded ], + [ $scalar, $arrayref, $hashref ], + "Functional interface: Dump to Load roundtrip works as expected" + ); +} + +{ + my $scalar = 'this is a string'; + my $arrayref = [ 1 .. 5 ]; + my $hashref = { alpha => 'beta', gamma => 'delta' }; + + my ($fh, $filename) = tempfile; + close $fh; # or LOCK_SH will hang + + my $rv = CPAN::Meta::YAML::DumpFile( + $filename, $scalar, $arrayref, $hashref); + ok($rv, "DumpFile returned true value"); + + my @yamldocsloaded = CPAN::Meta::YAML::LoadFile($filename); + cmp_deeply( + [ @yamldocsloaded ], + [ $scalar, $arrayref, $hashref ], + "Functional interface: DumpFile to LoadFile roundtrip works as expected" + ); +} + +{ + my $str = "This is not real YAML"; + my @yamldocsloaded; + eval { @yamldocsloaded = CPAN::Meta::YAML::Load("$str\n"); }; + error_like( + qr/CPAN::Meta::YAML failed to classify line '$str'/, + "Correctly failed to load non-YAML string" + ); +} + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/22_comments.t b/cpan/CPAN-Meta-YAML/t/22_comments.t deleted file mode 100644 index 1f0f402..0000000 --- a/cpan/CPAN-Meta-YAML/t/22_comments.t +++ /dev/null @@ -1,111 +0,0 @@ -# Testing of inline comments. These comments can be quite useful in config -# files and people will expect them to work. - -use strict; -use warnings; - -BEGIN { - $| = 1; - $^W = 1; -} - -use File::Spec::Functions ':ALL'; -use t::lib::Test; -use Test::More tests(2); -use CPAN::Meta::YAML; - - - - - -##################################################################### -# Main Tests - -yaml_ok( - <<'END_YAML', ---- -a: b#content -c: d #comment -e: -- f #comment -- g# content -h: 'single' # comment -h2: 'single # content' # comment -i: "double" # comment -i2: "double # content" # comment -j: | # comment - literal # content - block # content -k: {} # comment -l: [] # comment -m: # comment - n: o -END_YAML - [ - { - a => 'b#content', - c => 'd', - e => [ - 'f', - 'g# content', - ], - h => 'single', - h2 => 'single # content', - i => 'double', - i2 => 'double # content', - j => "literal # content\nblock # content\n", - k => {}, - l => [], - m => { - n => 'o', - }, - }, - ], - 'Properly ignore comments', - noyamlpm => 1, -); - -# Repeat, with otherwise illegal characters in the comments -yaml_ok( - <<'END_YAML', ---- -a: b#content -c: d #comment '"!&@%` -e: -- f #comment '"!&@%` -- g# content -h: 'single' # comment '"!&@%` -h2: 'single # content' # comment '"!&@%` -i: "double" # comment '"!&@%` -i2: "double # content" # comment '"!&@%` -j: | # comment '"!&@%` - literal # content - block # content -k: {} # comment '"!&@%` -l: [] # comment '"!&@%` -m: # comment '"!&@%` - n: o -END_YAML - [ - { - a => 'b#content', - c => 'd', - e => [ - 'f', - 'g# content', - ], - h => 'single', - h2 => 'single # content', - i => 'double', - i2 => 'double # content', - j => "literal # content\nblock # content\n", - k => {}, - l => [], - m => { - n => 'o', - }, - }, - ], - 'Properly ignore comments (with otherwise illegal characters)', - noyamlpm => 1, -); diff --git a/cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t b/cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t new file mode 100644 index 0000000..1c56c38 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t @@ -0,0 +1,33 @@ +# Run the appropriate tests from https://github.com/ingydotnet/yaml-spec-tml +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestBridge; +use TestUtils; + +my $JSON = json_class() + or Test::More::plan skip_all => "no JSON or JSON::PP"; + +# Each spec test will need a different bridge and arguments: +my @spec_tests = ( + ['t/tml-spec/basic-data.tml', 'test_yaml_json', $JSON], + # This test is currently failing massively. We use LAST to only run what is + # covered so far. + ['t/tml-spec/unicode.tml', 'test_code_point'], +); + +for my $test (@spec_tests) { + my ($file, $bridge, @args) = @$test; + my $code = sub { + my ($file, $blocks) = @_; + subtest "YAML Spec Test; file: $file" => sub { + plan tests => scalar @$blocks; + my $func = \&{$bridge}; + $func->($_) for @$blocks; + }; + }; + run_testml_file($file, $code, @args); +} + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/31_local_tml.t b/cpan/CPAN-Meta-YAML/t/31_local_tml.t new file mode 100644 index 0000000..0e62685 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/31_local_tml.t @@ -0,0 +1,20 @@ +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestBridge; +use IO::Dir; +use File::Spec::Functions qw/catdir/; + +my $tml_local = "t/tml-local"; + +for my $dir ( IO::Dir->new($tml_local)->read ) { + next if $dir =~ /^\./; + my $fn = "test_$dir"; + $fn =~ s/-/_/g; + my $bridge = TestBridge->can($fn); + next unless $bridge; + run_all_testml_files( "TestML", catdir($tml_local, $dir), $bridge ); +} + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/32_world_tml.t b/cpan/CPAN-Meta-YAML/t/32_world_tml.t new file mode 100644 index 0000000..5dcca9a --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/32_world_tml.t @@ -0,0 +1,11 @@ +use strict; +use warnings; +use lib 't/lib/'; +use Test::More 0.99; +use TestBridge; + +run_all_testml_files( + "Real-world examples", 't/tml-world', \&test_yaml_roundtrip +); + +done_testing; diff --git a/cpan/CPAN-Meta-YAML/t/README.md b/cpan/CPAN-Meta-YAML/t/README.md new file mode 100644 index 0000000..4eece3c --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/README.md @@ -0,0 +1,157 @@ +# Guide to CPAN::Meta::YAML testing + +CPAN::Meta::YAML tests use several components: + +* .t files +* Test libraries in t/lib +* YAML data files in t/data +* TestML data files in t/tml-* + +The use of each is described below. + +## .t files + +The .t files are standard Perl test files. They may use one or more of the +test libraries in t/lib. They may only use modules available in Perl 5.8.1 or +later (and not subsequently deprecated), but they may use newer non-XS versions +of those modules as necessary to avoid known bugs. + +Some .t files have complete inputs/outputs for their tests. Others iterate +over .tml files in the t/tml-* directories. + +A .t file should load Test::More and either use `done_testing` or provide a +test plan. If tests iterate over external data, the use of `done_testing` is +preferred so that external data can be updated with new tests without needing +to also update a test plan. + +Currently, the convention is to name .t files matching the pattern +qr/^\d\d_\w+\.t$/ + +## Test libraries + +There are currently three test libraries in t/lib. A .t file that uses one or +more of them should put `use lib 't/lib';` at the top of the .t file. Test +libraries can assume that if they were loaded, that 't/lib' is already in @INC. + +The test libraries are: + +* TestML::Tiny +* TestBridge +* TestUtils + +The TestML::Tiny library contains functions for parsing and executing TestML +tests with callbacks. TestML is a data-driven testing language; TestML::Tiny +implements a small subset of its features. See the section on TestML, below, +for an example. Generally, bugs should be patched upstream on CPAN and then +a new Test::Tiny CPAN release can be copied here and pod-stripped. + +The TestBridge library contains testing functions for use in .t files or to +be passed to TestML::Tiny functions as callbacks. Test functions should not +include `done_testing`. They should use `subtest` for any repetitive testing +that loops over test cases. Callback should check for the expected test +points (see below) and skip a TML block if those points are not available. + +The TestUtils library contains utility functions. Testing functions should +not be added here (i.e. nothing that uses Test::More). + +## YAML data files in t/data + +Files in the t/data directory are intended to test how YAML files are loaded +and decoded and typically need some custom test code to load the file and see +if the result matches expectations (successful or not). + +If a real-world YAML file cannot be loaded due to character set encoding +issues, it should be placed in this directory for testing. If a real-world +YAML file is ASCII or UTF-8 encoded, can be decoded successfully, but has +problems in parsing, it should be reduced to the smallest sample of YAML that +demonstrates the parsing problem and added to a .tml file for testing. See +below for more details. + +## TestML quick intro + +TestML data files are UTF-8 encoded files with a .tml suffix that contain one +or more test "blocks". Each block has a test label, and one or more 'test +points', usually representing input and expected output, and possibly +additional annotations or flags. + +Here is an example of a .tml file with a single block: + + # This is a TestML block: (this line is a comment) + === This is the test label + Lines until the first point are ignored + + # This is a "block" style point. All non-comment lines until next point + # are the data for the 'yaml' point. The data ends with newline, and + # trailing blank lines are trimmed. + --- yaml + --- + foo: bar + # a comment + \# not a comment + + # This is the second point; "inline" style. The data after the colon goes + # to end of line. Leading/trailing whitespace is trimmed. + --- perl: [ { foo => 'bar' } ] + + # This is a point whose value is the empty string + --- a_flag + + # This is the next block: + === Another test case + +The test label is provided on a line beginning with qr/^===/. Test "points" +are provided in sections beginning with qr/^--- +\w+/. All flush-left comment +lines are stripped. Lines beginning with '\' are escaped. + +Different tests expect different test points in a .tml file, based on the +specific test callback being used. + +Many .tml files have the points 'yaml' and 'perl' as in the example above. The +'yaml' point is a YAML document and the 'perl' point is a Data::Dumper Perl +data structure. The test checks whether the YAML parses into a data structure +identical to the Perl one. The 'a_flag' point is an annotation that the +testing callback can use to affect the run of a given test. + +The semantics of points (including annotations) is specific to the callback +functions used to process test blocks. + +# TestML data files in t/tml-* + +TestML data files are organized into three directories: + +* t/tml-spec — these test files are provided by the YAML spec maintainers and +should not be modified except to skip testing features that CPAN::Meta::YAML does not +support + +* t/tml-local — these test files are CPAN::Meta::YAML's own unit tests; generally new +test cases for coverage or correctness should be added here; these are +broken into subdirectories, described later + +* t/tml-world — these test files represent "real world" YAML and their +corresponding expected Perl output + +Generally, if a "real world" problem can be isolated to a particular snippet of +YAML, it's best to add it to a t/tml-local file (or create a new one). If the +problem can only be seen in the context of the entire YAML document, include it +in t/tml-world. If the problem relates to encoding, it should be put into +t/data instead. + +# t/tml-local subdirectories + +The subdirectories in t/tml-local define four types of tests: + +* perl-to-yaml: test that perl data dump to an expected YAML string + +* yaml-roundtrip: test that a YAML string loads to an expected perl data + structure; also tests that the perl data can be dumped and loaded back; + +* dump-error: test that certain perl data trigger expected errors + +* load-error: test that certain YAML strings trigger expected errors + +All .tml files in a t/tml-local directory must have the TestML +test points required by the corresponding test functions defined +in the TestBridge library. + +Generally, files should be grouped by data type or feature so that +related tests are kept together. diff --git a/cpan/CPAN-Meta-YAML/t/data/HTML-WebDAO.yml b/cpan/CPAN-Meta-YAML/t/data/HTML-WebDAO.yml deleted file mode 100644 index c5262ff..0000000 --- a/cpan/CPAN-Meta-YAML/t/data/HTML-WebDAO.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- #YAML:1.0 -name: HTML-WebDAO -version: 0.04 -author: - - |- - Zahatski Aliaksandr, Ezagap@users.sourceforge.netE -abstract: Perl extension for create complex web application -license: perl diff --git a/cpan/CPAN-Meta-YAML/t/data/Spreadsheet-Read.yml b/cpan/CPAN-Meta-YAML/t/data/Spreadsheet-Read.yml deleted file mode 100644 index f402ab8..0000000 --- a/cpan/CPAN-Meta-YAML/t/data/Spreadsheet-Read.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- #YAML:1.1 -name: Read -version: VERSION -abstract: Meta-Wrapper for reading spreadsheet data -license: perl -author: - - H.Merijn Brand -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/CPAN-Meta-YAML/t/data/Template-Provider-Unicode-Japanese.yml b/cpan/CPAN-Meta-YAML/t/data/Template-Provider-Unicode-Japanese.yml deleted file mode 100644 index 66dae89..0000000 --- a/cpan/CPAN-Meta-YAML/t/data/Template-Provider-Unicode-Japanese.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -abstract: Decode all templates by Unicode::Japanese -author: Hironori Yoshida C<< >> -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/CPAN-Meta-YAML/t/data/one.yml b/cpan/CPAN-Meta-YAML/t/data/ascii.yml similarity index 100% rename from cpan/CPAN-Meta-YAML/t/data/one.yml rename to cpan/CPAN-Meta-YAML/t/data/ascii.yml diff --git a/cpan/CPAN-Meta-YAML/t/data/sample.yml b/cpan/CPAN-Meta-YAML/t/data/latin1.yml similarity index 96% rename from cpan/CPAN-Meta-YAML/t/data/sample.yml rename to cpan/CPAN-Meta-YAML/t/data/latin1.yml index bea4f8a..02bb349 100644 --- a/cpan/CPAN-Meta-YAML/t/data/sample.yml +++ b/cpan/CPAN-Meta-YAML/t/data/latin1.yml @@ -3,7 +3,7 @@ invoice: 34843 date : 2001-01-23 bill-to: given : Chris - family : Dumars + family : Dumàrs address: lines: | 458 Walkman Dr. diff --git a/cpan/CPAN-Meta-YAML/t/data/multibyte.yml b/cpan/CPAN-Meta-YAML/t/data/multibyte.yml index 91f3459..10f04f6 100644 --- a/cpan/CPAN-Meta-YAML/t/data/multibyte.yml +++ b/cpan/CPAN-Meta-YAML/t/data/multibyte.yml @@ -1,22 +1,2 @@ --- -abstract: Perl-compatible regular expression engine author: "Ævar Arnfjörð Bjarmason " -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/CPAN-Meta-YAML/t/data/toolbar.yml b/cpan/CPAN-Meta-YAML/t/data/toolbar.yml deleted file mode 100644 index 5219248..0000000 --- a/cpan/CPAN-Meta-YAML/t/data/toolbar.yml +++ /dev/null @@ -1,16 +0,0 @@ -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/CPAN-Meta-YAML/t/data/two.yml b/cpan/CPAN-Meta-YAML/t/data/two.yml deleted file mode 100644 index 9a2b98d..0000000 --- a/cpan/CPAN-Meta-YAML/t/data/two.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -- foo ---- -- bar diff --git a/cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml b/cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml new file mode 100644 index 0000000..40f5bcd --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml @@ -0,0 +1,2 @@ +--- +author: "Ævar Arnfjörð Bjarmason " diff --git a/cpan/CPAN-Meta-YAML/t/data/vanilla.yml b/cpan/CPAN-Meta-YAML/t/data/vanilla.yml deleted file mode 100644 index dc757e1..0000000 --- a/cpan/CPAN-Meta-YAML/t/data/vanilla.yml +++ /dev/null @@ -1,98 +0,0 @@ -# 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/CPAN-Meta-YAML/t/lib/Test.pm b/cpan/CPAN-Meta-YAML/t/lib/Test.pm deleted file mode 100644 index 63dae54..0000000 --- a/cpan/CPAN-Meta-YAML/t/lib/Test.pm +++ /dev/null @@ -1,310 +0,0 @@ -package t::lib::Test; - -use strict; -use warnings; - -use Exporter (); -use File::Spec (); -use Test::More (); - -use vars qw{@ISA @EXPORT}; -BEGIN { - @ISA = qw{ Exporter }; - @EXPORT = qw{ - tests yaml_ok yaml_error slurp load_ok - test_data_directory - }; -} - -# Do we have the authorative YAML to test against -eval { - require YAML; - - # This doesn't currently work, but is documented to. - # So if it ever turns up, use it. - $YAML::UseVersion = 1; -}; -my $HAVE_YAMLPM = !! ( - $YAML::VERSION - and - $YAML::VERSION >= 0.66 -); -sub have_yamlpm { $HAVE_YAMLPM } - -# Do we have YAML::Perl to test against? -eval { - require YAML::Perl; -}; -my $HAVE_YAMLPERL = !! ( - $YAML::Perl::VERSION - and - $YAML::Perl::VERSION >= 0.02 -); -sub have_yamlperl { $HAVE_YAMLPERL } - -# Do we have YAML::Syck to test against? -eval { - require YAML::Syck; -}; -my $HAVE_SYCK = !! ( - $YAML::Syck::VERSION - and - $YAML::Syck::VERSION >= 1.05 -); -sub have_syck { $HAVE_SYCK } - -# Do we have YAML::XS to test against? -eval { - require YAML::XS; -}; -my $HAVE_XS = !! ( - $YAML::XS::VERSION - and - $YAML::XS::VERSION >= 0.29 -); -sub have_xs{ $HAVE_XS } - -# 22 tests per call to yaml_ok -# 4 tests per call to load_ok -sub tests { - return ( tests => count(@_) ); -} - -sub test_data_directory { - return File::Spec->catdir( 't', 'data' ); -} - -sub count { - my $yaml_ok = shift || 0; - my $load_ok = shift || 0; - my $single = shift || 0; - my $count = $yaml_ok * 38 + $load_ok * 4 + $single; - return $count; -} - -sub yaml_ok { - my $string = shift; - my $object = shift; - my $name = shift || 'unnamed'; - my %options = ( @_ ); - bless $object, 'CPAN::Meta::YAML'; - - # If YAML itself is available, test with it - SKIP: { - unless ( $HAVE_YAMLPM ) { - Test::More::skip( "Skipping YAML.pm, not available for testing", 7 ); - } - if ( $options{noyamlpm} ) { - Test::More::skip( "Skipping YAML.pm for known-broken feature", 7 ); - } - - # Test writing with YAML.pm - my $yamlpm_out = eval { YAML::Dump( @$object ) }; - Test::More::is( $@, '', "$name: YAML.pm saves without error" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 4 ) if $@; - Test::More::ok( - !!(defined $yamlpm_out and ! ref $yamlpm_out), - "$name: YAML.pm serializes correctly", - ); - my @yamlpm_round = eval { YAML::Load( $yamlpm_out ) }; - Test::More::is( $@, '', "$name: YAML.pm round-trips without error" ); - Test::More::skip( "Shortcutting after failure", 2 ) if $@; - my $round = bless [ @yamlpm_round ], 'CPAN::Meta::YAML'; - Test::More::is_deeply( $round, $object, "$name: YAML.pm round-trips correctly" ); - } - - # Test reading with YAML.pm - my $yamlpm_copy = $string; - my @yamlpm_in = eval { YAML::Load( $yamlpm_copy ) }; - Test::More::is( $@, '', "$name: YAML.pm loads without error" ); - Test::More::is( $yamlpm_copy, $string, "$name: YAML.pm does not modify the input string" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 1 ) if $@; - Test::More::is_deeply( \@yamlpm_in, $object, "$name: YAML.pm parses correctly" ); - } - } - - # If YAML::Syck itself is available, test with it - SKIP: { - unless ( $HAVE_SYCK ) { - Test::More::skip( "Skipping YAML::Syck, not available for testing", 7 ); - } - if ( $options{nosyck} ) { - Test::More::skip( "Skipping YAML::Syck for known-broken feature", 7 ); - } - unless ( @$object == 1 ) { - Test::More::skip( "Skipping YAML::Syck for unsupported feature", 7 ); - } - - # Test writing with YAML::Syck - my $syck_out = eval { YAML::Syck::Dump( @$object ) }; - Test::More::is( $@, '', "$name: YAML::Syck saves without error" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 4 ) if $@; - Test::More::ok( - !!(defined $syck_out and ! ref $syck_out), - "$name: YAML::Syck serializes correctly", - ); - my @syck_round = eval { YAML::Syck::Load( $syck_out ) }; - Test::More::is( $@, '', "$name: YAML::Syck round-trips without error" ); - Test::More::skip( "Shortcutting after failure", 2 ) if $@; - my $round = bless [ @syck_round ], 'CPAN::Meta::YAML'; - Test::More::is_deeply( $round, $object, "$name: YAML::Syck round-trips correctly" ); - } - - # Test reading with YAML::Syck - my $syck_copy = $string; - my @syck_in = eval { YAML::Syck::Load( $syck_copy ) }; - Test::More::is( $@, '', "$name: YAML::Syck loads without error" ); - Test::More::is( $syck_copy, $string, "$name: YAML::Syck does not modify the input string" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 1 ) if $@; - Test::More::is_deeply( \@syck_in, $object, "$name: YAML::Syck parses correctly" ); - } - } - - # If YAML::XS itself is available, test with it - SKIP: { - unless ( $HAVE_XS ) { - Test::More::skip( "Skipping YAML::XS, not available for testing", 7 ); - } - if ( $options{noxs} ) { - Test::More::skip( "Skipping YAML::XS for known-broken feature", 7 ); - } - - # Test writing with YAML::XS - my $xs_out = eval { YAML::XS::Dump( @$object ) }; - Test::More::is( $@, '', "$name: YAML::XS saves without error" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 4 ) if $@; - Test::More::ok( - !!(defined $xs_out and ! ref $xs_out), - "$name: YAML::XS serializes correctly", - ); - my @xs_round = eval { YAML::XS::Load( $xs_out ) }; - Test::More::is( $@, '', "$name: YAML::XS round-trips without error" ); - Test::More::skip( "Shortcutting after failure", 2 ) if $@; - my $round = bless [ @xs_round ], 'CPAN::Meta::YAML'; - Test::More::is_deeply( $round, $object, "$name: YAML::XS round-trips correctly" ); - } - - # Test reading with YAML::XS - my $xs_copy = $string; - my @xs_in = eval { YAML::XS::Load( $xs_copy ) }; - Test::More::is( $@, '', "$name: YAML::XS loads without error" ); - Test::More::is( $xs_copy, $string, "$name: YAML::XS does not modify the input string" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 1 ) if $@; - Test::More::is_deeply( \@xs_in, $object, "$name: YAML::XS parses correctly" ); - } - } - - # If YAML::Perl is available, test with it - SKIP: { - unless ( $HAVE_YAMLPERL ) { - Test::More::skip( "Skipping YAML::Perl, not available for testing", 7 ); - } - if ( $options{noyamlperl} ) { - Test::More::skip( "Skipping YAML::Perl for known-broken feature", 7 ); - } - - # Test writing with YAML.pm - my $yamlperl_out = eval { YAML::Perl::Dump( @$object ) }; - Test::More::is( $@, '', "$name: YAML::Perl saves without error" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 4 ) if $@; - Test::More::ok( - !!(defined $yamlperl_out and ! ref $yamlperl_out), - "$name: YAML::Perl serializes correctly", - ); - my @yamlperl_round = eval { YAML::Perl::Load( $yamlperl_out ) }; - Test::More::is( $@, '', "$name: YAML::Perl round-trips without error" ); - Test::More::skip( "Shortcutting after failure", 2 ) if $@; - my $round = bless [ @yamlperl_round ], 'CPAN::Meta::YAML'; - Test::More::is_deeply( $round, $object, "$name: YAML::Perl round-trips correctly" ); - } - - # Test reading with YAML::Perl - my $yamlperl_copy = $string; - my @yamlperl_in = eval { YAML::Perl::Load( $yamlperl_copy ) }; - Test::More::is( $@, '', "$name: YAML::Perl loads without error" ); - Test::More::is( $yamlperl_copy, $string, "$name: YAML::Perl does not modify the input string" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 1 ) if $@; - Test::More::is_deeply( \@yamlperl_in, $object, "$name: YAML::Perl parses correctly" ); - } - } - - # Does the string parse to the structure - my $yaml_copy = $string; - my $yaml = eval { CPAN::Meta::YAML->read_string( $yaml_copy ); }; - Test::More::is( $@, '', "$name: CPAN::Meta::YAML parses without error" ); - Test::More::is( $yaml_copy, $string, "$name: CPAN::Meta::YAML does not modify the input string" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 2 ) if $@; - Test::More::isa_ok( $yaml, 'CPAN::Meta::YAML' ); - Test::More::is_deeply( $yaml, $object, "$name: CPAN::Meta::YAML parses correctly" ); - } - - # Does the structure serialize to the string. - # We can't test this by direct comparison, because any - # whitespace or comments would be lost. - # So instead we parse back in. - my $output = eval { $object->write_string }; - Test::More::is( $@, '', "$name: CPAN::Meta::YAML serializes without error" ); - SKIP: { - Test::More::skip( "Shortcutting after failure", 5 ) if $@; - Test::More::ok( - !!(defined $output and ! ref $output), - "$name: CPAN::Meta::YAML serializes correctly", - ); - my $roundtrip = eval { CPAN::Meta::YAML->read_string( $output ) }; - Test::More::is( $@, '', "$name: CPAN::Meta::YAML round-trips without error" ); - Test::More::skip( "Shortcutting after failure", 2 ) if $@; - Test::More::isa_ok( $roundtrip, 'CPAN::Meta::YAML' ); - Test::More::is_deeply( $roundtrip, $object, "$name: CPAN::Meta::YAML round-trips correctly" ); - - # Testing the serialization - Test::More::skip( "Shortcutting perfect serialization tests", 1 ) unless $options{serializes}; - Test::More::is( $output, $string, 'Serializes ok' ); - } - - # Return true as a convenience - return 1; -} - -sub yaml_error { - my $string = shift; - my $like = shift; - my $yaml = CPAN::Meta::YAML->read_string( $string ); - Test::More::is( $yaml, undef, '->read_string returns undef' ); - Test::More::ok( CPAN::Meta::YAML->errstr =~ /$like/, "Got expected error" ); - # NOTE: like() gives better diagnostics (but requires 5.005) - # Test::More::like( $@, qr/$_[0]/, "CPAN::Meta::YAML throws expected error" ); -} - -sub slurp { - my $file = shift; - local $/ = undef; - open( FILE, " $file" ) or die "open($file) failed: $!"; - binmode( FILE, $_[0] ) if @_ > 0 && $] > 5.006; - # binmode(FILE); # disable perl's BOM interpretation - my $source = ; - 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" ); - 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; diff --git a/cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm b/cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm new file mode 100644 index 0000000..56c3a38 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm @@ -0,0 +1,351 @@ +package TestBridge; + +use strict; +use warnings; + +use Test::More 0.99; +use TestUtils; +use TestML::Tiny; + +BEGIN { + $| = 1; + binmode(Test::More->builder->$_, ":utf8") + for qw/output failure_output todo_output/; +} + +use CPAN::Meta::YAML; + +use Exporter (); +our @ISA = qw{ Exporter }; +our @EXPORT = qw{ + run_all_testml_files + run_testml_file + test_yaml_roundtrip + test_perl_to_yaml + test_dump_error + test_load_error + test_yaml_json + test_code_point + error_like + cmp_deeply + _testml_has_points +}; + +# regular expressions for checking error messages; incomplete, but more +# can be added as more error messages get test coverage +my %ERROR = ( + E_CIRCULAR => qr{\QCPAN::Meta::YAML does not support circular references}, + E_FEATURE => qr{\QCPAN::Meta::YAML does not support a feature}, + E_PLAIN => qr{\QCPAN::Meta::YAML found illegal characters in plain scalar}, + E_CLASSIFY => qr{\QCPAN::Meta::YAML failed to classify the line}, +); + +# use XXX -with => 'YAML::XS'; + +#--------------------------------------------------------------------------# +# run_all_testml_files +# +# Iterate over all .tml files in a directory using a particular test bridge +# code # reference. Each file is wrapped in a subtest with a test plan +# equal to the number of blocks. +#--------------------------------------------------------------------------# + +sub run_all_testml_files { + my ($label, $dir, $bridge, @args) = @_; + + my $code = sub { + my ($file, $blocks) = @_; + subtest "$label: $file" => sub { + plan tests => scalar @$blocks; + $bridge->($_, @args) for @$blocks; + }; + }; + + my @files = find_tml_files($dir); + + run_testml_file($_, $code) for sort @files; +} + +sub run_testml_file { + my ($file, $code) = @_; + + my $blocks = TestML::Tiny->new( + testml => $file, + version => '0.1.0', + )->{function}{data}; + + $code->($file, $blocks); +} + +sub _testml_has_points { + my ($block, @points) = @_; + my @values; + for my $point (@points) { + defined $block->{$point} or return; + push @values, $block->{$point}; + } + push @values, $block->{Label}; + return @values; +} + +#--------------------------------------------------------------------------# +# test_yaml_roundtrip +# +# two blocks: perl, yaml +# +# Tests that a YAML string loads to the expected perl data. Also, tests +# roundtripping from perl->YAML->perl. +# +# We can't compare the YAML for roundtripping because CPAN::Meta::YAML doesn't +# preserve order and comments. Therefore, all we can test is that given input +# YAML we can produce output YAML that produces the same Perl data as the +# input. +# +# The perl must be an array reference of data to serialize: +# +# [ $thing1, $thing2, ... ] +# +# However, if a test point called 'serializes' exists, the output YAML is +# expected to match the input YAML and will be checked for equality. +#--------------------------------------------------------------------------# + +sub test_yaml_roundtrip { + my ($block) = @_; + + my ($yaml, $perl, $label) = + _testml_has_points($block, qw(yaml perl)) or return; + + my %options = (); + for (qw(serializes)) { + if (defined($block->{$_})) { + $options{$_} = 1; + } + } + + my $expected = eval $perl; die $@ if $@; + bless $expected, 'CPAN::Meta::YAML'; + + subtest $label, sub { + # Does the string parse to the structure + my $yaml_copy = $yaml; + my $got = eval { CPAN::Meta::YAML->read_string( $yaml_copy ); }; + is( $@, '', "CPAN::Meta::YAML parses without error" ); + is( $yaml_copy, $yaml, "CPAN::Meta::YAML does not modify the input string" ); + SKIP: { + skip( "Shortcutting after failure", 2 ) if $@; + isa_ok( $got, 'CPAN::Meta::YAML' ); + cmp_deeply( $got, $expected, "CPAN::Meta::YAML parses correctly" ) + or diag "ERROR: $CPAN::Meta::YAML::errstr\n\nYAML:$yaml"; + } + + # Does the structure serialize to the string. + # We can't test this by direct comparison, because any + # whitespace or comments would be lost. + # So instead we parse back in. + my $output = eval { $expected->write_string }; + is( $@, '', "CPAN::Meta::YAML serializes without error" ); + SKIP: { + skip( "Shortcutting after failure", 5 ) if $@; + ok( + !!(defined $output and ! ref $output), + "CPAN::Meta::YAML serializes to scalar", + ); + my $roundtrip = eval { CPAN::Meta::YAML->read_string( $output ) }; + is( $@, '', "CPAN::Meta::YAML round-trips without error" ); + skip( "Shortcutting after failure", 2 ) if $@; + isa_ok( $roundtrip, 'CPAN::Meta::YAML' ); + cmp_deeply( $roundtrip, $expected, "CPAN::Meta::YAML round-trips correctly" ); + + # Testing the serialization + skip( "Shortcutting perfect serialization tests", 1 ) unless $options{serializes}; + is( $output, $yaml, 'Serializes ok' ); + } + + }; +} + +#--------------------------------------------------------------------------# +# test_perl_to_yaml +# +# two blocks: perl, yaml +# +# Tests that perl references serialize correctly to a specific YAML output +# +# The perl must be an array reference of data to serialize: +# +# [ $thing1, $thing2, ... ] +#--------------------------------------------------------------------------# + +sub test_perl_to_yaml { + my ($block) = @_; + + my ($perl, $yaml, $label) = + _testml_has_points($block, qw(perl yaml)) or return; + + my $input = eval "no strict; $perl"; die $@ if $@; + + subtest $label, sub { + my $result = eval { CPAN::Meta::YAML->new( @$input )->write_string }; + is( $@, '', "write_string lives" ); + is( $result, $yaml, "dumped YAML correct" ); + }; +} + +#--------------------------------------------------------------------------# +# test_dump_error +# +# two blocks: perl, error +# +# Tests that perl references result in an error when dumped +# +# The perl must be an array reference of data to serialize: +# +# [ $thing1, $thing2, ... ] +# +# The error must be a key in the %ERROR hash in this file +#--------------------------------------------------------------------------# + +sub test_dump_error { + my ($block) = @_; + + my ($perl, $error, $label) = + _testml_has_points($block, qw(perl error)) or return; + + my $input = eval "no strict; $perl"; die $@ if $@; + chomp $error; + my $expected = $ERROR{$error}; + + subtest $label, sub { + my $result = eval { CPAN::Meta::YAML->new( @$input )->write_string }; + ok( !$result, "returned false" ); + error_like( $expected, "Got expected error" ); + }; +} + +#--------------------------------------------------------------------------# +# test_load_error +# +# two blocks: yaml, error +# +# Tests that a YAML string results in an error when loaded +# +# The error must be a key in the %ERROR hash in this file +#--------------------------------------------------------------------------# + +sub test_load_error { + my ($block) = @_; + + my ($yaml, $error, $label) = + _testml_has_points($block, qw(yaml error)) or return; + + chomp $error; + my $expected = $ERROR{$error}; + + subtest $label, sub { + my $result = eval { CPAN::Meta::YAML->read_string( $yaml ) }; + is( $result, undef, 'read_string returns undef' ); + error_like( $expected, "Got expected error" ) + or diag "YAML:\n$yaml"; + }; +} + +#--------------------------------------------------------------------------# +# test_yaml_json +# +# two blocks: yaml, json +# +# Tests that a YAML string can be loaded to Perl and dumped to JSON and +# match an expected JSON output. The expected JSON is loaded and dumped +# to ensure similar JSON dump options. +#--------------------------------------------------------------------------# + +sub test_yaml_json { + my ($block, $json_lib) = @_; + $json_lib ||= do { require JSON::PP; 'JSON::PP' }; + + my ($yaml, $json, $label) = + _testml_has_points($block, qw(yaml json)) or return; + + subtest "$label", sub { + # test YAML Load + my $object = eval { + CPAN::Meta::YAML::Load($yaml); + }; + my $err = $@; + ok !$err, "YAML loads"; + return if $err; + + # test YAML->Perl->JSON + # N.B. round-trip JSON to decode any \uNNNN escapes and get to + # characters + my $want = $json_lib->new->encode( + $json_lib->new->decode($json) + ); + my $got = $json_lib->new->encode($object); + is $got, $want, "Load is accurate"; + }; +} + +#--------------------------------------------------------------------------# +# test_code_point +# +# two blocks: code, yaml +# +# Tests that a Unicode codepoint is correctly dumped to YAML as both +# key and value. +# +# The code test point must be a non-negative integer +# +# The yaml code point is the expected output of { $key => $value } where +# both key and value are the character represented by the codepoint. +#--------------------------------------------------------------------------# + +sub test_code_point { + my ($block) = @_; + + my ($code, $yaml, $label) = + _testml_has_points($block, qw(code yaml)) or return; + + subtest "$label - Unicode map key/value test" => sub { + my $data = { chr($code) => chr($code) }; + my $dump = CPAN::Meta::YAML::Dump($data); + $dump =~ s/^---\n//; + is $dump, $yaml, "Dump key and value of code point char $code"; + + my $yny = CPAN::Meta::YAML::Dump(CPAN::Meta::YAML::Load($yaml)); + $yny =~ s/^---\n//; + is $yny, $yaml, "YAML for code point $code YNY roundtrips"; + + my $nyn = CPAN::Meta::YAML::Load(CPAN::Meta::YAML::Dump($data)); + cmp_deeply( $nyn, $data, "YAML for code point $code NYN roundtrips" ); + } +} + +#--------------------------------------------------------------------------# +# error_like +# +# Test CPAN::Meta::YAML->errstr against a regular expression and clear the +# errstr afterwards +#--------------------------------------------------------------------------# + +sub error_like { + my ($regex, $label) = @_; + $label = "Got expected error" unless defined $label; + local $Test::Builder::Level = $Test::Builder::Level + 1; + my $ok = like( $@, $regex, $label ); + return $ok; +} + +#--------------------------------------------------------------------------# +# cmp_deeply +# +# is_deeply with some better diagnostics +#--------------------------------------------------------------------------# +sub cmp_deeply { + my ($got, $want, $label) = @_; + local $Test::Builder::Level = $Test::Builder::Level + 1; + is_deeply( $got, $want, $label ) + or diag "GOT:\n", explain($got), "\nWANTED:\n", explain($want); +} + +1; diff --git a/cpan/CPAN-Meta-YAML/t/lib/TestML/Tiny.pm b/cpan/CPAN-Meta-YAML/t/lib/TestML/Tiny.pm new file mode 100644 index 0000000..5a3df6f --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/lib/TestML/Tiny.pm @@ -0,0 +1,312 @@ +use 5.008001; use strict; use warnings; +package TestML::Tiny; + +; # original $VERSION removed by Doppelgaenger + +use Carp(); +use Test::More 0.99 (); + +# use XXX; + +sub import { + strict->import; + warnings->import; +} + +sub new { + my $self = bless { @_[1..$#_] }, $_[0]; + my $testml = $self->_get_testml; + my $bridge = $self->_get_bridge; + $self->{runtime} ||= TestML::Tiny::Runtime->new( + bridge => $bridge, + ); + my $compiler = TestML::Tiny::Compiler->new( + $self->{version} ? (version => $self->{version}) : (), + ); + $self->{function} = $compiler->compile($testml); + return $self; +} + +sub run { + my ($self) = @_; + my $runtime = $self->{runtime} || ''; + Carp::croak "Missing or invalid runtime object for TestML::Tiny::run()" + unless defined($runtime) and ref($runtime) eq 'TestML::Tiny::Runtime'; + $runtime->run; +} + +sub _get_testml { + my ($self) = @_; + my $testml = $self->{testml} + or Carp::croak "TestML object requires a testml attribute"; + $testml = $self->_slurp($testml) + if $testml !~ /\n/; + return $testml; +} + +sub _get_bridge { + my ($self) = @_; + my $bridge = $self->{bridge} || 'main'; + return $bridge if ref $bridge; + eval "require $bridge"; + Carp::croak $@ if $@ and $@ !~ /^Can't locate /; + return ( + defined(&{"${bridge}::new"}) + ? $bridge->new + : bless {}, $bridge + ); +} + +sub _slurp { + open my $fh, "<:raw:encoding(UTF-8)", $_[1] + or die "Can't open $_[1] for input"; + local $/; + <$fh>; +} + +#------------------------------------------------------------------------------ + +package TestML::Tiny::Runtime; + +# use XXX; + +sub new { + my $self = $TestML::Tiny::Runtime::Singleton = + bless { @_[1..$#_] }, $_[0]; +}; + +sub run { + Test::More::fail 'not done yet!'; + Test::More::done_testing; +} + +#------------------------------------------------------------------------------ +package TestML::Tiny::Compiler; + +# use XXX; + +my $ID = qr/\w+/; +my $SP = qr/[\ \t]/; +my $LINE = qr/.*$/m; +my $DIRECTIVE = qr/^%($ID)$SP+($LINE)/m; + +sub new { + my $self = bless { @_[1..$#_] }, $_[0]; +} + +sub runtime { + $TestML::Tiny::Runtime::Singleton; +} + +sub compile { + my ($self, $testml) = @_; + my $function = $self->{function} = TestML::Tiny::Function->new; + $self->{testml} = $testml; + $self->preprocess; + my $version = $self->check_version; + my ($code_syntax, $data_syntax) = + @{$self}{qw(code_syntax data_syntax)}; + my $code_method = "compile_code_${code_syntax}_$version"; + Carp::croak "Don't know how to compile TestML '$code_syntax' code" + unless $self->can($code_method); + my $data_method = "compile_data_${data_syntax}_$version"; + Carp::croak "Don't know how to compile TestML '$data_syntax' data" + unless $self->can($data_method); + $function->{statements} = $self->$code_method; + $function->{data} = $self->$data_method; + return $function; +} + +my %directives = ( + code_syntax => 'tiny', + data_syntax => 'testml', + data_marker => '===', + block_marker => '===', + point_marker => '---', +); +sub preprocess { + my ($self) = @_; + + my $version = $self->{version} || undef; + my $testml = $self->{testml}; + my $directives = [ $testml =~ /$DIRECTIVE/gm ]; + $testml =~ s/($DIRECTIVE)/#$1/g; + while (@$directives) { + my ($key, $value) = splice(@$directives, 0, 2); + if ($key eq "TestML") { + $self->check_not_set_and_set($key, $value, 'version'); + } + elsif ($key eq "BlockMarker") { + $self->check_not_set_and_set( + 'BlockMarker', $value, 'block_marker' + ); + ($self->{block_marker} = $value) =~ + s/([\*\^\$\+\?\(\)\.])/\\$1/g; + } + elsif ($key eq "PointMarker") { + $self->check_not_set_and_set( + 'PointMarker', $value, 'point_marker' + ); + ($self->{point_marker} = $value) =~ + s/([\*\^\$\+\?\(\)\.])/\\$1/g; + } + elsif ($key eq "CodeSyntax") { + die "Untested"; + $self->check_not_set_and_set( + 'CodeSyntax', $value, 'code_syntax' + ); + $self->{code_syntax} = $value; + } + elsif ($key eq "DataSyntax") { + die "Untested"; + $self->check_not_set_and_set( + 'DataSyntax', $value, 'data_syntax' + ); + $self->{data_syntax} = $value; + } + else { + Carp::croak "Unknown TestML directive: '%$key'"; + } + } + $self->{data_marker} = $self->{block_marker} + if not($self->{data_marker}) and $self->{block_marker}; + for my $directive (keys %directives) { + $self->{$directive} ||= $directives{$directive}; + } + + ($self->{code}, $self->{data}) = + ($testml =~ /(.*?)(^$self->{data_marker}.*)/msg); + $self->{code} ||= ''; + $self->{data} ||= ''; +} + +sub check_not_set_and_set { + my ($self, $key, $value, $attr) = @_; + if (defined $self->{$attr} and $self->{$attr} ne $value) { + Carp::croak "Can't set TestML '$key' directive to '$value'. " . + "Already set to '$self->{$attr}'"; + } + $self->{$attr} = $value; +} + +sub check_version { + my ($self) = @_; + my $version = $self->{version} || undef; + Carp::croak "TestML syntax version not defined. Cannot continue" + unless defined $version; + Carp::croak "Invalid value for TestML version '$version'. Must be 0.1.0" + unless $version eq '0.1.0'; + $version =~ s/\./_/g; + return $version; +} + +sub compile_code_tiny_0_1_0 { + my ($self) = @_; + my $num = 1; + [ grep { not /(^#|^\s*$)/ } split /\n/, $self->{code} ]; +} + +sub compile_data_testml_0_1_0 { + my ($self) = @_; + + my $lines = [ grep { ! /^#/ } split /\n/, $self->{data} ]; + + my $blocks = []; + my $parse = []; + push @$lines, undef; # sentinel + while (@$lines) { + push @$parse, shift @$lines; + if (!defined($lines->[0]) or + $lines->[0] =~ /^$self->{block_marker}/ + ) { + my $block = $self->_parse_testml_block($parse); + push @$blocks, $block + unless exists $block->{SKIP}; + last if exists $block->{LAST}; + $parse = []; # clear for next parse + } + last if !defined($lines->[0]); + } + + my $only = [ grep { exists $_->{ONLY} } @$blocks ]; + + return @$only ? $only : $blocks; +} + +sub _parse_testml_block { + my ($self, $lines) = @_; + + my ($label) = $lines->[0] =~ /^$self->{block_marker}(?:\s+(.*))?$/; + shift @$lines until not(@$lines) or + $lines->[0] =~ /^$self->{point_marker} +\w+/; + + my $block = $self->_parse_testml_points($lines); + $block->{Label} = $label || ''; + + return $block; +} + +sub _parse_testml_points { + my ($self, $lines) = @_; + + my $block = {}; + + while (@$lines) { + my $line = shift @$lines; + $line =~ /^$self->{point_marker} +(\w+)/ + or die "Invalid TestML line:\n'$line'"; + my $point_name = $1; + die "$block repeats $point_name" + if exists $block->{$point_name}; + $block->{$point_name} = ''; + if ($line =~ /^$self->{point_marker} +(\w+): +(.*?) *$/) { + ($block->{$1} = $2) =~ s/^ *(.*?) *$/$1/; + shift @$lines while @$lines and + $lines->[0] !~ /^$self->{point_marker} +(\w)/; + } + elsif ($line =~ /^$self->{point_marker} +(\w+)$/) { + $point_name = $1; + while ( @$lines ) { + $line = shift @$lines; + if ($line =~ /^$self->{point_marker} \w+/) { + unshift @$lines, $line; + last; + } + $block->{$point_name} .= "$line\n"; + } + $block->{$point_name} =~ s/\n\s*\z/\n/; + $block->{$point_name} =~ s/^\\//gm; + } + else { + die "Invalid TestML line:\n'$line'"; + } + } + return $block; +} + +#------------------------------------------------------------------------------ +package TestML::Tiny::Function; + +sub new { + my $self = bless { + statements => [], + data => [], + namespace => {}, + }, $_[0]; +} + +#------------------------------------------------------------------------------ +package TestML::Tiny::Bridge; + +sub new { + my $self = bless { @_[1..$#_] }, $_[0]; +} + +#------------------------------------------------------------------------------ +package TestML::Tiny::Library::Standard; + +sub new { + my $self = bless { @_[1..$#_] }, $_[0]; +} + +1; diff --git a/cpan/CPAN-Meta-YAML/t/lib/TestUtils.pm b/cpan/CPAN-Meta-YAML/t/lib/TestUtils.pm new file mode 100644 index 0000000..df49933 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/lib/TestUtils.pm @@ -0,0 +1,56 @@ +package TestUtils; + +use strict; +use warnings; + +use Exporter (); +use File::Spec (); +use File::Find (); + +our @ISA = qw{ Exporter }; +our @EXPORT = qw{ + find_tml_files + json_class + slurp + test_data_directory + test_data_file +}; + +sub find_tml_files { + my $dir = shift; + my @files; + File::Find::find( + sub { push @files, $File::Find::name if -f and /\.tml$/ }, + $dir + ); + return @files; +} + +# Prefer JSON to JSON::PP; skip if we don't have at least one +sub json_class { + for (qw/JSON JSON::PP/) { + return $_ if eval "require $_; 1"; + } + return; +} + +sub test_data_directory { + return File::Spec->catdir( 't', 'data' ); +} + +sub test_data_file { + return File::Spec->catfile( test_data_directory(), shift ); +} + +sub slurp { + my $file = shift; + local $/ = undef; + open( FILE, " $file" ) or die "open($file) failed: $!"; + binmode( FILE, $_[0] ) if @_ > 0; + # binmode(FILE); # disable perl's BOM interpretation + my $source = ; + close( FILE ) or die "close($file) failed: $!"; + $source; +} + +1; diff --git a/cpan/CPAN-Meta-YAML/t/tml b/cpan/CPAN-Meta-YAML/t/tml new file mode 100755 index 0000000..4ae95e9 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml @@ -0,0 +1,117 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use lib 'lib', 't/lib/'; +use Test::More 0.99; +use Getopt::Long qw/:config passthrough/; +use List::Util qw/first/; +use TestBridge; +use TestUtils; + +#--------------------------------------------------------------------------# +# Note: This program is both the proxy to select .tml files for 'prove' and the +# test-runner that 'prove' executes. +#--------------------------------------------------------------------------# + +# match path prefix under t/ +my %BRIDGE_MAP = ( + 'tml-local/dump-error' => \&test_dump_error, + 'tml-local/load-error' => \&test_load_error, + 'tml-local/perl-to-yaml' => \&test_perl_to_yaml, + 'tml-local/yaml-roundtrip' => \&test_yaml_roundtrip, + 'tml-spec/basic-data.tml' => \&test_yaml_json, + 'tml-spec/unicode.tml' => \&test_code_point, + 'tml-world' => \&test_yaml_roundtrip, +); + +sub main { + my ($verbose, $run_tests); + GetOptions( + 'run_test' => \$run_tests, + ); + + if ( $run_tests ) { + my $file = shift @ARGV; + exit 0 unless -f $file; + my ($bridge) = first { $file =~ m{^t/\Q$_} } keys %BRIDGE_MAP; + die "No bridge found for $file" unless $bridge; + + run_testml_file( + $file, + sub { + my ($file, $blocks) = @_; + subtest "TestML dev runner: $file" => sub { + plan tests => scalar @$blocks; + $BRIDGE_MAP{$bridge}->($_) for @$blocks; + }; + done_testing; + }, + ); + } + else { + my (@opts, @files, @patterns); + for (@ARGV) { + if ( /^-/ ) { + push @opts, $_; + } + elsif ( -f ) { + push @files, $_; + } + else { + push @patterns, $_; + } + } + + # if we got no files or patterns, treat that as taking anything + @patterns = "." if !@patterns && !@files; + + if (@patterns) { + FILE: for my $file ( find_tml_files('t') ) { + if ( first { $file =~ /$_/ } @patterns ) { + push @files, $file; + } + } + } + + exec( 'prove', @opts, '--exec', "$0 --run_test", @files ) + if @files; + } +} + +main; + +__END__ + +=head1 NAME + +t/tml - run .tml files matching a pattern + +=head1 SYNOPSIS + + t/tml [prove options] [patterns] + +=head1 USAGE + +This program runs F against a set of F<.tml> files using their +corresponding test bridge functions. + +Any arguments beginning with C<-> will be passed through to F. All +other arguments will be used as patterns to select F<.tml> files found anywhere +under the F directory. You can use shell globbing syntax, and let the shell +expand the patterns, or you can quote/escape the patterns and let them be +treated as Perl regular expressions. + +For example: + + t/tml unicode # paths matching qr/unicode/ + t/tml basic uni # paths matching qr/basic/ or qr/uni/ + t/tml 'local.*re' # paths matching qr/local.*re/ + t/tml '\d+' # paths matching qr/\d+/ + +Examples of options for prove: + + t/tml -v quoting # verbose run of paths matching qr/quoting/ + t/tml -j9 world # parallel run of paths matching qr/world/ + t/tml -j9 # parallel run of all .tml files + +=cut diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/dump-error/circular.tml b/cpan/CPAN-Meta-YAML/t/tml-local/dump-error/circular.tml new file mode 100644 index 0000000..2cc4611 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/dump-error/circular.tml @@ -0,0 +1,18 @@ +=== Circular Reference Protection +# When we try to serialize, it should NOT infinite loop +--- perl +$VAR1 = [ + { + 'a' => 'b', + 'c' => [ + {}, + 2 + ] + }, + [] + ]; +$VAR1->[0]{'c'}[0] = $VAR1->[0]; +$VAR1->[1] = $VAR1->[0]{'c'}; +[ $VAR1 ] + +--- error: E_CIRCULAR diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/load-error/document.tml b/cpan/CPAN-Meta-YAML/t/tml-local/load-error/document.tml new file mode 100644 index 0000000..454c5d0 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/load-error/document.tml @@ -0,0 +1,5 @@ +=== scalar document followed by mapping +--- yaml +\--- foo +a: 1 +--- error: E_CLASSIFY diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/load-error/scalar.tml b/cpan/CPAN-Meta-YAML/t/tml-local/load-error/scalar.tml new file mode 100644 index 0000000..0b0fd78 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/load-error/scalar.tml @@ -0,0 +1,51 @@ +=== multiline quote +--- yaml +- 'Multiline +quote' +--- error: E_FEATURE + +=== dash dash 2 +--- yaml +- - 2 +--- error: E_PLAIN + +=== dash +--- yaml +foo: - +--- error: E_PLAIN + +=== leading ampersand +--- yaml +foo: @INC +--- error: E_PLAIN + +=== leading percent +--- yaml +foo: %INC +--- error: E_PLAIN + +=== trailing colon +--- yaml +foo: bar: +--- error: E_PLAIN + +=== key key value +--- yaml +foo: bar: baz +--- error: E_PLAIN + +=== backticks +--- yaml +foo: `perl -V` +--- error: E_PLAIN + +=== double-dash +--- yaml +-- +--- error: E_PLAIN + +=== multi-line scalar document starting on header +--- yaml +\--- foo +bar +--- error: E_CLASSIFY diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/load-error/tag.tml b/cpan/CPAN-Meta-YAML/t/tml-local/load-error/tag.tml new file mode 100644 index 0000000..fb24004 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/load-error/tag.tml @@ -0,0 +1,11 @@ +=== version object +--- yaml +\--- +version: !!perl/hash:version + original: v2.0.2 + qv: 1 + version: + - 2 + - 0 + - 2 +--- error: E_FEATURE diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/perl-to-yaml/quoting.tml b/cpan/CPAN-Meta-YAML/t/tml-local/perl-to-yaml/quoting.tml new file mode 100644 index 0000000..8843d5d --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/perl-to-yaml/quoting.tml @@ -0,0 +1,26 @@ +=== Quote boolean-like string (scalar) +# Strings that could be confused with booleans should be quoted +--- perl +[ 'true' ] + +--- yaml +\--- 'true' + +=== Quote boolean-like string (list) +--- perl +[ [ qw{ null true false } ] ] + +--- yaml +\--- +- 'null' +- 'true' +- 'false' + +=== Quote scalars ending in colon +--- perl +[ [ 'A:' ] ] + +--- yaml +\--- +- 'A:' + diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/collection.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/collection.tml new file mode 100644 index 0000000..5b45243 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/collection.tml @@ -0,0 +1,128 @@ +#--------------------------------------------------------------------------# +# This file is for testing combinations of sequences and mappings +#--------------------------------------------------------------------------# + +##################################################################### +# Null HASH/ARRAY + +=== null hash in array +--- yaml +--- +- foo +- {} +- bar +--- perl +[ [ 'foo', {}, 'bar' ] ] + + +=== null array in array +--- yaml +--- +- foo +- [] +- bar +--- perl +[ [ 'foo', [], 'bar' ] ] + + +=== null hash in hash +--- yaml +--- +foo: {} +bar: 1 +--- perl +[ { foo => {}, bar => 1 } ] + + +=== null array in hash +--- yaml +--- +foo: [] +bar: 1 +--- perl +[ { foo => [], bar => 1 } ] + +# Simple array inside a hash with an undef +=== array_in_hash +--- yaml +--- +foo: + - bar + - ~ + - baz + +--- perl +[ { foo => [ 'bar', undef, 'baz' ] } ] + + +# Simple hash inside a hash with an undef +=== hash_in_hash +--- yaml +--- +foo: ~ +bar: + foo: bar + +--- perl +[ { foo => undef, bar => { foo => 'bar' } } ] + + +# Mixed hash and scalars inside an array +=== hash_in_array +--- yaml +--- +- + foo: ~ + this: that +- foo +- ~ +- + foo: bar + this: that + +--- perl +[ [ + { foo => undef, this => 'that' }, + 'foo', + undef, + { foo => 'bar', this => 'that' }, +] ] + + +###################################################################### +# Non-Indenting Sub-List + +=== Non-indenting sub-list +--- yaml +--- +foo: +- list +bar: value +--- perl +[ { foo => [ 'list' ], bar => 'value' } ] +--- noyamlpm + + + +# Inline nested hash +=== inline_nested_hash +--- yaml +--- +- ~ +- foo: bar + this: that +- baz + +--- perl +[ [ undef, { foo => 'bar', this => 'that' }, 'baz' ] ] + + +# RT 51491 +=== space after hypen +--- yaml +\--- +FOO: + - + bar: baz +--- perl +[ { 'FOO' => [ { bar => 'baz' } ] } ] diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/comment.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/comment.tml new file mode 100644 index 0000000..8e04eab --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/comment.tml @@ -0,0 +1,124 @@ +##################################################################### +# Main Tests + +=== Properly ignore comments +--- yaml +--- +a: b#content +c: d #comment +e: +- f #comment +- g# content +h: 'single' # comment +h2: 'single # content' # comment +i: "double" # comment +i2: "double # content" # comment +j: | # comment + literal # content + block # content +k: {} # comment +l: [] # comment +m: # comment + n: o +--- perl +[ + { + a => 'b#content', + c => 'd', + e => [ + 'f', + 'g# content', + ], + h => 'single', + h2 => 'single # content', + i => 'double', + i2 => 'double # content', + j => "literal # content\nblock # content\n", + k => {}, + l => [], + m => { + n => 'o', + }, + }, +] +--- noyamlpm + + +# Repeat, with otherwise illegal characters in the comments +=== Properly ignore comments (with otherwise illegal characters) +--- yaml +--- +a: b#content +c: d #comment '"!&@%` +e: +- f #comment '"!&@%` +- g# content +h: 'single' # comment '"!&@%` +h2: 'single # content' # comment '"!&@%` +i: "double" # comment '"!&@%` +i2: "double # content" # comment '"!&@%` +j: | # comment '"!&@%` + literal # content + block # content +k: {} # comment '"!&@%` +l: [] # comment '"!&@%` +m: # comment '"!&@%` + n: o +--- perl +[ + { + a => 'b#content', + c => 'd', + e => [ + 'f', + 'g# content', + ], + h => 'single', + h2 => 'single # content', + i => 'double', + i2 => 'double # content', + j => "literal # content\nblock # content\n", + k => {}, + l => [], + m => { + n => 'o', + }, + }, +] +--- noyamlpm + +#################################################################### +# Comment on the Document Line + +=== comment header +--- yaml +--- # Comment +foo: bar +--- perl +[ { foo => 'bar' } ] +--- noyamlpm + + +# Empty comments +=== empty_comment_in_list +--- yaml +--- +- foo +\# +- bar + +--- perl +[ [ 'foo', 'bar' ] ] + + +=== empty_comment_in_hash +--- yaml +--- +foo: bar +\# foo +one: two + +--- perl +[ { foo => 'bar', one => 'two' } ] + + diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/document.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/document.tml new file mode 100644 index 0000000..be54b07 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/document.tml @@ -0,0 +1,214 @@ +##################################################################### +# Support for YAML version directives + +# Simple inline case (comment variant) +=== simple_doctype_comment +--- yaml +--- #YAML:1.0 +foo: bar +--- perl +[ { foo => 'bar' } ] +--- nosyck + + +# Simple inline case (percent variant) +=== simple_doctype_percent +--- yaml +--- %YAML:1.0 +foo: bar +--- perl +[ { foo => 'bar' } ] +--- noyamlpm +--- noxs + + +# Simple header (comment variant) +=== predocument_1_0 +--- yaml +\%YAML:1.0 +--- +foo: bar +--- perl +[ { foo => 'bar' } ] +--- noyamlpm +--- nosyck +--- noxs + + +# Simple inline case (comment variant) +=== predocument_1_1 +--- yaml +\%YAML 1.1 +--- +foo: bar +--- perl +[ { foo => 'bar' } ] +--- noyamlpm +--- nosyck + + +# Multiple inline documents (comment variant) +=== multi_doctype_comment +--- yaml +--- #YAML:1.0 +foo: bar +--- #YAML:1.0 +- 1 +--- #YAML:1.0 +foo: bar +--- perl +[ { foo => 'bar' }, [ 1 ], { foo => 'bar' } ] + + +# Simple pre-document case (comment variant) +=== predocument_percent +--- yaml +\%YAML 1.1 +--- +foo: bar +--- perl +[ { foo => 'bar' } ] +--- noyamlpm +--- nosyck + + +# Simple pre-document case (comment variant) +=== predocument_comment +--- yaml +\#YAML 1.1 +--- +foo: bar +--- perl +[ { foo => 'bar' } ] + + +=== two documents +--- yaml +\--- +- foo +\--- +- bar +--- perl +[ [ 'foo' ], [ 'bar' ] ] + +# Document ending (hash) +=== document_end_hash +--- yaml +--- + foo: bar +... +--- perl +[ { foo => "bar" } ] +--- noyamlpm +--- nosyck + + +# Document ending (array) +=== document_end_array +--- yaml +--- +- foo +... +--- perl +[ [ 'foo' ] ] +--- noyamlpm + + +# Multiple documents (simple) +=== multi_document_simple +--- yaml +--- +- foo +... +--- +- foo +... +--- perl +[ [ 'foo' ], [ 'foo' ] ] +--- noyamlpm + + +# Multiple documents (whitespace-separated) +=== multi_document_space +--- yaml +--- +- foo +... + +--- +- foo +... +--- perl +[ [ 'foo' ], [ 'foo' ] ] +--- noyamlpm + +##################################################################### +# Sample Testing + +# Test a completely empty document +=== empty +--- yaml +--- perl +[ ] + + +# Just a newline +### YAML.pm has a bug where it dies on a single newline +=== only_newlines +--- yaml +\ +\ +--- perl +[ ] + + +# Just a comment +=== only_comment +--- yaml +\# comment +--- perl +[ ] + + +# Empty documents +=== only_header +--- yaml +--- + +--- perl +[ undef ] + + +=== two_header +--- yaml +--- +--- + +--- perl +[ undef, undef ] + + +=== one_undef +--- yaml +--- ~ + +--- perl +[ undef ] + + +=== one_undef2 +--- yaml +--- ~ +--- perl +[ undef ] + + +=== two_undef +--- yaml +--- ~ +--- + +--- perl +[ undef, undef ] + + diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/mapping.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/mapping.tml new file mode 100644 index 0000000..caf8a0d --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/mapping.tml @@ -0,0 +1,178 @@ +=== Empty mapping +--- yaml +\--- {} +--- perl +[ {} ] + +# Simple hashs +=== one_hash1 +--- yaml +--- +foo: bar + +--- perl +[ { foo => 'bar' } ] + + +=== one_hash2 +--- yaml +--- +foo: bar +this: ~ + +--- perl +[ { this => undef, foo => 'bar' } ] + + +=== one_hash3 +--- yaml +--- +-foo: bar + +--- perl +[ { '-foo' => 'bar' } ] + + +# Implicit document start +=== implicit_hash +--- yaml +foo: bar + +--- perl +[ { foo => 'bar' } ] + + + +# Make sure we support x-foo keys +=== x-foo key +--- yaml +--- +x-foo: 1 +--- perl +[ { 'x-foo' => 1 } ] + + +# Hash key legally containing a colon +=== module_hash_key +--- yaml +--- +Foo::Bar: 1 +--- perl +[ { 'Foo::Bar' => 1 } ] + + +# Hash indented +=== hash_indented +--- yaml +--- + foo: bar +--- perl +[ { foo => "bar" } ] + +##################################################################### +# Empty Values and Premature EOF + +=== empty hash keys +--- yaml +--- +foo: 0 +requires: +build_requires: +--- perl +[ { foo => 0, requires => undef, build_requires => undef } ] +--- noyamlpm + +##################################################################### +# Confirm we can read the synopsis + +=== synopsis +--- yaml +--- +rootproperty: blah +section: + one: two + three: four + Foo: Bar + empty: ~ +--- perl +[ { + rootproperty => 'blah', + section => { + one => 'two', + three => 'four', + Foo => 'Bar', + empty => undef, + }, +} ] + +##################################################################### +# Indentation after empty hash value + +=== Indentation after empty hash value +--- 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' +--- perl +[ { + 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', + }, +} ] + + +##################################################################### +# Spaces in the Key + +=== spaces in the key +--- yaml +--- +the key: the value +--- perl +[ { 'the key' => 'the value' } ] + + +# Complex keys +=== key_with_whitespace +--- yaml +--- +a b: c d + +--- perl +[ { 'a b' => 'c d' } ] + +=== quoted_empty_key +--- yaml +--- +'': foo + +--- perl +[ { '' => 'foo' } ] + + diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/quoting.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/quoting.tml new file mode 100644 index 0000000..e9fb60f --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/quoting.tml @@ -0,0 +1,134 @@ +=== Empty double-quote +--- yaml +\--- +- "" +--- perl +[ [ "" ] ] + +# Simple single quote +=== single_quote1 +--- yaml +--- +- 'foo' + +--- perl +[ [ 'foo' ] ] + + +=== single_spaces +--- yaml +--- +- ' ' +--- perl +[ [ ' ' ] ] + + +=== single_null +--- yaml +--- +- '' + +--- perl +[ [ '' ] ] + + +# Double quotes +=== only_spaces +--- noyamlpm +--- yaml +--- " " + +--- perl +[ ' ' ] + + +=== leading_trailing_spaces +--- noyamlpm +--- yaml +--- " foo" +--- "bar " + +--- perl +[ " foo", "bar " ] + +=== single quotes in double quotes +--- yaml +\--- "'foo'" +--- perl +[ "'foo'" ] + +=== double quotes in single quotes +--- yaml +\--- '"foo"' +--- perl +[ '"foo"' ] + +##################################################################### +# Quote vs Hash + +=== hash-like quote +--- yaml +--- +author: + - 'mst: Matt S. Trout ' +--- perl +[ { author => [ 'mst: Matt S. Trout ' ] } ] + +##################################################################### +# Quote and Escaping Idiosyncracies + +=== single quote subtleties +--- yaml +--- +name1: 'O''Reilly' +name2: 'O''Reilly O''Tool' +name3: 'Double '''' Quote' +--- perl +[ { + name1 => "O'Reilly", + name2 => "O'Reilly O'Tool", + name3 => "Double '' Quote", +} ] + + +=== single quote subtleties +--- yaml +--- +slash1: '\\' +slash2: '\\foo' +slash3: '\\foo\\\\' +--- perl +[ { + slash1 => "\\\\", + slash2 => "\\\\foo", + slash3 => "\\\\foo\\\\\\\\", +} ] + +##################################################################### +# Check Multiple-Escaping + +# RT #42119: write of two single quotes +=== Multiple escaping of quote ok +--- yaml +--- "A'B'C" +--- perl +[ "A'B'C" ] + + +# Escapes without whitespace +=== Multiple escaping of escape ok +--- yaml +\--- A\B\C +--- perl +[ "A\\B\\C" ] + + +# Escapes with whitespace +=== Multiple escaping of escape with whitespace ok +--- yaml +--- 'A\B \C' +--- perl +[ "A\\B \\C" ] + + + diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/scalar.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/scalar.tml new file mode 100644 index 0000000..176b19f --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/scalar.tml @@ -0,0 +1,135 @@ +%PointMarker +++ + +# Just a scalar +=== one_scalar ++++ yaml +--- foo + ++++ perl +[ 'foo' ] + + +=== one_scalar2 ++++ yaml +--- foo + ++++ perl +[ 'foo' ] + + +=== two_scalar ++++ yaml +--- foo +--- bar + ++++ perl +[ 'foo', 'bar' ] + + +##################################################################### +# Support for literal multi-line scalars + +# Declarative multi-line scalar +=== simple_multiline ++++ yaml +--- + foo: > + bar + baz ++++ perl +[ { foo => "bar baz\n" } ] + + +# Piped multi-line scalar +=== indented ++++ yaml +--- +- | + foo + bar +- 1 ++++ perl +[ [ "foo\nbar\n", 1 ] ] + + +# ... with a pointless hyphen +=== indented ++++ yaml +--- +- |- + foo + bar +- 1 ++++ perl +[ [ "foo\nbar", 1 ] ] + + +##################################################################### +# Hitchhiker Scalar + +=== hitchhiker scalar ++++ yaml +--- 42 ++++ perl +[ 42 ] ++++ serializes + +##################################################################### +# Newlines and tabs + +=== special characters ++++ yaml +foo: "foo\\\n\tbar" ++++ perl +[ { foo => "foo\\\n\tbar" } ] + +##################################################################### +# Unprintable Characters + +=== unprintable ++++ yaml +--- "foo\n\x00" ++++ perl +[ "foo\n\0" ] + +##################################################################### +# Ticker #32402 + +# Tests a particular pathological case + +=== Pathological >< case ++++ yaml +--- +- value +- '><' ++++ perl +[ [ 'value', '><' ] ] + +##################################################################### +# Special Characters + +=== Special Characters ++++ SKIP +# Encoding failure ++++ yaml +--- +- "Ingy d\xC3\xB6t Net" ++++ perl +[ [ "Ingy d\xC3\xB6t Net" ] ] + +###################################################################### +# Check illegal characters that are in legal places + +=== Bang in a quote ++++ yaml +--- 'Wow!' ++++ perl +[ "Wow!" ] + + +=== Ampersand in a quote ++++ yaml +--- 'This&that' ++++ perl +[ "This&that" ] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/sequence.tml b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/sequence.tml new file mode 100644 index 0000000..c96778e --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-local/yaml-roundtrip/sequence.tml @@ -0,0 +1,104 @@ +=== Empty sequence +--- yaml +\--- [] +--- perl +[ [] ] + +# Simple lists +=== one_list1 +--- yaml +--- +- foo + +--- perl +[ [ 'foo' ] ] + +# Implicit document start +=== implicit_array +--- yaml +- foo + +--- perl +[ [ 'foo' ] ] + + + +=== one_list2 +--- yaml +--- +- foo +- bar + +--- perl +[ [ 'foo', 'bar' ] ] + + +=== one_listundef +--- yaml +--- +- ~ +- bar + +--- perl +[ [ undef, 'bar' ] ] + + +=== one_listundefs +--- noyamlpm +--- yaml +--- +- ~ +- +- + +--- perl +[ [ undef, undef, undef ] ] + + +##################################################################### +# Empty Values and Premature EOF + +=== empty array keys +--- yaml +--- +- foo +- +- +--- perl +[ [ 'foo', undef, undef ] ] +--- noyamlpm + +##################################################################### +# Empty Quote Line + +=== empty quote line +--- yaml +--- +- foo +\# +- bar +--- perl +[ [ "foo", "bar" ] ] + +##################################################################### +# Trailing Whitespace +# +=== trailing whitespace +--- yaml +--- +abstract: Generate fractal curves +foo: ~ +arr: + # THESE LINES HAVE INTENTIONAL TRAILING WHITESPACE + - foo + - ~ + - 'bar' +--- perl +[ { + abstract => 'Generate fractal curves', + foo => undef, + arr => [ 'foo', undef, 'bar' ], +} ] + + + diff --git a/cpan/CPAN-Meta-YAML/t/tml-spec/basic-data.tml b/cpan/CPAN-Meta-YAML/t/tml-spec/basic-data.tml new file mode 100644 index 0000000..75bdb26 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-spec/basic-data.tml @@ -0,0 +1,24 @@ +=== basic hash +# This is just a simple one key hash. +--- yaml +a: b +--- json +{"a":"b"} + +=== double quoted keys +# Hash with quoted key with embedded newline +--- yaml +"a\nb": c +--- json +{"a\nb":"c"} +# --- dump +# "a\nb": c + +=== basic array +# This is just a simple one key hash. +--- yaml +- a +-b +--- json +["a","b"] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-spec/unicode.tml b/cpan/CPAN-Meta-YAML/t/tml-spec/unicode.tml new file mode 100644 index 0000000..9eb77e2 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-spec/unicode.tml @@ -0,0 +1,440 @@ +# Test unicode strings in key and value contexts + +%TestML 0.1.0 + +### +# These tests target unicode characters that are handled special or known to be +# problematic. Test YNY (YAML→Native→YAML) and NYN roundtripping. +# +# YAML scalar emission does quoting based on first character, presence of +# escape characters, and special ambiguous cases like ': '. These ones +# character strings go a long way towards making sure an implementation is +# correct. +### + + +# Make a mapping { "$code" : "$code" } where code is a unicode code point: + +# Dump mapping matches *yaml +*code.dump_code_key_value == *yaml + +# Load *yaml then dump matches *yaml +*yaml.load_yaml.dump_yaml == *yaml + +# Dump mapping the load memory-matches mapping +*code.code_key_value.dump_yaml.load_yaml === *code.code_key_value + + +# 0 → \0 "null" +# +# \z is the other YAML "null" encoding. Most implementations (including +# libyaml), seem to go with \0 when emitting. +=== Code point 0 +--- code: 0 +--- yaml +"\0": "\0" + + +# 1-6,14-27,29-31 → \x## +=== Code point 1 +--- code: 1 +--- yaml +"\x01": "\x01" + + +# 7 → \a "bell" (alarm) +=== Code point 7 +--- code: 7 +--- yaml +"\a": "\a" + + +# 8 → \b "backspace" +=== Code point 8 +--- code: 8 +--- yaml +"\b": "\b" + + +# 9 → \t "horizontal tab" +=== Code point 9 +--- code: 9 +--- yaml +"\t": "\t" + + +# 10 → \n "linefeed" (newline) +=== Code point 10 +--- code: 10 +--- yaml +"\n": "\n" + + +# 11 → \v "vertical tab" +=== Code point 11 +--- code: 11 +--- yaml +"\v": "\v" + + +# 11 → \f "form feed" +=== Code point 12 +--- code: 12 +--- yaml +"\f": "\f" + + +# 11 → \f "carriage return" +=== Code point 13 +--- code: 13 +--- yaml +"\r": "\r" + +# 27 → \e "escape" +=== Code point 27 +--- code: 27 +--- yaml +"\e": "\e" + + +# Space character needs quotes. +=== Code point 32 +--- code: 32 +--- yaml +' ': ' ' + + +# ! is a tag indicator. Needs quotes. +=== Code point 33 +--- code: 33 +--- yaml +'!': '!' + + +# Quote single quotes with double quotes. +=== Code point 34 +--- code: 34 +--- yaml +'"': '"' + + +# '#' is comment character. Needs quotes. +=== Code point 35 +--- code: 35 +--- yaml +'#': '#' + + +# $ has no special meaning. No quotes. +=== Code point 36 +--- code: 36 +--- yaml +$: $ + + +# % is directive indicator. Needs quotees. +=== Code point 37 +--- code: 37 +--- yaml +'%': '%' + + +# & is anchor indicator. Needs quotes. +=== Code point 38 +--- code: 38 +--- yaml +'&': '&' + + +# Quote double quotes with single quotes. +=== Code point 39 +--- code: 39 +--- yaml +"'": "'" + + +# ( has no special meaning. No quotes. +=== Code point 40 +--- code: 40 +--- yaml +(: ( + + +# ) has no special meaning. No quotes. +=== Code point 41 +--- code: 41 +--- yaml +): ) + + +# * is an alias indicator. Needs quotes. +=== Code point 42 +--- code: 42 +--- yaml +'*': '*' + + +# + has no special meaning. No quotes. +=== Code point 43 +--- code: 43 +--- yaml ++: + + + +# , is a list separator. Needs quotes. +=== Code point 44 +--- code: 44 +--- yaml +',': ',' + + +# - is a sequence element marker. In many contexts it is not ambiguous when +# unquoted, but in others it is ambiguous. libyaml always quotes it so going +# with that for now. +=== Code point 45 +--- code: 45 +--- yaml +'-': '-' + + +# . has no special meaning. No quotes. +=== Code point 46 +--- code: 46 +--- yaml +.: . + + +# / has no special meaning. No quotes. +=== Code point 47 +--- code: 47 +--- yaml +/: / + + +# 48-57 → 0-9 "digitss" +# These values are strings, so must quote them. +=== Code point 48 +--- code: 48 +--- yaml +'0': '0' + + +# : is a key/value separator. It is not always ambigous when not quoted, but +# libyaml always quotes it at start of a string. Probably wise. Going with that +# for now. +=== Code point 58 +--- code: 58 +--- yaml +':': ':' + + +# ; has no special meaning. No quotes. +=== Code point 59 +--- code: 59 +--- yaml +;: ; + + +# < has no special meaning. No quotes. +=== Code point 60 +--- code: 60 +--- yaml +<: < + + +# = has no special meaning. No quotes. +=== Code point 61 +--- code: 61 +--- yaml +=: = + + +# > is a folded scalar indicator. Needs quotes. +=== Code point 62 +--- code: 62 +--- yaml +'>': '>' + + +# ? is a mapping key indicator. Needs quotes. +=== Code point 63 +--- code: 63 +--- yaml +'?': '?' + + +# @ is a reserved character. Needs quotes. +# TODO Check spec on this. +=== Code point 64 +--- code: 64 +--- yaml +'@': '@' + + +# 65-90 → A-Z "upper case letters". No quotes. +=== Code point 65 +--- code: 65 +--- yaml +A: A + + +# Some implementations think N means false. This should not be the case in a +# default schema. No quotes. +# +# NOTE: +# http://yaml.org/type/bool.html suggests that many simple strings should be +# loaded as boolean, but this is an outdated concept. Currently, only the +# words true/false/null (lower case) should be loaded specially (not as +# strings). This may become even more restrictive in the future. ie Only +# true/false/null in a flow context. +=== Code point 78 +--- code: 78 +--- yaml +N: N + + +# Some implementations think Y means true. This should not be the case in a +# default schema. No quotes. +=== Code point 89 +--- code: 89 +--- yaml +Y: Y + + +# [ is a flow sequence start indicator. Needs quotes. +=== Code point 91 +--- code: 91 +--- yaml +'[': '[' + + +# \ is an escape indicator in double quoted strings. Used on its own it has no +# special meaning. No quotes. +=== Code point 92 +--- SKIP +--- code: 92 +--- yaml +\: \ + + +# ] is a flow sequence end indicator. Needs quotes. +=== Code point 93 +--- code: 93 +--- yaml +']': ']' + + +# ^ has no special meaning. No quotes. +=== Code point 94 +--- code: 94 +--- yaml +^: ^ + + +# _ has no special meaning. No quotes. +=== Code point 95 +--- code: 95 +--- yaml +_: _ + + +# ` is a reserved character. Needs quotes. +=== Code point 96 +--- code: 96 +--- yaml +'`': '`' + + +# 65-90 → a-z "lower case letters". No quotes. +=== Code point 97 +--- code: 97 +--- yaml +a: a + + +# Some implementations think n means false. This should not be the case in a +# default schema. No quotes. +=== Code point 110 +--- code: 110 +--- yaml +n: n + + +# Some implementations think y means true. This should not be the case in a +# default schema. No quotes. +=== Code point 121 +--- code: 121 +--- yaml +y: y + + +# { is a flow mapping start indicator. Needs quotes. +=== Code point 123 +--- code: 123 +--- yaml +'{': '{' + + +# | is a literal scalar indicator. Needs quotes. +=== Code point 124 +--- code: 124 +--- yaml +'|': '|' + + +# } is a flow mapping end indicator. Needs quotes. +=== Code point 125 +--- code: 125 +--- yaml +'}': '}' + + +# A single ~ has long been used as a plain scalar representation of null. This +# should be deprecated, but may take a while. +=== Code point 126 +--- code: 126 +--- yaml +'~': '~' +--- unquoted +~: ~ + + +# 127 → "escape" +# YAML does not have a special character. YAML2 should consider \?. +=== Code point 127 +--- code: 127 +--- yaml +"\x7F": "\x7F" + + +# 80-84,86-159 → \x## +=== Code point 128 +--- code: 128 +--- yaml +"\x80": "\x80" + + +# 133 (\x85) → "next line" (NEL) +=== Code point 133 +--- code: 133 +--- yaml +"\N": "\N" + + +# 160 (\xA0) → "non-breaking space" +# It seems extremely odd that YAML does not escape this. +# Investigate further. +=== Code point 160 +--- SKIP +--- code: 160 +--- yaml + :   + + +# 161-… → From here on up use printable unicode chars. +# XXX Need to look into other special code blocks. Especially those known to +# libyaml. +=== Code point 161 +--- code: 161 +--- yaml +¡: ¡ diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Acme-Time-Baby.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Acme-Time-Baby.tml new file mode 100644 index 0000000..3371cf1 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Acme-Time-Baby.tml @@ -0,0 +1,27 @@ +=== Acme-Time-Baby +--- 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 + +--- perl +[ { + 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', +} ] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Data-Swap.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Data-Swap.tml new file mode 100644 index 0000000..4dad06d --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Data-Swap.tml @@ -0,0 +1,25 @@ +=== Data-Swap +# File with a YAML header +--- yaml +\--- #YAML:1.0 +name: Data-Swap +version: 0.05 +license: perl +distribution_type: module +requires: + perl: 5.6.0 +dynamic_config: 0 + +--- perl +[ { + name => 'Data-Swap', + version => '0.05', + license => 'perl', + distribution_type => 'module', + requires => { + perl => '5.6.0', + }, + dynamic_config => '0', +} ] + +--- nosyck diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Games-Nintendo-Wii-Mii.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Games-Nintendo-Wii-Mii.tml new file mode 100644 index 0000000..686f20f --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Games-Nintendo-Wii-Mii.tml @@ -0,0 +1,57 @@ +=== Games-Nintendo-Wii-Mii +# Testing various failing META.yml files from CPAN +--- yaml +--- +abstract: Mii in Nintendo Wii data parser and builder +author: Toru Yamaguchi +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 + +--- perl +[ { + abstract => 'Mii in Nintendo Wii data parser and builder', + author => 'Toru Yamaguchi ', + 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', +} ] + + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/HTML-WebDAO.tml b/cpan/CPAN-Meta-YAML/t/tml-world/HTML-WebDAO.tml new file mode 100644 index 0000000..ae9c690 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/HTML-WebDAO.tml @@ -0,0 +1,24 @@ +=== HTML-WebDAO +--- yaml +\--- #YAML:1.0 +name: HTML-WebDAO +version: 0.04 +author: + - |- + Zahatski Aliaksandr, Ezagap@users.sourceforge.netE +abstract: Perl extension for create complex web application +license: perl + +--- perl +[ { + abstract => 'Perl extension for create complex web application', + author => [ + 'Zahatski Aliaksandr, Ezagap@users.sourceforge.netE', + ], + license => 'perl', + name => 'HTML-WebDAO', + version => '0.04', +} ] + +--- nosyck + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/ITS-SIN-FIDS-Content-XML.tml b/cpan/CPAN-Meta-YAML/t/tml-world/ITS-SIN-FIDS-Content-XML.tml new file mode 100644 index 0000000..eb02ef1 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/ITS-SIN-FIDS-Content-XML.tml @@ -0,0 +1,30 @@ +=== ITS-SIN-FIDS-Content-XML +# Testing a META.yml from a commercial project that crashed +--- 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 + +--- perl +[ { + name => 'ITS-SIN-FIDS-Content-XML', + version => "0.01", # this kludge is to prevent floating point comparison errors + 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', +} ] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Plagger.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Plagger.tml new file mode 100644 index 0000000..6ca8bd8 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Plagger.tml @@ -0,0 +1,101 @@ +##################################################################### +# Example Plagger Configuration 1 + +=== Plagger +--- 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 +--- perl +[ { 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', + }, + }, + }, +] } ] + + +##################################################################### +# Example Plagger Configuration 2 + +=== plagger2 +--- 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' + + +--- perl +[ { 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', + ], + }, +} ] } ] diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Spreadsheet-Read.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Spreadsheet-Read.tml new file mode 100644 index 0000000..d040217 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Spreadsheet-Read.tml @@ -0,0 +1,161 @@ +=== Spreadsheet-Read +--- yaml +\--- #YAML:1.1 +name: Read +version: VERSION +abstract: Meta-Wrapper for reading spreadsheet data +license: perl +author: + - H.Merijn Brand +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 + +--- perl +[ { + '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 ' + ], + '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' +} ] + +--- noyamlpm + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Template-Provider-Unicode-Japanese.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Template-Provider-Unicode-Japanese.tml new file mode 100644 index 0000000..f14edfb --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Template-Provider-Unicode-Japanese.tml @@ -0,0 +1,47 @@ +=== Template-Provider-Unicode-Japanese +--- yaml +--- +abstract: Decode all templates by Unicode::Japanese +author: Hironori Yoshida C<< >> +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 + +--- perl +[ { + abstract => 'Decode all templates by Unicode::Japanese', + author => 'Hironori Yoshida C<< >>', + 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', +} ] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml b/cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml new file mode 100644 index 0000000..477d409 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml @@ -0,0 +1,221 @@ +=== vanilla_perl +# VanillaPerl YAML config file +--- yaml +# 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 + +--- perl +[ { + 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', + }, +} ] + +--- nosyck diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml b/cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml new file mode 100644 index 0000000..af84a39 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml @@ -0,0 +1,41 @@ +=== CPAN::Meta::YAML +# Testing CPAN::Meta::YAML's own META.yml file -- at least as of some time ago +--- yaml +abstract: Read/Write YAML files with as little code as possible +author: 'Adam Kennedy ' +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 + +--- perl +[ { + abstract => 'Read/Write YAML files with as little code as possible', + author => 'Adam Kennedy ', + 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', +} ] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml b/cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml new file mode 100644 index 0000000..d7883b9 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/toolbar.tml @@ -0,0 +1,41 @@ +=== toolbar +# Testing of a known-bad file from an editor +--- yaml +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 + +--- perl +[ { + 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', + ] +} ] + diff --git a/cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml b/cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml new file mode 100644 index 0000000..ffa6fe9 --- /dev/null +++ b/cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml @@ -0,0 +1,69 @@ +=== yaml_org_example +# Testing sample data structure from yaml.org +--- yaml +--- +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. + +--- perl +[ { + 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 +} ] + +--- nosyck + -- 2.7.4