Hello community,

here is the log from the commit of package perl-JSON-Validator for 
openSUSE:Factory checked in at 2020-03-11 18:50:18
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-JSON-Validator (Old)
 and      /work/SRC/openSUSE:Factory/.perl-JSON-Validator.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-JSON-Validator"

Wed Mar 11 18:50:18 2020 rev:17 rq:783470 version:3.24

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-JSON-Validator/perl-JSON-Validator.changes  
2020-02-20 14:56:14.878390206 +0100
+++ 
/work/SRC/openSUSE:Factory/.perl-JSON-Validator.new.3160/perl-JSON-Validator.changes
        2020-03-11 18:52:29.099598117 +0100
@@ -1,0 +2,15 @@
+Wed Mar  4 03:09:18 UTC 2020 -  <timueller+p...@suse.de>
+
+- updated to 3.24
+   see /usr/share/doc/packages/perl-JSON-Validator/Changes
+
+  3.24 2020-03-03T15:46:39+0900
+    - Optimize checksum generation #202
+      Contributor: Ere Maijala
+    - Improved "type":[...] error messages #199
+      Contributor: Karen Etheridge
+    - Fix handle validation of true, false schemas in oneOf #201 #203
+      Contributor: Karen Etheridge
+    - Fix guessing type:object if "dependencies" is present #206
+
+-------------------------------------------------------------------

Old:
----
  JSON-Validator-3.23.tar.gz

New:
----
  JSON-Validator-3.24.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-JSON-Validator.spec ++++++
--- /var/tmp/diff_new_pack.ruZYH0/_old  2020-03-11 18:52:32.175599493 +0100
+++ /var/tmp/diff_new_pack.ruZYH0/_new  2020-03-11 18:52:32.175599493 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           perl-JSON-Validator
-Version:        3.23
+Version:        3.24
 Release:        0
 %define cpan_name JSON-Validator
 Summary:        Validate data against a JSON schema
@@ -34,8 +34,10 @@
 BuildRequires:  perl(Mojolicious) >= 7.28
 BuildRequires:  perl(Test::Deep)
 BuildRequires:  perl(Test::More) >= 1.30
+BuildRequires:  perl(YAML::XS) >= 0.80
 Requires:       perl(List::Util) >= 1.45
 Requires:       perl(Mojolicious) >= 7.28
+Requires:       perl(YAML::XS) >= 0.80
 %{perl_requires}
 
 %description

++++++ JSON-Validator-3.23.tar.gz -> JSON-Validator-3.24.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/Changes 
new/JSON-Validator-3.24/Changes
--- old/JSON-Validator-3.23/Changes     2020-02-19 01:37:44.000000000 +0100
+++ new/JSON-Validator-3.24/Changes     2020-03-03 07:46:39.000000000 +0100
@@ -1,7 +1,16 @@
 Revision history for perl distribution JSON-Validator
 
+3.24 2020-03-03T15:46:39+0900
+  - Optimize checksum generation #202
+    Contributor: Ere Maijala
+  - Improved "type":[...] error messages #199
+    Contributor: Karen Etheridge
+  - Fix handle validation of true, false schemas in oneOf #201 #203
+    Contributor: Karen Etheridge
+  - Fix guessing type:object if "dependencies" is present #206
+
 3.23 2020-02-19T09:37:44+0900
- - Using List::Util::uniq() instead of JSON::Validator::Util::uniq #198
+ - Using List::Util::uniq() instead of JSON::Validator::Util::uniq() #198
 
 3.22 2020-02-15T08:35:29+0900
  - Add support for "dependencies" keyword #192 #197
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/MANIFEST 
new/JSON-Validator-3.24/MANIFEST
--- old/JSON-Validator-3.23/MANIFEST    2020-02-19 01:37:45.000000000 +0100
+++ new/JSON-Validator-3.24/MANIFEST    2020-03-03 07:46:40.000000000 +0100
@@ -91,6 +91,7 @@
 t/jv-string.t
 t/load-data.t
 t/load-file.t
+t/load-from-app.t
 t/load-http.t
 t/load-json.t
 t/load-yaml.t
@@ -115,6 +116,7 @@
 t/stack/Some.pm
 t/stack/Some/Module.pm
 t/to-json.t
+t/util-checksum-yaml-xs.t
 t/util.t
 t/validate-draft07.t
 t/validate-id.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/META.json 
