clarify use_moose doc
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 23dumpmore.t
CommitLineData
605fcea8 1use strict;
2use Test::More;
605fcea8 3use File::Path;
ff746964 4use IPC::Open3;
f170d55b 5use Data::Dumper::Concise;
73099af4 6use DBIx::Class::Schema::Loader ();
7use File::Temp 'tempfile';
8use lib qw(t/lib);
605fcea8 9
a4187fdf 10my $DUMP_PATH = './t/_dump';
605fcea8 11
f812ef60 12my $TEST_DB_CLASS = 'make_dbictest_db';
13
ff746964 14sub dump_directly {
a4187fdf 15 my %tdata = @_;
605fcea8 16
a4187fdf 17 my $schema_class = $tdata{classname};
605fcea8 18
19 no strict 'refs';
20 @{$schema_class . '::ISA'} = ('DBIx::Class::Schema::Loader');
ff746964 21 $schema_class->loader_options(%{$tdata{options}});
605fcea8 22
a4187fdf 23 my @warns;
605fcea8 24 eval {
a4187fdf 25 local $SIG{__WARN__} = sub { push(@warns, @_) };
f812ef60 26 $schema_class->connect(get_dsn(\%tdata));
605fcea8 27 };
28 my $err = $@;
29 $schema_class->storage->disconnect if !$err && $schema_class->storage;
30 undef *{$schema_class};
a4187fdf 31
8048320c 32 check_error($err, $tdata{error});
a4187fdf 33
ff746964 34 return @warns;
35}
36
37sub dump_dbicdump {
38 my %tdata = @_;
39
17ca645f 40 # use $^X so we execute ./script/dbicdump with the same perl binary that the tests were executed with
41 my @cmd = ($^X, qw(./script/dbicdump));
ff746964 42
43 while (my ($opt, $val) = each(%{ $tdata{options} })) {
f170d55b 44 $val = Dumper($val) if ref $val;
ff746964 45 push @cmd, '-o', "$opt=$val";
46 }
47
f812ef60 48 push @cmd, $tdata{classname}, get_dsn(\%tdata);
ff746964 49
17ca645f 50 # make sure our current @INC gets used by dbicdump
f1059ad4 51 use Config;
8048320c 52 local $ENV{PERL5LIB} = join $Config{path_sep}, @INC, ($ENV{PERL5LIB} || '');
17ca645f 53
ff746964 54 my ($in, $out, $err);
55 my $pid = open3($in, $out, $err, @cmd);
56
8048320c 57 my @out = <$out>;
ff746964 58 waitpid($pid, 0);
59
8048320c 60 my ($error, @warns);
61
62 if ($? >> 8 != 0) {
63 $error = $out[0];
64 check_error($error, $tdata{error});
65 }
66 else {
67 @warns = @out;
68 }
69
ff746964 70 return @warns;
71}
72
f812ef60 73sub get_dsn {
74 my $opts = shift;
75
76 my $test_db_class = $opts->{test_db_class} || $TEST_DB_CLASS;
77
78 eval "require $test_db_class;";
79 die $@ if $@;
80
81 my $dsn = do {
82 no strict 'refs';
83 ${$test_db_class . '::dsn'};
84 };
85
86 return $dsn;
87}
88
8048320c 89sub check_error {
90 my ($got, $expected) = @_;
91
c9cf9b4d 92 return unless $got;
93
94 if (not $expected) {
95 fail "Unexpected error in " . ((caller(1))[3]) . ": $got";
96 return;
97 }
8048320c 98
99 if (ref $expected eq 'Regexp') {
100 like $got, $expected, 'error matches expected pattern';
101 return;
102 }
103
104 is $got, $expected, 'error matches';
105}
106
ff746964 107sub do_dump_test {
108 my %tdata = @_;
109
110 $tdata{options}{dump_directory} = $DUMP_PATH;
f22644d7 111 $tdata{options}{use_namespaces} ||= 0;
ff746964 112
113 for my $dumper (\&dump_directly, \&dump_dbicdump) {
114 test_dumps(\%tdata, $dumper->(%tdata));
115 }
116}
117
118sub test_dumps {
119 my ($tdata, @warns) = @_;
120
121 my %tdata = %{$tdata};
122
123 my $schema_class = $tdata{classname};
a4187fdf 124 my $check_warns = $tdata{warnings};
ff746964 125 is(@warns, @$check_warns, "$schema_class warning count");
8048320c 126
a4187fdf 127 for(my $i = 0; $i <= $#$check_warns; $i++) {
ff746964 128 like($warns[$i], $check_warns->[$i], "$schema_class warning $i");
a4187fdf 129 }
130
131 my $file_regexes = $tdata{regexes};
132 my $file_neg_regexes = $tdata{neg_regexes} || {};
133 my $schema_regexes = delete $file_regexes->{schema};
134
135 my $schema_path = $DUMP_PATH . '/' . $schema_class;
136 $schema_path =~ s{::}{/}g;
f812ef60 137
138 dump_file_like($schema_path . '.pm', @$schema_regexes) if $schema_regexes;
139
a4187fdf 140 foreach my $src (keys %$file_regexes) {
141 my $src_file = $schema_path . '/' . $src . '.pm';
142 dump_file_like($src_file, @{$file_regexes->{$src}});
143 }
144 foreach my $src (keys %$file_neg_regexes) {
145 my $src_file = $schema_path . '/' . $src . '.pm';
146 dump_file_not_like($src_file, @{$file_neg_regexes->{$src}});
147 }
605fcea8 148}
149
a4187fdf 150sub dump_file_like {
151 my $path = shift;
152 open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!";
153 my $contents = do { local $/; <$dumpfh>; };
154 close($dumpfh);
c9cf9b4d 155 like($contents, $_, "$path matches $_") for @_;
a4187fdf 156}
605fcea8 157
a4187fdf 158sub dump_file_not_like {
159 my $path = shift;
160 open(my $dumpfh, '<', $path) or die "Failed to open '$path': $!";
161 my $contents = do { local $/; <$dumpfh>; };
162 close($dumpfh);
c9cf9b4d 163 unlike($contents, $_, "$path does not match $_") for @_;
605fcea8 164}
165
a4187fdf 166sub append_to_class {
167 my ($class, $string) = @_;
168 $class =~ s{::}{/}g;
169 $class = $DUMP_PATH . '/' . $class . '.pm';
170 open(my $appendfh, '>>', $class) or die "Failed to open '$class' for append: $!";
171 print $appendfh $string;
172 close($appendfh);
173}
174
175rmtree($DUMP_PATH, 1, 1);
176
6dde4613 177# test loading external content
178do_dump_test(
179 classname => 'DBICTest::Schema::13',
6dde4613 180 warnings => [
181 qr/Dumping manual schema for DBICTest::Schema::13 to directory /,
182 qr/Schema dump completed/,
183 ],
184 regexes => {
185 Foo => [
186qr/package DBICTest::Schema::13::Foo;\nour \$skip_me = "bad mojo";\n1;/
187 ],
188 },
189);
190
191# test skipping external content
192do_dump_test(
193 classname => 'DBICTest::Schema::14',
194 options => { skip_load_external => 1 },
6dde4613 195 warnings => [
196 qr/Dumping manual schema for DBICTest::Schema::14 to directory /,
197 qr/Schema dump completed/,
198 ],
199 neg_regexes => {
200 Foo => [
201qr/package DBICTest::Schema::14::Foo;\nour \$skip_me = "bad mojo";\n1;/
202 ],
203 },
204);
205
206rmtree($DUMP_PATH, 1, 1);
207
73099af4 208# test config_file
209
210my ($fh, $config_file) = tempfile;
211
212print $fh <<'EOF';
213{ skip_relationships => 1 }
214EOF
215close $fh;
216
217do_dump_test(
218 classname => 'DBICTest::Schema::14',
219 options => { config_file => $config_file },
73099af4 220 warnings => [
221 qr/Dumping manual schema for DBICTest::Schema::14 to directory /,
222 qr/Schema dump completed/,
223 ],
224 neg_regexes => {
225 Foo => [
226 qr/has_many/,
227 ],
228 },
229);
230
231unlink $config_file;
232
f812ef60 233rmtree($DUMP_PATH, 1, 1);
234
c9cf9b4d 235eval "use Moose; use MooseX::NonMoose; use namespace::autoclean;";
236if (not $@) {
237
238# first dump a fresh use_moose=1 schema
239
240do_dump_test(
241 classname => 'DBICTest::DumpMore::1',
242 options => {
243 use_moose => 1,
244 result_base_class => 'My::ResultBaseClass',
245 schema_base_class => 'My::SchemaBaseClass',
246 },
247 warnings => [
248 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
249 qr/Schema dump completed/,
250 ],
251 regexes => {
252 schema => [
253qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::SchemaBaseClass';\n\n/,
254qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
255 ],
256 Foo => [
257qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::ResultBaseClass';\n\n/,
258qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
259 ],
260 Bar => [
261qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::ResultBaseClass';\n\n/,
262qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
263 ],
264 },
265);
266
267# now upgrade a non-moose schema to use_moose=1
268
269rmtree($DUMP_PATH, 1, 1);
270
271do_dump_test(
272 classname => 'DBICTest::DumpMore::1',
273 options => {
274 result_base_class => 'My::ResultBaseClass',
275 schema_base_class => 'My::SchemaBaseClass',
276 },
277 warnings => [
278 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
279 qr/Schema dump completed/,
280 ],
281 regexes => {
282 schema => [
283 qr/\nuse base 'My::SchemaBaseClass';\n/,
284 ],
285 Foo => [
286 qr/\nuse base 'My::ResultBaseClass';\n/,
287 ],
288 Bar => [
289 qr/\nuse base 'My::ResultBaseClass';\n/,
290 ],
291 },
292);
293
294# check that changed custom content is upgraded for Moose bits
295append_to_class('DBICTest::DumpMore::1::Foo', q{# XXX This is my custom content XXX});
296
297do_dump_test(
298 classname => 'DBICTest::DumpMore::1',
299 options => {
300 use_moose => 1,
301 result_base_class => 'My::ResultBaseClass',
302 schema_base_class => 'My::SchemaBaseClass',
303 },
304 warnings => [
305 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
306 qr/Schema dump completed/,
307 ],
308 regexes => {
309 schema => [
310qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::SchemaBaseClass';\n\n/,
311qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
312 ],
313 Foo => [
314qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::ResultBaseClass';\n\n/,
315qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
316 ],
317 Bar => [
318qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::ResultBaseClass';\n\n/,
319qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
320 ],
321 },
322);
323
324# now add the Moose custom content to unapgraded schema, and make sure it is not repeated
325
326rmtree($DUMP_PATH, 1, 1);
327
328do_dump_test(
329 classname => 'DBICTest::DumpMore::1',
330 options => {
331 result_base_class => 'My::ResultBaseClass',
332 schema_base_class => 'My::SchemaBaseClass',
333 },
334 warnings => [
335 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
336 qr/Schema dump completed/,
337 ],
338 regexes => {
339 schema => [
340 qr/\nuse base 'My::SchemaBaseClass';\n/,
341 ],
342 Foo => [
343 qr/\nuse base 'My::ResultBaseClass';\n/,
344 ],
345 Bar => [
346 qr/\nuse base 'My::ResultBaseClass';\n/,
347 ],
348 },
349);
350
351# add Moose custom content then check it is not repeated
352
353append_to_class('DBICTest::DumpMore::1::Foo', qq{__PACKAGE__->meta->make_immutable;\n1;\n});
354
355do_dump_test(
356 classname => 'DBICTest::DumpMore::1',
357 options => {
358 use_moose => 1,
359 result_base_class => 'My::ResultBaseClass',
360 schema_base_class => 'My::SchemaBaseClass',
361 },
362 warnings => [
363 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
364 qr/Schema dump completed/,
365 ],
366 regexes => {
367 schema => [
368qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::SchemaBaseClass';\n\n/,
369qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
370 ],
371 Foo => [
372qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::ResultBaseClass';\n\n/,
373qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
374 ],
375 Bar => [
376qr/\nuse Moose;\nuse MooseX::NonMoose;\nuse namespace::autoclean;\nextends 'My::ResultBaseClass';\n\n/,
377qr/\n__PACKAGE__->meta->make_immutable;\n1;(?!\n1;\n)\n.*/,
378 ],
379 },
380 neg_regexes => {
381 Foo => [
382qr/\n__PACKAGE__->meta->make_immutable;\n.*\n__PACKAGE__->meta->make_immutable;/s,
383 ],
384 },
385);
386
387
388}
389else {
390 SKIP: { skip 'use_moose=1 deps not installed', 1 };
391}
392
393rmtree($DUMP_PATH, 1, 1);
394
f812ef60 395do_dump_test(
396 classname => 'DBICTest::Schema::14',
397 test_db_class => 'make_dbictest_db_clashing_monikers',
398 error => qr/tables 'bar', 'bars' reduced to the same source moniker 'Bar'/,
399);
400
401rmtree($DUMP_PATH, 1, 1);
402
9de8c789 403# test out the POD
404
a4187fdf 405do_dump_test(
406 classname => 'DBICTest::DumpMore::1',
f170d55b 407 options => {
408 custom_column_info => sub {
409 my ($table, $col, $info) = @_;
410 return +{ extra => { is_footext => 1 } } if $col eq 'footext';
411 }
412 },
a4187fdf 413 warnings => [
414 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
415 qr/Schema dump completed/,
416 ],
417 regexes => {
418 schema => [
419 qr/package DBICTest::DumpMore::1;/,
420 qr/->load_classes/,
421 ],
422 Foo => [
9de8c789 423qr/package DBICTest::DumpMore::1::Foo;/,
424qr/=head1 NAME\n\nDBICTest::DumpMore::1::Foo\n\n=cut\n\n/,
425qr/=head1 ACCESSORS\n\n/,
c9cf9b4d 426qr/=head2 fooid\n\n data_type: 'integer'\n is_auto_increment: 1\n is_nullable: 0\n\n/,
517a30e2 427qr/=head2 footext\n\n data_type: 'text'\n default_value: 'footext'\n extra: {is_footext => 1}\n is_nullable: 1\n\n/,
9de8c789 428qr/->set_primary_key/,
429qr/=head1 RELATIONS\n\n/,
430qr/=head2 bars\n\nType: has_many\n\nRelated object: L<DBICTest::DumpMore::1::Bar>\n\n=cut\n\n/,
431qr/1;\n$/,
a4187fdf 432 ],
433 Bar => [
9de8c789 434qr/package DBICTest::DumpMore::1::Bar;/,
435qr/=head1 NAME\n\nDBICTest::DumpMore::1::Bar\n\n=cut\n\n/,
436qr/=head1 ACCESSORS\n\n/,
c9cf9b4d 437qr/=head2 barid\n\n data_type: 'integer'\n is_auto_increment: 1\n is_nullable: 0\n\n/,
517a30e2 438qr/=head2 fooref\n\n data_type: 'integer'\n is_foreign_key: 1\n is_nullable: 1\n\n/,
9de8c789 439qr/->set_primary_key/,
440qr/=head1 RELATIONS\n\n/,
441qr/=head2 fooref\n\nType: belongs_to\n\nRelated object: L<DBICTest::DumpMore::1::Foo>\n\n=cut\n\n/,
442qr/1;\n$/,
a4187fdf 443 ],
444 },
445);
446
447append_to_class('DBICTest::DumpMore::1::Foo',q{# XXX This is my custom content XXX});
448
449do_dump_test(
450 classname => 'DBICTest::DumpMore::1',
a4187fdf 451 warnings => [
452 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
453 qr/Schema dump completed/,
454 ],
455 regexes => {
456 schema => [
457 qr/package DBICTest::DumpMore::1;/,
458 qr/->load_classes/,
459 ],
460 Foo => [
461 qr/package DBICTest::DumpMore::1::Foo;/,
462 qr/->set_primary_key/,
463 qr/1;\n# XXX This is my custom content XXX/,
464 ],
465 Bar => [
466 qr/package DBICTest::DumpMore::1::Bar;/,
467 qr/->set_primary_key/,
468 qr/1;\n$/,
469 ],
470 },
471);
605fcea8 472
a4187fdf 473do_dump_test(
474 classname => 'DBICTest::DumpMore::1',
28b4691d 475 options => { really_erase_my_files => 1 },
a4187fdf 476 warnings => [
477 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
478 qr/Deleting existing file /,
479 qr/Deleting existing file /,
480 qr/Deleting existing file /,
481 qr/Schema dump completed/,
482 ],
483 regexes => {
484 schema => [
485 qr/package DBICTest::DumpMore::1;/,
486 qr/->load_classes/,
487 ],
488 Foo => [
489 qr/package DBICTest::DumpMore::1::Foo;/,
490 qr/->set_primary_key/,
491 qr/1;\n$/,
492 ],
493 Bar => [
494 qr/package DBICTest::DumpMore::1::Bar;/,
495 qr/->set_primary_key/,
496 qr/1;\n$/,
497 ],
498 },
499 neg_regexes => {
500 Foo => [
501 qr/# XXX This is my custom content XXX/,
502 ],
492dce8d 503 },
504);
505
eac5494b 506rmtree($DUMP_PATH, 1, 1);
507
492dce8d 508do_dump_test(
509 classname => 'DBICTest::DumpMore::1',
510 options => { use_namespaces => 1, generate_pod => 0 },
492dce8d 511 warnings => [
512 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
513 qr/Schema dump completed/,
514 ],
515 neg_regexes => {
516 'Result/Foo' => [
517 qr/^=/m,
518 ],
a4187fdf 519 },
520);
605fcea8 521
eac5494b 522rmtree($DUMP_PATH, 1, 1);
523
f44ecc2f 524do_dump_test(
525 classname => 'DBICTest::DumpMore::1',
69219349 526 options => { db_schema => 'foo_schema', qualify_objects => 1, use_namespaces => 1 },
527 warnings => [
528 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
529 qr/Schema dump completed/,
530 ],
531 regexes => {
532 'Result/Foo' => [
533 qr/^\Q__PACKAGE__->table("foo_schema.foo");\E/m,
414c61a0 534 # the has_many relname should not have the schema in it!
535 qr/^__PACKAGE__->has_many\(\n "bars"/m,
69219349 536 ],
537 },
538);
539
540rmtree($DUMP_PATH, 1, 1);
541
542do_dump_test(
543 classname => 'DBICTest::DumpMore::1',
f44ecc2f 544 options => { use_namespaces => 1 },
f44ecc2f 545 warnings => [
546 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
547 qr/Schema dump completed/,
548 ],
549 regexes => {
550 schema => [
551 qr/package DBICTest::DumpMore::1;/,
552 qr/->load_namespaces/,
553 ],
554 'Result/Foo' => [
555 qr/package DBICTest::DumpMore::1::Result::Foo;/,
556 qr/->set_primary_key/,
557 qr/1;\n$/,
558 ],
559 'Result/Bar' => [
560 qr/package DBICTest::DumpMore::1::Result::Bar;/,
561 qr/->set_primary_key/,
562 qr/1;\n$/,
563 ],
564 },
565);
566
eac5494b 567rmtree($DUMP_PATH, 1, 1);
568
f44ecc2f 569do_dump_test(
570 classname => 'DBICTest::DumpMore::1',
571 options => { use_namespaces => 1,
572 result_namespace => 'Res',
573 resultset_namespace => 'RSet',
574 default_resultset_class => 'RSetBase',
575 },
f44ecc2f 576 warnings => [
577 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
578 qr/Schema dump completed/,
579 ],
580 regexes => {
581 schema => [
582 qr/package DBICTest::DumpMore::1;/,
583 qr/->load_namespaces/,
584 qr/result_namespace => 'Res'/,
585 qr/resultset_namespace => 'RSet'/,
586 qr/default_resultset_class => 'RSetBase'/,
587 ],
588 'Res/Foo' => [
589 qr/package DBICTest::DumpMore::1::Res::Foo;/,
590 qr/->set_primary_key/,
591 qr/1;\n$/,
592 ],
593 'Res/Bar' => [
594 qr/package DBICTest::DumpMore::1::Res::Bar;/,
595 qr/->set_primary_key/,
596 qr/1;\n$/,
597 ],
598 },
599);
600
eac5494b 601rmtree($DUMP_PATH, 1, 1);
602
f44ecc2f 603do_dump_test(
604 classname => 'DBICTest::DumpMore::1',
605 options => { use_namespaces => 1,
606 result_namespace => '+DBICTest::DumpMore::1::Res',
607 resultset_namespace => 'RSet',
608 default_resultset_class => 'RSetBase',
9c9c2f2b 609 result_base_class => 'My::ResultBaseClass',
610 schema_base_class => 'My::SchemaBaseClass',
f44ecc2f 611 },
f44ecc2f 612 warnings => [
613 qr/Dumping manual schema for DBICTest::DumpMore::1 to directory /,
614 qr/Schema dump completed/,
615 ],
616 regexes => {
617 schema => [
618 qr/package DBICTest::DumpMore::1;/,
619 qr/->load_namespaces/,
620 qr/result_namespace => '\+DBICTest::DumpMore::1::Res'/,
621 qr/resultset_namespace => 'RSet'/,
622 qr/default_resultset_class => 'RSetBase'/,
9c9c2f2b 623 qr/use base 'My::SchemaBaseClass'/,
f44ecc2f 624 ],
625 'Res/Foo' => [
626 qr/package DBICTest::DumpMore::1::Res::Foo;/,
9c9c2f2b 627 qr/use base 'My::ResultBaseClass'/,
f44ecc2f 628 qr/->set_primary_key/,
629 qr/1;\n$/,
630 ],
631 'Res/Bar' => [
632 qr/package DBICTest::DumpMore::1::Res::Bar;/,
9c9c2f2b 633 qr/use base 'My::ResultBaseClass'/,
f44ecc2f 634 qr/->set_primary_key/,
635 qr/1;\n$/,
636 ],
637 },
638);
c634fde9 639
eac5494b 640rmtree($DUMP_PATH, 1, 1);
641
8048320c 642do_dump_test(
643 classname => 'DBICTest::DumpMore::1',
644 options => {
645 use_namespaces => 1,
646 result_base_class => 'My::MissingResultBaseClass',
647 },
648 error => qr/My::MissingResultBaseClass.*is not installed/,
649);
f44ecc2f 650
d27f2b7b 651done_testing;
652
9de8c789 653END { rmtree($DUMP_PATH, 1, 1) unless $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP} }
69219349 654# vim:et sts=4 sw=4 tw=0: