File Coverage

blib/lib/Rose/DB/Object/Metadata/Util.pm
Criterion Covered Total %
statement 6 89 6.7
branch 0 72 0.0
condition 0 17 0.0
subroutine 2 10 20.0
pod 0 6 0.0
total 8 194 4.1


line stmt bran cond sub pod time code
1             package Rose::DB::Object::Metadata::Util;
2              
3 61     61   421 use strict;
  61         165  
  61         1812  
4              
5 61     61   322 use Carp();
  61         128  
  61         94228  
6              
7             require Exporter;
8             our @ISA = qw(Exporter);
9              
10             our @EXPORT_OK =
11             qw(perl_hashref perl_arrayref perl_quote_key perl_quote_value
12             hash_key_padding);
13             our %EXPORT_TAGS = (all => \@EXPORT_OK);
14              
15             our $DEFAULT_PERL_INDENT = 4;
16             our $DEFAULT_PERL_BRACES = 'k&r';
17              
18             our $VERSION = '0.817';
19              
20             sub perl_hashref
21             {
22 0 0   0 0   my(%args) = (@_ == 1 ? (hash => $_[0]) : @_);
23              
24 0 0         my $inline = defined $args{'inline'} ? $args{'inline'} : ($args{'inline'} = 1);
25 0 0         my $indent = defined $args{'indent'} ? $args{'indent'} : ($args{'indent'} = $DEFAULT_PERL_INDENT);
26 0 0         my $braces = defined $args{'braces'} ? $args{'braces'} : ($args{'braces'} = $DEFAULT_PERL_BRACES);
27 0 0         my $level = defined $args{'level'} ? $args{'level'} : ($args{'level'} = 0);
28 0           my $no_curlies = delete $args{'no_curlies'};
29 0   0       my $key_padding = $args{'key_padding'} || 0;
30 0           my $inline_limit = $args{'inline_limit'};
31              
32 0   0 0     my $sort_keys = $args{'sort_keys'} || sub { lc $_[0] cmp lc $_[1] };
  0            
33              
34 0           my $hash = delete $args{'hash'};
35              
36 0           my $indent_txt = ' ' x ($indent * ($level + 1));
37 0           my $sub_indent = ' ' x ($indent * $level);
38              
39 0           my @pairs;
40              
41 0           foreach my $key (sort { $sort_keys->($a, $b) } keys %$hash)
  0            
42             {
43             push(@pairs, sprintf('%-*s => ', $key_padding, perl_quote_key($key)) .
44 0           perl_value(value => $hash->{$key}, %args));
45             }
46              
47 0           my($inline_perl, $perl);
48              
49 0 0         $inline_perl = ($no_curlies ? '' : '{ ') . join(', ', @pairs) . ($no_curlies ? '' : ' }');
    0          
50              
51 0 0         if($braces eq 'bsd')
    0          
52             {
53 0 0         $perl = "\n${sub_indent}" . ($no_curlies ? '' : "{\n");
54             }
55             elsif($braces eq 'k&r')
56             {
57 0 0         $perl = "{\n" unless($no_curlies);
58             }
59             else
60             {
61 0 0         Carp::croak 'Invalid ', (defined $args{'braces'} ? '' : 'default '),
62             "brace style: '$braces'";
63             }
64              
65 0 0         $perl .= join(",\n", map { "$indent_txt$_" } @pairs) . ',' .
  0            
66             ($no_curlies ? '' : "\n$sub_indent}");
67              
68 0 0 0       if(defined $inline_limit && length($inline_perl) > $inline_limit)
69             {
70 0           return $perl;
71             }
72              
73 0 0         return $inline ? $inline_perl : $perl;
74             }
75              
76             sub perl_arrayref
77             {
78 0 0   0 0   my(%args) = (@_ == 1 ? (array => $_[0]) : @_);
79              
80 0 0         my $inline = defined $args{'inline'} ? $args{'inline'} : ($args{'inline'} = 1);
81 0 0         my $indent = defined $args{'indent'} ? $args{'indent'} : ($args{'indent'} = $DEFAULT_PERL_INDENT);
82 0 0         my $braces = defined $args{'braces'} ? $args{'braces'} : ($args{'braces'} = $DEFAULT_PERL_BRACES);
83 0 0         my $level = defined $args{'level'} ? $args{'level'} : ($args{'level'} = 0);
84 0   0       my $key_padding = $args{'key_padding'} || 0;
85 0           my $inline_limit = $args{'inline_limit'};
86              
87 0   0 0     my $sort_keys = $args{'sort_keys'} || sub { lc $_[0] cmp lc $_[1] };
  0            
88              
89 0           my $array = delete $args{'array'};
90              
91 0           my $indent_txt = ' ' x ($indent * ($level + 1));
92 0           my $sub_indent = ' ' x ($indent * $level);
93              
94 0           my @items;
95              
96 0           foreach my $item (@$array)
97             {
98 0           push(@items, perl_value(value => $item, %args));
99             }
100              
101 0           my($inline_perl, $perl);
102              
103 0           $inline_perl = '[ ' . join(', ', @items) . ' ]';
104              
105 0 0         if($braces eq 'bsd')
    0          
106             {
107 0           $perl = "\n${sub_indent}\[\n";
108             }
109             elsif($braces eq 'k&r')
110             {
111 0           $perl = "[\n";
112             }
113             else
114             {
115 0 0         Carp::croak 'Invalid ', (defined $args{'braces'} ? '' : 'default '),
116             "brace style: '$braces'";
117             }
118              
119 0           $perl .= join(",\n", map { "$indent_txt$_" } @items) . ",\n$sub_indent]";
  0            
120              
121 0 0 0       if(defined $inline_limit && length($inline_perl) > $inline_limit)
122             {
123 0           return $perl;
124             }
125              
126 0 0         return $inline ? $inline_perl : $perl;
127             }
128              
129             sub perl_value
130             {
131 0 0   0 0   my(%args) = (@_ == 1 ? (value => $_[0]) : @_);
132              
133 0           my $value = delete $args{'value'};
134              
135 0           $args{'level'}++;
136              
137 0 0         if(my $ref = ref $value)
138             {
139 0 0         if($ref eq 'ARRAY')
    0          
140             {
141 0           return perl_arrayref(array => $value, %args);
142             }
143             elsif($ref eq 'HASH')
144             {
145 0           $args{'key_padding'} = hash_key_padding($value);
146 0           delete $args{'inline'};
147 0           return perl_hashref(hash => $value, %args);
148             }
149             else
150             {
151 0           return $value;
152             }
153             }
154              
155 0           return perl_quote_value($value)
156             }
157              
158             sub hash_key_padding
159             {
160 0     0 0   my($hash) = shift;
161              
162 0           my $max_len = 0;
163 0           my $min_len = -1;
164              
165 0           foreach my $name (keys %$hash)
166             {
167 0 0         $max_len = length($name) if(length $name > $max_len);
168 0 0 0       $min_len = length($name) if(length $name < $min_len || $min_len < 0);
169             }
170              
171 0           return $max_len;
172             }
173              
174             sub perl_quote_key
175             {
176 0     0 0   my($key) = shift;
177              
178 0 0         return $key if($key =~ /^\d+$/);
179              
180 0           for($key)
181             {
182 0 0         s/'/\\'/g if(/'/);
183 0 0         $_ = "'$_'" if(/\W/);
184             }
185              
186 0           return $key;
187             }
188              
189             sub perl_quote_value
190             {
191 0     0 0   my($val) = shift;
192              
193 0           for($val)
194             {
195 0 0         s/'/\\'/g if(/'/);
196 0 0         $_ = "'$_'" unless(/^(?:[1-9]\d*\.?\d*|\.\d+)$/);
197             }
198              
199 0           return $val;
200             }
201              
202             1;