Wiki-Toolkit-Plugin-JSON-0.05000755001750001750 012165652135 16264 5ustar00vagrantvagrant000000000000Wiki-Toolkit-Plugin-JSON-0.05/Build.PL000444001750001750 102612165652130 17707 0ustar00vagrantvagrant000000000000#!/usr/bin/perl use strict; use Module::Build; Module::Build->new( module_name => 'Wiki::Toolkit::Plugin::JSON', requires => { 'JSON' => 0, 'Time::Piece' => 0, 'URI::Escape' => 0, }, recommends => { 'Wiki::Toolkit' => 0, 'Test::JSON' => 0, }, license => 'perl', sign => 1, dist_abstract => 'A Wiki::Toolkit plugin to output RecentChanges JSON.', )->create_build_script; Wiki-Toolkit-Plugin-JSON-0.05/Makefile.PL000444001750001750 160212165652130 20365 0ustar00vagrantvagrant000000000000 unless (eval "use Module::Build::Compat 0.02; 1" ) { print "This module requires Module::Build to install itself.\n"; require ExtUtils::MakeMaker; my $yn = ExtUtils::MakeMaker::prompt (' Install Module::Build now from CPAN?', 'y'); unless ($yn =~ /^y/i) { warn " *** Cannot install without Module::Build. Exiting ...\n"; exit 1; } require Cwd; require File::Spec; require CPAN; # Save this 'cause CPAN will chdir all over the place. my $cwd = Cwd::cwd(); my $makefile = File::Spec->rel2abs($0); CPAN::Shell->install('Module::Build::Compat'); chdir $cwd or die "Cannot chdir() back to $cwd: $!"; exec $^X, $makefile, @ARGV; # Redo now that we have Module::Build } Module::Build::Compat->run_build_pl(args => \@ARGV); Module::Build::Compat->write_makefile();Wiki-Toolkit-Plugin-JSON-0.05/SIGNATURE000644001750001750 255712165652135 17720 0ustar00vagrantvagrant000000000000This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.68. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 20ca7824cd13288b6ede7d1f7803390fb035dc61 Build.PL SHA1 6af6b8940f50b3521d16a0e03ec825b6625c1c34 CHANGES SHA1 26dd4d4a819c9839f53293dad468a037f93f5abb MANIFEST SHA1 726d350295ecbca7827d2fd1ce1f477f759824da META.json SHA1 cf59f18d3ed48c3aed79ffcf00396e4338161d6a META.yml SHA1 9fac6f034ce9889fcc0916351df871264de7b8f8 Makefile.PL SHA1 6726f84b6c54b7d3db726c2b1ca538c9816b4b5c lib/Wiki/Toolkit/Plugin/JSON.pm SHA1 ff1b0bda7a7dc4ada8f3ab8189c5a4f0f86a422f t/001_load.t SHA1 bb64a9bb8e46e7549e5c3b7bd534edb87377389a t/002_basic_invocation.t -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iJwEAQECAAYFAlHXVFgACgkQivyhN+Jvqw2/ogQAx/7XGHoSA/HbgaL5glopwLr2 YcyGVmgTeiH6tDupk/rQmzmKVyPYk5IFJLN3Deu0QvyiUnQw0leOx6licYd1Dc5s DANYXK/wJHJ+NsWWK6BDnfxzXIu4P3PYq6F16NHhKIU9cB+5OgeNOk6eSWO8GMQX AmbBZyT0nlc3ygcEUx4= =L21k -----END PGP SIGNATURE----- Wiki-Toolkit-Plugin-JSON-0.05/META.yml000444001750001750 121512165652130 17664 0ustar00vagrantvagrant000000000000--- abstract: 'A Wiki::Toolkit plugin to output RecentChanges JSON.' author: - unknown build_requires: {} configure_requires: Module::Build: 0.38 dynamic_config: 1 generated_by: 'Module::Build version 0.38, CPAN::Meta::Converter version 2.110440' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Wiki-Toolkit-Plugin-JSON provides: Wiki::Toolkit::Plugin::JSON: file: lib/Wiki/Toolkit/Plugin/JSON.pm version: 0.05 recommends: Test::JSON: 0 Wiki::Toolkit: 0 requires: JSON: 0 Time::Piece: 0 URI::Escape: 0 resources: license: http://dev.perl.org/licenses/ version: 0.05 Wiki-Toolkit-Plugin-JSON-0.05/CHANGES000444001750001750 113612165652130 17410 0ustar00vagrantvagrant0000000000002013-07-06 0.05 * Skip tests if Wiki::Toolkit::Testlib isnt available. * Test the validity of the outputted JSON with Test::JSON 2013-07-01 0.04 * Don't attempt to use JSON::Syck any more - JSON now uses JSON::XS where possible, so just use that. 2008-10-26: 0.03 * Add missing prerequisites 2008-10-24: 0.02 * Fix URL below * Update copyright * Add minimal test suite with use_ok 2008-10-18: 0.01 * Initial release, taken from http://dev.openguides.org/attachment/ticket/154/ Wiki-Toolkit-Plugin-JSON-0.05/MANIFEST000444001750001750 25012165652130 17522 0ustar00vagrantvagrant000000000000Build.PL CHANGES lib/Wiki/Toolkit/Plugin/JSON.pm MANIFEST Makefile.PL META.yml t/001_load.t t/002_basic_invocation.t META.json SIGNATURE Added here by Module::Build Wiki-Toolkit-Plugin-JSON-0.05/META.json000444001750001750 210612165652130 20034 0ustar00vagrantvagrant000000000000{ "abstract" : "A Wiki::Toolkit plugin to output RecentChanges JSON.", "author" : [ "unknown" ], "dynamic_config" : 1, "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.110440", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Wiki-Toolkit-Plugin-JSON", "prereqs" : { "configure" : { "requires" : { "Module::Build" : "0.38" } }, "runtime" : { "recommends" : { "Test::JSON" : 0, "Wiki::Toolkit" : 0 }, "requires" : { "JSON" : 0, "Time::Piece" : 0, "URI::Escape" : 0 } } }, "provides" : { "Wiki::Toolkit::Plugin::JSON" : { "file" : "lib/Wiki/Toolkit/Plugin/JSON.pm", "version" : "0.05" } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ] }, "version" : "0.05" } Wiki-Toolkit-Plugin-JSON-0.05/lib000755001750001750 012165652130 17025 5ustar00vagrantvagrant000000000000Wiki-Toolkit-Plugin-JSON-0.05/lib/Wiki000755001750001750 012165652130 17730 5ustar00vagrantvagrant000000000000Wiki-Toolkit-Plugin-JSON-0.05/lib/Wiki/Toolkit000755001750001750 012165652130 21355 5ustar00vagrantvagrant000000000000Wiki-Toolkit-Plugin-JSON-0.05/lib/Wiki/Toolkit/Plugin000755001750001750 012165652130 22613 5ustar00vagrantvagrant000000000000Wiki-Toolkit-Plugin-JSON-0.05/lib/Wiki/Toolkit/Plugin/JSON.pm000444001750001750 2124712165652130 24105 0ustar00vagrantvagrant000000000000package Wiki::Toolkit::Plugin::JSON; use strict; use vars qw( $VERSION ); $VERSION = '0.05'; use JSON; use POSIX 'strftime'; use Time::Piece; use URI::Escape; use Carp qw( croak ); sub new { my $class = shift; my $self = {@_}; bless $self, $class; unless ( $self->{wiki} && UNIVERSAL::isa( $self->{wiki}, 'Wiki::Toolkit' ) ) { croak 'No Wiki::Toolkit object supplied'; } # Mandatory arguments. foreach my $arg (qw/site_name site_url make_node_url recent_changes_link/) { croak "No $arg supplied" unless $self->{$arg}; } $self->{timestamp_fmt} = $Wiki::Toolkit::Store::Database::timestamp_fmt; $self->{utc_offset} = strftime "%z", localtime; $self->{utc_offset} =~ s/(..)(..)$/$1:$2/; return $self; } sub recent_changes { my ( $self, %args ) = @_; my $wiki = $self->{wiki}; # If we're not passed any parameters to limit the items returned, default to 15. my %criteria = ( ignore_case => 1, ); if ( $args{days} ) { $criteria{days} = $args{days}; } else { $criteria{last_n_changes} = $args{items} || 15; } if ( $args{ignore_minor_edits} ) { $criteria{metadata_wasnt} = { major_change => 0 }; } if ( $args{filter_on_metadata} ) { $criteria{metadata_was} = $args{filter_on_metadata}; } my @changes = $wiki->list_recent_changes(%criteria); foreach my $change (@changes) { $change->{timestamp} = $change->{last_modified}; # Make a Time::Piece object. my $time = Time::Piece->strptime( $change->{timestamp}, $self->{timestamp_fmt} ); my $utc_offset = $self->{utc_offset}; $change->{timestamp} = $time->strftime("%Y-%m-%dT%H:%M:%S$utc_offset"); $change->{author} = $change->{metadata}{username}[0] || $change->{metadata}{host}[0] || ''; $change->{description} = $change->{metadata}{comment}[0] || ''; $change->{status} = ( 1 == $change->{version} ) ? 'new' : 'updated'; $change->{major_change} = $change->{metadata}{major_change}[0]; $change->{major_change} = 1 unless defined $change->{major_change}; $change->{importance} = $change->{major_change} ? 'major' : 'minor'; $change->{url} = $self->{make_node_url}->( $change->{name}, $change->{version} ); if ( $self->{make_diff_url} ) { $change->{diff_url} = $self->{make_diff_url}->( $change->{name} ); } if ( $self->{make_history_url} ) { $change->{history_url} = $self->{make_history_url}->( $change->{name} ); } $change->{node_url} = $self->{make_node_url}->( $change->{name} ); my $rdf_url = $change->{node_url}; $rdf_url =~ s/\?/\?id=/; $rdf_url .= ';format=rdf'; $change->{rdf_url} = $rdf_url; # make XML-clean my $title = $change->{name}; $title =~ s/&/&/g; $title =~ s//>/g; $change->{title} = $title; } return $self->make_json( \@changes ); } sub make_json { my ( $self, $data ) = @_; return JSON::to_json( $data ); } 1; __END__ =head1 NAME Wiki::Toolkit::Plugin::JSON - A Wiki::Toolkit plugin to output RecentChanges JSON. =head1 DESCRIPTION This is an alternative access to the recent changes of a Wiki::Toolkit wiki. It outputs JSON. =head1 SYNOPSIS use Wiki::Toolkit; use Wiki::Toolkit::Plugin::JSON; my $wiki = Wiki::Toolkit->new( ... ); # See perldoc Wiki::Toolkit # Set up the JSON feeder with the mandatory arguments - see # C below for more, optional, arguments. my $json = Wiki::Toolkit::Plugin::JSON->new( wiki => $wiki, site_name => 'My Wiki', site_url => 'http://example.com/', make_node_url => sub { my ($node_name, $version) = @_; return 'http://example.com/?id=' . uri_escape($node_name) . ';version=' . uri_escape($version); }, recent_changes_link => 'http://example.com/?RecentChanges', ); print "Content-type: application/xml\n\n"; print $json->recent_changes; =head1 METHODS =head2 C my $json = Wiki::Toolkit::Plugin::JSON->new( # Mandatory arguments: wiki => $wiki, site_name => 'My Wiki', site_url => 'http://example.com/', make_node_url => sub { my ($node_name, $version) = @_; return 'http://example.com/?id=' . uri_escape($node_name) . ';version=' . uri_escape($version); }, recent_changes_link => 'http://example.com/?RecentChanges', # Optional arguments: site_description => 'My wiki about my stuff', interwiki_identifier => 'MyWiki', make_diff_url => sub { my $node_name = shift; return 'http://example.com/?diff=' . uri_escape($node_name) }, make_history_url => sub { my $node_name = shift; return 'http://example.com/?hist=' . uri_escape($node_name) }, ); C must be a L object. C, and C and C, if supplied, must be coderefs. The mandatory arguments are: =over 4 =item * wiki =item * site_name =item * site_url =item * make_node_url =item * recent_changes_link =back =head2 C $wiki->write_node( 'About This Wiki', 'blah blah blah', $checksum, { comment => 'Stub page, please update!', username => 'Fred', } ); print "Content-type: application/xml\n\n"; print $json->recent_changes; # Or get something other than the default of the latest 15 changes. print $json->recent_changes( items => 50 ); print $json->recent_changes( days => 7 ); # Or ignore minor edits. print $json->recent_changes( ignore_minor_edits => 1 ); # Personalise your feed further - consider only changes # made by Fred to pages about bookshops. print $json->recent_changes( filter_on_metadata => { username => 'Fred', category => 'Bookshops', }, ); If using C, note that only changes satisfying I criteria will be returned. B Many of the fields emitted by the JSON generator are taken from the node metadata. The form of this metadata is I mandated by L. Your wiki application should make sure to store some or all of the following metadata when calling C: =over 4 =item B - a brief comment summarising the edit that has just been made. Defaults to the empty string. =item B - an identifier for the person who made the edit; will be used as the Dublin Core contributor for this item. Defaults to the empty string. =item B - the hostname or IP address of the computer used to make the edit; if no username is supplied then this will be used as the Dublin Core contributor for this item. Defaults to the empty string. =item B - true if the edit was a major edit and false if it was a minor edit; used for the importance of the item. Defaults to true (ie if C was not defined or was explicitly stored as C). =back =head2 C print $json->rss_timestamp(); Returns the timestamp of the feed in POSIX::strftime style ("Tue, 29 Feb 2000 12:34:56 GMT"), which is equivalent to the timestamp of the most recent item in the feed. Takes the same arguments as recent_changes(). You will most likely need this to print a Last-Modified HTTP header so user-agents can determine whether they need to reload the feed or not. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =head1 MAINTAINER Earle Martin . Originally by Kake Pugh . =head1 COPYRIGHT AND LICENSE Copyright 2003-4 Kake Pugh. Subsequent modifications copyright 2005 Earle Martin. Copyright 2008 the Wiki::Toolkit team This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 THANKS The members of the Semantic Web Interest Group channel on irc.freenode.net, #swig, were very useful in the development of this module. =cut Wiki-Toolkit-Plugin-JSON-0.05/t000755001750001750 012165652130 16522 5ustar00vagrantvagrant000000000000Wiki-Toolkit-Plugin-JSON-0.05/t/001_load.t000444001750001750 10512165652130 20317 0ustar00vagrantvagrant000000000000use Test::More tests => 1; use_ok( "Wiki::Toolkit::Plugin::JSON" ); Wiki-Toolkit-Plugin-JSON-0.05/t/002_basic_invocation.t000444001750001750 417212165652130 22743 0ustar00vagrantvagrant000000000000use strict; use JSON; use Test::More; use Wiki::Toolkit::Plugin::JSON; #use Wiki::Toolkit::TestLib; eval "use Wiki::Toolkit::TestLib"; plan skip_all => "Wiki::Toolkit::TestLib needed to run tests" if $@; if ( scalar @Wiki::Toolkit::TestLib::wiki_info == 0 ) { plan skip_all => "no backends configured"; } else { plan tests => ( 4 * scalar @Wiki::Toolkit::TestLib::wiki_info ); } my $iterator = Wiki::Toolkit::TestLib->new_wiki_maker; while ( my $wiki = $iterator->new_wiki ) { # Put some test data in, sleeping for at least a second in between each. my @nodes = ( "1st Node", "2nd Node", "3rd Node" ); my $start_time = time; foreach my $node ( @nodes ) { my %node_data = $wiki->retrieve_node( $node ); $wiki->write_node( $node, "Stuff.", $node_data{checksum} ); do_sleep(); } # Now test the JSON Recent Changes output. my $json = Wiki::Toolkit::Plugin::JSON->new( wiki => $wiki, site_name => "My Wiki", site_url => "http://example.com/", make_node_url => sub { my ( $node_name, $version ) = @_; $node_name =~ s/\s+/_/g; # quick and dirty if ( $version ) { return "http://example.com/?id=$node_name;version=$version"; } else { return "http://example.com/?id=$node_name"; } }, recent_changes_link => "http://example.com/?RecentChanges", ); my $output = eval { local $SIG{__WARN__} = sub { die $_[0]; }; $json->recent_changes; }; ok( !$@, "->recent_changes() doesn't warn." ); SKIP: { eval "use Test::JSON"; skip "Test::JSON not installed", 1 if $@; is_valid_json( $output, "is well formed json"); }; my $parsed = eval { local $SIG{__WARN__} = sub { die $_[0]; }; decode_json( $output ); }; ok( !$@, "...and its output looks like JSON." ); is( scalar @$parsed, 3, "...and has the right number of nodes." ); } sub do_sleep { my $slept = sleep( 2 ); warn "Slept for less than a second; test results may be unreliable" unless $slept >= 1; }