File Coverage

lib/Dist/Zilla/Util/BundleInfo/Plugin.pm
Criterion Covered Total %
statement 18 105 17.1
branch 0 22 0.0
condition n/a
subroutine 6 20 30.0
pod 5 5 100.0
total 29 152 19.0


line stmt bran cond sub pod time code
1 1     1   614 use 5.008; # pragma utf8
  1         3  
  1         32  
2 1     1   4 use strict;
  1         1  
  1         24  
3 1     1   3 use warnings;
  1         8  
  1         25  
4 1     1   503 use utf8;
  1         8  
  1         4  
5              
6             package Dist::Zilla::Util::BundleInfo::Plugin;
7              
8             our $VERSION = '1.001003';
9              
10             # ABSTRACT: Data about a single plugin instance in a bundle
11              
12             our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
13              
14 1     1   549 use Moo 1.000008 qw( has );
  1         12342  
  1         6  
15              
16              
17              
18              
19              
20              
21              
22              
23              
24              
25              
26              
27              
28              
29              
30              
31              
32              
33              
34              
35              
36              
37              
38              
39              
40              
41              
42              
43              
44              
45              
46              
47              
48              
49              
50              
51              
52              
53              
54              
55             has name => ( is => ro =>, required => 1, );
56             has module => ( is => ro =>, required => 1, );
57             has payload => ( is => ro =>, required => 1, );
58              
59             has _loaded_module => (
60             is => ro =>,
61             lazy => 1,
62             builder => sub {
63 0     0     require Module::Runtime;
64 0           Module::Runtime::require_module( $_[0]->module );
65 0           return $_[0]->module;
66             },
67             );
68              
69             has _mvp_alias_rmap => (
70             is => ro =>,
71             lazy => 1,
72             builder => sub {
73 0     0     my ($self) = @_;
74 0 0         return {} unless $self->_loaded_module->can('mvp_aliases');
75 0           my $rmap = {};
76 0           my $fmap = $self->_loaded_module->mvp_aliases;
77 0           for my $key ( keys %{$fmap} ) {
  0            
78 0           my $value = $fmap->{$key};
79 0 0         $rmap->{$value} = [] if not exists $rmap->{$value};
80 0           push @{ $rmap->{$value} }, $key;
  0            
81             }
82 0           return $rmap;
83             },
84             );
85              
86             sub _mvp_alias_for {
87 0     0     my ( $self, $alias ) = @_;
88 0 0         return unless exists $self->_mvp_alias_rmap->{$alias};
89 0           return @{ $self->_mvp_alias_rmap->{$alias} };
  0            
90             }
91             has _mvp_multivalue_args => (
92             is => ro =>,
93             lazy => 1,
94             builder => sub {
95 0 0   0     return {} unless $_[0]->_loaded_module->can('mvp_multivalue_args');
96 0           my $map = {};
97 0           for my $arg ( $_[0]->_loaded_module->mvp_multivalue_args ) {
98 0           $map->{$arg} = 1;
99 0           for my $alias ( $_[0]->_mvp_alias_for($arg) ) {
100 0           $map->{$alias} = 1;
101             }
102             }
103 0           return $map;
104             },
105             );
106              
107             sub _property_is_mvp_multi {
108 0     0     my ( $self, $property ) = @_;
109 0           return exists $self->_mvp_multivalue_args->{$property};
110             }
111              
112              
113              
114              
115              
116              
117              
118              
119              
120              
121              
122              
123              
124              
125             sub inflate_bundle_entry {
126 0     0 1   my ( $self, $entry ) = @_;
127 0           my ( $name, $module, $payload ) = @{$entry};
  0            
128 0           return $self->new( name => $name, module => $module, payload => $payload );
129             }
130              
131              
132              
133              
134              
135              
136              
137              
138              
139              
140             sub to_bundle_entry {
141 0     0 1   my ( $self, ) = @_;
142 0           return [ $self->name, $self->module, $self->payload ];
143             }
144              
145              
146              
147              
148              
149              
150              
151              
152              
153              
154              
155              
156              
157             sub short_module {
158 0     0 1   my ($self) = @_;
159 0           my $name = $self->module;
160 0 0         if ( $name =~ /^Dist::Zilla::Plugin::(.*$)/xsm ) {
161 0           return "$1";
162             }
163 0           return "=$name";
164             }
165              
166             sub _dzil_ini_header {
167 0     0     my ($self) = @_;
168 0           return sprintf '[%s / %s]', $self->short_module, $self->name;
169             }
170              
171             sub _dzil_config_line {
172 0     0     my ( undef, $name, $value ) = @_;
173 0           return sprintf '%s = %s', $name, $value;
174             }
175              
176             sub _dzil_config_multiline {
177 0     0     my ( $self, $key, @values ) = @_;
178 0 0         if ( not $self->_property_is_mvp_multi($key) ) {
179 0           require Carp;
180 0           Carp::carp( "$key is not an MVP multi-value for " . $self->module );
181             }
182 0           my @out;
183 0           for my $value (@values) {
184 0 0         if ( not ref $value ) {
185 0           push @out, $self->_dzil_config_line( $key, $value );
186 0           next;
187             }
188 0           require Carp;
189 0           Carp::croak('2 Dimensional arrays cannot be exported to distini format');
190             }
191 0           return @out;
192             }
193              
194             sub _autoexpand_list {
195 0     0     my ( $self, $key, $value ) = @_;
196 0 0         if ( not ref $value ) {
197 0           return ( $key, $value );
198             }
199 0 0         if ( not $self->_property_is_mvp_multi($key) ) {
200 0           require Carp;
201 0           Carp::carp( "$key is not an MVP multi-value for " . $self->module );
202             }
203 0           return map { ( $key, $_ ) } @{$value};
  0            
  0            
204             }
205              
206              
207              
208              
209              
210              
211              
212              
213              
214              
215              
216              
217              
218              
219              
220              
221              
222              
223              
224              
225              
226              
227              
228              
229             sub payload_list {
230 0     0 1   my ( $self, ) = @_;
231 0           my $payload = $self->payload;
232 0           my @out;
233 0           for my $key ( sort keys %{$payload} ) {
  0            
234 0           push @out, $self->_autoexpand_list( $key, $payload->{$key} );
235             }
236 0           return @out;
237             }
238              
239              
240              
241              
242              
243              
244              
245              
246             sub to_dist_ini {
247 0     0 1   my ( $self, ) = @_;
248 0           my @out;
249 0           push @out, $self->_dzil_ini_header;
250              
251 0           my $payload = $self->payload;
252 0           for my $key ( sort keys %{$payload} ) {
  0            
253 0           my $value = $payload->{$key};
254 0 0         if ( not ref $value ) {
255 0           push @out, $self->_dzil_config_line( $key, $value );
256 0           next;
257             }
258 0 0         if ( 'ARRAY' eq ref $value ) {
259 0           push @out, $self->_dzil_config_multiline( $key, @{$value} );
  0            
260 0           next;
261             }
262 0           require Carp;
263 0           Carp::croak( 'Cannot format plugin payload of type ' . ref $value );
264             }
265 0           return join qq{\n}, @out, q[], q[];
266             }
267              
268 1     1   2056 no Moo;
  1         2  
  1         4  