new/JSON-Validator-3.24/META.json
--- old/JSON-Validator-3.23/META.json   2020-02-19 01:37:45.000000000 +0100
+++ new/JSON-Validator-3.24/META.json   2020-03-03 07:46:40.000000000 +0100
@@ -36,6 +36,7 @@
          "requires" : {
             "List::Util" : "1.45",
             "Mojolicious" : "7.28",
+            "YAML::XS" : "0.80",
             "perl" : "5.010001"
          }
       },
@@ -62,6 +63,6 @@
       },
       "x_IRC" : "irc://irc.freenode.net/#mojo"
    },
-   "version" : "3.23",
+   "version" : "3.24",
    "x_serialization_backend" : "JSON::PP version 4.02"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/META.yml 
new/JSON-Validator-3.24/META.yml
--- old/JSON-Validator-3.23/META.yml    2020-02-19 01:37:45.000000000 +0100
+++ new/JSON-Validator-3.24/META.yml    2020-03-03 07:46:40.000000000 +0100
@@ -24,6 +24,7 @@
 requires:
   List::Util: '1.45'
   Mojolicious: '7.28'
+  YAML::XS: '0.80'
   perl: '5.010001'
 resources:
   IRC: irc://irc.freenode.net/#mojo
@@ -31,5 +32,5 @@
   homepage: https://mojolicious.org
   license: http://www.opensource.org/licenses/artistic-license-2.0
   repository: https://github.com/mojolicious/json-validator.git
-version: '3.23'
+version: '3.24'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/Makefile.PL 
new/JSON-Validator-3.24/Makefile.PL
--- old/JSON-Validator-3.23/Makefile.PL 2020-02-18 08:56:50.000000000 +0100
+++ new/JSON-Validator-3.24/Makefile.PL 2020-03-03 07:38:57.000000000 +0100
@@ -30,9 +30,10 @@
       x_IRC => 'irc://irc.freenode.net/#mojo',
     },
   },
-  PREREQ_PM     => {'List::Util' => '1.45', 'Mojolicious' => '7.28'},
-  TEST_REQUIRES => {'Test::More' => '1.30', 'Test::Deep'  => '0'},
-  test => {TESTS => (-e 'META.yml' ? 't/*.t' : 't/*.t xt/*.t')},
+  PREREQ_PM =>
+    {'List::Util' => '1.45', 'Mojolicious' => '7.28', 'YAML::XS' => '0.80'},
+  TEST_REQUIRES => {'Test::More' => '1.30', 'Test::Deep' => '0'},
+  test          => {TESTS        => (-e 'META.yml' ? 't/*.t' : 't/*.t 
xt/*.t')},
 );
 
 unless (eval { ExtUtils::MakeMaker->VERSION('6.63_03') }) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/lib/JSON/Validator/Util.pm 
new/JSON-Validator-3.24/lib/JSON/Validator/Util.pm
--- old/JSON-Validator-3.23/lib/JSON/Validator/Util.pm  2020-02-18 
08:56:16.000000000 +0100
+++ new/JSON-Validator-3.24/lib/JSON/Validator/Util.pm  2020-03-03 
07:36:29.000000000 +0100
@@ -1,8 +1,7 @@
 package JSON::Validator::Util;
 use Mojo::Base -strict;
 
-use Carp         ();
-use Data::Dumper ();
+use Carp ();
 use Exporter 'import';
 use JSON::Validator::Error;
 use List::Util;
@@ -11,14 +10,19 @@
 use Mojo::Loader;
 use Mojo::Util;
 use Scalar::Util 'blessed';
+use YAML::XS;
 
 our @EXPORT_OK
   = qw(E data_checksum data_section data_type is_type schema_extract 
json_pointer prefix_errors schema_type);
 
 sub E { JSON::Validator::Error->new(@_) }
 
+my $serializer
+  = eval 'use Sereal::Encoder;1' ? \&_sereal_encode : \&YAML::XS::Dump;
+
 sub data_checksum {
-  Mojo::Util::md5_sum(Data::Dumper->new([@_])->Sortkeys(1)->Useqq(1)->Dump);
+  return Mojo::Util::md5_sum(
+    ref $_[0] ? $serializer->($_[0]) : defined $_[0] ? qq('$_[0]') : 'undef');
 }
 
 sub data_section {
@@ -110,7 +114,7 @@
     push @errors, map {
       my $msg = sprintf '/%s/%s %s', $type, $index, $_->message;
       $msg =~ s!(\d+)\s/!$1/!g;
-      E $_->path, $msg;
+      E +{%$_, message => $msg};   # preserve 'details', for later 
introspection
     } @$e;
   }
 
@@ -118,12 +122,14 @@
 }
 
 sub schema_type {
+  return ''            if ref $_[0] ne 'HASH';
   return $_[0]->{type} if $_[0]->{type};
   return _guessed_right(object => $_[1]) if $_[0]->{additionalProperties};
   return _guessed_right(object => $_[1]) if $_[0]->{patternProperties};
   return _guessed_right(object => $_[1]) if $_[0]->{properties};
   return _guessed_right(object => $_[1]) if $_[0]->{propertyNames};
   return _guessed_right(object => $_[1]) if $_[0]->{required};
+  return _guessed_right(object => $_[1]) if $_[0]->{dependencies};
   return _guessed_right(object => $_[1])
     if defined $_[0]->{maxProperties}
     or defined $_[0]->{minProperties};
@@ -190,6 +196,11 @@
   return $data;
 }
 
+sub _sereal_encode {
+  state $s = Sereal::Encoder->new({canonical => 1});
+  return $s->encode($_[0]);
+}
+
 1;
 
 =encoding utf8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/lib/JSON/Validator.pm 
new/JSON-Validator-3.24/lib/JSON/Validator.pm
--- old/JSON-Validator-3.23/lib/JSON/Validator.pm       2020-02-19 
01:37:44.000000000 +0100
+++ new/JSON-Validator-3.24/lib/JSON/Validator.pm       2020-03-03 
07:46:39.000000000 +0100
@@ -24,7 +24,7 @@
 use constant SPECIFICATION_URL => 'http://json-schema.org/draft-04/schema#';
 use constant YAML_SUPPORT      => eval 'use YAML::XS 0.67;1';
 
-our $VERSION = '3.23';
+our $VERSION = '3.24';
 our @EXPORT_OK = qw(joi validate_json);
 
 my $BUNDLED_CACHE_DIR = path(path(__FILE__)->dirname, qw(Validator cache));
@@ -519,8 +519,7 @@
   # Test base schema before allOf, anyOf or oneOf
   if (ref $type eq 'ARRAY') {
     push @{$self->{temp_schema}}, [map { +{%$schema, type => $_} } @$type];
-    push @errors,
-      $self->_validate_any_of($to_json ? $$to_json : $_[1],
+    return $self->_validate_any_of_types($to_json ? $$to_json : $_[1],
       $path, $self->{temp_schema}[-1]);
   }
   elsif ($type) {
@@ -574,69 +573,105 @@
 
 sub _validate_all_of {
   my ($self, $data, $path, $rules) = @_;
-  my $type = data_type $data, $rules;
-  my (@errors, @expected);
+  my (@errors, @errors_with_prefix);
 
   my $i = 0;
   for my $rule (@$rules) {
     next unless my @e = $self->_validate($_[1], $path, $rule);
-    my $schema_type = schema_type $rule;
-    push @expected, $schema_type if $schema_type;
-    push @errors, [$i, @e] if !$schema_type or $schema_type eq $type;
+    push @errors, @e;
+    push @errors_with_prefix, [$i, @e];
   }
   continue {
     $i++;
   }
 
-  return E $path, [allOf => type => join('/', uniq @expected), $type]
-    if !@errors and @expected;
-  return prefix_errors allOf => @errors if @errors;
-  return;
+  return if not @errors;
+
+  return prefix_errors(allOf => @errors_with_prefix)
+    if @errors == 1
+    or
+    (grep { $_->details->[1] ne 'type' or $_->path ne ($path || '/') } 
@errors);
+
+  # combine all 'type' errors at the base path together
+  my @details    = map $_->details, @errors;
+  my $want_types = join '/', uniq map $_->[0], @details;
+  return E $path, [allOf => type => $want_types, $details[-1][2]];
+}
+
+sub _validate_any_of_types {
+  my ($self, $data, $path, $rules) = @_;
+  my @errors;
+
+  for my $rule (@$rules) {
+    return unless my @e = $self->_validate($_[1], $path, $rule);
+    push @errors, @e;
+  }
+
+  # favour a non-type error from one of the rules
+  if (my @e
+    = grep { $_->details->[1] ne 'type' or $_->path ne ($path || '/') } 
@errors)
+  {
+    return @e;
+  }
+
+  # the type didn't match any of the rules: combine the errors together
+  my @details    = map $_->details, @errors;
+  my $want_types = join '/', uniq map $_->[0], @details;
+  return E $path, [$want_types => 'type', $details[-1][2]];
 }
 
 sub _validate_any_of {
   my ($self, $data, $path, $rules) = @_;
-  my $type = data_type $data, $rules;
-  my (@e, @errors, @expected);
+  my (@errors, @errors_with_prefix);
 
   my $i = 0;
   for my $rule (@$rules) {
-    @e = $self->_validate($_[1], $path, $rule);
-    return unless @e;
-    my $schema_type = schema_type $rule;
-    push @errors, [$i, @e] and next if !$schema_type or $schema_type eq $type;
-    push @expected, $schema_type;
+    return unless my @e = $self->_validate($_[1], $path, $rule);
+    push @errors, @e;
+    push @errors_with_prefix, [$i, @e];
   }
   continue {
     $i++;
   }
 
-  my $expected = join '/', uniq @expected;
-  return E $path, [anyOf => type => $expected, $type] unless @errors;
-  return prefix_errors anyOf => @errors;
+  return prefix_errors(anyOf => @errors_with_prefix)
+    if @errors == 1
+    or
+    (grep { $_->details->[1] ne 'type' or $_->path ne ($path || '/') } 
@errors);
+
+  # combine all 'type' errors at the base path together
+  my @details    = map $_->details, @errors;
+  my $want_types = join '/', uniq map $_->[0], @details;
+  return E $path, [anyOf => type => $want_types, $details[-1][2]];
 }
 
 sub _validate_one_of {
   my ($self, $data, $path, $rules) = @_;
-  my $type = data_type $data, $rules;
-  my (@errors, @expected);
+  my (@errors, @errors_with_prefix);
 
   my ($i, @passed) = (0);
   for my $rule (@$rules) {
     my @e = $self->_validate($_[1], $path, $rule) or push @passed, $i and next;
-    my $schema_type = schema_type $rule;
-    push @errors, [$i, @e] and next if !$schema_type or $schema_type eq $type;
-    push @expected, $schema_type;
+    push @errors_with_prefix, [$i, @e];
+    push @errors, @e;
   }
   continue {
     $i++;
   }
 
   return if @passed == 1;
-  return E $path, [oneOf => 'all_rules_match'] unless @errors + @expected;
+  return E $path, [oneOf => 'all_rules_match'] unless @errors;
   return E $path, [oneOf => 'n_rules_match', join(', ', @passed)] if @passed;
-  return prefix_errors oneOf => @errors if @errors;
-  return E $path, [oneOf => type => join('/', uniq @expected), $type];
+
+  return prefix_errors(oneOf => @errors_with_prefix)
+    if @errors == 1
+    or
+    (grep { $_->details->[1] ne 'type' or $_->path ne ($path || '/') } 
@errors);
+
+  # the type didn't match any of the rules: combine the errors together
+  my @details    = map $_->details, @errors;
+  my $want_types = join '/', uniq map $_->[0], @details;
+  return E $path, [oneOf => type => $want_types, $details[-1][2]];
 }
 
 sub _validate_number_max {
@@ -862,7 +897,7 @@
   if (my $n_schema = $schema->{propertyNames}) {
     for my $name (keys %$data) {
       next unless my @e = $self->_validate($name, $path, $n_schema);
-      push @errors, prefix_errors propertyName => [map { ($name, $_) } @e];
+      push @errors, prefix_errors propertyName => map [$name, $_], @e;
     }
   }
 
@@ -1327,7 +1362,11 @@
 =item * Any other URL
 
 An URL (without a recognized scheme) will be treated as a path to a file on
-disk.
+disk. If the file could not be found on disk and the path starts with "/", then
+the will be loaded from the app defined in L</ua>. Something like this:
+
+  $jv->ua->server->app(MyMojoApp->new);
+  $jv->ua->get('/any/other/url.json');
 
 =back
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/acceptance.t 
new/JSON-Validator-3.24/t/acceptance.t
--- old/JSON-Validator-3.23/t/acceptance.t      2020-02-18 08:49:52.000000000 
+0100
+++ new/JSON-Validator-3.24/t/acceptance.t      2020-03-03 07:35:36.000000000 
+0100
@@ -18,7 +18,6 @@
 
 my $test_only_re = $ENV{TEST_ONLY} || '';
 my $todo_re      = join('|',
-  'dependencies',
   'change resolution scope - changed scope ref valid',
   $ENV{TEST_ONLINE} ? () : ('remote ref'),
 );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/issue-103-one-of.t 
new/JSON-Validator-3.24/t/issue-103-one-of.t
--- old/JSON-Validator-3.23/t/issue-103-one-of.t        2020-02-07 
03:10:28.000000000 +0100
+++ new/JSON-Validator-3.24/t/issue-103-one-of.t        2020-03-01 
09:09:31.000000000 +0100
@@ -5,7 +5,8 @@
   desc => 'foo'}, 'data://main/example.json',
   E('/sym',      '/oneOf/0/allOf/0/allOf/0 Missing property.'),
   E('/template', '/oneOf/0/allOf/2 Missing property.'),
-  E('/sym',      '/oneOf/1/allOf/0 Missing property.');
+  E('/sym',      '/oneOf/1/allOf/0 Missing property.'),
+  E('/',         '/oneOf/2 Expected string - got object.');
 
 validate_ok {
   sym      => 'a',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/jv-allof.t 
new/JSON-Validator-3.24/t/jv-allof.t
--- old/JSON-Validator-3.23/t/jv-allof.t        2020-02-18 08:49:52.000000000 
+0100
+++ new/JSON-Validator-3.24/t/jv-allof.t        2020-03-03 07:36:29.000000000 
+0100
@@ -39,4 +39,31 @@
   E('/', '/oneOf/1 String is too long: 10/4.'),
   E('/', '/oneOf/1 String does not match ^[a-z]+$.');
 
+validate_ok 'hello', {type => ['integer', 'boolean']},
+  E('/', 'Expected integer/boolean - got string.');
+
+validate_ok 'hello', {allOf => [{type => ['integer', 'boolean']}]},
+  E('/', '/allOf/0 Expected integer/boolean - got string.');
+
+validate_ok 'hello',
+  {
+  allOf => [
+    {allOf => [{type => 'boolean'}, {type => 'string', maxLength => 2}]},
+    {type  => 'integer'},
+  ],
+  },
+  E('/', '/allOf/0/allOf/0 Expected boolean - got string.'),
+  E('/', '/allOf/0/allOf/1 String is too long: 5/2.'),
+  E('/', '/allOf/1 Expected integer - got string.');
+
+validate_ok {foo => 'not an arrayref'},
+  {
+  allOf => [
+    {type => 'object', properties => {foo => {type => 'array'}}},
+    {type => 'boolean'},
+  ]
+  },
+  E('/foo', '/allOf/0 Expected array - got string.'),
+  E('/',    '/allOf/1 Expected boolean - got object.');
+
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/jv-anyof.t 
new/JSON-Validator-3.24/t/jv-anyof.t
--- old/JSON-Validator-3.23/t/jv-anyof.t        2018-12-15 05:26:03.000000000 
+0100
+++ new/JSON-Validator-3.24/t/jv-anyof.t        2020-03-03 07:36:29.000000000 
+0100
@@ -6,10 +6,14 @@
     [{type => "string", maxLength => 5}, {type => "number", minimum => 0}]
   };
 
-validate_ok 'short',    $schema;
-validate_ok 'too long', $schema, E('/', '/anyOf/0 String is too long: 8/5.');
-validate_ok 12,         $schema;
-validate_ok int(-1), $schema, E('/', '/anyOf/1 -1 < minimum(0)');
+validate_ok 'short', $schema;
+validate_ok 'too long', $schema, E('/', '/anyOf/0 String is too long: 8/5.'),
+  E('/', '/anyOf/1 Expected number - got string.');
+
+validate_ok 12, $schema;
+validate_ok int(-1), $schema, E('/', '/anyOf/0 Expected string - got number.'),
+  E('/', '/anyOf/1 -1 < minimum(0)');
+
 validate_ok {}, $schema, E('/', '/anyOf Expected string/number - got object.');
 
 # anyOf with explicit integer (where _guess_data_type returns 'number')
@@ -63,4 +67,42 @@
   E('/b', '/anyOf/1 Missing property.'),
 );
 
+validate_ok 'hello', {type => ['integer', 'string'], enum => [123, 'HELLO']},
+  E('/', 'Not in enum list: 123, HELLO.');
+
+validate_ok 'hello', {anyOf => [false, {type => ['integer', 'boolean']}]},
+  E('/', '/anyOf/0 Should not match.'),
+  E('/', '/anyOf/1 Expected integer/boolean - got string.');
+
+validate_ok 'hello', {type => ['integer', 'boolean']},
+  E('/', 'Expected integer/boolean - got string.');
+
+validate_ok 'hello', {anyOf => [{type => ['integer', 'boolean']}]},
+  E('/', '/anyOf/0 Expected integer/boolean - got string.');
+
+validate_ok 'hello',
+  {
+  anyOf => [
+    {anyOf => [{type => 'boolean'}, {type => 'string', maxLength => 2}]},
+    {type  => 'integer'},
+  ],
+  },
+  E('/', '/anyOf/0/anyOf/0 Expected boolean - got string.'),
+  E('/', '/anyOf/0/anyOf/1 String is too long: 5/2.'),
+  E('/', '/anyOf/1 Expected integer - got string.');
+
+validate_ok {foo => 'not an arrayref'},
+  {type => ['object', 'boolean'], properties => {foo => {type => 'array'}}},
+  E('/foo', 'Expected array - got string.');
+
+validate_ok {foo => 'not an arrayref'},
+  {
+  anyOf => [
+    {type => 'object', properties => {foo => {type => 'array'}}},
+    {type => 'boolean'},
+  ]
+  },
+  E('/foo', '/anyOf/0 Expected array - got string.'),
+  E('/',    '/anyOf/1 Expected boolean - got object.');
+
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/jv-enum.t 
new/JSON-Validator-3.24/t/jv-enum.t
--- old/JSON-Validator-3.23/t/jv-enum.t 2019-04-04 03:03:18.000000000 +0200
+++ new/JSON-Validator-3.24/t/jv-enum.t 2020-03-01 09:09:31.000000000 +0100
@@ -57,7 +57,16 @@
     properties =>
       {name => {type => ['string'], enum => [qw(n yes true false)]}},
   },
-  E('/name', '/anyOf Expected string - got null.'),
+  E('/name', 'Expected string - got null.'),
+);
+
+validate_ok(
+  {name => undef},
+  {
+    type       => 'object',
+    required   => ['name'],
+    properties => {name => {enum => [qw(n yes true false)]}},
+  },
   E('/name', 'Not in enum list: n, yes, true, false.'),
 );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/jv-object.t 
new/JSON-Validator-3.24/t/jv-object.t
--- old/JSON-Validator-3.23/t/jv-object.t       2020-02-18 08:49:52.000000000 
+0100
+++ new/JSON-Validator-3.24/t/jv-object.t       2020-03-03 07:35:36.000000000 
+0100
@@ -189,4 +189,21 @@
 , {additionalProperties => {'$ref' => '#/definitions/my_false_ref'}},
   {patternProperties => {foo => {'$ref' => '#/definitions/my_false_ref'}}};
 
+$schema = {dependencies => {bar => ['foo']}};
+validate_ok {bar => 2}, $schema, E('/foo', 'Missing property. Dependee: bar.');
+
+validate_ok {FOO => 1},
+  {
+  type          => 'object',
+  propertyNames => {
+    anyOf => [
+      {type => 'string', enum => ['foo', 'bar', 'baz']},
+      {type => 'string', enum => ['hello']},
+    ],
+  },
+  additionalProperties => {type => 'integer'},
+  },
+  E('/', '/propertyName/FOO /anyOf/0 Not in enum list: foo, bar, baz.'),
+  E('/', '/propertyName/FOO /anyOf/1 Not in enum list: hello.');
+
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/jv-oneof.t 
new/JSON-Validator-3.24/t/jv-oneof.t
--- old/JSON-Validator-3.23/t/jv-oneof.t        2020-02-07 03:10:28.000000000 
+0100
+++ new/JSON-Validator-3.24/t/jv-oneof.t        2020-03-03 07:36:29.000000000 
+0100
@@ -23,20 +23,73 @@
 validate_ok 13, $schema, E('/', '/oneOf Expected object/string - got number.');
 
 $schema = {oneOf => [{type => 'object'}, {type => 'number', multipleOf => 3}]};
-validate_ok 13, $schema, E('/', '/oneOf/1 Not multiple of 3.');
+validate_ok 13, $schema, E('/', '/oneOf/0 Expected object - got number.'),
+  E('/', '/oneOf/1 Not multiple of 3.');
 
 # Alternative oneOf
-# http://json-schema.org/latest/json-schema-validation.html#anchor79
+# https://json-schema.org/draft-07/json-schema-validation.html#rfc.section.7
 $schema = {
   type       => 'object',
   properties => {x => {type => ['string', 'null'], format => 'date-time'}}
 };
-validate_ok {x => 'foo'}, $schema,
-  E('/x', '/anyOf/0 Does not match date-time format.');
+validate_ok {x => 'foo'}, $schema, E('/x', 'Does not match date-time format.'),
+  E('/x', 'Not null.');
+
 validate_ok {x => '2015-04-21T20:30:43.000Z'}, $schema;
-validate_ok {x => undef}, $schema;
+validate_ok {x => undef},                      $schema;
 
 validate_ok 1, {oneOf => [{minimum => 1}, {minimum => 2}, {maximum => 3}]},
   E('/', 'oneOf rules 0, 2 match.');
 
+validate_ok 'hello', {oneOf => [true, false]};
+
+validate_ok 'hello', {oneOf => [true, true]},
+  E('/', 'All of the oneOf rules match.');
+
+validate_ok 'hello', {oneOf => [false, false]},
+  E('/', '/oneOf/0 Should not match.'), E('/', '/oneOf/1 Should not match.');
+
+validate_ok 'hello', {oneOf => [true, {type => ['string', 'boolean']}]},
+  E('/', 'All of the oneOf rules match.');
+
+validate_ok 'hello', {type => ['integer', 'boolean']},
+  E('/', 'Expected integer/boolean - got string.');
+
+validate_ok 'hello',
+  {oneOf => [false, {type => ['integer', 'string'], enum => [123, 'HELLO']}]},
+  E('/', '/oneOf/0 Should not match.'),
+  E('/', '/oneOf/1 Not in enum list: 123, HELLO.');
+
+validate_ok 'hello', {oneOf => [false, {type => ['integer', 'boolean']}]},
+  E('/', '/oneOf/0 Should not match.'),
+  E('/', '/oneOf/1 Expected integer/boolean - got string.');
+
+validate_ok 'hello', {oneOf => [false, {type => 'integer'}]},
+  E('/', '/oneOf/0 Should not match.'),
+  E('/', '/oneOf/1 Expected integer - got string.');
+
+validate_ok 'hello', {oneOf => [{type => ['integer', 'boolean']}]},
+  E('/', '/oneOf/0 Expected integer/boolean - got string.');
+
+validate_ok 'hello',
+  {
+  oneOf => [
+    {oneOf => [{type => 'boolean'}, {type => 'string', maxLength => 2}]},
+    {type  => 'integer'},
+  ],
+  },
+  E('/', '/oneOf/0/oneOf/0 Expected boolean - got string.'),
+  E('/', '/oneOf/0/oneOf/1 String is too long: 5/2.'),
+  E('/', '/oneOf/1 Expected integer - got string.');
+
+validate_ok {foo => 'not an arrayref'},
+  {
+  oneOf => [
+    {type => 'object', properties => {foo => {type => 'array'}}},
+    {type => 'boolean'},
+  ]
+  },
+  E('/foo', '/oneOf/0 Expected array - got string.'),
+  E('/',    '/oneOf/1 Expected boolean - got object.');
+
 done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/load-from-app.t 
new/JSON-Validator-3.24/t/load-from-app.t
--- old/JSON-Validator-3.23/t/load-from-app.t   1970-01-01 01:00:00.000000000 
+0100
+++ new/JSON-Validator-3.24/t/load-from-app.t   2020-03-01 09:09:31.000000000 
+0100
@@ -0,0 +1,21 @@
+use Mojo::Base -strict;
+use JSON::Validator;
+use Mojolicious;
+use Test::More;
+
+my $jv = JSON::Validator->new;
+$jv->ua->server->app(Mojolicious->new);
+$jv->ua->server->app->routes->get(
+  '/spec' => sub {
+    shift->render(json => {'$ref' => 'http://swagger.io/v2/schema.json'});
+  }
+);
+
+# Some CPAN testers says: [JSON::Validator] GET http://127.0.0.1:61594/api == 
Service Unavailable at JSON/Validator.pm
+eval { $jv->schema('/spec') };
+plan skip_all => $@ if $@ =~ /\sGET\s/i;
+
+is $@, '', 'loaded schema from app';
+is $jv->get('/properties/swagger/enum/0'), '2.0', 'loaded schema structure';
+
+done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/util-checksum-yaml-xs.t 
new/JSON-Validator-3.24/t/util-checksum-yaml-xs.t
--- old/JSON-Validator-3.23/t/util-checksum-yaml-xs.t   1970-01-01 
01:00:00.000000000 +0100
+++ new/JSON-Validator-3.24/t/util-checksum-yaml-xs.t   2020-03-03 
07:41:40.000000000 +0100
@@ -0,0 +1,36 @@
+BEGIN {
+  unshift @INC, sub {
+    my $file = $_[1];
+    die "Skipping $file in this test" if $file =~ m!Sereal\W+Encoder\.pm$!;
+  };
+}
+
+use Mojo::Util 'md5_sum';
+use JSON::Validator;
+use JSON::Validator::Util qw(data_checksum);
+use Test::More;
+
+my $d_hash  = {foo => {}, bar => {}};
+my $d_hash2 = {bar => {}, foo => {}};
+my $d_undef = {foo => undef};
+my $d_obj   = {foo => JSON::Validator::Error->new};
+my $d_array  = ['foo', 'bar'];
+my $d_array2 = ['bar', 'foo'];
+
+use_ok 'YAML::XS';
+ok !$INC{'Sereal/Encoder.pm'}, 'Sereal::Encoder was not loaded';
+
+isnt data_checksum($d_array), data_checksum($d_array2), 'data_checksum array';
+is data_checksum($d_hash), data_checksum($d_hash2),
+  'data_checksum hash field order';
+isnt data_checksum($d_hash), data_checksum($d_undef),
+  'data_checksum hash not undef';
+isnt data_checksum($d_hash), data_checksum($d_obj),
+  'data_checksum hash not object';
+isnt data_checksum($d_obj), data_checksum($d_undef),
+  'data_checksum object not undef';
+isnt data_checksum(3.14), md5_sum(3.15), 'data_checksum numeric';
+is data_checksum(3.14), data_checksum('3.14'),
+  'data_checksum numeric like string';
+
+done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/JSON-Validator-3.23/t/util.t 
new/JSON-Validator-3.24/t/util.t
--- old/JSON-Validator-3.23/t/util.t    2020-02-19 01:37:18.000000000 +0100
+++ new/JSON-Validator-3.24/t/util.t    2020-03-03 07:28:36.000000000 +0100
@@ -1,8 +1,9 @@
 use Mojo::Base -strict;
 use Mojo::JSON 'false';
+use Mojo::Util 'md5_sum';
 use JSON::Validator;
 use JSON::Validator::Util
-  qw(E data_type schema_type prefix_errors is_type json_pointer);
+  qw(E data_checksum data_type schema_type prefix_errors is_type json_pointer);
 use Test::More;
 
 my $e = E '/path/x', 'some error';
@@ -52,4 +53,29 @@
 is schema_type({const      => 42}),      'const',  'schema_type const';
 is schema_type({cannot     => 'guess'}), '',       'schema_type no idea';
 
+subtest 'data_checksum with Sereal::Encoder' => sub {
+  plan skip_all => 'Sereal::Encoder not installed'
+    unless eval 'use Sereal::Encoder;1';
+
+  my $d_hash  = {foo => {}, bar => {}};
+  my $d_hash2 = {bar => {}, foo => {}};
+  my $d_undef = {foo => undef};
+  my $d_obj   = {foo => JSON::Validator::Error->new};
+  my $d_array  = ['foo', 'bar'];
+  my $d_array2 = ['bar', 'foo'];
+
+  isnt data_checksum($d_array), data_checksum($d_array2), 'data_checksum 
array';
+  is data_checksum($d_hash), data_checksum($d_hash2),
+    'data_checksum hash field order';
+  isnt data_checksum($d_hash), data_checksum($d_undef),
+    'data_checksum hash not undef';
+  isnt data_checksum($d_hash), data_checksum($d_obj),
+    'data_checksum hash not object';
+  isnt data_checksum($d_obj), data_checksum($d_undef),
+    'data_checksum object not undef';
+  isnt data_checksum(3.14), md5_sum(3.15), 'data_checksum numeric';
+  is data_checksum(3.14), data_checksum('3.14'),
+    'data_checksum numeric like string';
+};
+
 done_testing;


Reply via email to