ConfigLoader 0.04
David Kamholz [Wed, 8 Feb 2006 15:09:30 +0000 (15:09 +0000)]
    - add finalize_config method
    - make default finalize_config traverse the config and substitute
      things beginning __HOME__/* with real path
    - don't use File::Slurp, not sure how to eliminate warnings

Build.PL
Changes
lib/Catalyst/Plugin/ConfigLoader.pm
lib/Catalyst/Plugin/ConfigLoader/JSON.pm
lib/Catalyst/Plugin/ConfigLoader/YAML.pm
t/10-live_auto.t
t/lib/TestApp.pm
t/lib/TestApp/testapp.pl

index 8b849a1..a8161ef 100644 (file)
--- a/Build.PL
+++ b/Build.PL
@@ -10,7 +10,8 @@ my $build = Module::Build->new(
        create_makefile_pl => 'traditional',\r
        requires           => {\r
                'Catalyst'    => 0,\r
-               'File::Slurp' => 0\r
+               #'File::Slurp' => 0,\r
+               'Data::Visitor' => 0.02,\r
        },\r
 );\r
 \r
diff --git a/Changes b/Changes
index 9fcf975..0e1e575 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,10 +1,16 @@
 Revision history for Perl extension Catalyst::Plugin::ConfigLoader.\r
 \r
+0.04  Wed Feb 08 2006\r
+    - add finalize_config method\r
+    - make default finalize_config traverse the config and substitute\r
+      things beginning __HOME__/* with real path\r
+    - don't use File::Slurp, not sure how to eliminate warnings\r
+\r
 0.03  Mon Jan 30 2006\r
-       - pod fixes\r
+    - pod fixes\r
 \r
 0.02  Sun Jan 29 2006\r
-       - refactoring (suggested by Christian Hansen)\r
+    - refactoring (suggested by Christian Hansen)\r
 \r
 0.01  Sat Jan 28 2006\r
-       - original version
\ No newline at end of file
+    - original version
\ No newline at end of file
index 0ba9f99..8047225 100644 (file)
@@ -8,8 +8,9 @@ use Module::Pluggable::Fast
     name    => '_config_loaders',\r
     search  => [ __PACKAGE__ ],\r
     require => 1;\r
+use Data::Visitor::Callback;\r
 \r
-our $VERSION = '0.03';\r
+our $VERSION = '0.04';\r
 \r
 =head1 NAME\r
 \r
@@ -25,8 +26,7 @@ Catalyst::Plugin::ConfigLoader - Load config files of various types
        \r
     # by default myapp.* will be loaded\r
     # you can specify a file if you'd like\r
-    __PACKAGE__->config( file = > 'config.yaml' );\r
-    \r
+    __PACKAGE__->config( file = > 'config.yaml' );    \r
 \r
 =head1 DESCRIPTION\r
 \r
@@ -71,9 +71,32 @@ sub setup {
         }\r
     }\r
 \r
+    $c->finalize_config;\r
+\r
     $c->NEXT::setup( @_ );\r
 }\r
 \r
+=head2 finalize_config\r
+\r
+This method is called after the config file is loaded. It can be\r
+used to implement tuning of config values that can only be done\r
+at runtime. If you need to do this to properly configure any\r
+plugins, it's important to load ConfigLoader before them.\r
+ConfigLoader provides a default finalize_config method which\r
+walks through the loaded config hash and replaces any strings\r
+beginning with C<< __HOME__/<path> >> with the full path to\r
+the file inside the app's home directory.\r
+\r
+=cut\r
+\r
+sub finalize_config {\r
+    my $c = shift;\r
+    my $v = Data::Visitor::Callback->new(\r
+        plain_value => sub { s[^__HOME__/(.+)$][ $c->path_to($1) ]e }\r
+    );\r
+    $v->visit($c->config);\r
+}\r
+\r
 =head1 AUTHOR\r
 \r
 =over 4 \r
index a6268c9..3a187d1 100644 (file)
@@ -3,7 +3,7 @@ package Catalyst::Plugin::ConfigLoader::JSON;
 use strict;\r
 use warnings;\r
 \r
-use File::Slurp;\r
+#use File::Slurp;    \r
 \r
 =head1 NAME\r
 \r
index 6acc3a9..e16bce1 100644 (file)
@@ -3,7 +3,7 @@ package Catalyst::Plugin::ConfigLoader::YAML;
 use strict;\r
 use warnings;\r
 \r
-use File::Slurp;\r
+#use File::Slurp;\r
 \r
 =head1 NAME\r
 \r
index 56997e8..e497bff 100644 (file)
@@ -4,11 +4,18 @@ use warnings;
 use FindBin;\r
 use lib "$FindBin::Bin/lib";\r
 \r
-use Test::More tests => 2;\r
+use Test::More tests => 4;\r
 \r
 use Catalyst::Test 'TestApp';\r
 \r
 {\r
-    ok( my $response = request('http://localhost/config/'), 'request ok' );\r
+    my $response;\r
+    ok( $response = request('http://localhost/config/'), 'request ok' );\r
     is( $response->content, 'foo', 'config ok' );\r
+\r
+       $response = request('http://localhost/appconfig/cache');\r
+       ok( $response->content !~ /^__HOME__/, 'home dir substituted in config var' );\r
+\r
+       $response = request('http://localhost/appconfig/foo');\r
+       is( $response->content, 'bar', 'app finalize_config works' );\r
 }\r
index 6d4b336..50eecc7 100644 (file)
@@ -9,4 +9,15 @@ our $VERSION = '0.01';
 
 __PACKAGE__->setup;
 
+sub finalize_config {
+    my $c = shift;
+    $c->config(foo => 'bar');
+    $c->NEXT::finalize_config;
+}
+
+sub appconfig : Local {
+    my ($self,$c,$var) = @_;
+    $c->res->body($c->config->{$var});
+}
+
 1;
index 0a775f1..7de24eb 100644 (file)
@@ -2,5 +2,6 @@
        name               => 'TestApp',
        Controller::Config => {
                foo => 'foo'
-       }
+       },
+       cache              => '__HOME__/cache',
 }