File Coverage

blib/lib/version/regex.pm
Criterion Covered Total %
statement 5 5 100.0
branch 2 4 50.0
condition n/a
subroutine 3 3 100.0
pod 0 2 0.0
total 10 14 71.4


line stmt bran cond sub pod time code
1             package version::regex;
2              
3 12     12   86 use strict;
  12         90  
  12         5119  
4              
5             our $VERSION = 0.99_26;
6              
7             #--------------------------------------------------------------------------#
8             # Version regexp components
9             #--------------------------------------------------------------------------#
10              
11             # Fraction part of a decimal version number. This is a common part of
12             # both strict and lax decimal versions
13              
14             my $FRACTION_PART = qr/\.[0-9]+/;
15              
16             # First part of either decimal or dotted-decimal strict version number.
17             # Unsigned integer with no leading zeroes (except for zero itself) to
18             # avoid confusion with octal.
19              
20             my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/;
21              
22             # First part of either decimal or dotted-decimal lax version number.
23             # Unsigned integer, but allowing leading zeros. Always interpreted
24             # as decimal. However, some forms of the resulting syntax give odd
25             # results if used as ordinary Perl expressions, due to how perl treats
26             # octals. E.g.
27             # version->new("010" ) == 10
28             # version->new( 010 ) == 8
29             # version->new( 010.2) == 82 # "8" . "2"
30              
31             my $LAX_INTEGER_PART = qr/[0-9]+/;
32              
33             # Second and subsequent part of a strict dotted-decimal version number.
34             # Leading zeroes are permitted, and the number is always decimal.
35             # Limited to three digits to avoid overflow when converting to decimal
36             # form and also avoid problematic style with excessive leading zeroes.
37              
38             my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/;
39              
40             # Second and subsequent part of a lax dotted-decimal version number.
41             # Leading zeroes are permitted, and the number is always decimal. No
42             # limit on the numerical value or number of digits, so there is the
43             # possibility of overflow when converting to decimal form.
44              
45             my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/;
46              
47             # Alpha suffix part of lax version number syntax. Acts like a
48             # dotted-decimal part.
49              
50             my $LAX_ALPHA_PART = qr/_[0-9]+/;
51              
52             #--------------------------------------------------------------------------#
53             # Strict version regexp definitions
54             #--------------------------------------------------------------------------#
55              
56             # Strict decimal version number.
57              
58             our $STRICT_DECIMAL_VERSION =
59             qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x;
60              
61             # Strict dotted-decimal version number. Must have both leading "v" and
62             # at least three parts, to avoid confusion with decimal syntax.
63              
64             our $STRICT_DOTTED_DECIMAL_VERSION =
65             qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x;
66              
67             # Complete strict version number syntax -- should generally be used
68             # anchored: qr/ \A $STRICT \z /x
69              
70             our $STRICT =
71             qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x;
72              
73             #--------------------------------------------------------------------------#
74             # Lax version regexp definitions
75             #--------------------------------------------------------------------------#
76              
77             # Lax decimal version number. Just like the strict one except for
78             # allowing an alpha suffix or allowing a leading or trailing
79             # decimal-point
80              
81             our $LAX_DECIMAL_VERSION =
82             qr/ $LAX_INTEGER_PART (?: $FRACTION_PART | \. )? $LAX_ALPHA_PART?
83             |
84             $FRACTION_PART $LAX_ALPHA_PART?
85             /x;
86              
87             # Lax dotted-decimal version number. Distinguished by having either
88             # leading "v" or at least three non-alpha parts. Alpha part is only
89             # permitted if there are at least two non-alpha parts. Strangely
90             # enough, without the leading "v", Perl takes .1.2 to mean v0.1.2,
91             # so when there is no "v", the leading part is optional
92              
93             our $LAX_DOTTED_DECIMAL_VERSION =
94             qr/
95             v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )?
96             |
97             $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART?
98             /x;
99              
100             # Complete lax version number syntax -- should generally be used
101             # anchored: qr/ \A $LAX \z /x
102             #
103             # The string 'undef' is a special case to make for easier handling
104             # of return values from ExtUtils::MM->parse_version
105              
106             our $LAX =
107             qr/ undef | $LAX_DOTTED_DECIMAL_VERSION | $LAX_DECIMAL_VERSION /x;
108              
109             #--------------------------------------------------------------------------#
110              
111             # Preloaded methods go here.
112 87 50   87 0 39713 sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x }
113 86 50   86 0 1572 sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x }
114              
115             1;