File Coverage

blib/lib/Evo/Path.pm
Criterion Covered Total %
statement 44 44 100.0
branch 22 32 68.7
condition n/a
subroutine 8 8 100.0
pod 2 4 50.0
total 76 88 86.3


line stmt bran cond sub pod time code
1             package Evo::Path;
2 9     9   5571 use Evo -Class, 'Carp croak';
  9         20  
  9         80  
3             use overload
4 888     888   4108 '""' => sub { shift->to_string },
5 9     9   1026 fallback => 1;
  9         787  
  9         90  
6              
7             has base => '/';
8             has children => sub { [] };
9              
10 662 50   662   1408 my sub _split ($safe, $path) {
  662 50       1323  
  662         948  
  662         932  
  662         912  
11 662 100       1353 return if !$path;
12 659 100       1378 return grep { !!$_ } split '/', $path if !$safe;
  6         39  
13             grep {
14 1015 100       6909 $_ ne '..'
15             ? 1
16             : croak qq#unsafe "$path", use "append_unsafe" instead (or \$fs->cd('..'))#
17 656 100       1701 } grep { !!$_ && $_ ne '.' } split '/', $path;
  1467         5766  
18             }
19              
20 83 50   83 1 529 sub append ($self, $path) {
  83 50       193  
  83         122  
  83         135  
  83         107  
21 83         360 (ref $self)->new(base => $self->base, children => [$self->children->@*, _split(1, $path)]);
22             }
23              
24 3 50   3 1 15 sub append_unsafe ($self, $path) {
  3 50       16  
  3         9  
  3         9  
  3         8  
25 3         34 (ref $self)->new(base => $self->base, children => [$self->children->@*, _split(0, $path)]);
26             }
27              
28 1465 50   1465 0 3785 sub to_string($self) {
  1465 50       2757  
  1465         2005  
  1465         1925  
29 1465         2867 my $base = $self->base;
30 1465 100       3900 $base .= '/' unless $base =~ m#/$#;
31 1465         19721 $base . join '/', $self->children->@*;
32             }
33              
34 576 50   576 0 8557 sub from_string ($me, $path = undef, $base = '/') {
  576 50       1265  
  576 100       943  
  576         874  
  576         1158  
  576         753  
35 576         1214 $me->new(base => $base, children => [_split(1, $path)]);
36             }
37              
38             1;
39              
40             __END__