File Coverage

lib/Neo4j/Driver/Type/DateTime.pm
Criterion Covered Total %
statement 50 50 100.0
branch 22 22 100.0
condition 9 9 100.0
subroutine 9 9 100.0
pod 5 5 100.0
total 95 95 100.0


line stmt bran cond sub pod time code
1 20     20   285 use v5.12;
  20         80  
2 20     20   144 use warnings;
  20         55  
  20         1635  
3              
4             package Neo4j::Driver::Type::DateTime 1.02;
5             # ABSTRACT: Represents a Neo4j temporal instant value
6              
7              
8             # For documentation, see Neo4j::Driver::Types.
9              
10              
11 20     20   168 use parent 'Neo4j::Types::DateTime';
  20         70  
  20         141  
12              
13              
14             sub _parse {
15 33     33   65 my ($self) = @_;
16            
17 33         468 my ($days, $hours, $mins, $secs, $nanos, $tz) = $self->{T} =~ m/^(?:([-+]?[0-9]{4,}-[0-9]{2}-[0-9]{2}))?T?(?:([0-9]{2}):([0-9]{2}):([0-9]{2})(?:[,.]([0-9]+))?)?(.*)$/;
18            
19 33 100       110 if (defined $days) {
20 26         202 require Time::Piece;
21 26         138 my $t = Time::Piece->strptime($1, '%Y-%m-%d');
22 26         1187 $days = $t->mjd - 40587;
23             }
24 33         1471 $self->{days} = $days;
25            
26 33 100       99 if (defined $secs) {
27 29         101 $secs = $hours * 3600 + $mins * 60 + $secs;
28 29 100       75 if (defined $nanos) {
29 10         57 $nanos = sprintf '%-9s', $nanos;
30 10         27 $nanos =~ tr/ /0/;
31 10         21 $nanos = 0 + $nanos;
32             }
33             else {
34 19         35 $nanos = 0;
35             }
36            
37 29 100       64 if ($tz eq 'Z') {
38 1         5 $self->{tz_name} = 'Etc/GMT';
39 1         3 $self->{tz_offset} = 0;
40             }
41             else {
42 28         196 my ($sign, $h, $m, $name) = $tz =~ m/(?:([-+])([0-9]{2}):([0-9]{2}))?(?:\[([^\]]+)\])?/;
43 28         78 $self->{tz_name} = $name;
44 28 100       76 if (defined $h) {
45 11         27 $h = "$sign$h";
46 11         20 $m = "$sign$m";
47 11         37 $self->{tz_offset} = $h * 3600 + $m * 60;
48 11 100 100     105 if ( ! defined $name && $m == 0 && $h >= -12 && $h <= 14 ) {
      100        
      100        
49 4         21 $self->{tz_name} = sprintf 'Etc/GMT%+i', $h * -1;
50             }
51             }
52             }
53             }
54 33         79 $self->{seconds} = $secs;
55 33         82 $self->{nanoseconds} = $nanos;
56             }
57              
58              
59             sub days {
60 45     45 1 13746 my ($self) = @_;
61 45 100       155 exists $self->{days} or $self->_parse;
62 45         172 return $self->{days};
63             }
64              
65              
66             sub seconds {
67 47     47 1 2293 my ($self) = @_;
68 47 100       140 exists $self->{seconds} or $self->_parse;
69 47         176 return $self->{seconds};
70             }
71              
72              
73             sub nanoseconds {
74 12     12 1 12492 my ($self) = @_;
75 12 100       50 exists $self->{nanoseconds} or $self->_parse;
76 12         68 return $self->{nanoseconds};
77             }
78              
79              
80             sub tz_name {
81 22     22 1 10499 my ($self) = @_;
82 22 100       80 exists $self->{tz_name} or $self->_parse;
83 22         112 return $self->{tz_name};
84             }
85              
86              
87             sub tz_offset {
88 36     36 1 8064 my ($self) = @_;
89 36 100       143 exists $self->{tz_offset} or $self->_parse;
90 36         148 return $self->{tz_offset};
91             }
92              
93              
94             1;