File Coverage

blib/lib/WWW/DuckDuckGo/ZeroClickInfo.pm
Criterion Covered Total %
statement 47 62 75.8
branch 21 52 40.3
condition 2 9 22.2
subroutine 7 10 70.0
pod 2 5 40.0
total 79 138 57.2


line stmt bran cond sub pod time code
1             package WWW::DuckDuckGo::ZeroClickInfo;
2             BEGIN {
3 2     2   866 $WWW::DuckDuckGo::ZeroClickInfo::AUTHORITY = 'cpan:DDG';
4             }
5             {
6             $WWW::DuckDuckGo::ZeroClickInfo::VERSION = '0.016';
7             }
8             # ABSTRACT: A DuckDuckGo Zero Click Info definition
9              
10 2     2   15 use Moo;
  2         3  
  2         18  
11 2     2   2829 use WWW::DuckDuckGo::Link;
  2         6  
  2         74  
12 2     2   14 use URI;
  2         3  
  2         2481  
13              
14             sub by {
15 1     1 0 4160 my ( $class, $result ) = @_;
16 1         5 my %params;
17 1 50       5 if ($result->{RelatedTopics}) {
18 1         3 $params{related_topics_sections} = {};
19 1 50       6 if ($result->{RelatedTopics}->[0]->{Topics}) {
20 0         0 for (@{$result->{RelatedTopics}}) {
  0         0  
21 0 0       0 die "go to irc.freenode.net #duckduckgo and kick yegg, and also tell him your searchterm" if $_->{Name} eq '_';
22 0         0 my @topics;
23 0         0 for (@{$_->{Topics}}) {
  0         0  
24 0 0 0     0 push @topics, $class->_link_class->by($_) if ref $_ eq 'HASH' and %{$_};
  0         0  
25             }
26 0         0 $params{related_topics_sections}->{$_->{Name}} = \@topics;
27             }
28             } else {
29 1         2 my @topics;
30 1         1 for (@{$result->{RelatedTopics}}) {
  1         4  
31 1 50 33     7 push @topics, $class->_link_class->by($_) if ref $_ eq 'HASH' and %{$_};
  1         13  
32             }
33 1 50       34 $params{related_topics_sections}->{_} = \@topics if @topics;
34             }
35             }
36 1         2 my @results;
37 1         2 for (@{$result->{Results}}) {
  1         3  
38 1 50 33     5 push @results, $class->_link_class->by($_) if ref $_ eq 'HASH' and %{$_};
  1         8  
39             }
40 1         28 $params{_json} = $result;
41 1 50       5 $params{results} = \@results if @results;
42 1 50       4 $params{abstract} = $result->{Abstract} if $result->{Abstract};
43 1 50       5 $params{abstract_text} = $result->{AbstractText} if $result->{AbstractText};
44 1 50       4 $params{abstract_source} = $result->{AbstractSource} if $result->{AbstractSource};
45 1 50       6 $params{abstract_url} = URI->new($result->{AbstractURL}) if $result->{AbstractURL};
46 1 50       64 $params{image} = URI->new($result->{Image}) if $result->{Image};
47 1 50       66 $params{heading} = $result->{Heading} if $result->{Heading};
48 1 50       3 $params{answer} = $result->{Answer} if $result->{Answer};
49 1 50       4 $params{answer_type} = $result->{AnswerType} if $result->{AnswerType};
50 1 50       4 $params{definition} = $result->{Definition} if $result->{Definition};
51 1 50       3 $params{definition_source} = $result->{DefinitionSource} if $result->{DefinitionSource};
52 1 50       4 $params{definition_url} = URI->new($result->{DefinitionURL}) if $result->{DefinitionURL};
53 1 50       7 $params{type} = $result->{Type} if $result->{Type};
54 1 50       4 $params{html} = $result->{HTML} if $result->{HTML};
55 1 50       3 $params{redirect} = $result->{Redirect} if $result->{Redirect};
56 1         8 __PACKAGE__->new(%params);
57             }
58              
59 2     2   37 sub _link_class { 'WWW::DuckDuckGo::Link' }
60              
61             has _json => (
62             is => 'ro',
63             );
64              
65             has abstract => (
66             is => 'ro',
67             predicate => 'has_abstract',
68             );
69              
70             has abstract_text => (
71             is => 'ro',
72             predicate => 'has_abstract_text',
73             );
74              
75             has abstract_source => (
76             is => 'ro',
77             predicate => 'has_abstract_source',
78             );
79              
80             has abstract_url => (
81             is => 'ro',
82             predicate => 'has_abstract_url',
83             );
84              
85             has image => (
86             is => 'ro',
87             predicate => 'has_image',
88             );
89              
90             has heading => (
91             is => 'ro',
92             predicate => 'has_heading',
93             );
94              
95             has answer => (
96             is => 'ro',
97             predicate => 'has_answer',
98             );
99              
100             has answer_type => (
101             is => 'ro',
102             predicate => 'has_answer_type',
103             );
104              
105             has definition => (
106             is => 'ro',
107             predicate => 'has_definition',
108             );
109              
110             has definition_source => (
111             is => 'ro',
112             predicate => 'has_definition_source',
113             );
114              
115             has definition_url => (
116             is => 'ro',
117             predicate => 'has_definition_url',
118             );
119              
120             has html => (
121             is => 'ro',
122             predicate => 'has_html',
123             );
124              
125             has redirect => (
126             is => 'ro',
127             predicate => 'has_redirect',
128             );
129              
130             sub default_related_topics {
131 0     0 1 0 my ( $self ) = @_;
132 0 0       0 $self->related_topics_sections->{_} if $self->has_related_topics_sections;
133             }
134              
135             sub has_default_related_topics {
136 0     0 0 0 my ( $self ) = @_;
137 0 0       0 $self->has_related_topics_sections and defined $self->related_topics_sections->{_} ? 1 : 0;
    0          
138             }
139              
140             has related_topics_sections => (
141             is => 'ro',
142             predicate => 'has_related_topics_sections',
143             );
144              
145             # DEPRECATED WARN
146             sub related_topics {
147 0     0 0 0 warn __PACKAGE__.": usage of the function related_topics is deprecated, use default_related_topics for the same functionality (also see: related_topics_sections)";
148 0         0 shift->default_related_topics(@_);
149             }
150             ################
151              
152             has results => (
153             is => 'ro',
154             predicate => 'has_results',
155             );
156              
157             has type => (
158             is => 'ro',
159             predicate => 'has_type',
160             );
161              
162             has type_long_definitions => (
163             is => 'ro',
164             lazy => 1,
165             default => sub {{
166             A => 'article',
167             D => 'disambiguation',
168             C => 'category',
169             N => 'name',
170             E => 'exclusive',
171             }},
172             );
173              
174             sub type_long {
175 1     1 1 8378 my ( $self ) = @_;
176 1 50       8 return if !$self->type;
177 1         6 $self->type_long_definitions->{$self->type};
178             }
179              
180             1;
181              
182             __END__