| line | % | coverage | branch |
| 679 | 100 | T | F | if (scalar @_ == 1) { } |
| 688 | 100 | T | F | if defined $ENV{'CONFIG_DIR'} |
| 690 | 100 | T | F | if $params->{'file'} |
| 692 | 100 | T | F | unless (defined $params->{'config_dirs'}) |
| 693 | 100 | T | F | if ($params->{'config_file'} and 'File::Spec'->file_name_is_absolute($params->{'config_file'})) { } |
| 697 | 50 | T | F | if ($^O ne 'MSWin32') { } |
| 702 | 100 | T | F | if ($ENV{'HOME'}) { } |
| 100 | T | F | elsif ($ENV{'DOCUMENT_ROOT'}) { } |
| 713 | 50 | T | F | if (my $dir = $ENV{'CONFIG_DIR'}) { } |
| 723 | 100 | T | F | $params->{'defaults'} ? : |
| 732 | 100 | T | F | if (my $logger = $self->{'logger'}) |
| 733 | 100 | T | F | unless (&Scalar::Util::blessed($logger)) |
| 736 | 50 | T | F | if ($@) { } |
| 738 | 100 | T | F | if (ref $logger eq "ARRAY") |
| 745 | 0 | T | F | if ($params->{'level'} and $self->{'logger'}->can("level")) |
| 753 | 100 | T | F | if (defined $self->{'encryption_key_file'}) |
| 755 | 100 | T | F | unless -f $kf |
| 758 | 100 | T | F | if ($self->{'lazy'}) |
| 761 | 100 | T | F | if $self->{'schema'} |
| 762 | 100 | T | F | if $self->{'validators'} |
| 763 | 50 | T | F | if $self->{'checker'} |
| 769 | 100 | T | F | if (my $schema = $params->{'schema'}) |
| 772 | 100 | T | F | if (my $validators = $params->{'validators'}) |
| 775 | 100 | T | F | if (my $checker = $params->{'checker'}) |
| 779 | 100 | T | F | if (defined $self->{'config'} and scalar keys %{$$self{"config"};}) |
| 790 | 100 | T | F | unless $self->{'lazy'} |
| 793 | 100 | T | F | if (my $schema = delete $self->{'_lazy_schema'}) |
| 796 | 100 | T | F | if (my $validators = delete $self->{'_lazy_validators'}) |
| 799 | 50 | T | F | if (my $checker = delete $self->{'_lazy_checker'}) |
| 814 | 100 | T | F | if (defined $self->{'environment'}) { } |
| 823 | 100 | T | F | unless defined $env |
| 824 | 100 | T | F | if $env eq "" |
| 826 | 100 | T | F | unless ($env =~ /^[A-Za-z0-9_-]+$/) |
| 840 | 100 | T | F | if $r eq "CODE" or $r eq "GLOB" |
| 841 | 100 | T | F | if ($r eq "HASH") |
| 844 | 100 | T | F | if ($r eq "ARRAY") |
| 858 | 100 | T | F | unless (defined $raw) |
| 863 | 100 | T | F | unless (defined $raw) |
| 868 | 100 | T | F | if (defined $kf and -f $kf) |
| 869 | 50 | T | F | unless open my $fh, "<", $kf |
| 873 | 50 | T | F | if defined $raw |
| 877 | 100 | T | F | unless defined $raw |
| 887 | 100 | T | F | if length $raw == $_AES_KEY_SIZE |
| 889 | 100 | T | F | if (length $raw == $_HEX_KEY_LEN and $raw =~ /^[0-9A-Fa-f]{$_HEX_KEY_LEN}$/) |
| 893 | 100 | T | F | if (length $raw >= $_B64_KEY_MIN and length $raw <= $_B64_KEY_MAX) |
| 898 | 50 | T | F | if length $bytes == $_AES_KEY_SIZE |
| 911 | 100 | T | F | if $$seen{&Scalar::Util::refaddr($href)}++ |
| 914 | 100 | T | F | if $k eq "config_path" |
| 916 | 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\[/) { } |
| 920 | 100 | T | F | if (not ref $v->[$i] and defined $v->[$i] and $v->[$i] =~ /^ENC\[/) |
| 936 | 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) |
| 947 | 100 | T | F | unless (lc $algo eq "aes256gcm") |
| 957 | 100 | T | F | if (length $raw < $_ENC_PAYLOAD_MIN) |
| 961 | 100 | T | F | unless ($self->_load_driver("Crypt::AuthEnc::GCM")) |
| 974 | 100 | T | F | unless ($ok and not $@) |
| 991 | 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) { } |
| 992 | 100 | T | F | unless (&$spec($value)) |
| 996 | 100 | T | F | unless (defined $value and $value =~ /$spec/) |
| 997 | 100 | T | F | defined $value ? : |
| 1015 | 100 | T | F | if ($spec->{'required'} and not $self->exists($key) && defined $value) |
| 1018 | 100 | T | F | if (my $type = $spec->{'type'}) |
| 1021 | 100 | T | F | if (my $pattern = $spec->{'pattern'}) |
| 1022 | 100 | T | F | unless (defined $value and $value =~ /$pattern/) |
| 1023 | 50 | T | F | defined $value ? : |
| 1027 | 100 | T | F | if (defined(my $min = $spec->{'min'})) |
| 1028 | 100 | T | F | if defined $value and $value < $min |
| 1031 | 100 | T | F | if (defined(my $max = $spec->{'max'})) |
| 1032 | 100 | T | F | if defined $value and $value > $max |
| 1044 | 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') { } |
| 1045 | 100 | T | F | defined $value ? : |
| 100 | T | F | unless defined $value and $value =~ /^-?[0-9]+$/ |
| 1049 | 100 | T | F | defined $value ? : |
| 100 | T | F | unless defined $value and &Scalar::Util::looks_like_number($value) |
| 1053 | 100 | T | F | defined $value ? : |
| 100 | T | F | unless defined $value and $value =~ /^(?:1|0|true|false|yes|no)$/i |
| 1057 | 100 | T | F | unless defined $value and not ref $value |
| 1060 | 100 | T | F | unless ref $value eq "ARRAY" |
| 1063 | 100 | T | F | unless ref $value eq "HASH" |
| 1076 | 50 | T | F | unless ($self->_load_driver("Config::Checker")) |
| 1084 | 0 | T | F | if $@ |
| 1087 | 0 | T | F | if $@ |
| 1098 | 100 | T | F | unless defined $val |
| 1099 | 100 | T | F | if &Scalar::Util::blessed($val) |
| 1100 | 100 | T | F | if ref $val |
| 1115 | 50 | T | F | unless ref $hash eq "HASH" |
| 1117 | 100 | T | F | if $seen->{$addr}++ |
| 1119 | 100 | T | F | if $k eq "config_path" |
| 1120 | 100 | T | F | length $prefix ? : |
| 1121 | 100 | T | F | if (ref $hash->{$k} eq 'HASH') { } |
| 1139 | 100 | T | F | unless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__)) |
| 1154 | 100 | T | F | if ($self->{'data'}) |
| 1156 | 100 | T | F | if (ref $self->{'data'} eq 'HASH') { } |
| 1169 | 100 | T | F | if ($logger) |
| 1179 | 100 | T | F | $environment ? : |
| 100 | T | F | $environment ? : |
| 1183 | 100 | T | F | if ($self->{'config_file'} and scalar @dirs > 1) |
| 1184 | 100 | T | F | if ('File::Spec'->file_name_is_absolute($self->{'config_file'})) { } |
| 1193 | 100 | T | F | unless defined $dir |
| 1201 | 100 | T | F | if (my($host, $remote_dir) = $self->_parse_remote_dir($dir)) |
| 1202 | 100 | T | F | if ($self->_is_local_host($host)) { } |
| 1210 | 100 | T | F | if (length $effective_dir and not -d $effective_dir) |
| 1216 | 100 | T | F | if ($logger) |
| 1219 | 100 | T | F | unless -f $path |
| 1220 | 100 | T | F | unless -r $path |
| 1222 | 100 | T | F | if ($logger) |
| 1228 | 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$/) { } |
| 1231 | 100 | T | F | if ($@) |
| 1232 | 100 | T | F | if ($logger) { } |
| 1239 | 100 | T | F | if defined $data and ref $data |
| 1242 | 100 | T | F | if ($@) |
| 1243 | 50 | T | F | if ($logger) { } |
| 1252 | 50 | T | F | if ($self->_load_driver("XML::Simple", ["XMLin"])) |
| 1254 | 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) { } |
| 1258 | 0 | T | F | if ($@) { } |
| 0 | T | F | elsif ($rc) { } |
| 1259 | 0 | T | F | if ($logger) { } |
| 1270 | 100 | T | F | if (not defined $rc and $self->_load_driver("XML::PP")) |
| 1273 | 100 | T | F | if (my $tree = $xml_pp->parse(\$data)) |
| 1274 | 50 | T | F | if ($data = $xml_pp->collapse_structure($tree)) |
| 1276 | 100 | T | F | if ($data->{'config'}) |
| 1284 | 100 | T | F | if (my $ini = 'Config::IniFiles'->new('-file', $path)) { } |
| 1290 | 50 | T | F | if ($logger) { } |
| 1297 | 100 | T | F | if ($self->_load_driver("TOML::Tiny", ["from_toml"])) |
| 1302 | 100 | T | F | if ($toml_err) { } |
| 50 | T | F | elsif (ref $toml_data eq 'HASH' and scalar keys %$toml_data) { } |
| 1303 | 50 | T | F | if ($logger) { } |
| 1313 | 100 | T | F | if ($data) |
| 1314 | 100 | T | F | unless (ref $data) |
| 1315 | 100 | T | F | if ($logger) |
| 1320 | 100 | T | F | if (ref $data ne "HASH") |
| 1321 | 100 | T | F | if ($logger) |
| 1326 | 100 | T | F | if ($logger) |
| 1340 | 100 | T | F | unless ($self->{'script_name'}) |
| 1341 | 50 | T | F | unless "File::Basename"->can("basename") |
| 1349 | 100 | T | F | unless defined $config_file |
| 1352 | 100 | T | F | if $config_file eq $script_name and length $effective_dir == 0 || $effective_dir eq 'File::Spec'->curdir |
| 1353 | 100 | T | F | length $effective_dir ? : |
| 1354 | 100 | T | F | if ($logger) |
| 1357 | 100 | T | F | if (-f $path and -r $path) |
| 1360 | 100 | T | F | if ($logger) |
| 1364 | 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) { } |
| 1365 | 50 | T | F | if ($self->_load_driver('XML::Simple', ['XMLin'])) { } |
| 50 | T | F | elsif ($self->_load_driver('XML::PP')) { } |
| 1366 | 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 [])) { } |
| 1375 | 100 | T | F | if (my $tree = $xml_pp->parse(\$data)) |
| 1376 | 50 | T | F | if ($data = $xml_pp->collapse_structure($tree)) |
| 1378 | 100 | T | F | if ($data->{'config'}) |
| 1395 | 100 | T | F | if ($is_json) { } |
| 1397 | 100 | T | F | if ($@) |
| 1403 | 100 | T | F | if ($data) |
| 1409 | 100 | T | F | unless ($data or $raw_content =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) |
| 1411 | 100 | T | F | if (eval {
do {
$data = LoadFile($path)
}
} and ref $data eq "HASH") |
| 1417 | 100 | T | F | unless (defined $v) |
| 1425 | 100 | T | F | unless _is_plain_scalar($v) |
| 1427 | 100 | T | F | if $v =~ /^"[^"]+"$/ |
| 1428 | 100 | T | F | if ($v =~ /,/) |
| 1432 | 100 | T | F | if ($val =~ /([^=]+)=(.+)/) { } |
| 1440 | 50 | T | F | if ($data) |
| 1444 | 100 | T | F | if (not $data or ref $data ne "HASH") |
| 1445 | 50 | T | F | if ($self->_load_driver("TOML::Tiny", ["from_toml"])) |
| 1450 | 100 | T | F | if (not $toml_err and ref $toml_data eq "HASH" and scalar keys %$toml_data) |
| 1456 | 100 | T | F | if (not $data or ref $data ne "HASH") |
| 1458 | 100 | T | F | if (my $ini = "Config::IniFiles"->new("-file", $path)) |
| 1463 | 50 | T | F | if ($data) |
| 1467 | 100 | T | F | if (not $data or ref $data ne "HASH") |
| 1469 | 50 | T | F | if ($self->_load_driver("XML::Simple", ["XMLin"])) |
| 1471 | 0 | T | F | if (defined $xml_raw and not $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) |
| 1475 | 50 | T | F | if (not $data or ref $data ne "HASH") |
| 1476 | 50 | T | F | if ($self->_load_driver("Config::Abstract")) |
| 1483 | 0 | T | F | if ($err) { } |
| 0 | T | F | elsif ($data) { } |
| 1487 | 0 | T | F | if (scalar keys %{$data;} == 0) |
| 1494 | 50 | T | F | if (not $data or ref $data ne "HASH") |
| 1497 | 100 | T | F | if ($data = $ca->parse) |
| 1505 | 100 | T | F | if ($logger) |
| 1506 | 100 | T | F | if ($@) { } |
| 1513 | 100 | T | F | if ($data and ref $data eq "HASH") |
| 1520 | 100 | T | F | if (scalar keys %merged) { } |
| 100 | T | F | elsif ($data and ref $data eq 'HASH') { } |
| 100 | T | F | elsif (not $@ and $logger) { } |
| 1521 | 100 | T | F | if ($data) |
| 1541 | 100 | T | F | unless $key =~ /^\Q$self->{'env_prefix'}\E(.*)$/i |
| 1543 | 100 | T | F | if ($path =~ /__/) { } |
| 1565 | 100 | T | F | unless $arg =~ /=/ |
| 1567 | 100 | T | F | unless $key =~ /^--\Q$self->{'env_prefix'}\E(.*)$/ |
| 1571 | 50 | T | F | if (scalar @parts > 0) |
| 1573 | 100 | T | F | if (scalar @parts > 1) |
| 1585 | 100 | T | F | if ($self->{'flatten'}) { } |
| 1592 | 100 | T | F | $self->{'flatten'} ? : |
| 1596 | 100 | T | F | if (my $enc_key = $self->_get_encryption_key) |
| 1652 | 100 | T | F | unless defined $key |
| 1656 | 100 | T | F | if ($self->{'flatten'}) |
| 1661 | 100 | T | F | unless ref $ref eq "HASH" |
| 1662 | 100 | T | F | unless exists $ref->{$part} |
| 1665 | 100 | T | F | if (defined $ref and ref $ref eq "HASH" and not $self->{'no_fixate'}) |
| 1666 | 50 | T | F | if ($self->_load_data_reuse) |
| 1667 | 0 | T | F | if (ref $ref eq 'HASH') { } |
| 0 | T | F | elsif (ref $ref eq 'ARRAY') { } |
| 1668 | 0 | T | F | unless (tied %$ref) |
| 1692 | 100 | T | F | if $self->{'no_fixate'} |
| 1695 | 100 | T | F | if $self->{'reuse_loaded'} |
| 1696 | 100 | T | F | if $self->{'reuse_failed'} |
| 1702 | 50 | T | F | if ($@) |
| 1749 | 100 | T | F | unless defined $key |
| 1753 | 100 | T | F | if ($self->{'flatten'}) |
| 1754 | 100 | T | F | exists $self->{'config'}{$key} ? : |
| 1758 | 100 | T | F | unless ref $ref eq "HASH" |
| 1759 | 100 | T | F | unless exists $ref->{$part} |
| 1808 | 100 | T | F | unless $self->{'config'} |
| 1815 | 100 | T | F | scalar keys %{$$self{'config'};} ? : |
| 1921 | 100 | T | F | if (exists $layer->{'flat_data'}{$key}) |
| 1950 | 100 | T | F | unless defined $key |
| 1955 | 100 | T | F | $sep eq '.' ? : |
| 1959 | 100 | T | F | unless $layer->{'type'} eq $type |
| 1960 | 100 | T | F | if (exists $layer->{'flat_data'}{$flat_key}) |
| 1997 | 100 | T | F | $found ? : |
| 2028 | 100 | T | F | $found ? : |
| 2063 | 100 | T | F | $found ? : |
| 2098 | 100 | T | F | $found ? : |
| 2161 | 100 | T | F | unless my $key = $self->_get_encryption_key |
| 2164 | 100 | T | F | unless ($self->_load_driver("Crypt::AuthEnc::GCM")) |
| 2167 | 100 | T | F | unless ($self->_load_driver("Crypt::PRNG", ["random_bytes"])) |
| 2231 | 100 | T | F | if scalar @_ == 0 |
| 2235 | 100 | T | F | unless defined $defaults |
| 2250 | 100 | T | F | if (exists $config->{'global'}) |
| 2251 | 100 | T | F | if ($params->{'deep'}) { } |
| 2258 | 100 | T | F | if ($section and exists $config->{$section}) |
| 2262 | 100 | T | F | if ($params->{'merge'}) { } |
| 2280 | 100 | T | F | if $self->{'loaded'}{$driver} |
| 2281 | 100 | T | F | if $self->{'failed'}{$driver} |
| 2284 | 100 | T | F | if ($@) |
| 2285 | 100 | T | F | if (my $logger = $self->{'logger'}) |
| 2438 | 100 | T | F | unless defined $dir |
| 2439 | 100 | T | F | unless $dir =~ m[^\/\.\.\/([^/]+)(/.+)?$] |
| 2455 | 100 | T | F | unless defined $host and length $host |
| 2459 | 100 | T | F | if lc $bare eq "localhost" |
| 2460 | 100 | T | F | if $bare eq "127.0.0.1" |
| 2461 | 100 | T | F | if $bare eq "::1" |
| 2465 | 100 | T | F | unless (defined $self->{'_cached_hostname'}) |
| 2470 | 100 | T | F | if lc $bare eq $self->{'_cached_hostname'} |
| 2471 | 100 | T | F | if lc $bare eq $self->{'_cached_short_hostname'} |
| 2486 | 100 | T | F | unless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__)) |
| 2493 | 100 | T | F | unless ($self->_load_driver("File::Slurp::Remote")) |
| 2495 | 100 | T | F | $logger ? : |
| 2501 | 100 | T | F | $file_list ? : |
| 2508 | 100 | T | F | if ($logger) |
| 2513 | 100 | T | F | unless defined $raw |
| 2515 | 100 | T | F | if ($logger) |
| 2520 | 100 | T | F | unless defined $data |
| 2522 | 100 | T | F | if (ref $data ne "HASH") |
| 2524 | 100 | T | F | $logger ? : |
| 2554 | 100 | T | F | if ($@) |
| 2555 | 100 | T | F | if ($logger) |
| 2574 | 100 | T | F | unless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__)) |
| 2583 | 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) { } |
| 2586 | 50 | T | F | if defined $data and ref $data |
| 2592 | 50 | T | F | if ($self->_load_driver('XML::Simple', ['XMLin'])) { } |
| 50 | T | F | elsif ($self->_load_driver('XML::PP')) { } |
| 2593 | 0 | T | F | unless ($raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) |
| 2598 | 100 | T | F | if (my $tree = $pp->parse(\$raw)) |
| 2600 | 100 | T | F | if $data and $data->{'config'} |
| 2610 | 100 | T | F | if (my $ini = "Config::IniFiles"->new("-file", $tmp->filename)) |
| 2619 | 100 | T | F | if ($@) |
| 2622 | 100 | T | F | $logger ? : |
| 2637 | 100 | T | F | if $key eq "DESTROY" |
| 2652 | 100 | T | F | if ($self->{'flatten'}) |
| 2653 | 50 | T | F | $sep ne '.' ? : |
| 2654 | 100 | T | F | if exists $data->{$dot_key} |
| 2655 | 100 | T | F | if exists $data->{$key} |
| 2662 | 100 | T | F | if (ref $val eq 'HASH' and exists $val->{$part}) { } |