diff --git a/lib/Log/Mini.pm b/lib/Log/Mini.pm index c45be6c..6a8413e 100644 --- a/lib/Log/Mini.pm +++ b/lib/Log/Mini.pm @@ -2,27 +2,35 @@ package Log::Mini; use strict; use warnings; +use Module::Load qw/load/; -our $VERSION = "0.2.1"; +require Carp; -sub new { +our $VERSION = "0.3.0"; + +sub new +{ shift; - my ( $type, @args ) = @_; + my ($type, @args) = @_; + + @args = () unless @args; $type = 'stderr' unless defined $type; - if ( $type eq 'file' ) { - require Log::Mini::LoggerFILE; - return Log::Mini::LoggerFILE->new(@_); - } - elsif ( $type eq 'null' ) { - require Log::Mini::LoggerNULL; - return Log::Mini::LoggerNULL->new(@args); - } - else { - require Log::Mini::LoggerSTDERR; - return Log::Mini::LoggerSTDERR->new(@args); + if ($type eq 'file') { + unshift(@args, $type); } + + my $module_name = sprintf('Log::Mini::Logger::%s', uc($type)); + my $logger; + + eval { + load $module_name; + + $logger = $module_name->new(@args); + } or do { Carp::croak(sprintf("Failed to load adapter: %s, %s\n", $type, $@)) }; + + return $logger; } 1; diff --git a/lib/Log/Mini/LoggerBase.pm b/lib/Log/Mini/Logger/Base.pm similarity index 53% rename from lib/Log/Mini/LoggerBase.pm rename to lib/Log/Mini/Logger/Base.pm index a51c2ad..5e69530 100644 --- a/lib/Log/Mini/LoggerBase.pm +++ b/lib/Log/Mini/Logger/Base.pm @@ -1,12 +1,13 @@ -package Log::Mini::LoggerBase; +package Log::Mini::Logger::Base; use strict; use warnings; -use Carp qw(croak); +use Carp qw(croak); use List::Util qw(first); use Time::Moment; + my $LEVELS = { error => 1, warn => 2, @@ -15,9 +16,8 @@ my $LEVELS = { trace => 5 }; -sub new { - - # say STDERR Dumper(\@_); +sub new +{ my $class = shift; my (%params) = @_; @@ -29,39 +29,42 @@ sub new { return $self; } -sub set_level { +sub set_level +{ my $self = shift; my ($new_level) = @_; croak('Unknown log level') - unless first { $new_level eq $_ } keys %$LEVELS; + unless $LEVELS->{$new_level}; $self->{'level'} = $new_level; return; } -sub level { +sub level +{ my $self = shift; return $self->{level} || 'error'; } -sub log { return shift->_log( shift, @_) } -sub info { return shift->_log( 'info', @_ ) } -sub error { return shift->_log( 'error', @_ ) } -sub warn { return shift->_log( 'warn', @_ ) } -sub debug { return shift->_log( 'debug', @_ ) } -sub trace { return shift->_log( 'trace', @_ ) } +sub log { return shift->_log(shift, @_) } +sub info { return shift->_log('info', @_) } +sub error { return shift->_log('error', @_) } +sub warn { return shift->_log('warn', @_) } +sub debug { return shift->_log('debug', @_) } +sub trace { return shift->_log('trace', @_) } -sub _log { - my $self = shift; - my $level = shift; +sub _log +{ + my $self = shift; + my $level = shift; my $message = shift; - return if $LEVELS->{$level} > $LEVELS->{ $self->{'level'} }; + return if $LEVELS->{$level} > $LEVELS->{$self->{'level'}}; - my $time = Time::Moment->now->strftime('%Y-%m-%d %T%3f'); + my $time = $self->_getCurrentTime(); my $text = sprintf("%s [%s] %s\n", $time, $level, $message); $text = sprintf($text, @_) if (@_); @@ -73,4 +76,9 @@ sub _log { sub _print { croak 'Not implemented!' } +sub _getCurrentTime +{ + return Time::Moment->now->strftime('%Y-%m-%d %T%3f'); +} + 1; diff --git a/lib/Log/Mini/LoggerFILE.pm b/lib/Log/Mini/Logger/FILE.pm similarity index 80% rename from lib/Log/Mini/LoggerFILE.pm rename to lib/Log/Mini/Logger/FILE.pm index 80f8dea..59bde77 100644 --- a/lib/Log/Mini/LoggerFILE.pm +++ b/lib/Log/Mini/Logger/FILE.pm @@ -1,13 +1,13 @@ -package Log::Mini::LoggerFILE; +package Log::Mini::Logger::FILE; use strict; use warnings; use IO::Handle; +use base 'Log::Mini::Logger::Base'; -use base 'Log::Mini::LoggerBase'; - -sub new { +sub new +{ my $self = shift->SUPER::new(@_); my (%params) = @_; @@ -24,16 +24,18 @@ sub new { return $self; } -sub _print { +sub _print +{ my $self = shift; my $fh = $self->{fh}; print $fh @_; } - -sub DESTROY { +sub DESTROY +{ close shift->{'fh'}; return; } + 1; diff --git a/lib/Log/Mini/Logger/NULL.pm b/lib/Log/Mini/Logger/NULL.pm new file mode 100644 index 0000000..b16e68f --- /dev/null +++ b/lib/Log/Mini/Logger/NULL.pm @@ -0,0 +1,12 @@ +package Log::Mini::Logger::NULL; + +use strict; +use warnings; + +use base 'Log::Mini::Logger::Base'; + +sub _log { + return; +} + +1; diff --git a/lib/Log/Mini/Logger/STDERR.pm b/lib/Log/Mini/Logger/STDERR.pm new file mode 100644 index 0000000..be836f9 --- /dev/null +++ b/lib/Log/Mini/Logger/STDERR.pm @@ -0,0 +1,13 @@ +package Log::Mini::Logger::STDERR; + +use strict; +use warnings; + +use base 'Log::Mini::Logger::Base'; + +sub _print +{ + print STDERR $_[1]; +} + +1; diff --git a/lib/Log/Mini/LoggerNULL.pm b/lib/Log/Mini/LoggerNULL.pm deleted file mode 100644 index 9a07064..0000000 --- a/lib/Log/Mini/LoggerNULL.pm +++ /dev/null @@ -1,12 +0,0 @@ -package Log::Mini::LoggerNULL; - -use strict; -use warnings; - -use base 'Log::Mini::LoggerBase'; - -sub _log { - return; -} - -1; diff --git a/lib/Log/Mini/LoggerSTDERR.pm b/lib/Log/Mini/LoggerSTDERR.pm deleted file mode 100644 index a05384e..0000000 --- a/lib/Log/Mini/LoggerSTDERR.pm +++ /dev/null @@ -1,12 +0,0 @@ -package Log::Mini::LoggerSTDERR; - -use strict; -use warnings; - -use base 'Log::Mini::LoggerBase'; - -sub _print { - print STDERR $_[1]; -} - -1; diff --git a/t/01_logger_builder.t b/t/01_logger_builder.t index 0cad439..569079a 100644 --- a/t/01_logger_builder.t +++ b/t/01_logger_builder.t @@ -7,28 +7,37 @@ use Test::Fatal; use File::Temp; use Log::Mini; + subtest 'creates stderr logger' => sub { my $logger = Log::Mini->new('stderr'); - isa_ok $logger, 'Log::Mini::LoggerSTDERR'; + isa_ok $logger, 'Log::Mini::Logger::STDERR'; }; subtest 'creates null logger' => sub { my $logger = Log::Mini->new('null'); - isa_ok $logger, 'Log::Mini::LoggerNULL'; + isa_ok $logger, 'Log::Mini::Logger::NULL'; }; subtest 'creates file logger' => sub { - my $file = File::Temp->new; + my $file = File::Temp->new; my $logger = Log::Mini->new('file' => $file->filename); - isa_ok $logger, 'Log::Mini::LoggerFILE'; + isa_ok $logger, 'Log::Mini::Logger::FILE'; }; -subtest 'return STDERR on unknown logger' => sub { - my $logger = Log::Mini->new('unknown'); - isa_ok $logger, 'Log::Mini::LoggerSTDERR'; +subtest 'return STDERR on no logger name given' => sub { + my $logger = Log::Mini->new(); + isa_ok $logger, 'Log::Mini::Logger::STDERR'; }; -done_testing; \ No newline at end of file +subtest 'throw on unknown logger adapter' => sub { + like( + exception { Log::Mini->new('unknown'); }, + qr/^Failed to load adapter: unknown, .*/, + "the code died on unknown adapter", + ); +}; + +done_testing; diff --git a/t/02_Logger.t b/t/02_Logger.t index 741b5f6..c86a622 100644 --- a/t/02_Logger.t +++ b/t/02_Logger.t @@ -5,6 +5,7 @@ use warnings; use Test::More; use Test::Fatal; + subtest 'creates correct object' => sub { isa_ok(LoggerTest->new, 'LoggerTest'); }; @@ -26,7 +27,7 @@ subtest 'sets log level' => sub { subtest 'not throws when known log level' => sub { my $log = LoggerTest->new; - for my $level (qw/error warn debug/) { + for my $level (qw/error warn debug info trace/) { ok !exception { $log->set_level($level) }; } }; @@ -39,19 +40,19 @@ subtest 'throws exception when invalid log level' => sub { subtest 'prints formatted line' => sub { my $output = []; - my $log = _build_logger(output => $output); + my $log = _build_logger(output => $output); - for my $level (qw/error warn debug/) { + for my $level (qw/error warn debug info trace/) { + $log->set_level($level); $log->$level('message'); - like $output->[-1], - qr/\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d.\d{3} \[$level\] message/; + like $output->[-1], qr/\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d.\d{3} \[$level\] message/; } }; -subtest 'logs when level is higher' => sub { +subtest 'log all suitable levels' => sub { my $output = []; - my $log = _build_logger(output => $output); + my $log = _build_logger(output => $output); my $levels = { error => [qw/error/], @@ -73,11 +74,13 @@ subtest 'logs when level is higher' => sub { subtest 'not logs when level is lower' => sub { my $output = []; - my $log = _build_logger(output => $output); + my $log = _build_logger(output => $output); my $levels = { - error => [qw/warn debug/], - warn => [qw/debug/], + error => [qw/warn info debug trace/], + warn => [qw/info debug trace/], + info => [qw/debug trace/], + debug => [qw/trace/], }; for my $level (keys %$levels) { @@ -90,7 +93,8 @@ subtest 'not logs when level is lower' => sub { } }; -sub _build_logger { +sub _build_logger +{ my $logger = LoggerTest->new(@_); $logger->set_level('debug'); return $logger; @@ -99,9 +103,10 @@ sub _build_logger { done_testing; package LoggerTest; -use base 'Log::Mini::LoggerBase'; +use base 'Log::Mini::Logger::Base'; -sub new { +sub new +{ my $self = shift->SUPER::new(@_); my (%params) = @_; @@ -110,7 +115,8 @@ sub new { return $self; } -sub _print { +sub _print +{ my $self = shift; push @{$self->{output}}, @_; diff --git a/t/03_LoggerFILE.t b/t/03_LoggerFILE.t index 381a42c..142ab48 100644 --- a/t/03_LoggerFILE.t +++ b/t/03_LoggerFILE.t @@ -5,11 +5,11 @@ use warnings; use Test::More; use Test::Fatal; use File::Temp; -use Log::Mini::LoggerFILE; +use Log::Mini::Logger::FILE; subtest 'creates correct object' => sub { - isa_ok(Log::Mini::LoggerFILE->new, 'Log::Mini::LoggerFILE'); + isa_ok(Log::Mini::Logger::FILE->new, 'Log::Mini::Logger::FILE'); }; subtest 'prints to file' => sub { @@ -79,7 +79,7 @@ sub _slurp { } sub _build_logger { - my $logger = Log::Mini::LoggerFILE->new(@_); + my $logger = Log::Mini::Logger::FILE->new(@_); $logger->set_level('debug'); return $logger; } diff --git a/t/04_LoggerSTDERR.t b/t/04_LoggerSTDERR.t index 48b46df..a55904b 100644 --- a/t/04_LoggerSTDERR.t +++ b/t/04_LoggerSTDERR.t @@ -5,10 +5,11 @@ use warnings; use Test::More; use Test::Fatal; use Capture::Tiny qw(capture_stderr); -use Log::Mini::LoggerSTDERR; +use Log::Mini::Logger::STDERR; + subtest 'creates correct object' => sub { - isa_ok(Log::Mini::LoggerSTDERR->new, 'Log::Mini::LoggerSTDERR'); + isa_ok(Log::Mini::Logger::STDERR->new, 'Log::Mini::Logger::STDERR'); }; subtest 'prints to stderr' => sub { @@ -50,7 +51,7 @@ subtest 'prints sprintf formatted line' => sub { }; sub _build_logger { - my $logger = Log::Mini::LoggerSTDERR->new; + my $logger = Log::Mini::Logger::STDERR->new; $logger->set_level('debug'); return $logger; } diff --git a/t/05_Integration.t b/t/05_Integration.t index 964ab5f..e27819b 100644 --- a/t/05_Integration.t +++ b/t/05_Integration.t @@ -8,15 +8,20 @@ use File::Temp; use Log::Mini; - -subtest 'creates correct object LoggerFILE' => sub { +subtest 'creates correct object Logger::FILE' => sub { my $file = File::Temp->new; - isa_ok(Log::Mini->new( file => $file->filename), 'Log::Mini::LoggerFILE'); + isa_ok(Log::Mini->new(file => $file->filename), 'Log::Mini::Logger::FILE'); + isa_ok(Log::Mini::Logger::FILE->new(file => $file->filename), 'Log::Mini::Logger::FILE'); }; -subtest 'creates correct object LoggerSTDERR' => sub { - isa_ok(Log::Mini->new('stderr', level => 'debug'), 'Log::Mini::LoggerSTDERR'); - isa_ok(Log::Mini::LoggerSTDERR->new(level => 'debug'), 'Log::Mini::LoggerSTDERR'); +subtest 'creates correct object Logger::STDERR' => sub { + isa_ok(Log::Mini->new('stderr', level => 'debug'), 'Log::Mini::Logger::STDERR'); + isa_ok(Log::Mini::Logger::STDERR->new(level => 'debug'), 'Log::Mini::Logger::STDERR'); }; -done_testing; \ No newline at end of file +subtest 'creates correct object Logger::NULL' => sub { + isa_ok(Log::Mini->new('null', level => 'debug'), 'Log::Mini::Logger::NULL'); + isa_ok(Log::Mini::Logger::NULL->new(level => 'debug'), 'Log::Mini::Logger::NULL'); +}; + +done_testing;