POE-Component-RSSAggregator-1.11/0000755000076500000240000000000011032673437015763 5ustar jbisbeestaffPOE-Component-RSSAggregator-1.11/Changes0000644000076500000240000000712711032673337017264 0ustar jbisbeestaffRevision history for POE-Component-RSSAggregator 1.11 6/30/2008 - add POE as a prereq (duh) - clarified some documentation 1.1 6/30/2008 - perlcritic updates - move pod below __END__ - added two constants - use constant DEFAULT_TIMEOUT => 60; - use constant REDIRECT_DEPTH => 2; - remove trailing whitespace from lines - added implicit returns from subs that didn't have them - fix uninterpolated string warnings ("" to '') - added use strict/use warnings to tests - change quoted regexp to use {} instead of () - Update README 1.022 11/06/2006 - No need to update, cpants META.yml fix, needed to update to ExtUtils::MakeMaker 6.31 for META.yml update (part deux) 1.021 11/05/2006 - No need to update, cpants META.yml fix, needed to update to ExtUtils::MakeMaker 6.31 for META.yml update 1.02 11/01/2006 - Fixed cpants META.yaml issue 1.01 - Missed renaming a fetch to _fetch when the delay was set Thanks to Kester Edmonds for reporting it. 1.0 - Wrote decent pod for the module (finally) - Updated pod template to perl best practices template - renamed methods that should have only be internal - renamed fetch to internal _fetch - renamed response to internal _response 0.3 - Added POE::Component::Client::DNS as a dependency 0.29 - New shutdown event to clean things up - New feed_list method to get the current feeds - Updated some of the debug messages - Fix to to pause_feed in case there isn't a feed to pause - The begins of a PoCo::Server::HTTP test suite so I can actually write tests for it - Defaulted POE::Component::Client::HTTP to FollowRedirects => 2, and allow to set the number of redirects via POE::Component::RSSAggregator->new( ... follow_redirects => 4, ); - Need to write MUCH, MUCH, better documentation... its next! 0.28 - Squelched uninitialized -d test on tmpdir when its not defined. 0.27 - Updated pod (removed reference to XML::RSS::Feed::Factory) - removed calls to failed_to_fetch and failed_to_parse 0.26 - fixed 'remove_feed' so that it when it yielded 'pause_feed' that it would actually work. - updated pod to show 'alias' as a new() param 0.25 - ATTENTION! new() param 'feeds' has been deprecated, use add_feed instead $heap->{rssagg} = POE::Component::RSSAggregator->new( debug => 1, callback => $session->postback("handle_feed"), tmpdir => '/tmp', # optional caching ); $kernel->post('rssagg','add_feed',$_) for @feeds; - fixed the pod not to use XML::RSS::Feed::Factory in the example 0.20 - ATTENTION! You no longer need to use XML::RSS::Feed::Factory to defined 'feeds', just pass an array ref of hash refs for each feed you'd like to watch. - Fixed POD example so it actually works :D - added 'tmpdir' param to pass to XML::RSS::Feed objects to cache XML on DESTROY and to attempt to load and parse old headlines when the object is initialized. - added 'feed' accessor method to fetch XML::RSS::Feed objects 0.10 - Now use XML::RSS::Headline instead of XML::RSS::Feed::Headline - added an accessor 'feeds' for to the hash of rss feeds - use delay_set instead of delay_add. This is for the future support of adding, reloading, removing feeds. - use POE postback instead of sub reference for callback - updated the pod with a POE session example 0.01 - First version, released on an unsuspecting world. POE-Component-RSSAggregator-1.11/examples/0000755000076500000240000000000011032673437017601 5ustar jbisbeestaffPOE-Component-RSSAggregator-1.11/examples/example-1.pl0000644000076500000240000000206311030335210021706 0ustar jbisbeestaff#!/usr/bin/perl use strict; use warnings; use POE; use POE::Component::RSSAggregator; my @feeds = ( { url => "http://www.jbisbee.com/rdf/", name => "jbisbee", delay => 10, }, { url => "http://lwn.net/headlines/rss", name => "lwn", delay => 300, }, ); POE::Session->create( inline_states => { _start => \&init_session, handle_feed => \&handle_feed, }, ); $poe_kernel->run(); sub init_session { my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ]; $heap->{rssagg} = POE::Component::RSSAggregator->new( alias => 'rssagg', debug => 1, callback => $session->postback("handle_feed"), tmpdir => '/tmp', # optional caching ); $kernel->post( 'rssagg', 'add_feed', $_ ) for @feeds; } sub handle_feed { my ( $kernel, $feed ) = ( $_[KERNEL], $_[ARG1]->[0] ); for my $headline ( $feed->late_breaking_news ) { # do stuff with the XML::RSS::Headline object print $headline->headline . "\n"; } } POE-Component-RSSAggregator-1.11/lib/0000755000076500000240000000000011032673437016531 5ustar jbisbeestaffPOE-Component-RSSAggregator-1.11/lib/POE/0000755000076500000240000000000011032673437017154 5ustar jbisbeestaffPOE-Component-RSSAggregator-1.11/lib/POE/Component/0000755000076500000240000000000011032673437021116 5ustar jbisbeestaffPOE-Component-RSSAggregator-1.11/lib/POE/Component/RSSAggregator.pm0000644000076500000240000002504011032375217024122 0ustar jbisbeestaffpackage POE::Component::RSSAggregator; use warnings; use strict; use POE; use POE::Component::Client::HTTP; use HTTP::Request; use XML::RSS::Feed; use Carp qw(croak); use constant DEFAULT_TIMEOUT => 60; use constant REDIRECT_DEPTH => 2; our $VERSION = 1.11; sub new { my $class = shift; croak __PACKAGE__ . '->new() params must be a hash' if @_ % 2; my %params = @_; croak __PACKAGE__ . '->new() feeds param has been deprecated, use add_feed' if $params{feeds}; my $self = bless \%params, $class; $self->_init(); return $self; } sub _start { my ( $self, $kernel ) = @_[ OBJECT, KERNEL ]; $self->{alias} = 'rssagg' unless $self->{alias}; $kernel->alias_set( $self->{alias} ); return; } sub _stop {} sub _init { my ($self) = @_; unless ( $self->{http_alias} ) { $self->{http_alias} = 'ua'; $self->{follow_redirects} ||= REDIRECT_DEPTH; POE::Component::Client::HTTP->spawn( Alias => $self->{http_alias}, Timeout => DEFAULT_TIMEOUT, FollowRedirects => $self->{follow_redirects}, Agent => 'Mozilla/5.0 (X11; U; Linux i686; en-US; ' . 'rv:1.1) Gecko/20020913 Debian/1.1-1', ); } POE::Session->create( object_states => [ $self => [ qw( _start add_feed remove_feed pause_feed resume_feed _fetch _response shutdown _stop ) ], ], ); return; } sub _create_feed_object { my ( $self, $feed_hash ) = @_; warn "[$feed_hash->{name}] Creating XML::RSS::Feed object\n" if $self->{debug}; $feed_hash->{tmpdir} = $self->{tmpdir} if exists $self->{tmpdir} && -d $self->{tmpdir}; $feed_hash->{debug} = $self->{debug} if $self->{debug}; if ( my $rssfeed = XML::RSS::Feed->new(%$feed_hash) ) { $self->{feed_objs}{ $rssfeed->name } = $rssfeed; } else { warn "[$feed_hash->{name}] !! Error attempting to " . "create XML::RSS::Feed object\n"; } return; } sub feed_list { my ($self) = @_; my @feeds = map { $self->{feed_objs}{$_} } keys %{ $self->{feed_objs} }; return wantarray ? @feeds : \@feeds; } sub feeds { my ($self) = @_; return $self->{feed_objs}; } sub feed { my ( $self, $name ) = @_; return exists $self->{feed_objs}{$name} ? $self->{feed_objs}{$name} : undef; } sub add_feed { my ( $self, $kernel, $feed_hash ) = @_[ OBJECT, KERNEL, ARG0 ]; if ( exists $self->{feed_objs}{ $feed_hash->{name} } ) { warn "[$feed_hash->{name}] !! Add Failed: Feed name already exists\n"; return; } warn "[$feed_hash->{name}] Added\n" if $self->{debug}; $self->_create_feed_object($feed_hash); # Test to remove it after 10 seconds $kernel->yield( '_fetch', $feed_hash->{name} ); return; } sub remove_feed { my ( $self, $kernel, $name ) = @_[ OBJECT, KERNEL, ARG0 ]; unless ( exists $self->{feed_objs}{$name} ) { warn "[$name] remove_feed: Remove Failed: Unknown feed\n"; return; } $kernel->call( $self->{alias}, 'pause_feed', $name ); delete $self->{feed_objs}{$name}; warn "[$name] remove_feed: Removed RSS Feed\n" if $self->{debug}; return; } sub pause_feed { my ( $self, $kernel, $name ) = @_[ OBJECT, KERNEL, ARG0 ]; unless ( exists $self->{feed_objs}{$name} ) { warn "[$name] pause_feed: Pause Failed: Unknown feed\n"; return; } unless ( exists $self->{alarm_ids}{$name} ) { warn "[$name] pause_feed: Pause Failed: Feed currently on pause\n"; return; } if ( $kernel->alarm_remove( $self->{alarm_ids}{$name} ) ) { delete $self->{alarm_ids}{$name}; warn "[$name] pause_feed: Paused RSS Feed\n" if $self->{debug}; } else { warn "[$name] pause_feed: Failed to Pause RSS Feed\n" if $self->{debug}; } return; } sub resume_feed { my ( $self, $kernel, $name ) = @_[ OBJECT, KERNEL, ARG0 ]; unless ( exists $self->{feed_objs}{$name} ) { warn "[$name] resume_feed: Resume Failed: Unknown feed\n"; return; } if ( exists $self->{alarm_ids}{$name} ) { warn "[$name] resume_feed: Resume Failed: Feed currently active\n"; return; } warn "[$name] resume_feed: Resumed RSS Feed\n" if $self->{debug}; $kernel->yield( '_fetch', $name ); return; } sub shutdown { my ( $self, $kernel, $session ) = @_[ OBJECT, KERNEL, SESSION ]; for my $feed ( $self->feed_list ) { $kernel->call( $session, 'remove_feed', $feed->name ); } delete $self->{callback}; $kernel->alias_remove( $self->{alias} ); warn "shutdown: shutting down rssaggregator\n" if $self->{debug}; return; } sub _fetch { my ( $self, $kernel, $feed_name ) = @_[ OBJECT, KERNEL, ARG0 ]; unless ( exists $self->{feed_objs}{$feed_name} ) { warn "[$feed_name] Unknown Feed\n"; return; } my $rssfeed = $self->{feed_objs}{$feed_name}; my $req = HTTP::Request->new( GET => $rssfeed->url ); warn '[' . $rssfeed->name . '] Attempting to fetch' . "\n" if $self->{debug}; $kernel->post( $self->{http_alias}, 'request', '_response', $req, $rssfeed->name ); $self->{alarm_ids}{ $rssfeed->name } = $kernel->delay_set( '_fetch', $rssfeed->delay, $rssfeed->name ); return; } sub _response { my ( $self, $kernel, $request_packet, $response_packet ) = @_[ OBJECT, KERNEL, ARG0, ARG1 ]; my ( $req, $feed_name ) = @$request_packet; unless ( exists $self->{feed_objs}{$feed_name} ) { warn "[$feed_name] Unknown Feed\n"; return; } my $rssfeed = $self->{feed_objs}{$feed_name}; my $res = $response_packet->[0]; if ( $res->is_success ) { warn '[' . $rssfeed->name . '] Fetched ' . $rssfeed->url . "\n" if $self->{debug}; $self->{callback}->($rssfeed) if $rssfeed->parse( $res->content ); } else { warn '[!!] Failed to fetch ' . $req->uri . "\n"; } return; } 1; __END__ =head1 NAME POE::Component::RSSAggregator - Watch Muliple RSS Feeds for New Headlines =head1 VERSION Version 1.11 =head1 SYNOPSIS #!/usr/bin/perl use strict; use warnings; use POE; use POE::Component::RSSAggregator; my @feeds = ( { url => "http://www.jbisbee.com/rdf/", name => "jbisbee", delay => 10, }, { url => "http://lwn.net/headlines/rss", name => "lwn", delay => 300, }, ); POE::Session->create( inline_states => { _start => \&init_session, handle_feed => \&handle_feed, }, ); $poe_kernel->run(); sub init_session { my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ]; $heap->{rssagg} = POE::Component::RSSAggregator->new( alias => 'rssagg', debug => 1, callback => $session->postback("handle_feed"), tmpdir => '/tmp', # optional caching ); $kernel->post( 'rssagg', 'add_feed', $_ ) for @feeds; } sub handle_feed { my ( $kernel, $feed ) = ( $_[KERNEL], $_[ARG1]->[0] ); for my $headline ( $feed->late_breaking_news ) { # do stuff with the XML::RSS::Headline object print $headline->headline . "\n"; } } =head1 CONSTRUCTORS =head2 POE::Component::RSSAggregator->new( %hash ); Create a new instace of PoCo::RSSAggregator. =over 4 =item * alias POE alias to use for your instance of PoCo::RSSAggregator. =item * debug Boolean value to turn on verbose output. (debug is also passed to XML::RSS::Feed instances to turn on verbose output as well) =item * tmpdir The tmpdir argument is passed on to XML::RSS::Feed as the directory to cache RSS between fetches (and instances). =item * http_alias Optional. Alias of an existing PoCoCl::HTTP. =item * follow_redirects Optional. Only if you don't have an exiting PoCoCl::HTTP. Argument is passed to PoCoCl::HTTP to tell it the follow redirect level. (Defaults to 2) =back =head1 METHODS =head2 $rssagg->feed_list Returns the current feeds as an array or array_ref. =head2 $rssagg->feeds Returns a hash ref of feeds with the key being the feeds name. The hash reference you that belongs to the key is passed to XML::RSS::Feed->new($hash_ref). ( see L ) =head2 $rssagg->feed( $feed_name ) Accessor to access a the XML::RSS::Feed object via a feed's name. =head2 $rssagg->add_feed( $hash_ref ) The hash reference you pass in to add_feed is passed to XML::RSS::Feed->new($hash_ref). ( see L ) =head2 $rssagg->remove_feed( $feed_name ) Pass in the name of the feed you want to remove. =head2 $rssagg->pause_feed( $feed_name ) Pass in the name of the feed you want to pause. =head2 $rssagg->resume_feed( $feed_name ) Pass in the name of the feed you want to resume (that you previously paused). =head2 $rssagg->shutdown Shutdown the instance of PoCo::RSSAggregator. =head1 AUTHOR Jeff Bisbee, C<< >> =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc POE::Component::RSSAggregator You can also look for information at: =over 4 =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * RT: CPAN's request tracker L =item * Search CPAN L =back =head1 ACKNOWLEDGEMENTS Special thanks to Rocco Caputo, Martijn van Beers, Sean Burke, Prakash Kailasa and Randal Schwartz for their help, guidance, patience, and bug reports. Guys thanks for actually taking time to use the code and give good, honest feedback. =head1 COPYRIGHT & LICENSE Copyright 2006 Jeff Bisbee, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L, L, L POE-Component-RSSAggregator-1.11/Makefile.PL0000644000076500000240000000146411032324712017727 0ustar jbisbeestaffuse strict; use warnings; use ExtUtils::MakeMaker; WriteMakefile( NAME => 'POE::Component::RSSAggregator', AUTHOR => 'Jeff Bisbee ', VERSION_FROM => 'lib/POE/Component/RSSAggregator.pm', ABSTRACT_FROM => 'lib/POE/Component/RSSAggregator.pm', PL_FILES => {}, PREREQ_PM => { 'POE' => 0, 'POE::Component::Client::HTTP' => 0.51, 'POE::Component::Client::DNS' => 0.98, 'XML::RSS::Feed' => 0.01, 'HTTP::Request' => 1.30, 'Test::More' => 0, 'Carp' => 0, }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => 'POE-Component-RSSAggregator-*' }, LICENSE => 'perl', ); POE-Component-RSSAggregator-1.11/MANIFEST0000644000076500000240000000031311030335210017067 0ustar jbisbeestaffChanges lib/POE/Component/RSSAggregator.pm Makefile.PL MANIFEST META.yml # Will be created by "make dist" README examples/example-1.pl t/00-load.t t/01-basic.t t/boilerplate.t t/pod-coverage.t t/pod.t POE-Component-RSSAggregator-1.11/META.yml0000644000076500000240000000127511032673437017241 0ustar jbisbeestaff--- #YAML:1.0 name: POE-Component-RSSAggregator version: 1.11 abstract: Watch Muliple RSS Feeds for New Headlines license: perl author: - Jeff Bisbee generated_by: ExtUtils::MakeMaker version 6.44 distribution_type: module requires: Carp: 0 HTTP::Request: 1.3 POE: 0 POE::Component::Client::DNS: 0.98 POE::Component::Client::HTTP: 0.51 Test::More: 0 XML::RSS::Feed: 0.01 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.3.html version: 1.3 POE-Component-RSSAggregator-1.11/README0000644000076500000240000001122311032324756016637 0ustar jbisbeestaffNAME POE::Component::RSSAggregator - Watch Muliple RSS Feeds for New Headlines VERSION Version 1.11 SYNOPSIS #!/usr/bin/perl use strict; use warnings; use POE; use POE::Component::RSSAggregator; my @feeds = ( { url => "http://www.jbisbee.com/rdf/", name => "jbisbee", delay => 10, }, { url => "http://lwn.net/headlines/rss", name => "lwn", delay => 300, }, ); POE::Session->create( inline_states => { _start => \&init_session, handle_feed => \&handle_feed, }, ); $poe_kernel->run(); sub init_session { my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ]; $heap->{rssagg} = POE::Component::RSSAggregator->new( alias => 'rssagg', debug => 1, callback => $session->postback("handle_feed"), tmpdir => '/tmp', # optional caching ); $kernel->post( 'rssagg', 'add_feed', $_ ) for @feeds; } sub handle_feed { my ( $kernel, $feed ) = ( $_[KERNEL], $_[ARG1]->[0] ); for my $headline ( $feed->late_breaking_news ) { # do stuff with the XML::RSS::Headline object print $headline->headline . "\n"; } } CONSTRUCTORS POE::Component::RSSAggregator->new( %hash ); Create a new instace of PoCo::RSSAggregator. * alias POE alias to use for your instance of PoCo::RSSAggregator. * debug Boolean value to turn on verbose output. (debug is also passed to XML::RSS::Feed instances to turn on verbose output as well) * tmpdir The tmpdir argument is passed on to XML::RSS::Feed as the directory to cache RSS between fetches (and instances). * http_alias Optional. Alias of an existing PoCoCl::HTTP. * follow_redirects Optional. Only if you don't have an exiting PoCoCl::HTTP. Argument is passed to PoCoCl::HTTP to tell it the follow redirect level. (Defaults to 2) METHODS $rssagg->feed_list Returns the current feeds as an array or array_ref. $rssagg->feeds Returns a hash ref of feeds with the key being the feeds name. The hash reference you that belongs to the key is passed to XML::RSS::Feed->new($hash_ref). ( see XML::RSS::Feed ) $rssagg->feed( $feed_name ) Accessor to access a the XML::RSS::Feed object via a feed's name. $rssagg->add_feed( $hash_ref ) The hash reference you pass in to add_feed is passed to XML::RSS::Feed->new($hash_ref). ( see XML::RSS::Feed ) $rssagg->remove_feed( $feed_name ) Pass in the name of the feed you want to remove. $rssagg->pause_feed( $feed_name ) Pass in the name of the feed you want to pause. $rssagg->resume_feed( $feed_name ) Pass in the name of the feed you want to resume (that you previously paused). $rssagg->shutdown Shutdown the instance of PoCo::RSSAggregator. AUTHOR Jeff Bisbee, "" BUGS Please report any bugs or feature requests to "bug-poe-component-rssaggregator at rt.cpan.org", or through the web interface at . I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. SUPPORT You can find documentation for this module with the perldoc command. perldoc POE::Component::RSSAggregator You can also look for information at: * AnnoCPAN: Annotated CPAN documentation * CPAN Ratings * RT: CPAN's request tracker * Search CPAN ACKNOWLEDGEMENTS Special thanks to Rocco Caputo, Martijn van Beers, Sean Burke, Prakash Kailasa and Randal Schwartz for their help, guidance, patience, and bug reports. Guys thanks for actually taking time to use the code and give good, honest feedback. COPYRIGHT & LICENSE Copyright 2006 Jeff Bisbee, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. SEE ALSO XML::RSS::Feed, XML::RSS::Headline, XML::RSS::Headline::PerlJobs, XML::RSS::Headline::Fark POE-Component-RSSAggregator-1.11/t/0000755000076500000240000000000011032673437016226 5ustar jbisbeestaffPOE-Component-RSSAggregator-1.11/t/00-load.t0000644000076500000240000000034211032155222017531 0ustar jbisbeestaff#!/usr/bin/perl use strict; use warnings; use Test::More tests => 1; BEGIN { use_ok('POE::Component::RSSAggregator'); } diag("Testing POE::Component::RSSAggregator $POE::Component::RSSAggregator::VERSION, Perl $], $^X"); POE-Component-RSSAggregator-1.11/t/01-basic.t0000644000076500000240000001104011032155307017675 0ustar jbisbeestaff#!/usr/bin/perl use strict; use warnings; use Test::More tests => 1; use_ok('POE'); POE::Kernel->run(); __DATA__ use Test::More tests => 5; use POE; use POE::Component::RSSAggregator; use HTTP::Status; use POE::Component::Server::HTTP; our %URLS = ( test1 => \&test1, test2 => \&test2, ); our @test1_xml = ( q|jbisbee.com http://www.jbisbee.com/Testing PoCo::RSSAggregator Friday 12th of November 2004 02:20:00 PM http://www.jbisbee.com/xml-rss-feed/test/1100294400|, qq|jbisbee.com http://www.jbisbee.com/Testing PoCo::RSSAggregator Friday 12th of November 2004 02:20:30 PM http://www.jbisbee.com/xml-rss-feed/test/1100294430| ); our @test2_xml = ( q|jbisbee.com http://poe.perl.org/Testing PoCo::RSSAggregator Friday 12th of November 2004 02:20:00 PM http://poe.perl.org/xml-rss-feed/test/1100294400|, qq|jbisbee.com http://poe.perl.org/Testing PoCo::RSSAggregator Friday 12th of November 2004 02:20:30 PM http://poe.perl.org/xml-rss-feed/test/1100294430| ); POE::Session->new( _start => \&start, _stop => sub { }, _child => sub { }, handle_feed => \&handle_feed, closeshop => \&closeshop, verify => \&verify, ); POE::Kernel->run(); sub start { my ( $heap, $session, $kernel ) = @_[ HEAP, SESSION, KERNEL ]; my $postback = $session->postback("handle_feed"); $heap->{rssagg} = POE::Component::RSSAggregator->new( callback => $postback ); isa_ok( $heap->{rssagg}, "POE::Component::RSSAggregator" ); $heap->{httpd} = spawn_http_server(12345); $kernel->call( $heap->{rssagg}->{alias}, 'add_feed', $_ ) for ( { name => 'test1', url => 'http://localhost:12345/test1', delay => 1 }, { name => 'test2', url => 'http://localhost:12345/test2', delay => 1 }, ); my @feeds = $heap->{rssagg}->feed_list(); is( @feeds, 2, "Verify two feeds loaded" ); } my %done = ( test1 => 0, test2 => 0 ); my $done = 0; sub handle_feed { my ( $kernel, $session, $heap, $feed ) = ( @_[ KERNEL, SESSION, HEAP ], $_[ARG1]->[0] ); return if $done; isa_ok( $feed, "XML::RSS::Feed" ); my $headlines = $feed->num_headlines; if ( $feed->late_breaking_news ) { $done{ $feed->name }++; $done = 1; for my $test (qw(test1 test2)) { $done = $done{$test}; } $kernel->post( $session, 'closeshop' ) unless $done; } } sub closeshop { my ( $kernel, $heap ) = ( @_[ KERNEL, HEAP ] ); $kernel->post( $heap->{httpd}{httpd}, "shutdown" ); $kernel->post( $heap->{rssagg}->{alias}, 'shutdown' ); $kernel->yield('verify'); } sub verify { my ( $kernel, $heap ) = ( @_[ KERNEL, HEAP ] ); my @feeds = $heap->{rssagg}->feed_list(); is( @feeds, 0, "All feeds have been removed" ); } sub spawn_http_server { my ($port) = shift; return POE::Component::Server::HTTP->new( Port => $port, ContentHandler => { '/' => \&http_handler }, Headers => { Server => 'My Server' }, ); } sub http_handler { my ( $request, $response ) = @_; my $path = $request->uri->path; $path =~ s/^\///; my $xml = &{ $URLS{$path} }(); $response->code( HTTP::Status::RC_OK() ); $response->content($xml); return HTTP::Status::RC_OK(); } sub test1 { my $xml = shift @test1_xml; push @test1_xml, $xml; return $xml; } sub test2 { my $xml = shift @test2_xml; push @test2_xml, $xml; return $xml; } POE-Component-RSSAggregator-1.11/t/boilerplate.t0000644000076500000240000000245111032252134020702 0ustar jbisbeestaff#!/usr/bin/perl use strict; use warnings; use Test::More tests => 3; sub not_in_file_ok { my ( $filename, %regex ) = @_; open my $fh, '<', $filename or die "couldn't open $filename for reading: $!"; my %violated; while ( my $line = <$fh> ) { while ( my ( $desc, $regex ) = each %regex ) { if ( $line =~ $regex ) { push @{ $violated{$desc} ||= [] }, $.; } } } if (%violated) { fail("$filename contains boilerplate text"); diag "$_ appears on lines @{$violated{$_}}" for keys %violated; } else { pass("$filename contains no boilerplate text"); } return; } not_in_file_ok( README => 'The README is used...' => qr/The README is used/, '\'version information here\'' => qr/to provide version information/, ); not_in_file_ok( Changes => 'placeholder date/time' => qr{Date/time} ); sub module_boilerplate_ok { my ($module) = @_; not_in_file_ok( $module => 'the great new $MODULENAME' => qr/ - The great new /, 'boilerplate description' => qr/Quick summary of what the module/, 'stub function definition' => qr/function[12]/, ); return; } module_boilerplate_ok('lib/POE/Component/RSSAggregator.pm'); POE-Component-RSSAggregator-1.11/t/pod-coverage.t0000644000076500000240000000031411032251663020755 0ustar jbisbeestaff#!/usr/bin/perl use strict; use warnings; use Test::More; eval 'use Test::Pod::Coverage 1.04'; plan skip_all => 'Test::Pod::Coverage 1.04 required for testing POD coverage' if $@; all_pod_coverage_ok(); POE-Component-RSSAggregator-1.11/t/pod.t0000644000076500000240000000025411032251754017170 0ustar jbisbeestaff#!/usr/bin/perl use strict; use warnings; use Test::More; eval 'use Test::Pod 1.14'; plan skip_all => 'Test::Pod 1.14 required for testing POD' if $@; all_pod_files_ok();