1 |
dpavlin |
72 |
# 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; |