File Coverage

blib/lib/Pod/Weaver/Section/Version.pm
Criterion Covered Total %
statement 51 56 91.0
branch 15 26 57.6
condition 3 3 100.0
subroutine 10 10 100.0
pod 1 3 33.3
total 80 98 81.6


line stmt bran cond sub pod time code
1             package Pod::Weaver::Section::Version;
2             # ABSTRACT: add a VERSION pod section
3             $Pod::Weaver::Section::Version::VERSION = '4.017';
4 7     7   27016 use Moose;
  7         20  
  7         104  
5             with 'Pod::Weaver::Role::Section';
6             with 'Pod::Weaver::Role::StringFromComment';
7              
8 7     7   49398 use Module::Runtime qw(use_module);
  7         18  
  7         62  
9 7     7   417 use namespace::autoclean;
  7         16  
  7         87  
10              
11             #pod =head1 OVERVIEW
12             #pod
13             #pod This section plugin will produce a hunk of Pod meant to indicate the version of
14             #pod the document being viewed, like this:
15             #pod
16             #pod =head1 VERSION
17             #pod
18             #pod version 1.234
19             #pod
20             #pod It will do nothing if there is no C<version> entry in the input.
21             #pod
22             #pod =attr header
23             #pod
24             #pod The title of the header to be added.
25             #pod (default: "VERSION")
26             #pod
27             #pod =cut
28              
29             has header => (
30             is => 'ro',
31             isa => 'Str',
32             default => 'VERSION',
33             );
34              
35 7     7   8150 use DateTime;
  7         2313990  
  7         389  
36 7     7   76 use Moose::Util::TypeConstraints;
  7         17  
  7         106  
37              
38             my $MARKER;
39 7     7   20151 BEGIN { $MARKER = "\x{2316}" }
40              
41             use String::Formatter 0.100680 stringf => {
42             -as => '_format_version',
43              
44             input_processor => 'require_single_input',
45             string_replacer => 'method_replace',
46             codes => {
47 17         2168 v => sub { $_[0]->{version} },
48             V => sub { $_[0]->{version}
49             . ($_[0]->{is_trial}
50 0 0       0 ? (defined $_[1] ? $_[1] : '-TRIAL') : '') },
    0          
51              
52             d => sub {
53 1         20 use_module( 'DateTime', '0.44' ); # CLDR fixes
54             DateTime->from_epoch(epoch => $^T, time_zone => $_[0]->{self}->time_zone)
55 1         112 ->format_cldr($_[1]),
56             },
57 0         0 r => sub { $_[0]->{zilla}->name },
58             m => sub {
59 2 50       52 return $_[0]->{module} if defined $_[0]->{module};
60             $_[0]->{self}->log_fatal([
61             "%%m format used for Version section, but no package declaration found in %s",
62             $_[0]->{filename},
63 0         0 ]);
64             },
65              
66 4         350 T => sub { $MARKER },
67 0         0 n => sub { "\n" },
68 0         0 s => sub { q{ } },
69 6         398 t => sub { "\t" },
70             },
71 7     7   5411 };
  7         22779  
  7         193  
