automatically turn on quoting for MySQL (RT#60469)
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / Utils.pm
CommitLineData
cc4f11a2 1package # hide from PAUSE
2 DBIx::Class::Schema::Loader::Utils;
3
4use strict;
5use warnings;
61cd4bfc 6use Data::Dumper ();
1ad8e8c3 7use Test::More;
8use namespace::clean;
cc4f11a2 9use Exporter 'import';
10
0f21885a 11our @EXPORT_OK = qw/split_name dumper dumper_squashed eval_package_without_redefine_warnings class_path warnings_exist warnings_exist_silent/;
cc4f11a2 12
13use constant BY_CASE_TRANSITION =>
14 qr/(?<=[[:lower:]\d])[\W_]*(?=[[:upper:]])|[\W_]+/;
15
16use constant BY_NON_ALPHANUM =>
17 qr/[\W_]+/;
18
19sub split_name($) {
20 my $name = shift;
21
22 split $name =~ /[[:upper:]]/ && $name =~ /[[:lower:]]/ ? BY_CASE_TRANSITION : BY_NON_ALPHANUM, $name;
23}
24
15efd63a 25sub dumper($) {
26 my $val = shift;
27
28 my $dd = Data::Dumper->new([]);
29 $dd->Terse(1)->Indent(1)->Useqq(1)->Deparse(1)->Quotekeys(0)->Sortkeys(1);
30 return $dd->Values([ $val ])->Dump;
31}
32
33sub dumper_squashed($) {
34 my $val = shift;
35
36 my $dd = Data::Dumper->new([]);
37 $dd->Terse(1)->Indent(1)->Useqq(1)->Deparse(1)->Quotekeys(0)->Sortkeys(1)->Indent(0);
38 return $dd->Values([ $val ])->Dump;
39}
40
0f21885a 41sub eval_package_without_redefine_warnings {
42 my ($pkg, $code) = @_;
c38ec663 43
44 my $warn_handler = $SIG{__WARN__} || sub { warn @_ };
0f21885a 45
c38ec663 46 local $SIG{__WARN__} = sub {
47 $warn_handler->(@_)
48 unless $_[0] =~ /^Subroutine \S+ redefined/;
49 };
0f21885a 50
51 # This hairiness is to handle people using "use warnings FATAL => 'all';"
52 # in their custom or external content.
53 my @delete_syms;
54 my $try_again = 1;
55
56 while ($try_again) {
57 eval $code;
58
59 if (my ($sym) = $@ =~ /^Subroutine (\S+) redefined/) {
60 delete $INC{ +class_path($pkg) };
61 push @delete_syms, $sym;
62
63 foreach my $sym (@delete_syms) {
64 no strict 'refs';
65 undef *{"${pkg}::${sym}"};
66 }
67 }
68 elsif ($@) {
69 die $@ if $@;
70 }
71 else {
72 $try_again = 0;
73 }
74 }
75}
76
77sub class_path {
78 my $class = shift;
79
80 my $class_path = $class;
81 $class_path =~ s{::}{/}g;
82 $class_path .= '.pm';
83
84 return $class_path;
c38ec663 85}
86
1ad8e8c3 87sub warnings_exist(&$$) {
88 my ($code, $re, $test_name) = @_;
89
90 my $matched = 0;
91
92 my $warn_handler = $SIG{__WARN__} || sub { warn @_ };
93 local $SIG{__WARN__} = sub {
94 if ($_[0] =~ $re) {
95 $matched = 1;
96 }
97 else {
98 $warn_handler->(@_)
99 }
100 };
101
102 $code->();
103
104 ok $matched, $test_name;
105}
106
107sub warnings_exist_silent(&$$) {
108 my ($code, $re, $test_name) = @_;
109
110 my $matched = 0;
111
112 local $SIG{__WARN__} = sub { $matched = 1 if $_[0] =~ $re; };
113
114 $code->();
115
116 ok $matched, $test_name;
117}
118
119
cc4f11a2 1201;
121# vim:et sts=4 sw=4 tw=0: