Codebase list libjson-validator-perl / 893f07e
Cleaned up bundle() and made bundle.t less confusing Jan Henning Thorsen 4 years ago
2 changed file(s) with 49 addition(s) and 45 deletion(s). Raw diff Collapse all Expand all
5959
6060 sub bundle {
6161 my ($self, $args) = @_;
62 my @topics = ([undef, my $bundle = {}]);
6362 my ($cloner, $tied);
6463
65 $topics[0][0]
64 my $schema
6665 = $args->{schema} ? $self->_resolve($args->{schema}) : $self->schema->data;
66 my @topics = ([$schema, my $bundle = {}, '']); # ([$from, $to], ...);
6767
6868 local $DEFINITIONS = $args->{ref_key} || $DEFINITIONS;
6969 Mojo::Util::deprecated('bundle({ref_key => "..."}) will be removed.')
7171
7272 if ($args->{replace}) {
7373 $cloner = sub {
74 my $from = shift;
75 my $ref = ref $from;
76 $from = $tied->schema if $ref eq 'HASH' and $tied = tied %$from;
77 my $to = $ref eq 'ARRAY' ? [] : $ref eq 'HASH' ? {} : $from;
78 push @topics, [$from, $to] if $ref;
74 my $from = shift;
75 my $from_type = ref $from;
76 $from = $tied->schema if $from_type eq 'HASH' and $tied = tied %$from;
77 my $to = $from_type eq 'ARRAY' ? [] : $from_type eq 'HASH' ? {} : $from;
78 push @topics, [$from, $to] if $from_type;
7979 return $to;
8080 };
8181 }
8686 my $from = shift;
8787 my $from_type = ref $from;
8888
89 if ($from_type eq 'HASH' and my $ref = tied %$from) {
90 return $from
91 if !$args->{schema}
92 and $ref->fqn =~ m!^\Q$self->{root_schema_url}\E\#!;
93
94 my $k = $self->_definitions_key($bundle, $ref, \%seen);
95 push @topics, [$ref->schema, $bundle->{$DEFINITIONS}{$k} ||= {}]
96 unless $seen{$ref->fqn}++;
97 tie my %ref, 'JSON::Validator::Ref', $ref->schema, "#/$DEFINITIONS/$k";
98 return \%ref;
89 $tied = $from_type eq 'HASH' && tied %$from;
90 unless ($tied) {
91 my $to = $from_type eq 'ARRAY' ? [] : $from_type eq 'HASH' ? {} : $from;
92 push @topics, [$from, $to] if $from_type;
93 return $to;
9994 }
10095
101 my $to = $from_type eq 'ARRAY' ? [] : $from_type eq 'HASH' ? {} : $from;
102 push @topics, [$from, $to] if $from_type;
103 return $to;
96 return $from
97 if !$args->{schema}
98 and $tied->fqn =~ m!^\Q$self->{root_schema_url}\E\#!;
99
100 my $k = $self->_definitions_key($bundle, $tied, \%seen);
101 push @topics, [$tied->schema, $bundle->{$DEFINITIONS}{$k} ||= {}]
102 unless $seen{$tied->fqn}++;
103 tie my %ref, 'JSON::Validator::Ref', $tied->schema, "#/$DEFINITIONS/$k";
104 return \%ref;
104105 };
105106 }
106107
2020 $bundled = $jv->bundle({
2121 replace => 1,
2222 schema => {
23 name => {'$ref' => '#/definitions/name'},
24 definitions => {name => {type => 'string'}}
23 definitions => {name => {type => 'string'}},
24 surname => {'$ref' => '#/definitions/name'},
2525 },
2626 });
2727
28 is $bundled->{name}{type}, 'string', "[$n] replace=1";
28 is $bundled->{surname}{type}, 'string', "[$n] replace=1";
2929
3030 note "[$n] replace=0";
3131 $bundled = $jv->schema({
32 name => {'$ref' => '#/definitions/name'},
33 age => {'$ref' => 'b.json#/definitions/age'},
32 surname => {'$ref' => '#/definitions/name'},
33 age => {'$ref' => 'b.json#/definitions/years'},
3434 definitions => {name => {type => 'string'}},
35 B => {id => 'b.json', definitions => {age => {type => 'integer'}}},
35 B => {id => 'b.json', definitions => {years => {type => 'integer'}}},
3636 })->bundle;
37 ok $bundled->{definitions}{name},
38 "[$n] definitions/name still in definitions";
3739 is $bundled->{definitions}{name}{type}, 'string',
38 "[$n] name still in definitions";
39 is $bundled->{definitions}{age}{type}, 'integer', "[$n] added to definitions";
40 isnt $bundled->{age}, $jv->schema->get('/age'), "[$n] new age ref";
41 is $bundled->{name}, $jv->schema->get('/name'), "[$n] same name ref";
42 is $bundled->{age}{'$ref'}, '#/definitions/age',
43 "[$n] age \$ref point to /definitions/age";
44 is $bundled->{name}{'$ref'}, '#/definitions/name',
45 "[$n] name \$ref point to /definitions/name";
40 "[$n] definitions/name/type still in definitions";
41 is $bundled->{definitions}{years}{type}, 'integer',
42 "[$n] added to definitions";
43 isnt $bundled->{age}, $jv->schema->get('/age'), "[$n] new age ref";
44 is $bundled->{surname}, $jv->schema->get('/surname'), "[$n] same surname ref";
45 is $bundled->{age}{'$ref'}, '#/definitions/years',
46 "[$n] age \$ref point to /definitions/years";
47 is $bundled->{surname}{'$ref'}, '#/definitions/name',
48 "[$n] surname \$ref point to /definitions/name";
4649 }
4750
48 is $jv->get([qw(name type)]), 'string', 'get /name/$ref';
49 is $jv->get('/name/type'), 'string', 'get /name/type';
50 is $jv->get('/name/$ref'), undef, 'get /name/$ref';
51 is $jv->schema->get('/name/type'), 'string', 'schema get /name/type';
52 is $jv->schema->get('/name/$ref'), '#/definitions/name',
53 'schema get /name/$ref';
51 is $jv->get([qw(surname type)]), 'string', 'get /surname/$ref';
52 is $jv->get('/surname/type'), 'string', 'get /surname/type';
53 is $jv->get('/surname/$ref'), undef, 'get /surname/$ref';
54 is $jv->schema->get('/surname/type'), 'string', 'schema get /surname/type';
55 is $jv->schema->get('/surname/$ref'), '#/definitions/name',
56 'schema get /surname/$ref';
5457
5558 $bundled = $jv->schema('data://main/bundled.json')->bundle;
5659 is_deeply [sort keys %{$bundled->{definitions}}], ['objtype'],
6669 is_deeply [sort map { s!^[a-z0-9]{10}!SHA!; $_ }
6770 keys %{$bundled->{definitions}}],
6871 [qw(
69 SHA-age_json
70 SHA-unit_json
71 SHA-weight_json
72 height
73 )],
72 SHA-age_json
73 SHA-unit_json
74 SHA-weight_json
75 height
76 )],
7477 'right definitions in disk spec'
7578 or diag explain $bundled->{definitions};
7679 }