72              
73             # Needed by Config::MVP.
74 17     17 0 67667 sub mvp_multivalue_args { 'format' }
75              
76             #pod =attr format
77             #pod
78             #pod The string to use when generating the version string.
79             #pod
80             #pod Default: version %v
81             #pod
82             #pod The following variables are available:
83             #pod
84             #pod =begin :list
85             #pod
86             #pod * v - the version
87             #pod
88             #pod * V - the version, suffixed by "-TRIAL" if a trial release
89             #pod
90             #pod * d - the CLDR format for L<DateTime>
91             #pod
92             #pod * n - a newline
93             #pod
94             #pod * t - a tab
95             #pod
96             #pod * s - a space
97             #pod
98             #pod * r - the name of the dist, present only if you use L<Dist::Zilla> to generate
99             #pod the POD!
100             #pod
101             #pod * m - the name of the module, present only if L<PPI> parsed the document and it
102             #pod contained a package declaration!
103             #pod
104             #pod * T - special: at the beginning of the line, followed by any amount of
105             #pod whitespace, indicates that the line should only be included in trial
106             #pod releases; otherwise, results in a fatal error
107             #pod
108             #pod =end :list
109             #pod
110             #pod If multiple strings are supplied as an array ref, a line of POD is
111             #pod produced for each string. Each line will be separated by a newline.
112             #pod This is useful for splitting longer text across multiple lines in a
113             #pod C<weaver.ini> file, for example:
114             #pod
115             #pod ; weaver.ini
116             #pod [Version]
117             #pod format = version %v
118             #pod format =
119             #pod format = This module's version numbers follow the conventions described at
120             #pod format = L<semver.org|http://semver.org/>.
121             #pod format = %T
122             #pod format = %T This is a trial release!
123             #pod
124             #pod =cut
125              
126             subtype 'Pod::Weaver::Section::Version::_Format',
127             as 'ArrayRef[Str]';
128              
129             coerce 'Pod::Weaver::Section::Version::_Format',
130             from 'Str',
131             via { [ $_ ] };
132              
133             has format => (
134             is => 'ro',
135             isa => 'Pod::Weaver::Section::Version::_Format',
136             coerce => 1,
137             default => 'version %v',
138             );
139              
140             #pod =attr is_verbatim
141             #pod
142             #pod A boolean value specifying whether the version paragraph should be verbatim or not.
143             #pod
144             #pod Default: false
145             #pod
146             #pod =cut
147              
148             has is_verbatim => (
149             is => 'ro',
150             isa => 'Bool',
151             default => 0,
152             );
153              
154             #pod =attr time_zone
155             #pod
156             #pod The timezone to use when using L<DateTime> for the format.
157             #pod
158             #pod Default: local
159             #pod
160             #pod =cut
161              
162             has time_zone => (
163             is => 'ro',
164             isa => 'Str', # should be more validated later -- apocal
165             default => 'local',
166             );
167              
168             #pod =method build_content
169             #pod
170             #pod my @pod_elements = $section->build_content(\%input);
171             #pod
172             #pod This method is passed the same C<\%input> that goes to the C<weave_section>
173             #pod method, and should return a list of pod elements to insert.
174             #pod
175             #pod In almost all cases, this method is used internally, but could be usefully
176             #pod overridden in a subclass.
177             #pod
178             #pod =cut
179              
180             sub build_content {
181 17     17 1 49 my ($self, $input) = @_;
182 17 50       69 return unless $input->{version};
183              
184             my %args = (
185             self => $self,
186             version => $input->{version},
187             filename => $input->{filename},
188 17         135 );
189 17 50       78 $args{zilla} = $input->{zilla} if exists $input->{zilla};
190              
191             $args{is_trial} = exists $input->{is_trial} ? $input->{is_trial}
192             : $args{zilla} ? $args{zilla}->is_trial
193 17 50       121 : undef;
    100          
194              
195 17 50       63 if ( exists $input->{ppi_document} ) {
196 17         97 my $pkg_node = $input->{ppi_document}->find_first('PPI::Statement::Package');
197             $args{module}
198             = $pkg_node
199             ? $pkg_node->namespace
200 17 100       4420 : $self->_extract_comment_content($input->{ppi_document}, 'PODNAME')
201             ;
202             }
203              
204 17         473 my $content = q{};
205 17         48 LINE: for my $format (@{ $self->format }) {
  17         601  
206 30         151 my $line = _format_version($format, \%args);
207 30 100 100     3152 next if $line =~ s/^$MARKER\s*// and ! $args{is_trial};
208              
209 28 50       180 Carp::croak("%T format used inside line") if $line =~ /$MARKER/;
210              
211 28         130 $content .= "$line\n";
212             }
213              
214 17 100       655 if ( $self->is_verbatim ) {
215 3         113 $content = Pod::Elemental::Element::Pod5::Verbatim->new({
216             content => " $content",
217             });
218             } else {
219 14         492 $content = Pod::Elemental::Element::Pod5::Ordinary->new({
220             content => $content,
221             });
222             }
223              
224 17         4197 return ($content);
225             }
226              
227             sub weave_section {
228 17     17 0 65 my ($self, $document, $input) = @_;
229 17 50       80 return unless $input->{version};
230              
231 17         95 my @content = $self->build_content($input);
232              
233 17         534 $self->log_debug('adding ' . $self->header . ' section to pod');
234              
235 17         500 push @{ $document->children },
  17         498  
236             Pod::Elemental::Element::Nested->new({
237             command => 'head1',
238             content => $self->header,
239             children => \@content,
240             });
241             }
242              
243             __PACKAGE__->meta->make_immutable;
244             1;
245              
246             __END__
247              
248             =pod
249              
250             =encoding UTF-8
251              
252             =head1 NAME
253              
254             Pod::Weaver::Section::Version - add a VERSION pod section
255              
256             =head1 VERSION
257              
258             version 4.017
259              
260             =head1 OVERVIEW
261              
262             This section plugin will produce a hunk of Pod meant to indicate the version of
263             the document being viewed, like this:
264              
265             =head1 VERSION
266              
267             version 1.234
268              
269             It will do nothing if there is no C<version> entry in the input.
270              
271             =head1 ATTRIBUTES
272              
273             =head2 header
274              
275             The title of the header to be added.
276             (default: "VERSION")
277              
278             =head2 format
279              
280             The string to use when generating the version string.
281              
282             Default: version %v
283              
284             The following variables are available:
285              
286             =over 4
287              
288             =item *
289              
290             v - the version
291              
292             =item *
293              
294             V - the version, suffixed by "-TRIAL" if a trial release
295              
296             =item *
297              
298             d - the CLDR format for L<DateTime>
299              
300             =item *
301              
302             n - a newline
303              
304             =item *
305              
306             t - a tab
307              
308             =item *
309              
310             s - a space
311              
312             =item *
313              
314             r - the name of the dist, present only if you use L<Dist::Zilla> to generate the POD!
315              
316             =item *
317              
318             m - the name of the module, present only if L<PPI> parsed the document and it contained a package declaration!
319              
320             =item *
321              
322             T - special: at the beginning of the line, followed by any amount of whitespace, indicates that the line should only be included in trial releases; otherwise, results in a fatal error
323              
324             =back
325              
326             If multiple strings are supplied as an array ref, a line of POD is
327             produced for each string. Each line will be separated by a newline.
328             This is useful for splitting longer text across multiple lines in a
329             C<weaver.ini> file, for example:
330              
331             ; weaver.ini
332             [Version]
333             format = version %v
334             format =
335             format = This module's version numbers follow the conventions described at
336             format = L<semver.org|http://semver.org/>.
337             format = %T
338             format = %T This is a trial release!
339              
340             =head2 is_verbatim
341              
342             A boolean value specifying whether the version paragraph should be verbatim or not.
343              
344             Default: false
345              
346             =head2 time_zone
347              
348             The timezone to use when using L<DateTime> for the format.
349              
350             Default: local
351              
352             =head1 METHODS
353              
354             =head2 build_content
355              
356             my @pod_elements = $section->build_content(\%input);
357              
358             This method is passed the same C<\%input> that goes to the C<weave_section>
359             method, and should return a list of pod elements to insert.
360              
361             In almost all cases, this method is used internally, but could be usefully
362             overridden in a subclass.
363              
364             =head1 AUTHOR
365              
366             Ricardo SIGNES <rjbs@cpan.org>
367              
368             =head1 COPYRIGHT AND LICENSE
369              
370             This software is copyright (c) 2021 by Ricardo SIGNES.
371              
372             This is free software; you can redistribute it and/or modify it under
373             the same terms as the Perl 5 programming language system itself.
374              
375             =cut