269              
270             1;
271              
272             __END__
273              
274             =pod
275              
276             =encoding UTF-8
277              
278             =head1 NAME
279              
280             Dist::Zilla::Util::BundleInfo::Plugin - Data about a single plugin instance in a bundle
281              
282             =head1 VERSION
283              
284             version 1.001003
285              
286             =head1 METHODS
287              
288             =head2 C<inflate_bundle_entry>
289              
290             Creates a C<<::BundleInfo::Plugin> node based on an array-line returned from
291             C<< yourbundle->bundle_config >>.
292              
293             e.g:
294              
295             my $instance = ::Plugin->inflate_bundle_entry([
296             '@ABUNDLE/My::Name::Here', 'Fully::Qualified::Module::Name', { %config }
297             ]);
298              
299             =head2 C<to_bundle_entry>
300              
301             As with L<< C<inflate_bundle_entry>|/inflate_bundle_entry >>, except does the inverse operation,
302             turning an object into an array to pass to C<Dist::Zilla>
303              
304             my $line = $instance->to_bundle_entry;
305              
306             =head2 C<short_module>
307              
308             Returns the "short" form of the module name.
309              
310             This is basically the inverse of Dist::Zillas plugin name expansion
311             routine
312              
313             Dist::Zilla::Plugin::Foo -> Foo
314             Non::Dist::Zilla::Plugin::Foo -> =Non::Dist::Zilla::Plugin::Foo
315              
316             =head2 C<payload_list>
317              
318             Returns the payload in "expanded" form.
319              
320             Internally, payloads are stored as:
321              
322             {
323             key_a => value_0,
324             key_b => [ value_1, value_2, value_3 ],
325             }
326              
327             And this is optimal for coding.
328              
329             This method returns them in an order more amenable for C<INI> injection.
330              
331             ( 'key_a', value_0,
332             'key_b', value_1,
333             'key_b', value_2,
334             'key_b', value_3,
335             )
336              
337             =head2 C<to_dist_ini>
338              
339             Returns a copy of this C<plugin> in a textual form suitable for injecting into
340             a C<dist.ini>
341              
342             =head1 ATTRIBUTES
343              
344             =head2 C<name>
345              
346             The "name" property of the plugin.
347              
348             e.g:
349              
350             [ Foo / Bar ] ; My name is Bar
351              
352             =head2 C<module>
353              
354             The "module" property of the plugin.
355              
356             e.g.:
357              
358             [ Foo / Bar ] ; My module is Dist::Zilla::Plugin::Bar
359              
360             =head2 C<payload>
361              
362             The "payload" property of the plugin
363             that will be passed during C<register_compontent>
364              
365             =begin MetaPOD::JSON v1.1.0
366              
367             {
368             "namespace":"Dist::Zilla::Util::BundleInfo::Plugin",
369             "interface":"class",
370             "inherits":"Moo::Object"
371             }
372              
373              
374             =end MetaPOD::JSON
375              
376             =head1 AUTHOR
377              
378             Kent Fredric <kentfredric@gmail.com>
379              
380             =head1 COPYRIGHT AND LICENSE
381              
382             This software is copyright (c) 2014 by Kent Fredric <kentfredric@gmail.com>.
383              
384             This is free software; you can redistribute it and/or modify it under
385             the same terms as the Perl 5 programming language system itself.
386              
387             =cut