Changeset 814


Ignore:
Timestamp:
Jun 22, 2006, 3:30:44 PM (15 years ago)
Author:
nick
Message:

Support RSS and Atom for category and locale indicies, + test for this

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/OpenGuides.pm

    r810 r814  
    485485                    );
    486486
     487  # RSS / Atom version (recent changes style).
     488  $guide->show_index(
     489                        type   => "locale",
     490                        value  => "Holborn",
     491                        format => "rss",
     492                    );
     493
    487494  # Or return output as a string (useful for writing tests).
    488495  $guide->show_index(
     
    568575            $template = "map_index.tt";
    569576           
     577        } elsif( $args{format} eq "rss" || $args{format} eq "atom") {
     578            # They really wanted a recent changes style rss/atom feed
     579            my $feed_type = $args{format};
     580            my ($feed,$content_type) = $self->get_feed_and_content_type($feed_type);
     581
     582            # Grab the actual node data out of @nodes
     583            my @node_data;
     584            foreach my $node (@nodes) {
     585                $node->{node_data}->{name} = $node->{name};
     586                push @node_data, $node->{node_data};
     587            }
     588
     589            my $output = "Content-Type: ".$content_type."\n";
     590            $output .= $feed->build_feed_for_nodes($feed_type, @node_data);
     591
     592            return $output if $args{return_output};
     593            print $output;
     594            return;
    570595        }
    571596    } else {
     
    641666}
    642667
     668=item B<get_feed_and_content_type>
     669
     670Fetch the OpenGuides feed object, and the output content type, for the
     671supplied feed type.
     672
     673Handles all the setup for the OpenGuides feed object.
     674=cut
     675sub get_feed_and_content_type {
     676    my ($self, $feed_type) = @_;
     677
     678    my $feed = OpenGuides::Feed->new(
     679                                        wiki       => $self->wiki,
     680                                        config     => $self->config,
     681                                        og_version => $VERSION,
     682                                    );
     683
     684    my $content_type;
     685   
     686    if ($feed_type eq 'rss') {
     687        $content_type = "application/rdf+xml";
     688    }
     689    elsif ($feed_type eq 'atom') {
     690        $content_type = "application/atom+xml";
     691    }
     692    else {
     693        croak "Unknown feed type given: $feed_type";
     694    }
     695
     696    return ($feed, $content_type);
     697}
     698
    643699=item B<display_feed>
    644700
     
    713769
    714770
    715     my $feed = OpenGuides::Feed->new(
    716                                         wiki       => $self->wiki,
    717                                         config     => $self->config,
    718                                         og_version => $VERSION,
    719                                     );
    720 
    721     my $output;
    722    
    723     if ($feed_type eq 'rss') {
    724         $output = "Content-Type: application/rdf+xml\n";
    725     }
    726     elsif ($feed_type eq 'atom') {
    727         $output = "Content-Type: application/atom+xml\n";
    728     }
    729     else {
    730         croak "Unknown feed type given: $feed_type";
    731     }
     771    # Get the feed object, and the content type
     772    my ($feed,$content_type) = $self->get_feed_and_content_type($feed_type);
     773
     774    my $output = "Content-Type: ".$content_type."\n";
    732775   
    733776    # Get the feed, and the timestamp, in one go
  • trunk/t/53_show_index.t

    r785 r814  
    33use OpenGuides;
    44use OpenGuides::Test;
    5 use Test::More tests => 6;
     5use Test::More tests => 17; # 19 when all enabled
    66
    77eval { require DBD::SQLite; };
     
    99
    1010SKIP: {
    11     skip "DBD::SQLite not installed - no database to test with", 6
     11    skip "DBD::SQLite not installed - no database to test with", 17
    1212      unless $have_sqlite;
    1313
     
    3333                       { category => "Alpha" } )
    3434      or die "Couldn't write node";
     35
     36    # Test the normal, HTML version
    3537    my $output = eval {
    3638        $guide->show_index(
     
    4547    unlike( $output, qr|<title>\s*-|, "...sets <title> correctly" );
    4648
     49    # Test the RDF version
    4750    $output = $guide->show_index(
    4851                                  type          => "category",
     
    5356    like( $output, qr|Content-Type: application/rdf\+xml|,
    5457          "RDF output gets content-type of application/rdf+xml" );
     58    like( $output, qr|<rdf:RDF|, "Really is rdf" );
     59    like( $output, qr|<dc:title>Category Alpha</dc:title>|, "Right rdf title" );
     60    my @entries = ($output =~ /(\<rdf\:li\>)/g);
     61    is( 2, scalar @entries, "Right number of nodes included in rdf" );
     62
     63    # Test the RSS version
     64    $output = eval {
     65        $guide->show_index(
     66                            type          => "category",
     67                            value         => "Alpha",
     68                            return_output => 1,
     69                            format        => "rss",
     70                          );
     71    };
     72    is( $@, "", "->show_index doesn't die when asked for rss" );
     73    like( $output, qr|Content-Type: application/rdf\+xml|,
     74          "RSS output gets content-type of application/rdf+xml" );
     75    like( $output, "/\<rdf\:RDF.*?http\:\/\/purl.org\/rss\//s", "Really is rss" );
     76    #like( $output, qr|<title>Category Alpha</title>|, "Right rss title" );
     77    my @entries = ($output =~ /(\<\/item\>)/g);
     78    is( 2, scalar @entries, "Right number of nodes included in rss" );
     79warn($output);
     80
     81    # Test the Atom version
     82    $output = eval {
     83        $guide->show_index(
     84                            type          => "category",
     85                            value         => "Alpha",
     86                            return_output => 1,
     87                            format        => "atom",
     88                          );
     89    };
     90    is( $@, "", "->show_index doesn't die when asked for atom" );
     91    like( $output, qr|Content-Type: application/atom\+xml|,
     92          "Atom output gets content-type of application/atom+xml" );
     93    like( $output, qr|<feed|, "Really is atom" );
     94    #like( $output, qr|<title>Category Alpha</title>|, "Right atom title" );
     95    my @entries = ($output =~ /(\<entry\>)/g);
     96    is( 2, scalar @entries, "Right number of nodes included in atom" );
    5597}
Note: See TracChangeset for help on using the changeset viewer.