File Coverage

blib/lib/Dancer2/Plugin/Path/Class.pm
Criterion Covered Total %
statement 78 83 93.9
branch 14 22 63.6
condition n/a
subroutine 10 10 100.0
pod n/a
total 102 115 88.7


line stmt bran cond sub pod time code
1             package Dancer2::Plugin::Path::Class;
2              
3             # ABSTRACT: list a directory using Path::Class
4              
5 2     2   457723 use strict;
  2         3  
  2         45  
6 2     2   6 use warnings;
  2         2  
  2         61  
7              
8             our $VERSION = 0.08;
9              
10 2     2   70634 use Dancer2::Plugin;
  2         145081  
  2         10  
11 2     2   22787 use MIME::Types;
  2         3456  
  2         95  
12 2     2   717 use Path::Class;
  2         38498  
  2         91  
13 2     2   771 use Format::Human::Bytes;
  2         659  
  2         1047  
14              
15             sub _decorate_dirs {
16 2     2   3 my ($dir, $dirs) = @_;
17 2         3 my @ls_dirs = ();
18 2         2 for my $basename (@{$dirs}) {
  2         4  
19 1         4 my $subdir = $dir->subdir($basename);
20 1         32 my @subdirs = (); # the subdirs of this subdir
21 1         1 my $file_count = 0; # the number of files in this subdir
22 1         39 while (my $ent = $subdir->next) {
23 5         522 my $subsubname = $ent->basename;
24 5 100       24 next if $subsubname =~ /^\./; # hidden
25 3 50       5 next if $subsubname =~ /~$/; # ignore
26 3 50       7 next unless -r $ent; # can read
27 3 50       90 if ($ent->is_dir) {
28 0         0 push @subdirs, $subsubname;
29             } else {
30 3         17 $file_count++;
31             }
32             }
33 1         36 @subdirs = sort {$a cmp $b} @subdirs;
  0         0  
34 1         6 push @ls_dirs, {
35             name => $basename,
36             subdirs => \@subdirs,
37             file_count => $file_count,
38             };
39             }
40 2         4 return \@ls_dirs;
41             }
42              
43             sub _ymd {
44 3     3   147 my $stamp = shift;
45 3         47 my ($mday, $mon, $year) = (localtime($stamp))[3..5];
46 3         12 my $date = sprintf("%4d-%02d-%02d", $year + 1900, $mon + 1, $mday);
47 3         28 return $date;
48             }
49              
50             sub _decorate_files {
51 2     2   3 my ($dir, $files) = @_;
52 2         3 my @ls_files = ();
53 2         28 my $mt = MIME::Types->new;
54 2         13 for my $basename (@{$files}) {
  2         5  
55 3         8 my $file = $dir->file($basename);
56 3 50       134 next unless -r $file; # can read
57 3         110 my $st = $file->stat;
58 3 50       359 next unless $st; # can stat
59 3         8 my $type = $mt->mimeTypeOf($basename);
60 3         193 push @ls_files, {
61             name => $basename,
62             type => "$type",
63             size => Format::Human::Bytes::base2($st->size),
64             date => _ymd($st->mtime),
65             };
66             }
67 2         12 return \@ls_files;
68             }
69              
70             register ls => sub {
71 2     2   122463 my ($dsl, @args) = @_;
72 2         9 my $dir = dir(@args);
73 2         150 my $ls_name = $dir->basename;
74 2         7 my @dirs = ();
75 2         3 my @files = ();
76 2         2 my $ls_dirs;
77             my $ls_files;
78            
79 2 50       6 if (-d $dir) {
80 2         64 while (my $ent = $dir->next) {
81 8         1031 my $basename = $ent->basename;
82 8 100       41 next if $basename =~ /^\./; # hidden
83 4 50       8 next if $basename =~ /~$/; # ignore
84 4 100       10 if ($ent->is_dir) {
85 1 50       5 next unless -r $ent; # can read
86 1         31 push @dirs, $basename;
87             } else {
88 3         17 push @files, $basename;
89             }
90             }
91 2         95 @dirs = sort {$a cmp $b} @dirs;
  0         0  
92 2         7 $ls_dirs = _decorate_dirs($dir, \@dirs);
93 2         4 @files = sort {$a cmp $b} @files;
  3         4  
94 2         7 $ls_files = _decorate_files($dir, \@files);
95             } else {
96 0         0 push @files, $dir->basename;
97 0         0 $ls_files = _decorate_files($dir->parent, \@files);
98             }
99              
100 2         18 my $ls_cdup = $dsl->app->request->path;
101 2         18 $ls_cdup =~ s{/[^/]*$}{};
102              
103 2         12 $dsl->app->request->var( ls_name => $ls_name );
104 2         16 $dsl->app->request->var( ls_cdup => $ls_cdup );
105 2         12 $dsl->app->request->var( ls_dirs => $ls_dirs );
106 2         10 $dsl->app->request->var( ls_files => $ls_files );
107            
108 2         10 return $dir;
109              
110             };
111              
112             register_plugin;
113             1;
114             __END__