File Coverage

blib/lib/WebService/IMDB/Date.pm
Criterion Covered Total %
statement 31 39 79.4
branch 17 30 56.6
condition 15 21 71.4
subroutine 6 6 100.0
pod n/a
total 69 96 71.8


line stmt bran cond sub pod time code
1             # $Id: Date.pm 7370 2012-04-09 01:17:33Z chris $
2              
3             =head1 NAME
4              
5             WebService::IMDB::Date
6              
7             =head1 DESCRIPTION
8              
9             Constructor always returns a L.
10              
11             =cut
12              
13             package WebService::IMDB::Date;
14              
15 2     2   12 use strict;
  2         2  
  2         71  
16 2     2   10 use warnings;
  2         5  
  2         86  
17              
18             our $VERSION = '0.05';
19              
20 2     2   11 use Carp;
  2         4  
  2         157  
21             our @CARP_NOT = qw(WebService::IMDB WebService::IMDB::Trivium);
22              
23 2     2   2420 use DateTime::Format::Strptime;
  2         418071  
  2         170  
24 2     2   2661 use DateTime::Incomplete;
  2         128825  
  2         1497  
25              
26              
27             sub _new {
28 97     97   171 my $class = shift;
29 97         112 my $ws = shift;
30 97 50       207 my $data = shift or die;
31              
32 97 100 100     843 if (ref $data eq "HASH" && exists $data->{'normal'} && defined $data->{'normal'}) {
    100 66        
    50 66        
      33        
33             # TODO: Check whehter locale affects this.
34 75         131 my $dt = $data->{'normal'};
35 75 50       550 my ($y, $m, $d) = $dt =~ m/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/ or die "Failed to parse '$dt'";
36 75 100 66     556 if (defined $y && defined $m && defined $d) {
    100 100        
    50 66        
37 68         283 return DateTime::Incomplete->new('year' => $y, 'month' => $m, 'day' => $d);
38             } elsif (defined $y && defined $m) {
39 2         21 return DateTime::Incomplete->new('year' => $y, 'month' => $m);
40             } elsif (defined $y) {
41 5         19 return DateTime::Incomplete->new('year' => $y);
42             } else {
43 0         0 die "";
44             }
45              
46             } elsif (ref $data eq "HASH" && exists $data->{'text'}) {
47              
48 1 50       7 if (!defined $data->{'text'}) { # A bit hacky, but not sure how else to deal with this.
49 0         0 return undef;
50             } else {
51             # Some 'text' dates are actually parseable, e.g. those of the format "July 14, 2007". Attempt to detect them
52             # and parse to a DateTime::Incomplete
53 1         14 my $d = DateTime::Format::Strptime->new('pattern' => "%B %d, %Y", 'on_error' => "undef")->parse_datetime($data->{'text'});
54 1 50       787 if (defined $d) {
    50          
    50          
55 0         0 return DateTime::Incomplete->new('year' => $d->year(), 'month' => $d->month(), 'day' => $d->day());
56              
57             } elsif ($data->{'text'} =~ m/^\d{1,2}\/\d{2}$/) {
58 0 0       0 my ($m, $y) = $data->{'text'} =~ m/^(\d{1,2})\/(\d{2})$/ or die "Failed to parse '$data->{'text'}'";
59 0         0 return DateTime::Incomplete->new('year' => $y, 'month' => $m);
60              
61             } elsif ($data->{'text'} =~ m/^\d{1,2}\/\d{1,2}\/\d{2}$/) {
62 0 0       0 my ($m, $d, $y) = $data->{'text'} =~ m/^(\d{1,2})\/(\d{1,2})\/(\d{2})$/ or die "Failed to parse '$data->{'text'}'";
63 0         0 return DateTime::Incomplete->new('year' => $y, 'month' => $m, 'day' => $d);
64              
65             } else {
66 1         8 return $data->{'text'};
67             }
68             }
69              
70             } elsif (ref $data eq "" && $data =~ m/^\d{4}-\d{2}-\d{2}$/) {
71 21 50       124 my ($y, $m, $d) = $data =~ m/^(\d{4})-(\d{2})-(\d{2})$/ or die "Failed to parse '$data'";
72 21         92 return DateTime::Incomplete->new('year' => $y, 'month' => $m, 'day' => $d);
73              
74             } else {
75 0           croak "Unable to parse date";
76             }
77             }
78              
79             1;