File Coverage

blib/lib/Perl/APIReference.pm
Criterion Covered Total %
statement 35 62 56.4
branch 6 16 37.5
condition n/a
subroutine 9 13 69.2
pod 2 2 100.0
total 52 93 55.9


line stmt bran cond sub pod time code
1             package Perl::APIReference;
2              
3 2     2   149787 use 5.006;
  2         8  
4 2     2   14 use strict;
  2         4  
  2         84  
5 2     2   11 use warnings;
  2         4  
  2         126  
6 2     2   12 use Carp qw/croak/;
  2         3  
  2         157  
7 2     2   1104 use version;
  2         6086  
  2         13  
8 2     2   221 use Sereal::Decoder;
  2         5  
  2         210  
9              
10             our $VERSION = '0.24';
11              
12             use Class::XSAccessor
13 2         37 getters => {
14             'index' => 'index',
15             'perl_version' => 'perl_version',
16 2     2   1191 };
  2         6777  
17              
18             sub _par_loader_hint {
19 0     0   0 require Perl::APIReference::Generator;
20 0         0 require Perl::APIReference::V5_040_002;
21             }
22              
23             our %Perls;
24             SCOPE: {
25             # Generate list of supported Perl versions from shorthand.
26             my @perls = (
27             [40, 0..2],
28             [38, 0..4],
29             [36, 0..3],
30             [34, 0..3],
31             [32, 0..1],
32             [30, 0..3],
33             [28, 0..3],
34             [26, 0..4],
35             [24, 0..4],
36             [22, 0..4],
37             [20, 0..2],
38             [18, 0..2],
39             [16, 0..3],
40             [14, 0..4],
41             [12, 0..5],
42             [10, 0..1],
43             [8, 0..9],
44             [6, 0..2],
45             );
46              
47             foreach my $p (@perls) {
48             my $major = $p->[0];
49             foreach my $minor (@$p[1..$#$p]) {
50             my $v = sprintf("V5_%03u_%03u", $major, $minor);
51             my $num = sprintf("5.%03u", $major);
52             $num .= sprintf("%03u", $minor) if $minor > 0;
53             $Perls{$num} = $v;
54             }
55             }
56             };
57              
58             our $NewestAPI = '5.040002';
59             our $NewestStableAPI = '5.040002';
60              
61             # Aliases
62             $Perls{'5.04'} = $Perls{'5.040'};
63             $Perls{'5.040000'} = $Perls{'5.040'};
64             $Perls{'5.038000'} = $Perls{'5.038'};
65             $Perls{'5.036000'} = $Perls{'5.036'};
66             $Perls{'5.034000'} = $Perls{'5.034'};
67             $Perls{'5.032000'} = $Perls{'5.032'};
68             $Perls{'5.03'} = $Perls{'5.030'};
69             $Perls{'5.030000'} = $Perls{'5.030'};
70             $Perls{'5.028000'} = $Perls{'5.028'};
71             $Perls{'5.026000'} = $Perls{'5.026'};
72             $Perls{'5.024000'} = $Perls{'5.024'};
73             $Perls{'5.022000'} = $Perls{'5.022'};
74             $Perls{'5.02'} = $Perls{'5.020'};
75             $Perls{'5.020000'} = $Perls{'5.020'};
76             $Perls{'5.018000'} = $Perls{'5.018'};
77             $Perls{'5.016000'} = $Perls{'5.016'};
78             $Perls{'5.014000'} = $Perls{'5.014'};
79             $Perls{'5.012000'} = $Perls{'5.012'};
80             $Perls{'5.010000'} = $Perls{'5.010'};
81             $Perls{'5.01'} = $Perls{'5.010'};
82             $Perls{'5.008000'} = $Perls{'5.008'};
83             $Perls{'5.006000'} = $Perls{'5.006'};
84             #$Perls{'5.000'} = $Perls{5};
85              
86             sub _get_class_name {
87 99     99   183 my $class_or_self = shift;
88 99         285 my $version = shift;
89 99 50       622 return exists $Perls{$version} ? "Perl::APIReference::" . $Perls{$version} : undef;
90             }
91              
92             sub new {
93 99     99 1 679742 my $class = shift;
94 99         514 my %args = @_;
95 99         358 my $perl_version = $args{perl_version};
96 99 50       525 croak("Need perl_version")
97             if not defined $perl_version;
98 99 50       559 $perl_version = $NewestStableAPI if lc($perl_version) eq "newest";
99 99 50       384 $perl_version = $NewestAPI if lc($perl_version) eq "newest_devel";
100              
101 99         2208 $perl_version = version->new($perl_version)->numify();
102             croak("Bad perl version '$perl_version'")
103 99 50       651 if not exists $Perls{$perl_version};
104              
105 99         434 my $classname = __PACKAGE__->_get_class_name($perl_version);
106 99         31837 eval "require $classname;";
107 99 50       779 croak("Bad perl version ($@)") if $@;
108              
109 99         717 return $classname->new(perl_version => $perl_version);
110             }
111              
112             sub as_yaml_calltips {
113 0     0 1   my $self = shift;
114              
115 0           my $index = $self->index();
116 0           my %toyaml;
117 0           foreach my $entry (keys %$index) {
118             my $yentry = {
119             cmd => '',
120             'exp' => $index->{$entry}{text},
121 0           };
122 0           $toyaml{$entry} = $yentry;
123             }
124 0           require YAML::Tiny;
125 0           return YAML::Tiny::Dump(\%toyaml);
126             }
127              
128             # only for ::Generator
129             sub _new_from_parse {
130 0     0     my $class = shift;
131              
132 0           return bless {@_} => $class;
133             }
134              
135             # only for ::Generator
136             sub _dump_as_class {
137 0     0     my $self = shift;
138 0           my $version = $self->perl_version;
139 0           my $classname = $self->_get_class_name($version);
140 0 0         if (not defined $classname) {
141 0           die "Can't determine class name for Perl version '$version'."
142             . " Do you need to add it to the list of supported versions first?";
143             }
144 0           my $file_name = $classname;
145 0           $file_name =~ s/^.*::([^:]+)$/$1.pm/;
146            
147 0           require Sereal::Encoder;
148 0           my $data = $self->{'index'};
149 0           my $dump = Sereal::Encoder->new({
150             compress => Sereal::Encoder::SRL_ZSTD(),
151             compress_level => 22,
152             compress_threshold => 1,
153             dedupe_strings => 1,
154             sort_keys => 1,
155             })->encode($data);
156            
157 0 0         open my $fh, '>', $file_name or die $!;
158 0           binmode $fh;
159 0           print $fh <
160             package $classname;
161             use strict;
162             use warnings;
163             use Sereal::Decoder;
164             use parent 'Perl::APIReference';
165              
166             sub new {
167             my \$class = shift;
168             my \$pos = tell(*DATA);
169             binmode(*DATA);
170             local \$/ = undef;
171              
172             my \$data = ;
173             \$data =~ s/^\\s+//;
174              
175             my \$self = bless({
176             'index' => Sereal::Decoder::decode_sereal(\$data),
177             perl_version => '$version',
178             } => \$class);
179              
180             seek(*DATA, \$pos, 0);
181              
182             return \$self;
183             }
184              
185             1;
186              
187             HERE
188 0           print $fh "__DATA__\n";
189 0           print $fh $dump;
190             }
191              
192              
193             1;
194             __END__