1 |
# Dobrica Pavlinusic, <dpavlin@rot13.org> 02/22/07 20:30:00 CET |
2 |
|
3 |
use strict; |
4 |
use warnings; |
5 |
|
6 |
package Grep::Source; |
7 |
|
8 |
use Carp qw/verbose/; |
9 |
use Module::Pluggable search_path => 'Grep::Source', sub_name => 'sources', require => 1; |
10 |
use base qw(Class::Accessor); |
11 |
Grep::Source->mk_accessors( qw(feed uri q new_items collection) ); |
12 |
|
13 |
use Data::Dump qw/dump/; |
14 |
|
15 |
=head1 NAME |
16 |
|
17 |
Grep::Source - base class for implementation of different sources for Grep |
18 |
|
19 |
=head1 METHODS |
20 |
|
21 |
This is mostly documentation because most of methods are implemented by plugins. |
22 |
|
23 |
=head2 sources |
24 |
|
25 |
my @sources = Grep::Source->sources(); |
26 |
|
27 |
Returns all available sources. |
28 |
|
29 |
=cut |
30 |
|
31 |
warn "Found source plugins: ", dump( __PACKAGE__->sources() ); |
32 |
|
33 |
=head2 new |
34 |
|
35 |
my $source = Grep::Source->new({ feed => $feed_record }); |
36 |
|
37 |
=head2 search |
38 |
|
39 |
my $collection = $source->search( 'query string' ); |
40 |
|
41 |
It will also setup following accessors: |
42 |
|
43 |
=over 8 |
44 |
|
45 |
=item q |
46 |
|
47 |
Search query |
48 |
|
49 |
=item uri |
50 |
|
51 |
URI of feed with embedded search query |
52 |
|
53 |
=item new_items |
54 |
|
55 |
Number of new items in result collection |
56 |
|
57 |
=head2 collection |
58 |
|
59 |
Actuall results which is L<Grep::Model::ItemCollection>, so following will |
60 |
work: |
61 |
|
62 |
print "and ", $self->collection->count, " total items"; |
63 |
|
64 |
|
65 |
Also setups number of new items |
66 |
|
67 |
print $source->new_items, " items new"; |
68 |
|
69 |
=cut |
70 |
|
71 |
sub search { |
72 |
my $self = shift; |
73 |
|
74 |
my $q = shift; |
75 |
|
76 |
$q ? $self->q( $q ) : $q = $self->q; |
77 |
|
78 |
die "no q?" unless ( $self->q ); |
79 |
die "no feed?" unless ( $self->feed ); |
80 |
die "feed not Grep::Model::Feed" unless ( $self->feed->isa('Grep::Model::Feed') ); |
81 |
|
82 |
my $message; |
83 |
my $uri = $self->feed->uri; |
84 |
if ($uri =~ m/%s/) { |
85 |
$uri = $self->feed->search_uri( $q ); |
86 |
$message = 'Searching'; |
87 |
} else { |
88 |
$message = 'Fetching'; |
89 |
} |
90 |
$message .= ' ' . $self->feed->title . " at $uri"; |
91 |
|
92 |
$self->uri( $uri ); |
93 |
|
94 |
Jifty->log->info( $message ); |
95 |
|
96 |
$self->collection( Grep::Model::ItemCollection->new() ); |
97 |
|
98 |
my $class = 'Grep::Source::Feed'; |
99 |
$class = 'Grep::Source::MoinMoin'; |
100 |
Jifty->log->debug("using $class"); |
101 |
|
102 |
$class->fetch( $self ); |
103 |
|
104 |
Grep::Search->finish if $self->new_items; |
105 |
|
106 |
return $self->collection; |
107 |
} |
108 |
|
109 |
=head2 add_record |
110 |
|
111 |
$parent->add_record( id => 42, foo => 'bar', ... ); |
112 |
|
113 |
=cut |
114 |
|
115 |
sub add_record { |
116 |
my $self = shift; |
117 |
|
118 |
my $i = Grep::Model::Item->new(); |
119 |
|
120 |
my ($ok,$msg) = $i->load_or_create( @_ ); |
121 |
|
122 |
$msg ||= ''; |
123 |
|
124 |
if ( $ok ) { |
125 |
Jifty->log->debug("item ", $i->id, ": $msg"); |
126 |
$self->collection->add_record( $i ); |
127 |
|
128 |
# is new record? |
129 |
if ( $msg !~ m/^Found/ ) { |
130 |
Grep::Search->add( $i ); |
131 |
$self->new_items( $self->new_items + 1 ); |
132 |
} |
133 |
} else { |
134 |
warn "can't add entry ", dump( @_ ), "\n"; |
135 |
} |
136 |
} |
137 |
|
138 |
1; |