File Coverage

blib/lib/Bootylicious/Timestamp.pm
Criterion Covered Total %
statement 39 39 100.0
branch 6 8 75.0
condition 7 9 77.7
subroutine 10 10 100.0
pod 1 6 16.6
total 63 72 87.5


line stmt bran cond sub pod time code
1             package Bootylicious::Timestamp;
2              
3 19     19   46824 use strict;
  19         20  
  19         413  
4 19     19   53 use warnings;
  19         33  
  19         382  
5              
6 19     19   59 use base 'Mojo::Base';
  19         19  
  19         7523  
7              
8             require Time::Local;
9             require Time::Piece;
10              
11             __PACKAGE__->attr('epoch');
12              
13             my $TIMESTAMP_RE = qr/(\d\d\d\d)(\d?\d)(\d?\d)(?:T(\d\d):?(\d\d):?(\d\d))?/;
14              
15             sub new {
16 287     287 1 8108 my $self = shift->SUPER::new;
17 287         1423 my %params = @_;
18              
19 287 100       404 if (exists $params{epoch}) {
20 206         382 $self->epoch($params{epoch});
21             }
22             else {
23 81         163 my $epoch = $self->_to_epoch($params{timestamp});
24 81         199 $self->epoch($epoch);
25             }
26              
27 287         1656 return $self;
28             }
29              
30             sub _to_epoch {
31 81     81   77 my $self = shift;
32 81         80 my $timestamp = shift;
33              
34 81 50       1036 return unless $timestamp =~ qr/^$TIMESTAMP_RE$/;
35              
36 81   100     778 my ($year, $month, $day, $hour, $minute, $second) =
      100        
      100        
37             ($1, $2, $3, ($4 || 0), ($5 || 0), ($6 || 0));
38              
39 81         81 my $epoch = 0;
40 81         88 eval {
41 81         317 $epoch =
42             Time::Local::timegm($second, $minute, $hour, $day, $month - 1,
43             $year - 1900);
44             };
45              
46 81 50 33     2249 return if $@ || $epoch < 0;
47              
48 81         130 return $epoch;
49             }
50              
51             sub year {
52 47     47 0 1103 my $self = shift;
53              
54 47         85 return Time::Piece->gmtime($self->epoch)->year;
55             }
56              
57             sub month {
58 39     39 0 400 my $self = shift;
59              
60 39         85 return Time::Piece->gmtime($self->epoch)->mon;
61             }
62              
63             sub timestamp {
64 11     11 0 778 my $self = shift;
65              
66 11         29 my $t = Time::Piece->gmtime($self->epoch);
67              
68 11         537 return $t->strftime('%Y%m%dT%H:%M:%S');
69             }
70              
71             sub strftime {
72 7     7 0 8 my $self = shift;
73 7         7 my $fmt = shift;
74              
75 7         16 my $t = Time::Piece->gmtime($self->epoch);
76              
77 7         271 return $t->strftime($fmt);
78             }
79              
80             sub is_timestamp {
81 2     2 0 348 my $self = shift;
82 2         3 my $timestamp = shift;
83              
84 2 100       41 return $timestamp =~ qr/^$TIMESTAMP_RE$/ ? 1 : 0;
85             }
86              
87             1;