Any-Renderer
view release on metacpan or search on metacpan
lib/Any/Renderer.pm view on Meta::CPAN
A renderer in this context is something that turns a data structure into a
string. This includes templating engines, serialisers etc.
This module provides a consistent API to these services so that your
application can generate output in an extensible variety of formats.
Formats currently supported include:
- XML (via XML::Simple)
- XML+XSLT
- Data::Dumper
- Javascript, Javascript::Anon & JSON
- UrlEncoded
- The formats supported by Data::Serializer (e.g. Config::General and Config::Wrest)
- Any templating language supported by Any::Template
The module will discover any backend modules and offer up their formats.
Once loaded, Any::Renderer will look for a module to handle any new formats it doesn't know about, so adding new formats in a persistent environment won't require the module to be reloaded.
However if you CHANGE which module provides a format you will need to reload Any::Renderer (e.g. send a SIGHUP to modperl).
=head1 METHODS
lib/Any/Renderer.pm view on Meta::CPAN
=head1 GLOBAL VARIABLES
=over 4
=item @Any::Renderer::LowPriProviders
A list of backend providers which have lower precedence (if there is more than one module which provides a given format).
The earlier things appear in this list, the lower the precedence.
Defaults to C<Data::Serializer> as this provides both XML::Simple and Data::Dumper (which have native Any::Renderer backends).
=back
=head1 WRITING A CUSTOM BACKEND
Back-end modules should have the same public interface as Any::Renderer itself:
=over 4
=item $o = new Any::Renderer::MyBackend($format, \%options);
lib/Any/Renderer/Data/Dumper.pm view on Meta::CPAN
package Any::Renderer::Data::Dumper;
# $Id: Dumper.pm,v 1.9 2006/08/23 19:41:16 johna Exp $
use strict;
use vars qw($VERSION);
use Data::Dumper;
$VERSION = sprintf"%d.%03d", q$Revision: 1.9 $ =~ /: (\d+)\.(\d+)/;
use constant FORMAT_NAME => 'Data::Dumper';
sub new
{
my ( $class, $format, $options ) = @_;
die("Invalid format $format") unless($format eq FORMAT_NAME);
$options ||= {};
my $self = {
'options' => $options,
'varname' => delete $options->{VariableName},
};
$options->{DumperOptions} ||= {};
foreach my $opt(keys %{$options->{DumperOptions}}) {
die("Data::Dumper does not support a $opt method") unless(Data::Dumper->can($opt));
}
bless $self, $class;
return $self;
}
sub render
{
my ( $self, $data ) = @_;
TRACE ( "Rendering w/Data::Dumper" );
DUMP ( $data );
my $o = Data::Dumper->new([ $data ], [ $self->{ 'varname' } ]);
$o->Sortkeys(1);
foreach my $opt(keys %{$self->{options}{DumperOptions}}) {
$o->$opt($self->{options}{DumperOptions}{$opt}); #Fire corresponding methods
}
return $o->Dump();
}
sub requires_template
{
return 0;
lib/Any/Renderer/Data/Dumper.pm view on Meta::CPAN
return [ FORMAT_NAME ];
}
sub TRACE {}
sub DUMP {}
1;
=head1 NAME
Any::Renderer::Data::Dumper - render data structures through Data::Dumper
=head1 SYNOPSIS
use Any::Renderer;
my %options = ('DumperOptions' => {'Indent' => 1});
my $format = "Data::Dumper";
my $r = new Any::Renderer ( $format, \%options );
my $data_structure = [...]; # arbitrary structure
my $string = $r->render ( $data_structure );
=head1 DESCRIPTION
Any::Renderer::Data::Dumper renders any Perl data structure passed to it into
a string representation via Data::Dumper. For example:
perl -MAny::Renderer -e "print Any::Renderer->new('Data::Dumper')->render({a => 1, b => [2,3]})"
results in:
$VAR1 = {
'a' => 1,
'b' => [
2,
3
]
};
=head1 FORMATS
=over 4
=item Data::Dumper
=back
=head1 METHODS
=over 4
=item $r = new Any::Renderer::Data::Dumper($format, \%options)
C<$format> must be C<Data::Dumper>.
See L</OPTIONS> for a description of valid C<%options>.
=item $string = $r->render($data_structure)
The main method.
=item $bool = Any::Renderer::Data::Dumper::requires_template($format)
False in this case.
=item $list_ref = Any::Renderer::Data::Dumper::available_formats()
Just the one - C<Data::Dumper>.
=back
=head1 OPTIONS
=over 4
=item VariableName
Name of the perl variable the structure is assigned to. Defaults to C<$VAR1>.
=item DumperOptions
This hashref of options is mapped to Data::Dumper methods (Indent, Purity, Useqq, etc.). For example:
perl -MAny::Renderer -e "print Any::Renderer->new('Data::Dumper', {DumperOptions => {Indent=>0}})->render({a => 1, b => [2,3]})"
results in:
$VAR1 = {'a' => 1,'b' => [2,3]};
See L<Data::Dumper> for the list of I<Configuration Variables or Methods>.
=back
=head1 SEE ALSO
L<Data::Dumper>, L<Any::Renderer>
=head1 VERSION
$Revision: 1.9 $ on $Date: 2006/08/23 19:41:16 $ by $Author: johna $
=head1 AUTHOR
Matt Wilson and John Alden <cpan _at_ bbc _dot_ co _dot_ uk>
=head1 COPYRIGHT
t/Any_Renderer.t view on Meta::CPAN
use Any::Renderer;
ASSERT ( 1, 'Compilation' );
########################################################################
# Test available backends - this has to work whatever we have installed
########################################################################
# the known renderers and whether or not they require templates
my %known_renderers = (
"Data::Dumper" => 0,
"JavaScript" => 0,
"JavaScript::Anon" => 0,
"Javascript" => 0,
"Javascript::Anon" => 0,
"JSON" => 0,
"UrlEncoded" => 0,
"XML" => 0,
"XSLT" => 1,
);
t/Any_Renderer.t view on Meta::CPAN
};
#Ask what's available
my %d_renderers = map {$_ => Any::Renderer::requires_template ( $_ ) || 0} @{Any::Renderer::available_formats()};
DUMP ( "discovered renderers", \%d_renderers );
DUMP ( "known renderers", \%known_renderers );
ASSERT ( intersects( \%known_renderers, \%d_renderers ), "Check of available formats" );
##############################################################
# Use Data::Dumper to test the API as it's a core module
##############################################################
$format = "Data::Dumper";
#Test defaults (no options)
%options = ();
$renderer = new Any::Renderer ( $format, \%options );
ASSERT ( "\$VAR1 = [\n 1,\n 2,\n 3\n ];\n" eq $renderer->render ( [ 1, 2, 3 ] ), "Render using defaults" );
#Test option passing
%options = ( VariableName => 'dd_var' );
$renderer = new Any::Renderer ( $format, \%options );
ASSERT ( "\$dd_var = [\n 1,\n 2,\n 3\n ];\n" eq $renderer->render ( [ 1, 2, 3 ] ), "Using options" );
t/Any_Renderer_Data_Dumper.t view on Meta::CPAN
#!/usr/local/bin/perl
# Purpose : unit test for Any::Renderer::Data::Dumper
# Author : Matt Wilson
# Created : 17th March 2006
# CVS : $Header: /home/cvs/software/cvsroot/any_renderer/t/Any_Renderer_Data_Dumper.t,v 1.6 2006/08/29 12:40:48 andreww Exp $
use Test::Assertions::TestScript;
use Any::Renderer::Data::Dumper;
ASSERT ( 1, 'Compilation' );
# are we handling what we _think_ we're handling?
ASSERT ( EQUAL ( [ 'Data::Dumper' ], Any::Renderer::Data::Dumper::available_formats () ), "Handle expected formats" );
# do we require a template as expected (or not)?
ASSERT ( 0 == Any::Renderer::Data::Dumper::requires_template ( "Data::Dumper" ), "Requires template?" );
# initiate an object with a specific variable name
my %options = ( VariableName => 'dd_var' );
my $dd = new Any::Renderer::Data::Dumper ( "Data::Dumper", \%options );
# rendering a list into Data::Dumper
ASSERT ( "\$dd_var = [\n 1,\n 2,\n 3\n ];\n" eq $dd->render ( [ 1, 2, 3 ] ), "Render a list (with specific variable name)" );
# rendering of a hash into Data::Dumper
ASSERT ( "\$dd_var = {\n '1' => 2\n };\n" eq $dd->render ( { 1 => 2 } ), "Render a hash (with specific variable name)" );
# rendering of a singular value
ASSERT ( "\$dd_var = 1;\n" eq $dd->render ( 1 ), "Render a single value (with specific variable name)" );
# rendering of a singular string value
ASSERT ( "\$dd_var = 'string';\n" eq $dd->render ( "string" ), "Render a single value (with specific variable name)" );
# initiate an object
%options = ();
$dd = new Any::Renderer::Data::Dumper ( "Data::Dumper", \%options );
# rendering a list into Data::Dumper
ASSERT ( "\$VAR1 = [\n 1,\n 2,\n 3\n ];\n" eq $dd->render ( [ 1, 2, 3 ] ), "Render a list" );
# rendering of a hash into Data::Dumper
ASSERT ( "\$VAR1 = {\n '1' => 2\n };\n" eq $dd->render ( { 1 => 2 } ), "Render a hash" );
# rendering of a singular value
ASSERT ( "\$VAR1 = 1;\n" eq $dd->render ( 1 ), "Render a single value" );
# rendering of a singular string value
ASSERT ( "\$VAR1 = 'string';\n" eq $dd->render ( "string" ), "Render a single value" );
# Test passing options to Data::Dumper
$dd = new Any::Renderer::Data::Dumper ( "Data::Dumper", {'DumperOptions' => {'Indent' => 0}} );
my $rv = $dd->render ( { 1 => 2 } );
ASSERT ( "\$VAR1 = {'1' => 2};" eq $rv, "Set Indent" );
# Test Data::Dumper method name checking
ASSERT(DIED(sub{ new Any::Renderer::Data::Dumper ( "Data::Dumper", {'DumperOptions' => {'Nonsense' => 1}} ) }) && $@ =~ /does not support a Nonsense method/,"Trapped dodgy method name");
# Trap invalid formats
ASSERT(DIED(sub {new Any::Renderer::Data::Dumper( "Nonsense", {} )}) && $@=~/Invalid format Nonsense/,"Trap invalid format");
# vim: ft=perl
t/Any_Renderer_Data_Serializer.t view on Meta::CPAN
}
use Test::Assertions::TestScript tests => $NumTests, auto_import_trace => 1;
ASSERT ( 1, 'Check if Data::Serializer is available' );
if($HaveDataSerializer) {
require Any::Renderer::Data::Serializer;
ASSERT ( 1, 'Compilation' );
# are we handling what we _think_ we're handling?
ASSERT ( scalar (grep { $_ eq 'Data::Dumper' } @{Any::Renderer::Data::Serializer::available_formats ()}), "Handle expected formats" );
# do we require a template as expected (or not)?
ASSERT ( 0 == Any::Renderer::Data::Serializer::requires_template ( "Data::Dumper" ), "Requires template?" );
# initiate an object
%options = ();
$dd = new Any::Renderer::Data::Serializer ( "Data::Dumper", \%options );
# rendering a list into Data::Serializer
ASSERT ( "[1,2,3]" eq $dd->render ( [ 1, 2, 3 ] ), "Render a list" );
# rendering of a hash into Data::Serializer
ASSERT ( "{'1' => 2}" eq $dd->render ( { 1 => 2 } ), "Render a hash" );
# rendering of a integer value
ASSERT ( "1" eq $dd->render ( 1 ), "Render an integer" );
( run in 0.507 second using v1.01-cache-2.11-cpan-a5abf4f5562 )