File Coverage

blib/lib/MetaCPAN/Client/Role/Entity.pm
Criterion Covered Total %
statement 34 39 87.1
branch 12 16 75.0
condition 2 6 33.3
subroutine 7 8 87.5
pod 2 2 100.0
total 57 71 80.2


line stmt bran cond sub pod time code
1 21     21   24733 use strict;
  21         45  
  21         555  
2 21     21   103 use warnings;
  21         64  
  21         791  
3             package MetaCPAN::Client::Role::Entity;
4             # ABSTRACT: A role for MetaCPAN entities
5             $MetaCPAN::Client::Role::Entity::VERSION = '2.030000';
6 21     21   99 use Moo::Role;
  21         40  
  21         125  
7              
8 21     21   19198 use JSON::PP;
  21         251405  
  21         1293  
9 21     21   512 use Ref::Util qw< is_ref is_arrayref is_hashref >;
  21         1310  
  21         8666  
10              
11             has data => (
12             is => 'ro',
13             required => 1,
14             );
15              
16             has client => (
17             is => 'ro',
18             lazy => 1,
19             builder => '_build_client',
20             );
21              
22             sub _build_client {
23 0     0   0 require MetaCPAN::Client;
24 0         0 return MetaCPAN::Client->new();
25             }
26              
27             sub BUILDARGS {
28 80     80 1 41830 my ( $class, %args ) = @_;
29              
30 80         251 my $known_fields = $class->_known_fields;
31              
32 80         162 for my $k ( @{ $known_fields->{scalar} } ) {
  80         265  
33             $args{data}{$k} = $args{data}{$k}->[0]
34 1474 50 33     8488 if is_arrayref( $args{data}{$k} ) and @{$args{data}{$k}} == 1;
  0         0  
35              
36 1474 100       2545 if ( JSON::PP::is_bool($args{data}{$k}) ) {
    50          
37 272         1428 $args{data}{$k} = !!$args{data}{$k};
38             }
39             elsif ( is_ref( $args{data}{$k} ) ) {
40 0         0 delete $args{data}{$k};
41             }
42             }
43              
44 80         434 for my $k ( @{ $known_fields->{arrayref} } ) {
  80         208  
45             # fix the case when we expect an array ref but get a scalar because
46             # the result array had one element and we received a scalar
47 171 50 33     655 if ( defined($args{data}{$k}) and !is_ref($args{data}{$k}) ) {
48 0         0 $args{data}{$k} = [ $args{data}{$k} ]
49             }
50              
51             delete $args{data}{$k}
52 171 50       364 unless is_arrayref( $args{data}{$k} ); # warn?
53             }
54              
55 80         176 for my $k ( @{ $known_fields->{hashref} } ) {
  80         172  
56             delete $args{data}{$k}
57 173 100       353 unless is_hashref( $args{data}{$k} ); # warn?
58             }
59              
60 80         1426 return \%args;
61             }
62              
63             sub new_from_request {
64 111     111 1 10183 my ( $class, $request, $client ) = @_;
65              
66 111         441 my $known_fields = $class->_known_fields;
67              
68             return $class->new(
69             ( defined $client ? ( client => $client ) : () ),
70             data => {
71             map +( defined $request->{$_} ? ( $_ => $request->{$_} ) : () ),
72 110 100       474 map +( @{ $known_fields->{$_} } ),
  330 100       5494  
73             qw< scalar arrayref hashref >
74             }
75             );
76             }
77              
78             1;
79              
80             __END__