Static::Simple: Added serve_static_file patch from groditi, plus tests
Andy Grundman [Fri, 11 May 2007 15:18:49 +0000 (15:18 +0000)]
Changes
lib/Catalyst/Plugin/Static/Simple.pm
t/11serve_static.t [new file with mode: 0644]
t/lib/TestApp.pm

diff --git a/Changes b/Changes
index 79d8095..2a6424a 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,4 +1,6 @@
 Revision history for Perl extension Catalyst::Plugin::Static::Simple
+0.17    
+        - Added serve_static_file, to serve a given file as static. (groditi)
 
 0.16    2007-04-30 15:00:00
         - Allow all files in directories defined by the config option 'dirs'
index f4f56bc..aa0c732 100644 (file)
@@ -8,7 +8,7 @@ use File::Spec ();
 use IO::File ();
 use MIME::Types ();
 
-our $VERSION = '0.16';
+our $VERSION = '0.17';
 
 __PACKAGE__->mk_accessors( qw/_static_file _static_debug_message/ );
 
@@ -166,7 +166,7 @@ sub _locate_static_file {
 sub _serve_static {
     my $c = shift;
            
-    my $full_path = $c->_static_file;
+    my $full_path = shift || $c->_static_file;
     my $type      = $c->_ext_to_type( $full_path );
     my $stat      = stat $full_path;
 
@@ -195,6 +195,25 @@ sub _serve_static {
     return 1;
 }
 
+sub serve_static_file {
+    my ( $c, $full_path ) = @_;
+
+    my $config = $c->config->{static} ||= {};
+    
+    if ( -e $full_path ) {
+        $c->_debug_msg( "Serving static file: $full_path" )
+            if $config->{debug};
+    }
+    else {
+        $c->_debug_msg( "404: file not found: $full_path" )
+            if $config->{debug};
+        $c->res->status( 404 );
+        return;
+    }
+
+    $c->_serve_static( $full_path );
+}
+
 # looks up the correct MIME type for the current file extension
 sub _ext_to_type {
     my ( $c, $full_path ) = @_;
@@ -426,6 +445,21 @@ through Catalyst. You can leave Static::Simple as part of your
 application, and it will continue to function on a development server,
 or using Catalyst's built-in server.
 
+=head1 PUBLIC METHODS
+
+=head2 serve_static_file $file_path
+
+Will serve the file located in $file_path statically. This is useful when
+you need to  autogenerate them if they don't exist, or they are stored in a model.
+
+    package MyApp::Controller::User;
+
+    sub curr_user_thumb : PathPart("my_thumbnail.png") {
+        my ( $self, $c ) = @_;
+        my $file_path = $c->user->picture_thumbnail_path;
+        $c->serve_static_file($file_path);
+    }
+
 =head1 INTERNAL EXTENDED METHODS
 
 Static::Simple extends the following steps in the Catalyst process.
@@ -462,8 +496,11 @@ Andy Grundman, <andy@hybridized.org>
 =head1 CONTRIBUTORS
 
 Marcus Ramberg, <mramberg@cpan.org>
+
 Jesse Sheidlower, <jester@panix.com>
 
+Guillermo Roditi, <groditi@cpan.org>
+
 =head1 THANKS
 
 The authors of Catalyst::Plugin::Static:
diff --git a/t/11serve_static.t b/t/11serve_static.t
new file mode 100644 (file)
index 0000000..da17d5a
--- /dev/null
@@ -0,0 +1,20 @@
+#!perl
+
+use strict;
+use warnings;
+
+use FindBin;
+use lib "$FindBin::Bin/lib";
+
+use Test::More tests => 6;
+use Catalyst::Test 'TestApp';
+
+# test getting a file via serve_static_file
+ok( my $res = request('http://localhost/serve_static'), 'request ok' );
+is( $res->code, 200, '200 ok' );
+is( $res->content_type, 'application/x-pagemaker', 'content-type ok' );
+like( $res->content, qr/serve_static/, 'content of serve_static ok' );
+
+# test getting a non-existant file via serve_static_file
+ok( $res = request('http://localhost/serve_static_404'), 'request ok' );
+is( $res->code, 404, '404 ok' );
\ No newline at end of file
index d118a55..001fb01 100644 (file)
@@ -2,11 +2,14 @@ package TestApp;
 \r
 use strict;\r
 use Catalyst;\r
+use File::Spec::Functions;\r
+use FindBin;\r
 \r
 our $VERSION = '0.01';\r
 \r
 TestApp->config(\r
     name => 'TestApp',\r
+    debug => 1,\r
 );\r
 \r
 my @plugins = qw/Static::Simple/;\r
@@ -44,4 +47,20 @@ sub subtest2 : Local {
     $c->res->output( 'subtest2 ok' );\r
 }\r
 \r
+sub serve_static : Local {\r
+    my ( $self, $c ) = @_;\r
+    \r
+    my $file = catfile( $FindBin::Bin, 'lib', 'TestApp.pm' );\r
+    \r
+    $c->serve_static_file( $file );\r
+}\r
+\r
+sub serve_static_404 : Local {\r
+    my ( $self, $c ) = @_;\r
+    \r
+    my $file = catfile( $FindBin::Bin, 'lib', 'foo.pm' );\r
+    \r
+    $c->serve_static_file( $file );\r
+}\r
+\r
 1;\r