File Coverage

blib/lib/Log/Dispatch/CronoDir.pm
Criterion Covered Total %
statement 72 72 100.0
branch 17 22 77.2
condition 8 12 66.6
subroutine 14 14 100.0
pod 1 2 50.0
total 112 122 91.8


line stmt bran cond sub pod time code
1             package Log::Dispatch::CronoDir;
2 2     2   16508 use 5.008001;
  2         4  
3 2     2   6 use strict;
  2         2  
  2         31  
4 2     2   12 use warnings;
  2         1  
  2         44  
5 2     2   374 use parent qw(Log::Dispatch::Output);
  2         226  
  2         6  
6              
7             our $VERSION = "0.04";
8              
9 2     2   22045 use File::Path qw(make_path);
  2         2  
  2         81  
10 2     2   8 use Params::Validate qw(validate SCALAR BOOLEAN);
  2         2  
  2         67  
11 2     2   7 use Scalar::Util qw(openhandle);
  2         2  
  2         1015  
12              
13             Params::Validate::validation_options(allow_extra => 1);
14              
15             sub new {
16 8     8 1 4326 my ($proto, %args) = @_;
17 8   33     28 my $class = ref $proto || $proto;
18 8         15 my $self = bless {}, $class;
19 8         29 $self->_basic_init(%args);
20 8         591 $self->_init(%args);
21 6         17 $self;
22             }
23              
24             sub _init {
25 8     8   8 my $self = shift;
26 8         233 my %args = validate(
27             @_,
28             { dirname_pattern => { type => SCALAR },
29             permissions => {
30             type => SCALAR,
31             default => 0755,
32             },
33             filename => { type => SCALAR },
34             mode => {
35             type => SCALAR,
36             default => '>>',
37             },
38             binmode => {
39             type => SCALAR,
40             optional => 1,
41             },
42             autoflush => {
43             type => BOOLEAN,
44             default => 1,
45             },
46             }
47             );
48              
49 6         40 my @rules;
50 6         24 $args{dirname_pattern} =~ s{ \% (\w) }{
51             $1 eq 'Y' ? do {
52 6         8 push @rules, { pos => 5, offset => 1900 };
53 6         15 '%04d';
54             } : $1 eq 'm' ? do {
55 6         9 push @rules, { pos => 4, offset => 1 };
56 6         10 '%02d';
57 18 50       44 } : $1 eq 'd' ? do {
    100          
    100          
58 6         7 push @rules, { pos => 3, offset => 0 };
59 6         10 '%02d';
60             } : '';
61             }egx;
62              
63 6         9 $self->{_rules} = \@rules;
64 6         9 $self->{_dirname_pattern} = $args{dirname_pattern};
65 6         6 $self->{_permissions} = $args{permissions};
66 6         5 $self->{_filename} = $args{filename};
67 6         6 $self->{_mode} = $args{mode};
68 6         7 $self->{_binmode} = $args{binmode};
69 6         6 $self->{_autoflush} = $args{autoflush};
70              
71 6         7 $self->_get_current_fh;
72             }
73              
74 3     3   107 sub _localtime { localtime }
75              
76             sub _find_current_dir {
77 10     10   8 my $self = shift;
78 10         14 my @now = _localtime();
79             sprintf(
80             $self->{_dirname_pattern},
81 10         83 map { $now[ $_->{pos} ] + $_->{offset} } @{ $self->{_rules} },
  30         69  
  10         16  
82             );
83             }
84              
85             sub _get_current_fh {
86 10     10   8 my $self = shift;
87 10         13 my $dirname = $self->_find_current_dir;
88              
89 10 100 100     48 if (!exists $self->{_current_dir} || $dirname ne $self->{_current_dir}) {
90             close $self->{_current_fh}
91 7 100 66     24 if $self->{_current_fh} and openhandle($self->{_current_fh});
92              
93 7         1456 make_path $dirname;
94 7         13 $self->{_current_dir} = $dirname;
95 7         61 $self->{_current_filepath} = File::Spec->catfile($dirname, $self->{_filename});
96              
97 7 50       105 chmod $self->{_permissions}, $dirname
98             or die "Failed chmod $dirname to $self->{_permissions}: $!";
99              
100             open my $fh, $self->{_mode}, $self->{_current_filepath}
101 7 50       317 or die "Failed opening file $self->{current_filepath} to write: $!";
102              
103 7 100       18 binmode $fh, $self->{_binmode} if $self->{_binmode};
104              
105             do {
106 7         15 my $oldfh = select $fh;
107 7         11 $| = 1;
108 7         14 select $oldfh;
109 7 50       13 } if $self->{_autoflush};
110              
111 7         19 $self->{_current_fh} = $fh;
112             }
113              
114 10         152 $self->{_current_fh};
115             }
116              
117             sub log_message {
118 4     4 0 1824 my ($self, %args) = @_;
119 4         5 print { $self->_get_current_fh } $args{message}
120 4 50       5 or die "Cannot write to file $self->{_current_file}: $!";
121             }
122              
123             sub DESTROY {
124 8     8   5214 my $self = shift;
125             close $self->{_current_fh}
126 8 100 66     124 if $self->{_current_fh} and openhandle($self->{_current_fh});
127             }
128              
129             1;
130             __END__