Skip to content

Commit f2df274

Browse files
author
Eugene Ponizovsky
committed
Added unit tests and some more
* Added unit tests. * Constructor parameter "interpolation" renamed to "interpolate_variables". * Constructor parameter "processing_directives" renamed to "process_directives". * Added accessors "interpolate_variables" and "process_directives". * Fixed bugs revealed during writing unit tests.
1 parent bcac222 commit f2df274

22 files changed

+1862
-26
lines changed

Makefile.PL

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ WriteMakefile(
2727
license => 'http://dev.perl.org/licenses/',
2828
},
2929
},
30-
ABSTRACT_FROM => 'lib/App/Environ.pm',
30+
ABSTRACT_FROM => 'lib/Config/Loader.pm',
3131
AUTHOR => 'Eugene Ponizovsky <[email protected]>',
3232
LICENSE => 'perl',
3333
);

lib/Config/Loader.pm

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,10 @@ sub new {
4949
my $self = bless {}, $self_class;
5050

5151
$self->{dirs} = $params{dirs} || ['.'];
52-
$self->{interpolation}
53-
= exists $params{interpolation} ? $params{interpolation} : 1;
54-
$self->{processing_directives}
55-
= exists $params{processing_directives}
56-
? $params{processing_directives}
57-
: 1;
52+
$self->{interpolate_variables} = exists $params{interpolate_variables}
53+
? $params{interpolate_variables} : 1;
54+
$self->{process_directives} = exists $params{process_directives}
55+
? $params{process_directives} : 1;
5856

5957
$self->{_hash_merge} = Hash::Merge->new( 'CONFIG_PRECEDENT' );
6058
$self->{_config} = undef;
@@ -63,6 +61,22 @@ sub new {
6361
return $self;
6462
}
6563

64+
{
65+
no strict 'refs';
66+
67+
foreach my $name ( qw( interpolate_variables process_directives ) ) {
68+
*{$name} = sub {
69+
my $self = shift;
70+
71+
if ( @_ ) {
72+
$self->{$name} = shift;
73+
}
74+
75+
return $self->{$name};
76+
}
77+
}
78+
}
79+
6680
sub load {
6781
my $self = shift;
6882
my @config_sections = @_;
@@ -140,7 +154,7 @@ sub _build_tree {
140154

141155
if ( @not_found ) {
142156
croak "Can't locate " . join( ', ', @not_found )
143-
. " in directories: " . join( ', ', @{ $self->{dirs} } );
157+
. " in " . join( ', ', @{ $self->{dirs} } );
144158
}
145159
}
146160
}
@@ -172,25 +186,28 @@ sub _process_node {
172186

173187
return unless defined $node;
174188

175-
if ( ref($node) eq 'HASH' && $self->{processing_directives} ) {
176-
if ( defined $node->{'var'} ) {
189+
if ( ref($node) eq 'HASH' && $self->{process_directives} ) {
190+
if ( defined $node->{var} ) {
177191
$node = $self->_resolve_var( $node->{var} );
178192
}
179193
elsif ( defined $node->{include} ) {
180194
$node = $self->_build_tree( $node->{include} );
181195
}
182-
elsif ( defined $node->{underlay} ) {
183-
my $layer = delete $node->{underlay};
184-
$layer = $self->_process_layer($layer);
185-
$node = $self->{_hash_merge}->merge( $layer, $node );
186-
}
187-
elsif ( defined $node->{overlay} ) {
188-
my $layer = delete $node->{overlay};
189-
$layer = $self->_process_layer($layer);
190-
$node = $self->{_hash_merge}->merge( $node, $layer );
196+
else {
197+
if ( defined $node->{underlay} ) {
198+
my $layer = delete $node->{underlay};
199+
$layer = $self->_process_layer($layer);
200+
$node = $self->{_hash_merge}->merge( $layer, $node );
201+
}
202+
203+
if ( defined $node->{overlay} ) {
204+
my $layer = delete $node->{overlay};
205+
$layer = $self->_process_layer($layer);
206+
$node = $self->{_hash_merge}->merge( $node, $layer );
207+
}
191208
}
192209
}
193-
elsif ( $self->{interpolation} ) { # SCALAR
210+
elsif ( $self->{interpolate_variables} ) { # SCALAR
194211
$node =~ s/\$((\$?)\{([^\}]*)\})/
195212
$2 ? $1 : $self->_resolve_var( $3 )/ge;
196213
}
@@ -250,7 +267,7 @@ sub _resolve_var {
250267
else { # ARRAY
251268
if ( $token =~ m/\D/ ) {
252269
die "Argument \"$token\" isn't numeric in array element:"
253-
. " \${$var_name}\n";
270+
. " $var_name\n";
254271
}
255272

256273
last unless defined $pointer->[$token];
@@ -270,6 +287,10 @@ sub _resolve_var {
270287
}
271288
}
272289

290+
unless ( defined $vars->{$var_name} ) {
291+
$vars->{$var_name} = '';
292+
}
293+
273294
return $vars->{$var_name};
274295
}
275296

@@ -291,6 +312,10 @@ and variables interpolation support
291312
292313
=head2 load()
293314
315+
=head2 interpolate_variables
316+
317+
=head2 process_directives
318+
294319
=head1 AUTHOR
295320
296321
Eugene Ponizovsky, E<lt>[email protected]E<gt>

t/00-base.t

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use 5.008000;
2+
use strict;
3+
use warnings;
4+
5+
use Test::More tests => 3;
6+
7+
my $T_CLASS;
8+
9+
BEGIN {
10+
$T_CLASS = 'Config::Loader';
11+
use_ok($T_CLASS);
12+
}
13+
14+
can_ok( $T_CLASS, 'new' );
15+
my $config_loader = new_ok($T_CLASS);

t/01-accessors.t

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use 5.008000;
2+
use strict;
3+
use warnings;
4+
5+
use Test::More tests => 8;
6+
use Config::Loader;
7+
8+
my $CONFIG_LOADER = Config::Loader->new();
9+
10+
can_ok( $CONFIG_LOADER, 'interpolate_variables' );
11+
can_ok( $CONFIG_LOADER, 'process_directives' );
12+
13+
t_interpolate_variables($CONFIG_LOADER);
14+
t_process_directives($CONFIG_LOADER);
15+
16+
17+
sub t_interpolate_variables {
18+
my $config_loader = shift;
19+
20+
my $interpolate_variables = $config_loader->interpolate_variables;
21+
is( $interpolate_variables, 1, 'get variable interpolation switch value' );
22+
23+
$config_loader->interpolate_variables(undef);
24+
is( $config_loader->interpolate_variables,
25+
undef, 'disable variable interpolation' );
26+
27+
$config_loader->interpolate_variables(1);
28+
is( $config_loader->interpolate_variables, 1,
29+
"enable variable interpolation" );
30+
31+
return;
32+
}
33+
34+
sub t_process_directives {
35+
my $config_loader = shift;
36+
37+
my $process_directives = $config_loader->process_directives;
38+
is( $process_directives, 1, 'get directive processing switch value' );
39+
40+
$config_loader->process_directives(undef);
41+
is( $config_loader->process_directives,
42+
undef, 'disable directive processing' );
43+
44+
$config_loader->process_directives(1);
45+
is( $config_loader->process_directives, 1, "enable directive processing" );
46+
47+
return;
48+
}

0 commit comments

Comments
 (0)