| line | % | coverage | branch |
| 681 | 100 | T | F | if (scalar @_ == 1) { } |
| 690 | 100 | T | F | if defined $ENV{'CONFIG_DIR'} |
| 692 | 100 | T | F | if $params->{'file'} |
| 694 | 100 | T | F | unless (defined $params->{'config_dirs'}) |
| 695 | 100 | T | F | if ($params->{'config_file'} and 'File::Spec'->file_name_is_absolute($params->{'config_file'})) { } |
| 699 | 50 | T | F | if ($^O ne 'MSWin32') { } |
| 704 | 100 | T | F | if ($ENV{'HOME'}) { } |
| 100 | T | F | elsif ($ENV{'DOCUMENT_ROOT'}) { } |
| 715 | 50 | T | F | if (my $dir = $ENV{'CONFIG_DIR'}) { } |
| 725 | 100 | T | F | $params->{'defaults'} ? : |
| 734 | 100 | T | F | if (my $logger = $self->{'logger'}) |
| 735 | 100 | T | F | unless (&Scalar::Util::blessed($logger)) |
| 738 | 50 | T | F | if ($@) { } |
| 740 | 100 | T | F | if (ref $logger eq "ARRAY") |
| 747 | 0 | T | F | if ($params->{'level'} and $self->{'logger'}->can("level")) |
| 755 | 100 | T | F | if (defined $self->{'encryption_key_file'}) |
| 757 | 100 | T | F | unless -f $kf |
| 760 | 100 | T | F | if ($self->{'lazy'}) |
| 763 | 100 | T | F | if $self->{'schema'} |
| 764 | 100 | T | F | if $self->{'validators'} |
| 765 | 50 | T | F | if $self->{'checker'} |
| 771 | 100 | T | F | if (my $schema = $params->{'schema'}) |
| 774 | 100 | T | F | if (my $validators = $params->{'validators'}) |
| 777 | 100 | T | F | if (my $checker = $params->{'checker'}) |
| 781 | 100 | T | F | if (defined $self->{'config'} and scalar keys %{$$self{"config"};}) |
| 792 | 100 | T | F | unless $self->{'lazy'} |
| 795 | 100 | T | F | if (my $schema = delete $self->{'_lazy_schema'}) |
| 798 | 100 | T | F | if (my $validators = delete $self->{'_lazy_validators'}) |
| 801 | 50 | T | F | if (my $checker = delete $self->{'_lazy_checker'}) |
| 816 | 100 | T | F | if (defined $self->{'environment'}) { } |
| 825 | 100 | T | F | unless defined $env |
| 826 | 100 | T | F | if $env eq "" |
| 828 | 100 | T | F | unless ($env =~ /^[A-Za-z0-9_-]+$/) |
| 842 | 100 | T | F | if $r eq "CODE" or $r eq "GLOB" |
| 843 | 100 | T | F | if ($r eq "HASH") |
| 846 | 100 | T | F | if ($r eq "ARRAY") |
| 860 | 100 | T | F | unless (defined $raw) |
| 865 | 100 | T | F | unless (defined $raw) |
| 870 | 100 | T | F | if (defined $kf and -f $kf) |
| 871 | 50 | T | F | unless open my $fh, "<", $kf |
| 875 | 50 | T | F | if defined $raw |
| 879 | 100 | T | F | unless defined $raw |
| 889 | 100 | T | F | if length $raw == $_AES_KEY_SIZE |
| 891 | 100 | T | F | if (length $raw == $_HEX_KEY_LEN and $raw =~ /^[0-9A-Fa-f]{$_HEX_KEY_LEN}$/) |
| 895 | 100 | T | F | if (length $raw >= $_B64_KEY_MIN and length $raw <= $_B64_KEY_MAX) |
| 900 | 50 | T | F | if length $bytes == $_AES_KEY_SIZE |
| 913 | 100 | T | F | if $$seen{&Scalar::Util::refaddr($href)}++ |
| 916 | 100 | T | F | if $k eq "config_path" |
| 918 | 100 | T | F | if (ref $v eq 'HASH') { } |
| 100 | T | F | elsif (ref $v eq 'ARRAY') { } |
| 100 | T | F | elsif (not ref $v and defined $v and $v =~ /^ENC\[/) { } |
| 922 | 100 | T | F | if (not ref $v->[$i] and defined $v->[$i] and $v->[$i] =~ /^ENC\[/) |
| 938 | 100 | T | F | unless ($token =~ /^
ENC\[
([A-Za-z0-9]+) # algorithm name (e.g. AES256GCM)
,
([A-Za-z0-9_-]+) # base64url payload (RFC 4648 \302\2475 alphabet)
\]
$/x) |
| 949 | 100 | T | F | unless (lc $algo eq "aes256gcm") |
| 959 | 100 | T | F | if (length $raw < $_ENC_PAYLOAD_MIN) |
| 963 | 100 | T | F | unless ($self->_load_driver("Crypt::AuthEnc::GCM")) |
| 977 | 100 | T | F | unless ($ok and not $@) |
| 994 | 100 | T | F | if (ref $spec eq 'CODE') { } |
| 100 | T | F | elsif (ref $spec eq 'Regexp') { } |
| 100 | T | F | elsif (ref $spec eq 'HASH') { } |
| 100 | T | F | elsif (not ref $spec) { } |
| 995 | 100 | T | F | unless (&$spec($value)) |
| 999 | 100 | T | F | unless (defined $value and $value =~ /$spec/) |
| 1000 | 100 | T | F | defined $value ? : |
| 1018 | 100 | T | F | if ($spec->{'required'} and not $self->exists($key) && defined $value) |
| 1021 | 100 | T | F | if (my $type = $spec->{'type'}) |
| 1024 | 100 | T | F | if (my $pattern = $spec->{'pattern'}) |
| 1025 | 100 | T | F | unless (defined $value and $value =~ /$pattern/) |
| 1026 | 50 | T | F | defined $value ? : |
| 1030 | 100 | T | F | if (defined(my $min = $spec->{'min'})) |
| 1031 | 100 | T | F | if defined $value and $value < $min |
| 1034 | 100 | T | F | if (defined(my $max = $spec->{'max'})) |
| 1035 | 100 | T | F | if defined $value and $value > $max |
| 1047 | 100 | T | F | if ($ltype eq 'integer') { } |
| 100 | T | F | elsif ($ltype eq 'number' or $ltype eq 'float') { } |
| 100 | T | F | elsif ($ltype eq 'boolean') { } |
| 100 | T | F | elsif ($ltype eq 'string') { } |
| 100 | T | F | elsif ($ltype eq 'array') { } |
| 100 | T | F | elsif ($ltype eq 'hash') { } |
| 1048 | 100 | T | F | defined $value ? : |
| 100 | T | F | unless defined $value and $value =~ /^-?[0-9]+$/ |
| 1052 | 100 | T | F | defined $value ? : |
| 100 | T | F | unless defined $value and &Scalar::Util::looks_like_number($value) |
| 1056 | 100 | T | F | defined $value ? : |
| 100 | T | F | unless defined $value and $value =~ /^(?:1|0|true|false|yes|no)$/i |
| 1060 | 100 | T | F | unless defined $value and not ref $value |
| 1063 | 100 | T | F | unless ref $value eq "ARRAY" |
| 1066 | 100 | T | F | unless ref $value eq "HASH" |
| 1079 | 50 | T | F | unless ($self->_load_driver("Config::Checker")) |
| 1087 | 0 | T | F | if $@ |
| 1090 | 0 | T | F | if $@ |
| 1101 | 100 | T | F | unless defined $val |
| 1102 | 100 | T | F | if &Scalar::Util::blessed($val) |
| 1103 | 100 | T | F | if ref $val |
| 1118 | 50 | T | F | unless ref $hash eq "HASH" |
| 1120 | 100 | T | F | if $seen->{$addr}++ |
| 1122 | 100 | T | F | if $k eq "config_path" |
| 1123 | 100 | T | F | length $prefix ? : |
| 1124 | 100 | T | F | if (ref $hash->{$k} eq 'HASH') { } |
| 1142 | 100 | T | F | unless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__)) |
| 1157 | 100 | T | F | if ($self->{'data'}) |
| 1159 | 100 | T | F | if (ref $self->{'data'} eq 'HASH') { } |
| 1172 | 100 | T | F | if ($logger) |
| 1182 | 100 | T | F | $environment ? : |
| 100 | T | F | $environment ? : |
| 1186 | 100 | T | F | if ($self->{'config_file'} and scalar @dirs > 1) |
| 1187 | 100 | T | F | if ('File::Spec'->file_name_is_absolute($self->{'config_file'})) { } |
| 1196 | 100 | T | F | unless defined $dir |
| 1204 | 100 | T | F | if (my($host, $remote_dir) = $self->_parse_remote_dir($dir)) |
| 1205 | 100 | T | F | if ($self->_is_local_host($host)) { } |
| 1213 | 100 | T | F | if (length $effective_dir and not -d $effective_dir) |
| 1219 | 100 | T | F | if ($logger) |
| 1222 | 100 | T | F | unless -f $path |
| 1223 | 100 | T | F | unless -r $path |
| 1225 | 100 | T | F | if ($logger) |
| 1231 | 100 | T | F | if ($file =~ /\.ya?ml$/) { } |
| 100 | T | F | elsif ($file =~ /\.json$/) { } |
| 100 | T | F | elsif ($file =~ /\.xml$/) { } |
| 100 | T | F | elsif ($file =~ /\.ini$/) { } |
| 50 | T | F | elsif ($file =~ /\.toml$/) { } |
| 1234 | 100 | T | F | if ($@) |
| 1235 | 100 | T | F | if ($logger) { } |
| 1242 | 100 | T | F | if defined $data and ref $data |
| 1245 | 100 | T | F | if ($@) |
| 1246 | 50 | T | F | if ($logger) { } |
| 1255 | 50 | T | F | if ($self->_load_driver("XML::Simple", ["XMLin"])) |
| 1257 | 0 | T | F | if (defined $xml_raw and $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) { } |
| 0 | T | F | elsif (defined $xml_raw) { } |
| 1261 | 0 | T | F | if ($@) { } |
| 0 | T | F | elsif ($rc) { } |
| 1262 | 0 | T | F | if ($logger) { } |
| 1273 | 100 | T | F | if (not defined $rc and $self->_load_driver("XML::PP")) |
| 1276 | 100 | T | F | if (my $tree = $xml_pp->parse(\$data)) |
| 1277 | 50 | T | F | if ($data = $xml_pp->collapse_structure($tree)) |
| 1279 | 100 | T | F | if ($data->{'config'}) |
| 1287 | 100 | T | F | if (my $ini = 'Config::IniFiles'->new('-file', $path)) { } |
| 1293 | 50 | T | F | if ($logger) { } |
| 1300 | 100 | T | F | if ($self->_load_driver("TOML::Tiny", ["from_toml"])) |
| 1305 | 100 | T | F | if ($toml_err) { } |
| 50 | T | F | elsif (ref $toml_data eq 'HASH' and scalar keys %$toml_data) { } |
| 1306 | 50 | T | F | if ($logger) { } |
| 1316 | 100 | T | F | if ($data) |
| 1317 | 100 | T | F | unless (ref $data) |
| 1318 | 100 | T | F | if ($logger) |
| 1323 | 100 | T | F | if (ref $data ne "HASH") |
| 1324 | 100 | T | F | if ($logger) |
| 1329 | 100 | T | F | if ($logger) |
| 1343 | 100 | T | F | unless ($self->{'script_name'}) |
| 1344 | 50 | T | F | unless "File::Basename"->can("basename") |
| 1352 | 100 | T | F | unless defined $config_file |
| 1355 | 100 | T | F | if $config_file eq $script_name and length $effective_dir == 0 || $effective_dir eq 'File::Spec'->curdir |
| 1356 | 100 | T | F | length $effective_dir ? : |
| 1357 | 100 | T | F | if ($logger) |
| 1360 | 100 | T | F | if (-f $path and -r $path) |
| 1363 | 100 | T | F | if ($logger) |
| 1367 | 100 | T | F | if ($data =~ /^\s*<\?xml/ or $data =~ m[</[^>]+>]) { } |
| 100 | T | F | elsif ($data =~ /
\{ # opening brace
.+ # key material; dot matches newlines because of the s modifier
: # colon separator
. # one value character
\} # closing brace
/sx) { } |
| 1368 | 50 | T | F | if ($self->_load_driver('XML::Simple', ['XMLin'])) { } |
| 50 | T | F | elsif ($self->_load_driver('XML::PP')) { } |
| 1369 | 0 | T | F | if ($data =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) { } |
| 0 | T | F | elsif (my $xml_data = XMLin(\$data, 'ForceArray', 0, 'KeyAttr', scalar [])) { } |
| 1378 | 100 | T | F | if (my $tree = $xml_pp->parse(\$data)) |
| 1379 | 50 | T | F | if ($data = $xml_pp->collapse_structure($tree)) |
| 1381 | 100 | T | F | if ($data->{'config'}) |
| 1398 | 100 | T | F | if ($is_json) { } |
| 1400 | 100 | T | F | if ($@) |
| 1406 | 100 | T | F | if ($data) |
| 1412 | 100 | T | F | unless ($data or $raw_content =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) |
| 1414 | 100 | T | F | if (eval {
do {
$data = LoadFile($path)
}
} and ref $data eq "HASH") |
| 1420 | 100 | T | F | unless (defined $v) |
| 1428 | 100 | T | F | unless _is_plain_scalar($v) |
| 1430 | 100 | T | F | if $v =~ /^"[^"]+"$/ |
| 1431 | 100 | T | F | if ($v =~ /,/) |
| 1435 | 100 | T | F | if ($val =~ /([^=]+)=(.+)/) { } |
| 1443 | 50 | T | F | if ($data) |
| 1447 | 100 | T | F | if (not $data or ref $data ne "HASH") |
| 1448 | 50 | T | F | if ($self->_load_driver("TOML::Tiny", ["from_toml"])) |
| 1453 | 100 | T | F | if (not $toml_err and ref $toml_data eq "HASH" and scalar keys %$toml_data) |
| 1459 | 100 | T | F | if (not $data or ref $data ne "HASH") |
| 1461 | 100 | T | F | if (my $ini = "Config::IniFiles"->new("-file", $path)) |
| 1466 | 50 | T | F | if ($data) |
| 1470 | 100 | T | F | if (not $data or ref $data ne "HASH") |
| 1472 | 50 | T | F | if ($self->_load_driver("XML::Simple", ["XMLin"])) |
| 1474 | 0 | T | F | if (defined $xml_raw and not $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) |
| 1478 | 50 | T | F | if (not $data or ref $data ne "HASH") |
| 1479 | 50 | T | F | if ($self->_load_driver("Config::Abstract")) |
| 1486 | 0 | T | F | if ($err) { } |
| 0 | T | F | elsif ($data) { } |
| 1490 | 0 | T | F | if (scalar keys %{$data;} == 0) |
| 1497 | 50 | T | F | if (not $data or ref $data ne "HASH") |
| 1500 | 100 | T | F | if ($data = $ca->parse) |
| 1508 | 100 | T | F | if ($logger) |
| 1509 | 100 | T | F | if ($@) { } |
| 1516 | 100 | T | F | if ($data and ref $data eq "HASH") |
| 1523 | 100 | T | F | if (scalar keys %merged) { } |
| 100 | T | F | elsif ($data and ref $data eq 'HASH') { } |
| 100 | T | F | elsif (not $@ and $logger) { } |
| 1524 | 100 | T | F | if ($data) |
| 1544 | 100 | T | F | unless $key =~ /^\Q$self->{'env_prefix'}\E(.*)$/i |
| 1546 | 100 | T | F | if ($path =~ /__/) { } |
| 1568 | 100 | T | F | unless $arg =~ /=/ |
| 1570 | 100 | T | F | unless $key =~ /^--\Q$self->{'env_prefix'}\E(.*)$/ |
| 1574 | 50 | T | F | if (scalar @parts > 0) |
| 1576 | 100 | T | F | if (scalar @parts > 1) |
| 1588 | 100 | T | F | if ($self->{'flatten'}) { } |
| 1595 | 100 | T | F | $self->{'flatten'} ? : |
| 1599 | 100 | T | F | if (my $enc_key = $self->_get_encryption_key) |
| 1655 | 100 | T | F | unless defined $key |
| 1659 | 100 | T | F | if ($self->{'flatten'}) |
| 1664 | 100 | T | F | unless ref $ref eq "HASH" |
| 1665 | 100 | T | F | unless exists $ref->{$part} |
| 1668 | 100 | T | F | if (defined $ref and ref $ref eq "HASH" and not $self->{'no_fixate'}) |
| 1669 | 50 | T | F | if ($self->_load_data_reuse) |
| 1670 | 0 | T | F | if (ref $ref eq 'HASH') { } |
| 0 | T | F | elsif (ref $ref eq 'ARRAY') { } |
| 1671 | 0 | T | F | unless (tied %$ref) |
| 1695 | 100 | T | F | if $self->{'no_fixate'} |
| 1698 | 100 | T | F | if $self->{'reuse_loaded'} |
| 1699 | 100 | T | F | if $self->{'reuse_failed'} |
| 1705 | 50 | T | F | if ($@) |
| 1752 | 100 | T | F | unless defined $key |
| 1756 | 100 | T | F | if ($self->{'flatten'}) |
| 1757 | 100 | T | F | exists $self->{'config'}{$key} ? : |
| 1761 | 100 | T | F | unless ref $ref eq "HASH" |
| 1762 | 100 | T | F | unless exists $ref->{$part} |
| 1811 | 100 | T | F | unless $self->{'config'} |
| 1818 | 100 | T | F | scalar keys %{$$self{'config'};} ? : |
| 1924 | 100 | T | F | if (exists $layer->{'flat_data'}{$key}) |
| 1953 | 100 | T | F | unless defined $key |
| 1958 | 100 | T | F | $sep eq '.' ? : |
| 1962 | 100 | T | F | unless $layer->{'type'} eq $type |
| 1963 | 100 | T | F | if (exists $layer->{'flat_data'}{$flat_key}) |
| 2000 | 100 | T | F | $found ? : |
| 2031 | 100 | T | F | $found ? : |
| 2066 | 100 | T | F | $found ? : |
| 2101 | 100 | T | F | $found ? : |
| 2165 | 100 | T | F | unless my $key = $self->_get_encryption_key |
| 2168 | 100 | T | F | unless ($self->_load_driver("Crypt::AuthEnc::GCM")) |
| 2171 | 100 | T | F | unless ($self->_load_driver("Crypt::PRNG", ["random_bytes"])) |
| 2239 | 100 | T | F | if scalar @_ == 0 |
| 2243 | 100 | T | F | unless defined $defaults |
| 2258 | 100 | T | F | if (exists $config->{'global'}) |
| 2259 | 100 | T | F | if ($params->{'deep'}) { } |
| 2266 | 100 | T | F | if ($section and exists $config->{$section}) |
| 2270 | 100 | T | F | if ($params->{'merge'}) { } |
| 2288 | 100 | T | F | if $self->{'loaded'}{$driver} |
| 2289 | 100 | T | F | if $self->{'failed'}{$driver} |
| 2292 | 100 | T | F | if ($@) |
| 2293 | 100 | T | F | if (my $logger = $self->{'logger'}) |
| 2446 | 100 | T | F | unless defined $dir |
| 2447 | 100 | T | F | unless $dir =~ m[^\/\.\.\/([^/]+)(/.+)?$] |
| 2463 | 100 | T | F | unless defined $host and length $host |
| 2467 | 100 | T | F | if lc $bare eq "localhost" |
| 2468 | 100 | T | F | if $bare eq "127.0.0.1" |
| 2469 | 100 | T | F | if $bare eq "::1" |
| 2473 | 100 | T | F | unless (defined $self->{'_cached_hostname'}) |
| 2478 | 100 | T | F | if lc $bare eq $self->{'_cached_hostname'} |
| 2479 | 100 | T | F | if lc $bare eq $self->{'_cached_short_hostname'} |
| 2494 | 100 | T | F | unless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__)) |
| 2501 | 100 | T | F | unless ($self->_load_driver("File::Slurp::Remote")) |
| 2503 | 100 | T | F | $logger ? : |
| 2509 | 100 | T | F | $file_list ? : |
| 2516 | 100 | T | F | if ($logger) |
| 2521 | 100 | T | F | unless defined $raw |
| 2523 | 100 | T | F | if ($logger) |
| 2528 | 100 | T | F | unless defined $data |
| 2530 | 100 | T | F | if (ref $data ne "HASH") |
| 2532 | 100 | T | F | $logger ? : |
| 2562 | 100 | T | F | if ($@) |
| 2563 | 100 | T | F | if ($logger) |
| 2582 | 100 | T | F | unless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__)) |
| 2591 | 100 | T | F | if ($filename =~ /\.ya?ml$/i) { } |
| 100 | T | F | elsif ($filename =~ /\.json$/i) { } |
| 100 | T | F | elsif ($filename =~ /\.xml$/i) { } |
| 100 | T | F | elsif ($filename =~ /\.ini$/i) { } |
| 2594 | 50 | T | F | if defined $data and ref $data |
| 2600 | 50 | T | F | if ($self->_load_driver('XML::Simple', ['XMLin'])) { } |
| 50 | T | F | elsif ($self->_load_driver('XML::PP')) { } |
| 2601 | 0 | T | F | unless ($raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) |
| 2606 | 100 | T | F | if (my $tree = $pp->parse(\$raw)) |
| 2608 | 100 | T | F | if $data and $data->{'config'} |
| 2618 | 100 | T | F | if (my $ini = "Config::IniFiles"->new("-file", $tmp->filename)) |
| 2627 | 100 | T | F | if ($@) |
| 2630 | 100 | T | F | $logger ? : |
| 2645 | 100 | T | F | if $key eq "DESTROY" |
| 2660 | 100 | T | F | if ($self->{'flatten'}) |
| 2661 | 50 | T | F | $sep ne '.' ? : |
| 2662 | 100 | T | F | if exists $data->{$dot_key} |
| 2663 | 100 | T | F | if exists $data->{$key} |
| 2670 | 100 | T | F | if (ref $val eq 'HASH' and exists $val->{$part}) { } |