[Catalyst-commits] r8769 - in trunk/Catalyst-View-XSLT: lib/Catalyst/View lib/Catalyst/View/XSLT/XML t t/lib t/lib/TestApp/root

janus at dev.catalyst.perl.org janus at dev.catalyst.perl.org
Sat Dec 6 20:59:06 GMT 2008


Author: janus
Date: 2008-12-06 20:59:06 +0000 (Sat, 06 Dec 2008)
New Revision: 8769

Added:
   trunk/Catalyst-View-XSLT/t/10_template_fh.t
   trunk/Catalyst-View-XSLT/t/11_xml_fh.t
   trunk/Catalyst-View-XSLT/t/12_xml_io_handle.t
   trunk/Catalyst-View-XSLT/t/13_xml_libxml_document.t
   trunk/Catalyst-View-XSLT/t/14_xml_path_class.t
   trunk/Catalyst-View-XSLT/t/15_template_import.t
   trunk/Catalyst-View-XSLT/t/lib/TestApp/root/testImport.xsl
Modified:
   trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT.pm
   trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT/XML/LibXSLT.pm
   trunk/Catalyst-View-XSLT/t/lib/TestApp.pm
Log:
add support for filehandles and objects, set document base uri and add a bunch of tests

Modified: trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT/XML/LibXSLT.pm
===================================================================
--- trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT/XML/LibXSLT.pm	2008-12-06 16:35:22 UTC (rev 8768)
+++ trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT/XML/LibXSLT.pm	2008-12-06 20:59:06 UTC (rev 8769)
@@ -70,7 +70,7 @@
 =cut
 
 sub process {
-    my ($self, $template, $args) = @_;
+    my ($self, $template, $args, $base) = @_;
 
     my ($result, $error) = ('', undef);
 
@@ -82,14 +82,22 @@
 
         my $xml = delete $args->{xml};
 
-        if ($xml =~ /\</) {
+        if ($xml =~ m/\</) {
             $xmlDocument = $xmlParser->parse_string($xml);
+        } elsif (ref($xml) && $xml->isa('GLOB')) {
+            $xmlDocument = $xmlParser->parse_fh($xml);
+        } elsif (ref($xml) && $xml->isa('XML::LibXML::Document')) {
+            $xmlDocument = $xml;
         } else {
             $xmlDocument = $xmlParser->parse_file($xml);
         }
 
         if ($template =~ m/\</) {
-            $xsltStylesheet = $xmlParser->parse_string($template);
+            $xsltStylesheet = $xmlParser->parse_string($template, $base);
+        } elsif (ref($template) && $template->isa('GLOB')) {
+            $xsltStylesheet = $xmlParser->parse_fh($template, $base);
+        } elsif (ref($template) && $template->isa('XML::LibXML::Document')) {
+            $xsltStylesheet = $template;
         } else {
             $xsltStylesheet = $xmlParser->parse_file($template);
         }

Modified: trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT.pm
===================================================================
--- trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT.pm	2008-12-06 16:35:22 UTC (rev 8768)
+++ trunk/Catalyst-View-XSLT/lib/Catalyst/View/XSLT.pm	2008-12-06 20:59:06 UTC (rev 8769)
@@ -220,18 +220,26 @@
 
 sub render {
     my ( $self, $c, $template, $args ) = @_;
+    my $basePath;
 
-    unless ( $template =~ m/\</ || -e $template ) {
-        my ($tmplFullPath, $error) = $self->_searchInIncPath($c, $template);
+    unless ( $template =~ m/\</ || $template->isa('GLOB') || -e $template ||
+      ( ref($template) && !$template->isa('Path::Class::File') ) ) {
+        my $error;
 
+        ($basePath, $error) = $self->_searchInIncPath($c, $template);
+
         if (defined $error) {
             $c->error("Template [$template] does not exists in include path");
             return 0;
         } else {
-            $template = $tmplFullPath;
+            $template = File::Spec->catfile($basePath, $template);
         }
     }
 
+    unless ($basePath) {
+        $basePath = $c->config->{root};
+    }
+
     my $vars = { 
         (ref $args eq 'HASH' ? %$args : %{ $c->stash() }),
     };
@@ -245,14 +253,15 @@
 
     # if xml is not string (therefore is a file (what about file descriptors ?!)) 
     # and is not existsting in the file system
-    if ($xml !~ m/\</ && ! -e $xml) {
-        my ($xmlFullPath, $error) = $self->_searchInIncPath($c, $xml);
+    unless ( $xml =~ m/\</ || $xml->isa('GLOB') || -e $xml ||
+      ( ref($xml) && !$xml->isa('Path::Class::File') ) ) {
+        my ($incPath, $error) = $self->_searchInIncPath($c, $xml);
 
         if (defined $error) {
-            $c->error("Template [$template] does not exists in include path");
+            $c->error("XML file [$xml] does not exists in include path");
             return undef;
         } else {
-            $vars->{xml} = $xmlFullPath;
+            $vars->{xml} = File::Spec->catfile($incPath, $xml);
         }
     }
 
@@ -287,7 +296,7 @@
     }
 
     $c->log->debug("Processing...") if $c->debug;
-    my ($output, $error) = $processor->process($template, $vars);
+    my ($output, $error) = $processor->process($template, $vars, $basePath);
 
     if ($error) {
         chomp $error;
@@ -355,24 +364,27 @@
 
     my $arefIncludePath = $self->{CONFIG}->{'INCLUDE_PATH'};
 
-    unshift( @{ $arefIncludePath }, @{ $c->stash->{additional_template_paths} } )
-      if (ref $c->stash->{additional_template_paths} eq 'ARRAY');
+    if (ref $c->stash->{additional_template_paths} eq 'ARRAY') {
+        unshift( @{ $arefIncludePath },
+          @{ $c->stash->{additional_template_paths} } );
+    }
 
     foreach my $incEntry ( @{ $arefIncludePath} ) {
 
         $c->log->debug( "Going to search for file [$filename] in [$incEntry]" ) if $c->debug;
         my $tmpTemplateName = '';
+        my $incPath = '';
 
         if (ref $incEntry eq 'Path::Class::File') {
-            $tmpTemplateName = File::Spec->catfile($incEntry->absolute, $filename);
+            $incPath = $incEntry->absolute();
         } else {
-            $tmpTemplateName = File::Spec->catfile($incEntry, $filename);
+            $incPath = $incEntry;
         }
 
-        if (-e $tmpTemplateName) {
+        if (-e File::Spec->catfile($incPath, $filename)) {
 
             $c->log->debug( "File [$filename] found in [$incEntry]") if $c->debug;
-            return ($tmpTemplateName, undef);
+            return ($incPath, undef);
         }
 
     }

Added: trunk/Catalyst-View-XSLT/t/10_template_fh.t
===================================================================
--- trunk/Catalyst-View-XSLT/t/10_template_fh.t	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/10_template_fh.t	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+use Test::More tests => 5;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/lib";
+
+use_ok('Catalyst::Test', 'TestApp');
+
+my $view = 'XML::LibXSLT';
+
+my $response;
+ok(($response = request("/test_template_fh?view=$view"))->is_success, 'request ok');
+is($response->content, TestApp->config->{default_message}, 'message ok');
+
+my $message = scalar localtime;
+my $xml = "<dummy-root>$message</dummy-root>";
+ok(($response = request("/test_template_fh?view=$view&message=$message"))->is_success, 'request with message ok');
+is($response->content, $message, 'message ok');
+

Added: trunk/Catalyst-View-XSLT/t/11_xml_fh.t
===================================================================
--- trunk/Catalyst-View-XSLT/t/11_xml_fh.t	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/11_xml_fh.t	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+use Test::More tests => 5;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/lib";
+
+use_ok('Catalyst::Test', 'TestApp');
+
+my $view = 'XML::LibXSLT';
+
+my $response;
+ok(($response = request("/test_xml_fh?view=$view"))->is_success, 'request ok');
+is($response->content, TestApp->config->{default_message}, 'message ok');
+
+my $message = scalar localtime;
+my $xml = "<dummy-root>$message</dummy-root>";
+ok(($response = request("/test_xml_fh?view=$view&message=$message"))->is_success, 'request with message ok');
+is($response->content, $message, 'message ok');
+

Added: trunk/Catalyst-View-XSLT/t/12_xml_io_handle.t
===================================================================
--- trunk/Catalyst-View-XSLT/t/12_xml_io_handle.t	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/12_xml_io_handle.t	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+use Test::More tests => 5;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/lib";
+
+use_ok('Catalyst::Test', 'TestApp');
+
+my $view = 'XML::LibXSLT';
+
+my $response;
+ok(($response = request("/test_xml_io_handle?view=$view"))->is_success, 'request ok');
+is($response->content, TestApp->config->{default_message}, 'message ok');
+
+my $message = scalar localtime;
+my $xml = "<dummy-root>$message</dummy-root>";
+ok(($response = request("/test_xml_io_handle?view=$view&message=$message"))->is_success, 'request with message ok');
+is($response->content, $message, 'message ok');
+

Added: trunk/Catalyst-View-XSLT/t/13_xml_libxml_document.t
===================================================================
--- trunk/Catalyst-View-XSLT/t/13_xml_libxml_document.t	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/13_xml_libxml_document.t	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+use Test::More tests => 5;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/lib";
+
+use_ok('Catalyst::Test', 'TestApp');
+
+my $view = 'XML::LibXSLT';
+
+my $response;
+ok(($response = request("/test_xml_libxml_document?view=$view"))->is_success, 'request ok');
+is($response->content, TestApp->config->{default_message}, 'message ok');
+
+my $message = scalar localtime;
+ok(($response = request("/test_xml_libxml_document?view=$view&message=$message"))->is_success, 'request with message ok');
+is($response->content, $message, 'message ok');
+
+

Added: trunk/Catalyst-View-XSLT/t/14_xml_path_class.t
===================================================================
--- trunk/Catalyst-View-XSLT/t/14_xml_path_class.t	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/14_xml_path_class.t	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+use Test::More tests => 5;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/lib";
+
+use_ok('Catalyst::Test', 'TestApp');
+
+my $view = 'XML::LibXSLT';
+
+my $response;
+ok(($response = request("/test_xml_path_class?view=$view"))->is_success, 'request ok');
+is($response->content, TestApp->config->{default_message}, 'message ok');
+
+my $message = scalar localtime;
+ok(($response = request("/test_xml_path_class?view=$view&message=$message"))->is_success, 'request with message ok');
+is($response->content, $message, 'message ok');
+

Added: trunk/Catalyst-View-XSLT/t/15_template_import.t
===================================================================
--- trunk/Catalyst-View-XSLT/t/15_template_import.t	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/15_template_import.t	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+use Test::More tests => 5;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/lib";
+
+use_ok('Catalyst::Test', 'TestApp');
+
+my $view = 'XML::LibXSLT';
+
+my $response;
+ok(($response = request("/test_template_import?view=$view"))->is_success, 'request ok');
+is($response->content, TestApp->config->{default_message}, 'message ok');
+
+my $message = scalar localtime;
+ok(($response = request("/test_template_import?view=$view&message=$message"))->is_success, 'request with message ok');
+is($response->content, $message, 'message ok');
+

Added: trunk/Catalyst-View-XSLT/t/lib/TestApp/root/testImport.xsl
===================================================================
--- trunk/Catalyst-View-XSLT/t/lib/TestApp/root/testImport.xsl	                        (rev 0)
+++ trunk/Catalyst-View-XSLT/t/lib/TestApp/root/testImport.xsl	2008-12-06 20:59:06 UTC (rev 8769)
@@ -0,0 +1,10 @@
+<xsl:stylesheet 
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+	version="1.0">
+
+	<!-- import something to check relative paths -->
+	<xsl:import href="additional/testIncludePath.xsl"/>
+	<!-- override it with what we actually want -->
+	<xsl:import href="testRender.xsl"/>
+
+</xsl:stylesheet>

Modified: trunk/Catalyst-View-XSLT/t/lib/TestApp.pm
===================================================================
--- trunk/Catalyst-View-XSLT/t/lib/TestApp.pm	2008-12-06 16:35:22 UTC (rev 8768)
+++ trunk/Catalyst-View-XSLT/t/lib/TestApp.pm	2008-12-06 20:59:06 UTC (rev 8769)
@@ -5,6 +5,7 @@
 
 use Catalyst; # qw/-Debug/;
 use Path::Class;
+use IO::Handle;
 
 our $VERSION = '0.04';
 
@@ -85,25 +86,112 @@
     my ($self, $c) = @_;
 
     my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testRender.xsl';
 
     $c->stash->{xml} = "<dummy-root>$message</dummy-root>";
 
-    $c->stash->{template} = <<'EOXSL';
-<?xml version="1.0"?>
-<xsl:stylesheet 
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-	version="1.0">
+    open(my $fh, '<', $c->config->{root} . '/' . $template) or $c->error("$!: $template");
+    {
+        local($/) = undef;
 
-	<xsl:output method="text" />
+        $c->stash->{template} = <$fh>;
+    }
+    close($fh);
+}
 
-	<xsl:template match="/">
-			<xsl:value-of select="dummy-root" />
-	</xsl:template>
+sub test_template_fh : Local {
+    my ($self, $c) = @_;
 
-</xsl:stylesheet>
-EOXSL
+    my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testRender.xsl';
+
+    $c->stash->{xml} = "<dummy-root>$message</dummy-root>";
+
+    open(my $fh, '<', $c->config->{root} . '/' . $template) or $c->error("$!: $template");
+    $c->stash->{template} = $fh;
 }
 
+sub test_xml_fh : Local {
+    my ($self, $c) = @_;
+
+    my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testRender.xsl';
+    my $xmlfile = 'test.xml';
+    my $fh;
+
+    my $xml = "<dummy-root>$message</dummy-root>";
+
+    open($fh, '+>', $c->config->{root} . '/' . $xmlfile) or $c->error("$!: $xmlfile");
+    print $fh $xml;
+    seek($fh, 0, 0);
+
+    $c->stash->{xml} = $fh;
+    $c->stash->{template} = $template;
+}
+
+sub test_xml_io_handle : Local {
+    my ($self, $c) = @_;
+
+    my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testRender.xsl';
+    my $xmlfile = 'test.xml';
+
+    my $xml = "<dummy-root>$message</dummy-root>";
+
+    my $fh = IO::File->new($c->config->{root}.'/'.$xmlfile, '+>') or $c->error("$!: $xmlfile");
+    print $fh $xml;
+    seek($fh, 0, 0);
+
+    $c->stash->{xml} = $fh;
+    $c->stash->{template} = $template;
+}
+
+sub test_xml_libxml_document : Local {
+    my ($self, $c) = @_;
+
+    my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testRender.xsl';
+
+    require XML::LibXML;
+
+    my $doc = XML::LibXML::Document->new();
+    my $root = $doc->createElement('dummy-root');
+    $doc->setDocumentElement($root);
+    $root->appendText($message);
+
+    $c->stash->{xml} = $doc;
+    $c->stash->{template} = $template;
+}
+
+sub test_xml_path_class : Local {
+    my ($self, $c) = @_;
+
+    my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testRender.xsl';
+    my $xmlfile = 'test.xml';
+    my $fh;
+
+    my $xml = "<dummy-root>$message</dummy-root>";
+
+    open($fh, '>', $c->config->{root} . '/' . $xmlfile) or $c->error("$!: $xmlfile");
+    print $fh $xml;
+    close($fh);
+
+    $c->stash->{xml} = file($xmlfile);
+    $c->stash->{template} = $template;
+}
+
+sub test_template_import : Local {
+    my ($self, $c) = @_;
+
+    my $message = $c->request->param('message') || $c->config->{default_message};
+    my $template = $c->request->param('template') || 'testImport.xsl';
+
+    $c->stash->{xml} = "<dummy-root>$message</dummy-root>";
+    $c->stash->{template} = $template;
+}
+
+
 sub end : Private {
     my ($self, $c) = @_;
 




More information about the Catalyst-commits mailing list