initial import v0.01
Brian Cassidy [Sun, 29 Jan 2006 01:40:49 +0000 (01:40 +0000)]
16 files changed:
Build.PL [new file with mode: 0644]
Changes [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
lib/Catalyst/Plugin/ConfigLoader.pm [new file with mode: 0644]
lib/Catalyst/Plugin/ConfigLoader/INI.pm [new file with mode: 0644]
lib/Catalyst/Plugin/ConfigLoader/JSON.pm [new file with mode: 0644]
lib/Catalyst/Plugin/ConfigLoader/Perl.pm [new file with mode: 0644]
lib/Catalyst/Plugin/ConfigLoader/XML.pm [new file with mode: 0644]
lib/Catalyst/Plugin/ConfigLoader/YAML.pm [new file with mode: 0644]
t/01-use.t [new file with mode: 0644]
t/10-live_auto.t [new file with mode: 0644]
t/98-pod_coverage.t [new file with mode: 0644]
t/99-pod.t [new file with mode: 0644]
t/lib/TestApp.pm [new file with mode: 0644]
t/lib/TestApp/Controller/Config.pm [new file with mode: 0644]
t/lib/TestApp/testapp.pl [new file with mode: 0644]

diff --git a/Build.PL b/Build.PL
new file mode 100644 (file)
index 0000000..14c4530
--- /dev/null
+++ b/Build.PL
@@ -0,0 +1,16 @@
+use strict;\r
+\r
+use Module::Build;\r
+\r
+my $build = Module::Build->new(\r
+       module_name        => 'Catalyst::Plugin::ConfigLoader',\r
+       dist_author        => 'Brian Cassidy <bricas@cpan.org>',\r
+       license            => 'perl',\r
+       create_readme      => 1,\r
+       create_makefile_pl => 'traditional',\r
+       requires           => {\r
+               'Catalyst' => 0,\r
+       },\r
+);\r
+\r
+$build->create_build_script;
\ No newline at end of file
diff --git a/Changes b/Changes
new file mode 100644 (file)
index 0000000..d8cd4b7
--- /dev/null
+++ b/Changes
@@ -0,0 +1,4 @@
+Revision history for Perl extension Catalyst::Plugin::ConfigLoader.\r
+\r
+0.01  Sat Jan 28 2006\r
+       - original version
\ No newline at end of file
diff --git a/MANIFEST b/MANIFEST
new file mode 100644 (file)
index 0000000..4da8e07
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,18 @@
+Build.PL\r
+Changes\r
+lib/Catalyst/Plugin/ConfigLoader.pm\r
+lib/Catalyst/Plugin/ConfigLoader/INI.pm\r
+lib/Catalyst/Plugin/ConfigLoader/JSON.pm\r
+lib/Catalyst/Plugin/ConfigLoader/Perl.pm\r
+lib/Catalyst/Plugin/ConfigLoader/XML.pm\r
+lib/Catalyst/Plugin/ConfigLoader/YAML.pm\r
+MANIFEST\r
+META.yml\r
+t/01-use.t\r
+t/10-live_auto.t\r
+t/98-pod_coverage.t\r
+t/99-pod.t\r
+t/lib/TestApp.pm\r
+t/lib/TestApp/testapp.pl\r
+t/lib/TestApp/Controller/Config.pm\r
+\r
diff --git a/lib/Catalyst/Plugin/ConfigLoader.pm b/lib/Catalyst/Plugin/ConfigLoader.pm
new file mode 100644 (file)
index 0000000..ef29444
--- /dev/null
@@ -0,0 +1,85 @@
+package Catalyst::Plugin::ConfigLoader;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+use NEXT;\r
+use Module::Pluggable::Fast\r
+    name    => '_config_loaders',\r
+    search  => [ __PACKAGE__ ],\r
+    require => 1;\r
+\r
+our $VERSION = '0.01';\r
+\r
+=head1 NAME\r
+\r
+Catalyst::Plugin::ConfigLoader - Load config files of various types\r
+\r
+=head1 SYNOPSIS\r
+\r
+       package MyApp;\r
+       \r
+       use Catalyst( ConfigLoader );\r
+       \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
+\r
+=head1 DESCRIPTION\r
+\r
+This mdoule will attempt to load find and load a configuration\r
+file of various types. Currently it supports YAML, JSON, XML,\r
+INI and Perl formats.\r
+\r
+=head1 METHODS\r
+\r
+=head2 setup( )\r
+\r
+This method is automatically called by Catalyst's setup routine. It will\r
+attempt to use each plugin and set the C<config()> section once a file has been\r
+successfully loaded.\r
+\r
+=cut\r
+\r
+sub setup {\r
+    my $c        = shift;\r
+    my $confpath = $c->config->{ file } || $c->path_to( Catalyst::Utils::appprefix( ref $c || $c ) );\r
+    \r
+    for my $loader ( $c->_config_loaders ) {\r
+        my $config = $loader->load( $confpath );\r
+        if( $config ) {\r
+            $c->config( $config );\r
+            last;\r
+        }\r
+    }\r
+\r
+    $c->NEXT::setup( @_ );\r
+}\r
+\r
+=head1 AUTHOR\r
+\r
+=over 4 \r
+\r
+=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
+\r
+=back\r
+\r
+=head1 COPYRIGHT AND LICENSE\r
+\r
+Copyright 2006 by Brian Cassidy\r
+\r
+This library is free software; you can redistribute it and/or modify\r
+it under the same terms as Perl itself. \r
+\r
+=head1 SEE ALSO\r
+\r
+=over 4 \r
+\r
+=item * L<Catalyst>\r
+\r
+=back\r
+\r
+=cut\r
+\r
+1;
\ No newline at end of file
diff --git a/lib/Catalyst/Plugin/ConfigLoader/INI.pm b/lib/Catalyst/Plugin/ConfigLoader/INI.pm
new file mode 100644 (file)
index 0000000..df263da
--- /dev/null
@@ -0,0 +1,75 @@
+package Catalyst::Plugin::ConfigLoader::INI;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+=head1 NAME\r
+\r
+Catalyst::Plugin::ConfigLoader::INI - Load INI config files\r
+\r
+=head1 DESCRIPTION\r
+\r
+Loads INI files. Example:\r
+\r
+    name=TestApp\r
+    \r
+    [Controller::Config]\r
+    foo=bar\r
+\r
+=head1 METHODS\r
+\r
+=head2 load( $file )\r
+\r
+Attempts to load C<$file> as an INI file.\r
+\r
+=cut\r
+\r
+sub load {\r
+       my $class    = shift;\r
+       my $confpath = shift;\r
+\r
+       my $file;\r
+    if( $confpath =~ /\.(.{3})$/ ) {\r
+        return unless $1 eq 'ini';\r
+        $file = $confpath;\r
+    }\r
+    else {\r
+        $file = "$confpath.ini";\r
+    }\r
+    \r
+    return unless -f $file;\r
+\r
+    require Config::Tiny;\r
+    my $config = Config::Tiny->read( $file );\r
+    my $main   = delete $config->{ _ };\r
+    $config->{ $_ } = $main->{ $_ } for keys %$main;\r
+\r
+    return $config;\r
+}\r
+\r
+=head1 AUTHOR\r
+\r
+=over 4 \r
+\r
+=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
+\r
+=back\r
+\r
+=head1 COPYRIGHT AND LICENSE\r
+\r
+Copyright 2006 by Brian Cassidy\r
+\r
+This library is free software; you can redistribute it and/or modify\r
+it under the same terms as Perl itself. \r
+\r
+=head1 SEE ALSO\r
+\r
+=over 4 \r
+\r
+=item * L<Catalyst>\r
+\r
+=back\r
+\r
+=cut\r
+\r
+1;
\ No newline at end of file
diff --git a/lib/Catalyst/Plugin/ConfigLoader/JSON.pm b/lib/Catalyst/Plugin/ConfigLoader/JSON.pm
new file mode 100644 (file)
index 0000000..02cdced
--- /dev/null
@@ -0,0 +1,86 @@
+package Catalyst::Plugin::ConfigLoader::JSON;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+use File::Slurp;\r
+\r
+=head1 NAME\r
+\r
+Catalyst::Plugin::ConfigLoader::JSON - Load JSON config files\r
+\r
+=head1 DESCRIPTION\r
+\r
+Loads JSON files. Example:\r
+\r
+    {\r
+        "name": "TestApp",\r
+        "Controller::Config": {\r
+            "foo": "bar"\r
+        }\r
+    }\r
+\r
+=head1 METHODS\r
+\r
+=head2 load( $file )\r
+\r
+Attempts to load C<$file> as a JSON file.\r
+\r
+=cut\r
+\r
+sub load {\r
+       my $class    = shift;\r
+       my $confpath = shift;\r
+\r
+       my @files;\r
+    if( $confpath =~ /\.(.{3,4})$/ ) {\r
+        return unless $1 =~ /^jso?n$/;\r
+        @files = $confpath;\r
+    }\r
+    else {\r
+        @files = map { "$confpath.$_" } qw( json jsn );\r
+    }\r
+    \r
+    for my $file ( @files ) {\r
+        next unless -f $file;\r
+        \r
+        my $content = read_file( $file );\r
+\r
+        eval { require JSON::Syck; };\r
+        if( $@ ) {\r
+            require JSON;\r
+            JSON->import;\r
+            return jsonToObj( $content );\r
+        }\r
+        else {\r
+            return JSON::Syck::Load( $content );\r
+        }\r
+    }\r
+}\r
+\r
+=head1 AUTHOR\r
+\r
+=over 4 \r
+\r
+=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
+\r
+=back\r
+\r
+=head1 COPYRIGHT AND LICENSE\r
+\r
+Copyright 2006 by Brian Cassidy\r
+\r
+This library is free software; you can redistribute it and/or modify\r
+it under the same terms as Perl itself. \r
+\r
+=head1 SEE ALSO\r
+\r
+=over 4 \r
+\r
+=item * L<Catalyst>\r
+\r
+=back\r
+\r
+=cut\r
+\r
+1;
\ No newline at end of file
diff --git a/lib/Catalyst/Plugin/ConfigLoader/Perl.pm b/lib/Catalyst/Plugin/ConfigLoader/Perl.pm
new file mode 100644 (file)
index 0000000..a7beb2a
--- /dev/null
@@ -0,0 +1,73 @@
+package Catalyst::Plugin::ConfigLoader::Perl;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+=head1 NAME\r
+\r
+Catalyst::Plugin::ConfigLoader::Perl - Load Perl config files\r
+\r
+=head1 DESCRIPTION\r
+\r
+Loads Perl files. Example:\r
+\r
+    {\r
+        name               => 'TestApp',\r
+        Controller::Config => {\r
+            foo => 'bar'\r
+        }\r
+    }\r
+\r
+=head1 METHODS\r
+\r
+=head2 load( $file )\r
+\r
+Attempts to load C<$file> as a Perl file.\r
+\r
+=cut\r
+\r
+sub load {\r
+       my $class    = shift;\r
+       my $confpath = shift;\r
+\r
+       my @files;\r
+    if( $confpath =~ /\.(.{2,4})$/ ) {\r
+        return unless $1 =~ /^p(er)?l$/;\r
+        @files = $confpath;\r
+    }\r
+    else {\r
+        @files = map { "$confpath.$_" } qw( pl perl );\r
+    }\r
+    \r
+    for my $file ( @files ) {\r
+        next unless -f $file;\r
+        return eval { require $file };\r
+    }\r
+}\r
+\r
+=head1 AUTHOR\r
+\r
+=over 4 \r
+\r
+=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
+\r
+=back\r
+\r
+=head1 COPYRIGHT AND LICENSE\r
+\r
+Copyright 2006 by Brian Cassidy\r
+\r
+This library is free software; you can redistribute it and/or modify\r
+it under the same terms as Perl itself. \r
+\r
+=head1 SEE ALSO\r
+\r
+=over 4 \r
+\r
+=item * L<Catalyst>\r
+\r
+=back\r
+\r
+=cut\r
+\r
+1;
\ No newline at end of file
diff --git a/lib/Catalyst/Plugin/ConfigLoader/XML.pm b/lib/Catalyst/Plugin/ConfigLoader/XML.pm
new file mode 100644 (file)
index 0000000..e44bcae
--- /dev/null
@@ -0,0 +1,81 @@
+package Catalyst::Plugin::ConfigLoader::XML;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+=head1 NAME\r
+\r
+Catalyst::Plugin::ConfigLoader::XML - Load XML config files\r
+\r
+=head1 DESCRIPTION\r
+\r
+Loads XML files. Example:\r
+\r
+    <config>\r
+        <name>TestApp</name>\r
+        <component name="Controller::Config">\r
+            <foo>bar</foo>\r
+        </component>\r
+    </config>\r
+\r
+=head1 METHODS\r
+\r
+=head2 load( $file )\r
+\r
+Attempts to load C<$file> as an XML file.\r
+\r
+=cut\r
+\r
+sub load {\r
+       my $class    = shift;\r
+       my $confpath = shift;\r
+\r
+       my $file;\r
+    if( $confpath =~ /\.(.{3})$/ ) {\r
+        return unless $1 eq 'xml';\r
+        $file = $confpath;\r
+    }\r
+    else {\r
+        $file = "$confpath.xml";\r
+    }\r
+    \r
+    return unless -f $file;\r
+\r
+    require XML::Simple;\r
+    XML::Simple->import;\r
+    my $config      = XMLin( $file, ForceArray => [ 'component' ] );\r
+\r
+    my $components = delete $config->{ component };\r
+       foreach my $element ( keys %$components ) {\r
+            $config->{ $element } = $components->{ $element };\r
+    }\r
+\r
+    return $config;\r
+}\r
+\r
+=head1 AUTHOR\r
+\r
+=over 4 \r
+\r
+=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
+\r
+=back\r
+\r
+=head1 COPYRIGHT AND LICENSE\r
+\r
+Copyright 2006 by Brian Cassidy\r
+\r
+This library is free software; you can redistribute it and/or modify\r
+it under the same terms as Perl itself. \r
+\r
+=head1 SEE ALSO\r
+\r
+=over 4 \r
+\r
+=item * L<Catalyst>\r
+\r
+=back\r
+\r
+=cut\r
+\r
+1;
\ No newline at end of file
diff --git a/lib/Catalyst/Plugin/ConfigLoader/YAML.pm b/lib/Catalyst/Plugin/ConfigLoader/YAML.pm
new file mode 100644 (file)
index 0000000..ec660bd
--- /dev/null
@@ -0,0 +1,82 @@
+package Catalyst::Plugin::ConfigLoader::YAML;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+use File::Slurp;\r
+\r
+=head1 NAME\r
+\r
+Catalyst::Plugin::ConfigLoader::YAML - Load YAML config files\r
+\r
+=head1 DESCRIPTION\r
+\r
+Loads YAML files. Example:\r
+\r
+    ---\r
+    name: TestApp\r
+    Controller::Config:\r
+        foo: bar\r
+\r
+=head1 METHODS\r
+\r
+=head2 load( $file )\r
+\r
+Attempts to load C<$file> as a YAML file.\r
+\r
+=cut\r
+\r
+sub load {\r
+       my $class    = shift;\r
+       my $confpath = shift;\r
+\r
+       my @files;\r
+    if( $confpath =~ /\.(.{3,4})$/ ) {\r
+        return unless $1 =~ /^ya?ml$/;\r
+        @files = $confpath;\r
+    }\r
+    else {\r
+        @files = map { "$confpath.$_" } qw( yml yaml );\r
+    }\r
+    \r
+    for my $file ( @files ) {\r
+        next unless -f $file;\r
+\r
+        eval { require YAML::Syck; };\r
+        if( $@ ) {\r
+            require YAML;\r
+            return YAML::LoadFile( $file );\r
+        }\r
+        else {\r
+            my $content = read_file( $file );\r
+            return YAML::Syck::Load( $content );\r
+        }\r
+    }\r
+}\r
+\r
+=head1 AUTHOR\r
+\r
+=over 4 \r
+\r
+=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
+\r
+=back\r
+\r
+=head1 COPYRIGHT AND LICENSE\r
+\r
+Copyright 2006 by Brian Cassidy\r
+\r
+This library is free software; you can redistribute it and/or modify\r
+it under the same terms as Perl itself. \r
+\r
+=head1 SEE ALSO\r
+\r
+=over 4 \r
+\r
+=item * L<Catalyst>\r
+\r
+=back\r
+\r
+=cut\r
+\r
+1;
\ No newline at end of file
diff --git a/t/01-use.t b/t/01-use.t
new file mode 100644 (file)
index 0000000..0399513
--- /dev/null
@@ -0,0 +1,10 @@
+use Test::More tests => 6;\r
+\r
+BEGIN { \r
+       use_ok( 'Catalyst::Plugin::ConfigLoader' );\r
+       use_ok( 'Catalyst::Plugin::ConfigLoader::INI' );\r
+       use_ok( 'Catalyst::Plugin::ConfigLoader::JSON' );\r
+       use_ok( 'Catalyst::Plugin::ConfigLoader::Perl' );\r
+       use_ok( 'Catalyst::Plugin::ConfigLoader::XML' );\r
+       use_ok( 'Catalyst::Plugin::ConfigLoader::YAML' );\r
+}\r
diff --git a/t/10-live_auto.t b/t/10-live_auto.t
new file mode 100644 (file)
index 0000000..56997e8
--- /dev/null
@@ -0,0 +1,14 @@
+use strict;\r
+use warnings;\r
+\r
+use FindBin;\r
+use lib "$FindBin::Bin/lib";\r
+\r
+use Test::More tests => 2;\r
+\r
+use Catalyst::Test 'TestApp';\r
+\r
+{\r
+    ok( my $response = request('http://localhost/config/'), 'request ok' );\r
+    is( $response->content, 'foo', 'config ok' );\r
+}\r
diff --git a/t/98-pod_coverage.t b/t/98-pod_coverage.t
new file mode 100644 (file)
index 0000000..73a83b0
--- /dev/null
@@ -0,0 +1,4 @@
+use Test::More;\r
+eval "use Test::Pod::Coverage 1.00";\r
+plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD coverage" if $@;\r
+all_pod_coverage_ok();
\ No newline at end of file
diff --git a/t/99-pod.t b/t/99-pod.t
new file mode 100644 (file)
index 0000000..3afe2fa
--- /dev/null
@@ -0,0 +1,4 @@
+use Test::More;\r
+eval "use Test::Pod 1.00";\r
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;\r
+all_pod_files_ok();
\ No newline at end of file
diff --git a/t/lib/TestApp.pm b/t/lib/TestApp.pm
new file mode 100644 (file)
index 0000000..6d4b336
--- /dev/null
@@ -0,0 +1,12 @@
+package TestApp;
+
+use strict;
+use warnings;
+
+use Catalyst qw/ConfigLoader/;
+
+our $VERSION = '0.01';
+
+__PACKAGE__->setup;
+
+1;
diff --git a/t/lib/TestApp/Controller/Config.pm b/t/lib/TestApp/Controller/Config.pm
new file mode 100644 (file)
index 0000000..1951de2
--- /dev/null
@@ -0,0 +1,13 @@
+package TestApp::Controller::Config;\r
+\r
+use strict;\r
+use warnings;\r
+\r
+use base qw( Catalyst::Controller );\r
+\r
+sub index : Private {\r
+       my( $self, $c ) = @_;\r
+       $c->res->output( $self->{ foo } );\r
+}\r
+\r
+1;
\ No newline at end of file
diff --git a/t/lib/TestApp/testapp.pl b/t/lib/TestApp/testapp.pl
new file mode 100644 (file)
index 0000000..0a775f1
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       name               => 'TestApp',
+       Controller::Config => {
+               foo => 'foo'
+       }
+}