File Coverage

blib/lib/Pandoc/Version.pm
Criterion Covered Total %
statement 60 60 100.0
branch 15 16 93.7
condition 9 12 75.0
subroutine 13 13 100.0
pod 6 7 85.7
total 103 108 95.3


line stmt bran cond sub pod time code
1             package Pandoc::Version;
2 11     11   87849 use 5.014;
  11         40  
3 11     11   57 use warnings;
  11         20  
  11         540  
4              
5             our $VERSION = '0.8.8';
6              
7 11         102 use overload '""' => 'string', '0+' => 'number',
8 11     11   9858 cmp => 'cmp', '<=>' => 'cmp', fallback => 1;
  11         8509  
9 11     11   1306 use Scalar::Util qw(reftype blessed);
  11         19  
  11         455  
10 11     11   3442 use Pandoc::Error;
  11         25  
  11         2766  
11              
12             our @CARP_NOT = ('Pandoc');
13              
14             sub new {
15 87     87 0 7988 my $class = shift;
16              
17             # We accept array or string input
18             # (or mixed but let's not document that!)
19             my @nums =
20             map {
21 212         247 my $num = $_;
22 212 100       514 $num =~ /^\d+$/ or Pandoc::Error->throw(
23             message => 'invalid version number',
24             version => $num
25             );
26 207         249 $num =~ s/^0+(?=\d)//; # ensure decimal interpretation
27 207         240 $num = 0+ $num;
28 207         14233 $num
29             }
30 109         205 map { s/^v//i; split /\./ } ## no critic
  109         237  
31 89 100 100     317 map { 'ARRAY' CORE::eq (reftype $_ // "") ? @$_ : $_ }
32 87   100     128 map { $_ // '' } @_;
  89         206  
33              
34 82 100       164 Pandoc::Error->throw('invalid version number') unless @nums;
35              
36 79         216 return bless \@nums => $class;
37             }
38              
39 25     25 1 412 sub string { join '.', @{ $_[0] } }
  25         113  
40              
41             sub number {
42 133     133 1 152 my ($major, @minors) = @{ $_[0] };
  133         213  
43 11     11   65 no warnings qw(uninitialized numeric);
  11         40  
  11         5609  
44 133 100       235 if ( @minors ) {
45 121         140 my $minor = join '', map { sprintf '%03d', $_ } @minors;
  178         1017  
46 121         526 return 0+ "$major.$minor"; # return a true number
47             }
48 12         27 return 0+ $major;
49             }
50              
51             sub cmp {
52             my ($a, $b) = map {
53 55 100 66 55 1 104 (blessed $_ and $_->isa('Pandoc::Version'))
  110   33     521  
54             ? $_ : Pandoc::Version->new($_ // ())
55             } ($_[0], $_[1]);
56 55         97 return $a->number <=> $b->number;
57             }
58              
59             sub match {
60 7     7 1 1242 my ($a, $b) = map { Pandoc::Version->new($_) } @_;
  14         27  
61 7         23 pop @$a while @$a > @$b;
62 7         11 pop @$b while @$b > @$a;
63              
64 7         14 return $a->number == $b->number;
65             }
66              
67             my %cmp_truth_table = (
68             '==' => [0,1,0],
69             '!=' => [1,0,1],
70             '>=' => [0,1,1],
71             '<=' => [1,1,0],
72             '<' => [1,0,0],
73             '>' => [0,0,1]
74             );
75              
76             sub fulfills {
77 17     17 1 6719 my ($self, $req) = @_;
78 17 50       35 return 1 unless $req;
79              
80 17         113 my @parts = split qr{\s*,\s*}, $req;
81 17         48 for my $part (@parts) {
82 32         176 my ($op, $ver) = $part =~ m{^\s*(==|>=|>|<=|<|!=)?\s*v?(\d+(\.\d+)*)$};
83 32 100       54 if (!defined $ver) {
84 1         10 Pandoc::Error->throw(
85             message => "invalid version requirement: $req",
86             require => $req,
87             )
88             }
89            
90 31         57 my $cmp = $self->cmp($ver) + 1; # will be 0 for <, 1 for ==, 2 for >
91 31 100 100     130 return unless $cmp_truth_table{$op || '>='}->[$cmp];
92             }
93              
94 8         31 1;
95             }
96              
97             sub TO_JSON {
98 4     4 1 1973 my ($self) = @_;
99 4         27 return [ map { 0+ $_ } @$self ];
  16         37  
100             }
101              
102             1;
103              
104             __END__