File Coverage

blib/lib/Mojolicious/Plugin/FeedReader.pm
Criterion Covered Total %
statement 64 64 100.0
branch 17 22 77.2
condition 20 21 95.2
subroutine 13 13 100.0
pod 3 4 75.0
total 117 124 94.3


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::FeedReader;
2 1     1   711512 use Mojo::Base 'Mojolicious::Plugin';
  1         9  
  1         7  
3              
4 1     1   643 use Mojo::Feed::Reader;
  1         2  
  1         8  
5              
6             our $VERSION = "0.21";
7              
8 1     1   56 use Scalar::Util qw(blessed);
  1         2  
  1         1068  
9              
10             has feed_reader => sub { Mojo::Feed::Reader->new };
11              
12             sub new {
13 6     6 1 45438 my $self = shift;
14 6         56 return $self->SUPER::new(feed_reader => Mojo::Feed::Reader->new(@_));
15             }
16              
17             sub register {
18 4     4 1 76 my ($self, $app) = @_;
19 4         16 $self->feed_reader->ua($app->ua);
20 4     20   116 $app->helper(parse_feed => sub { shift; $self->parse_rss(@_); });
  20         96959  
  20         103  
21 4     1   480 $app->helper(parse_rss => sub { shift; $self->parse_rss(@_); });
  1         305  
  1         8  
22 4     13   235 $app->helper(find_feeds => sub { shift; $self->find_feeds(@_); });
  13         121518  
  13         87  
23 4     3   261 $app->helper(parse_opml => sub { shift; $self->feed_reader->parse_opml(@_) });
  3         21959  
  3         17  
24             }
25              
26             sub parse_rss {
27 27     27 0 4874 my $self = shift;
28 27         86 my @args = @_;
29              
30             # handle deprecated case of using Mojo::DOM as input
31 27 100 100     362 if (ref $args[0] && blessed $args[0] && $args[0]->isa('Mojo::DOM')) {
      100        
32 1         6 $args[0] = $args[0]->to_string();
33             }
34              
35             # handle special case of being passed a callback - make non-blocking call
36 27 100 100     2360 if ( ref $args[0]
      100        
      100        
      66        
37             && blessed $args[0]
38             && $args[0]->isa('Mojo::URL')
39             && ref $args[1]
40             && ref $args[1] eq 'CODE')
41             {
42             $self->feed_reader->ua->get(
43             $args[0],
44             sub {
45 1     1   19748 my $tx = pop;
46 1         3 my $feed = undef;
47 1         5 my $result = $tx->result;
48 1 50       27 if ($result->is_success) {
49 1         22 my $feed_obj = $self->feed_reader->parse($result->body,
50             $result->content->charset);
51 1 50       4673 if ($feed_obj) {
52 1         9 $feed = $feed_obj->to_hash;
53 1         6 $feed->{'htmlUrl'} = delete $feed->{'link'};
54 1 50       6 for (keys %$feed) { delete $feed->{$_} if ($feed->{$_} eq '') };
  7         18  
55 1 50       2 delete $feed->{'items'} if (scalar @{$feed->{'items'}} == 0);
  1         62  
56             }
57             }
58 1         10 $args[1]->($feed);
59             }
60 2         12 );
61             }
62             else {
63 25         112 my $feed_obj = $self->feed_reader->parse(@args);
64 25 100       361123 return undef unless ($feed_obj);
65 23         188 my $feed = $feed_obj->to_hash;
66 23         122 $feed->{'htmlUrl'} = delete $feed->{'link'};
67 23 100       148 for (keys %$feed) { delete $feed->{$_} if ($feed->{$_} eq '') };
  161         407  
68 23 50       57 delete $feed->{'items'} if (scalar @{$feed->{'items'}} == 0);
  23         99  
69 23         4433 return $feed;
70             }
71             }
72              
73             sub find_feeds {
74 13     13 1 38 my $self = shift;
75 13         27 my $cb;
76 13 100 100     98 if (ref $_[-1] && ref $_[-1] eq 'CODE') {
77 3         12 $cb = pop @_;
78             }
79 13         75 my $promise = $self->feed_reader->discover(@_);
80 13 100       36364 if ($cb) {
81 3         16 return $promise->then($cb);
82             }
83             else {
84 10         25 my @res;
85 10     10   74 $promise->then(sub { @res = @_; })->wait;
  10         6797  
86 10         7405 return @res;
87             }
88             }
89              
90             1;
91              
92             __END__