Skip to content

Commit 5f946e7

Browse files
committed
Fixes in variable resolving logic
1 parent 5abea43 commit 5f946e7

File tree

4 files changed

+36
-39
lines changed

4 files changed

+36
-39
lines changed

README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Config-Processor version 0.21_02
1+
Config-Processor version 0.21_03
22
=============================
33

44
INSTALLATION

examples/etc/db_connectors/default.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ default:
33
host: 'localhost'
44
port: '1234'
55
dbname: 'stat'
6-
options: { var: ...default_options }
6+
options: { var: myapp.db.default_options }
77

examples/etc/dirs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ myapp:
44
dirs:
55
root_dir: "/myapp"
66
home_dir: "${ENV.HOME}"
7-
templates_dir: "${.root_dir}/templates"
7+
templates_dir: "${myapp.dirs.root_dir}/templates"
88
sessions_dir: "${.root_dir}/sessions"
99
media_dirs:
1010
- "${..root_dir}/media/${myapp.media_formats.0}"

lib/Config/Processor.pm

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use 5.008000;
44
use strict;
55
use warnings;
66

7-
our $VERSION = '0.21_02';
7+
our $VERSION = '0.21_03';
88

99
use File::Spec;
1010
use YAML::XS qw( LoadFile );
@@ -229,11 +229,11 @@ sub _process_node {
229229

230230
if ( !ref($node) && $self->{interpolate_variables} ) {
231231
$node =~ s/\$((\$?)\{([^\}]*)\})/
232-
$2 ? $1 : ( $self->_resolve_var( $3, $ancs ) || '' )/ge;
232+
$2 ? $1 : ( $self->_resolve_var( $3, [ @{$ancs} ] ) || '' )/ge;
233233
}
234234
elsif ( ref($node) eq 'HASH' && $self->{process_directives} ) {
235235
if ( defined $node->{var} ) {
236-
$node = $self->_resolve_var( $node->{var}, $ancs );
236+
$node = $self->_resolve_var( $node->{var}, [ @{$ancs} ] );
237237
}
238238
elsif ( defined $node->{include} ) {
239239
$node = $self->_build_tree( $node->{include} );
@@ -283,9 +283,11 @@ sub _resolve_var {
283283
my $name = shift;
284284
my $ancs = shift;
285285

286+
my $value;
287+
286288
if ( $name =~ m/^\./ ) {
287-
my @tokens = split( /\./, $name, -1 );
288-
my $anc_index = -1;
289+
my $node;
290+
my @tokens = split( /\./, $name, -1 );
289291

290292
while (1) {
291293
my $token = $tokens[0];
@@ -297,57 +299,52 @@ sub _resolve_var {
297299
shift @tokens;
298300

299301
last unless @tokens;
302+
next unless @{$ancs};
300303

301-
$anc_index++;
304+
$node = shift @{$ancs};
302305
}
303306

304-
my $node = $ancs->[$anc_index];
305-
306-
my $value = eval {
307-
$self->_fetch_value( $node, \@tokens, $ancs );
307+
$value = eval {
308+
$self->_fetch_value( $node, $ancs, \@tokens );
308309
};
309310

310311
if ($@) {
311312
chomp $@;
312313
die qq{Can't resolve variable "$name"; $@\n};
313314
}
314-
315-
return $value;
316315
}
316+
else {
317+
my $vars = $self->{_vars};
317318

318-
my $vars = $self->{_vars};
319-
320-
unless ( defined $vars->{$name} ) {
321-
my @tokens = split( /\./, $name, -1 );
319+
unless ( defined $vars->{$name} ) {
320+
my @tokens = split( /\./, $name, -1 );
322321

323-
my $value = eval {
324-
$self->_fetch_value( $self->{_config}, \@tokens, $ancs );
325-
};
322+
$vars->{$name} = eval {
323+
$self->_fetch_value( $self->{_config}, [], \@tokens );
324+
};
326325

327-
if ($@) {
328-
chomp $@;
329-
die qq{Can't resolve variable "$name"; $@\n};
326+
if ($@) {
327+
chomp $@;
328+
die qq{Can't resolve variable "$name"; $@\n};
329+
}
330330
}
331331

332-
$vars->{$name} = $value;
332+
$value = $vars->{$name};
333333
}
334334

335-
return $vars->{$name};
335+
return $value;
336336
}
337337

338338
####
339339
sub _fetch_value {
340340
my $self = shift;
341341
my $node = shift;
342-
my $tokens = shift;
343342
my $ancs = shift;
343+
my $tokens = shift;
344344

345-
unless ( @{$tokens} ) {
346-
return $node;
347-
}
345+
return $node unless @{$tokens};
348346

349347
my $value;
350-
my @anc_stack = @{$ancs};
351348

352349
while (1) {
353350
my $token = shift @{$tokens};
@@ -357,11 +354,11 @@ sub _fetch_value {
357354
if ( ref($node) eq 'HASH' ) {
358355
last unless defined $node->{$token};
359356

360-
unshift( @anc_stack, $node );
357+
unshift( @{$ancs}, $node );
361358

362359
unless ( @{$tokens} ) {
363-
$value = $self->_process_node( $node->{$token}, \@anc_stack );
364-
$node->{$token} = $value;
360+
$node->{$token} = $self->_process_node( $node->{$token}, $ancs );
361+
$value = $node->{$token};
365362

366363
last;
367364
}
@@ -377,11 +374,11 @@ sub _fetch_value {
377374

378375
last unless defined $node->[$token];
379376

380-
unshift( @anc_stack, $node );
377+
unshift( @{$ancs}, $node );
381378

382379
unless ( @{$tokens} ) {
383-
$value = $self->_process_node( $node->[$token], \@anc_stack );
384-
$node->[$token] = $value;
380+
$node->[$token] = $self->_process_node( $node->[$token], $ancs );
381+
$value = $node->[$token];
385382

386383
last;
387384
}
@@ -571,7 +568,7 @@ referenced configuration parameter.
571568
572569
dirs:
573570
root_dir: "/myapp"
574-
templates_dir: "${.root_dir}/templates"
571+
templates_dir: "${myapp.dirs.root_dir}/templates"
575572
sessions_dir: "${.root_dir}/sessions"
576573
media_dirs:
577574
- "${..root_dir}/media/${myapp.media_formats.0}"

0 commit comments

Comments
 (0)