Patch to logging to add doc and make it possible to select levels and for them to...
Tomas Doran [Wed, 10 Dec 2008 00:32:51 +0000 (00:32 +0000)]
Changes
lib/Catalyst.pm
t/unit_core_setup.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index 440c793..b80911c 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,8 @@
 # This file documents the revision history for Perl extension Catalyst.
 
+        - Make log levels additive, and add documentation and tests
+          for the setup_log method, which previously had none.
+          Sewn together by t0m from two patches provided by David E. Wheeler
         - Switch an around 'new' in Catalyst::Controller to a BUILDARGS
           method as it's much neater and more obvious what is going on (t0m)
         - Add a clearer method on request and response _context 
index 8480fca..ace6ba1 100644 (file)
@@ -262,7 +262,9 @@ MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
 
 =head2 -Log
 
-Specifies log level.
+    use Catalyst '-Log=warn,fatal,error';
+Specifies a comma-delimited list of log levels.
 
 =head2 -Stats
 
@@ -2204,19 +2206,34 @@ sub setup_home {
 
 =head2 $c->setup_log
 
-Sets up log.
+Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
+passing it to C<log()>. Pass in a comma-delimited list of levels to set the
+log to.
+This method also installs a C<debug> method that returns a true value into the
+catalyst subclass if the "debug" level is passed in the comma-delimited list,
+or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
+
+Note that if the log has already been setup, by either a previous call to
+C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
+that this method won't actually set up the log.
 
 =cut
 
 sub setup_log {
-    my ( $class, $debug ) = @_;
+    my ( $class, $levels ) = @_;
 
+    my %levels;
     unless ( $class->log ) {
-        $class->log( Catalyst::Log->new );
+        $levels ||= '';
+        $levels =~ s/^\s+//;
+        $levels =~ s/\s+$//;
+        %levels = map { $_ => 1 } split /\s*,\s*/, $levels || '';
+        $class->log( Catalyst::Log->new(keys %levels) );
     }
 
     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
-    if ( defined($env_debug) ? $env_debug : $debug ) {
+    if ( defined($env_debug) or $levels{debug} ) {
         $class->Class::MOP::Object::meta()->add_method('debug' => sub { 1 });
         $class->log->debug('Debug messages enabled');
     }
@@ -2492,6 +2509,8 @@ chansen: Christian Hansen
 
 chicks: Christopher Hicks
 
+David E. Wheeler
+
 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
 
 Drew Taylor
diff --git a/t/unit_core_setup.t b/t/unit_core_setup.t
new file mode 100644 (file)
index 0000000..311320f
--- /dev/null
@@ -0,0 +1,48 @@
+use strict;
+use warnings;
+use Catalyst::Runtime;
+
+use Test::More tests => 18;
+
+{
+    # Silence the log.
+    no warnings 'redefine';
+    *Catalyst::Log::_send_to_log = sub {};
+}
+
+TESTDEBUG: {
+    package MyTestDebug;
+    use parent qw/Catalyst/;
+    __PACKAGE__->setup(
+        '-Debug',
+    );
+}
+
+ok my $c = MyTestDebug->new, 'Get debug app object';
+ok my $log = $c->log, 'Get log object';
+isa_ok $log,        'Catalyst::Log', 'It should be a Catalyst::Log object';
+ok !$log->is_warn,  'Warnings should be disabled';
+ok !$log->is_error, 'Errors should be disabled';
+ok !$log->is_fatal, 'Fatal errors should be disabled';
+ok !$log->is_info,  'Info should be disabled';
+ok $log->is_debug,  'Debugging should be enabled';
+can_ok 'MyTestDebug', 'debug';
+ok +MyTestDebug->debug, 'And it should return true';
+
+
+TESTAPP: {
+    package MyTestLog;
+    use parent qw/Catalyst/;
+    __PACKAGE__->setup(
+        '-Log=warn,error,fatal'
+    );
+}
+
+ok $c = MyTestLog->new, 'Get log app object';
+ok $log = $c->log, 'Get log object';
+isa_ok $log,        'Catalyst::Log', 'It should be a Catalyst::Log object';
+ok $log->is_warn,   'Warnings should be enabled';
+ok $log->is_error,  'Errors should be enabled';
+ok $log->is_fatal,  'Fatal errors should be enabled';
+ok !$log->is_info,  'Info should be disabled';
+ok !$log->is_debug, 'Debugging should be disabled';