Branch Coverage

File:blib/lib/Config/Abstraction.pm
Coverage:87.6%

line%coveragebranch
681100TFif (scalar @_ == 1) { }
690100TFif defined $ENV{'CONFIG_DIR'}
692100TFif $params->{'file'}
694100TFunless (defined $params->{'config_dirs'})
695100TFif ($params->{'config_file'} and 'File::Spec'->file_name_is_absolute($params->{'config_file'})) { }
69950TFif ($^O ne 'MSWin32') { }
704100TFif ($ENV{'HOME'}) { }
100TFelsif ($ENV{'DOCUMENT_ROOT'}) { }
71550TFif (my $dir = $ENV{'CONFIG_DIR'}) { }
725100TF$params->{'defaults'} ? :
734100TFif (my $logger = $self->{'logger'})
735100TFunless (&Scalar::Util::blessed($logger))
73850TFif ($@) { }
740100TFif (ref $logger eq "ARRAY")
7470TFif ($params->{'level'} and $self->{'logger'}->can("level"))
755100TFif (defined $self->{'encryption_key_file'})
757100TFunless -f $kf
760100TFif ($self->{'lazy'})
763100TFif $self->{'schema'}
764100TFif $self->{'validators'}
76550TFif $self->{'checker'}
771100TFif (my $schema = $params->{'schema'})
774100TFif (my $validators = $params->{'validators'})
777100TFif (my $checker = $params->{'checker'})
781100TFif (defined $self->{'config'} and scalar keys %{$$self{"config"};})
792100TFunless $self->{'lazy'}
795100TFif (my $schema = delete $self->{'_lazy_schema'})
798100TFif (my $validators = delete $self->{'_lazy_validators'})
80150TFif (my $checker = delete $self->{'_lazy_checker'})
816100TFif (defined $self->{'environment'}) { }
825100TFunless defined $env
826100TFif $env eq ""
828100TFunless ($env =~ /^[A-Za-z0-9_-]+$/)
842100TFif $r eq "CODE" or $r eq "GLOB"
843100TFif ($r eq "HASH")
846100TFif ($r eq "ARRAY")
860100TFunless (defined $raw)
865100TFunless (defined $raw)
870100TFif (defined $kf and -f $kf)
87150TFunless open my $fh, "<", $kf
87550TFif defined $raw
879100TFunless defined $raw
889100TFif length $raw == $_AES_KEY_SIZE
891100TFif (length $raw == $_HEX_KEY_LEN and $raw =~ /^[0-9A-Fa-f]{$_HEX_KEY_LEN}$/)
895100TFif (length $raw >= $_B64_KEY_MIN and length $raw <= $_B64_KEY_MAX)
90050TFif length $bytes == $_AES_KEY_SIZE
913100TFif $$seen{&Scalar::Util::refaddr($href)}++
916100TFif $k eq "config_path"
918100TFif (ref $v eq 'HASH') { }
100TFelsif (ref $v eq 'ARRAY') { }
100TFelsif (not ref $v and defined $v and $v =~ /^ENC\[/) { }
922100TFif (not ref $v->[$i] and defined $v->[$i] and $v->[$i] =~ /^ENC\[/)
938100TFunless ($token =~ /^            ENC\[            ([A-Za-z0-9]+)          # algorithm name  (e.g. AES256GCM)            ,            ([A-Za-z0-9_-]+)        # base64url payload (RFC 4648 \302\2475 alphabet)            \]    $/x)
949100TFunless (lc $algo eq "aes256gcm")
959100TFif (length $raw < $_ENC_PAYLOAD_MIN)
963100TFunless ($self->_load_driver("Crypt::AuthEnc::GCM"))
977100TFunless ($ok and not $@)
994100TFif (ref $spec eq 'CODE') { }
100TFelsif (ref $spec eq 'Regexp') { }
100TFelsif (ref $spec eq 'HASH') { }
100TFelsif (not ref $spec) { }
995100TFunless (&$spec($value))
999100TFunless (defined $value and $value =~ /$spec/)
1000100TFdefined $value ? :
1018100TFif ($spec->{'required'} and not $self->exists($key) && defined $value)
1021100TFif (my $type = $spec->{'type'})
1024100TFif (my $pattern = $spec->{'pattern'})
1025100TFunless (defined $value and $value =~ /$pattern/)
102650TFdefined $value ? :
1030100TFif (defined(my $min = $spec->{'min'}))
1031100TFif defined $value and $value < $min
1034100TFif (defined(my $max = $spec->{'max'}))
1035100TFif defined $value and $value > $max
1047100TFif ($ltype eq 'integer') { }
100TFelsif ($ltype eq 'number' or $ltype eq 'float') { }
100TFelsif ($ltype eq 'boolean') { }
100TFelsif ($ltype eq 'string') { }
100TFelsif ($ltype eq 'array') { }
100TFelsif ($ltype eq 'hash') { }
1048100TFdefined $value ? :
100TFunless defined $value and $value =~ /^-?[0-9]+$/
1052100TFdefined $value ? :
100TFunless defined $value and &Scalar::Util::looks_like_number($value)
1056100TFdefined $value ? :
100TFunless defined $value and $value =~ /^(?:1|0|true|false|yes|no)$/i
1060100TFunless defined $value and not ref $value
1063100TFunless ref $value eq "ARRAY"
1066100TFunless ref $value eq "HASH"
107950TFunless ($self->_load_driver("Config::Checker"))
10870TFif $@
10900TFif $@
1101100TFunless defined $val
1102100TFif &Scalar::Util::blessed($val)
1103100TFif ref $val
111850TFunless ref $hash eq "HASH"
1120100TFif $seen->{$addr}++
1122100TFif $k eq "config_path"
1123100TFlength $prefix ? :
1124100TFif (ref $hash->{$k} eq 'HASH') { }
1142100TFunless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__))
1157100TFif ($self->{'data'})
1159100TFif (ref $self->{'data'} eq 'HASH') { }
1172100TFif ($logger)
1182100TF$environment ? :
100TF$environment ? :
1186100TFif ($self->{'config_file'} and scalar @dirs > 1)
1187100TFif ('File::Spec'->file_name_is_absolute($self->{'config_file'})) { }
1196100TFunless defined $dir
1204100TFif (my($host, $remote_dir) = $self->_parse_remote_dir($dir))
1205100TFif ($self->_is_local_host($host)) { }
1213100TFif (length $effective_dir and not -d $effective_dir)
1219100TFif ($logger)
1222100TFunless -f $path
1223100TFunless -r $path
1225100TFif ($logger)
1231100TFif ($file =~ /\.ya?ml$/) { }
100TFelsif ($file =~ /\.json$/) { }
100TFelsif ($file =~ /\.xml$/) { }
100TFelsif ($file =~ /\.ini$/) { }
50TFelsif ($file =~ /\.toml$/) { }
1234100TFif ($@)
1235100TFif ($logger) { }
1242100TFif defined $data and ref $data
1245100TFif ($@)
124650TFif ($logger) { }
125550TFif ($self->_load_driver("XML::Simple", ["XMLin"]))
12570TFif (defined $xml_raw and $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) { }
0TFelsif (defined $xml_raw) { }
12610TFif ($@) { }
0TFelsif ($rc) { }
12620TFif ($logger) { }
1273100TFif (not defined $rc and $self->_load_driver("XML::PP"))
1276100TFif (my $tree = $xml_pp->parse(\$data))
127750TFif ($data = $xml_pp->collapse_structure($tree))
1279100TFif ($data->{'config'})
1287100TFif (my $ini = 'Config::IniFiles'->new('-file', $path)) { }
129350TFif ($logger) { }
1300100TFif ($self->_load_driver("TOML::Tiny", ["from_toml"]))
1305100TFif ($toml_err) { }
50TFelsif (ref $toml_data eq 'HASH' and scalar keys %$toml_data) { }
130650TFif ($logger) { }
1316100TFif ($data)
1317100TFunless (ref $data)
1318100TFif ($logger)
1323100TFif (ref $data ne "HASH")
1324100TFif ($logger)
1329100TFif ($logger)
1343100TFunless ($self->{'script_name'})
134450TFunless "File::Basename"->can("basename")
1352100TFunless defined $config_file
1355100TFif $config_file eq $script_name and length $effective_dir == 0 || $effective_dir eq 'File::Spec'->curdir
1356100TFlength $effective_dir ? :
1357100TFif ($logger)
1360100TFif (-f $path and -r $path)
1363100TFif ($logger)
1367100TFif ($data =~ /^\s*<\?xml/ or $data =~ m[</[^>]+>]) { }
100TFelsif ($data =~ /                                            \{              # opening brace                                            .+              # key material; dot matches newlines because of the s modifier                                            :               # colon separator                                            .               # one value character                                            \}              # closing brace                                    /sx) { }
136850TFif ($self->_load_driver('XML::Simple', ['XMLin'])) { }
50TFelsif ($self->_load_driver('XML::PP')) { }
13690TFif ($data =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) { }
0TFelsif (my $xml_data = XMLin(\$data, 'ForceArray', 0, 'KeyAttr', scalar [])) { }
1378100TFif (my $tree = $xml_pp->parse(\$data))
137950TFif ($data = $xml_pp->collapse_structure($tree))
1381100TFif ($data->{'config'})
1398100TFif ($is_json) { }
1400100TFif ($@)
1406100TFif ($data)
1412100TFunless ($data or $raw_content =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i)
1414100TFif (eval {         do {         $data = LoadFile($path) } } and ref $data eq "HASH")
1420100TFunless (defined $v)
1428100TFunless _is_plain_scalar($v)
1430100TFif $v =~ /^"[^"]+"$/
1431100TFif ($v =~ /,/)
1435100TFif ($val =~ /([^=]+)=(.+)/) { }
144350TFif ($data)
1447100TFif (not $data or ref $data ne "HASH")
144850TFif ($self->_load_driver("TOML::Tiny", ["from_toml"]))
1453100TFif (not $toml_err and ref $toml_data eq "HASH" and scalar keys %$toml_data)
1459100TFif (not $data or ref $data ne "HASH")
1461100TFif (my $ini = "Config::IniFiles"->new("-file", $path))
146650TFif ($data)
1470100TFif (not $data or ref $data ne "HASH")
147250TFif ($self->_load_driver("XML::Simple", ["XMLin"]))
14740TFif (defined $xml_raw and not $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i)
147850TFif (not $data or ref $data ne "HASH")
147950TFif ($self->_load_driver("Config::Abstract"))
14860TFif ($err) { }
0TFelsif ($data) { }
14900TFif (scalar keys %{$data;} == 0)
149750TFif (not $data or ref $data ne "HASH")
1500100TFif ($data = $ca->parse)
1508100TFif ($logger)
1509100TFif ($@) { }
1516100TFif ($data and ref $data eq "HASH")
1523100TFif (scalar keys %merged) { }
100TFelsif ($data and ref $data eq 'HASH') { }
100TFelsif (not $@ and $logger) { }
1524100TFif ($data)
1544100TFunless $key =~ /^\Q$self->{'env_prefix'}\E(.*)$/i
1546100TFif ($path =~ /__/) { }
1568100TFunless $arg =~ /=/
1570100TFunless $key =~ /^--\Q$self->{'env_prefix'}\E(.*)$/
157450TFif (scalar @parts > 0)
1576100TFif (scalar @parts > 1)
1588100TFif ($self->{'flatten'}) { }
1595100TF$self->{'flatten'} ? :
1599100TFif (my $enc_key = $self->_get_encryption_key)
1655100TFunless defined $key
1659100TFif ($self->{'flatten'})
1664100TFunless ref $ref eq "HASH"
1665100TFunless exists $ref->{$part}
1668100TFif (defined $ref and ref $ref eq "HASH" and not $self->{'no_fixate'})
166950TFif ($self->_load_data_reuse)
16700TFif (ref $ref eq 'HASH') { }
0TFelsif (ref $ref eq 'ARRAY') { }
16710TFunless (tied %$ref)
1695100TFif $self->{'no_fixate'}
1698100TFif $self->{'reuse_loaded'}
1699100TFif $self->{'reuse_failed'}
170550TFif ($@)
1752100TFunless defined $key
1756100TFif ($self->{'flatten'})
1757100TFexists $self->{'config'}{$key} ? :
1761100TFunless ref $ref eq "HASH"
1762100TFunless exists $ref->{$part}
1811100TFunless $self->{'config'}
1818100TFscalar keys %{$$self{'config'};} ? :
1924100TFif (exists $layer->{'flat_data'}{$key})
1953100TFunless defined $key
1958100TF$sep eq '.' ? :
1962100TFunless $layer->{'type'} eq $type
1963100TFif (exists $layer->{'flat_data'}{$flat_key})
2000100TF$found ? :
2031100TF$found ? :
2066100TF$found ? :
2101100TF$found ? :
2165100TFunless my $key = $self->_get_encryption_key
2168100TFunless ($self->_load_driver("Crypt::AuthEnc::GCM"))
2171100TFunless ($self->_load_driver("Crypt::PRNG", ["random_bytes"]))
2239100TFif scalar @_ == 0
2243100TFunless defined $defaults
2258100TFif (exists $config->{'global'})
2259100TFif ($params->{'deep'}) { }
2266100TFif ($section and exists $config->{$section})
2270100TFif ($params->{'merge'}) { }
2288100TFif $self->{'loaded'}{$driver}
2289100TFif $self->{'failed'}{$driver}
2292100TFif ($@)
2293100TFif (my $logger = $self->{'logger'})
2446100TFunless defined $dir
2447100TFunless $dir =~ m[^\/\.\.\/([^/]+)(/.+)?$]
2463100TFunless defined $host and length $host
2467100TFif lc $bare eq "localhost"
2468100TFif $bare eq "127.0.0.1"
2469100TFif $bare eq "::1"
2473100TFunless (defined $self->{'_cached_hostname'})
2478100TFif lc $bare eq $self->{'_cached_hostname'}
2479100TFif lc $bare eq $self->{'_cached_short_hostname'}
2494100TFunless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__))
2501100TFunless ($self->_load_driver("File::Slurp::Remote"))
2503100TF$logger ? :
2509100TF$file_list ? :
2516100TFif ($logger)
2521100TFunless defined $raw
2523100TFif ($logger)
2528100TFunless defined $data
2530100TFif (ref $data ne "HASH")
2532100TF$logger ? :
2562100TFif ($@)
2563100TFif ($logger)
2582100TFunless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__))
2591100TFif ($filename =~ /\.ya?ml$/i) { }
100TFelsif ($filename =~ /\.json$/i) { }
100TFelsif ($filename =~ /\.xml$/i) { }
100TFelsif ($filename =~ /\.ini$/i) { }
259450TFif defined $data and ref $data
260050TFif ($self->_load_driver('XML::Simple', ['XMLin'])) { }
50TFelsif ($self->_load_driver('XML::PP')) { }
26010TFunless ($raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i)
2606100TFif (my $tree = $pp->parse(\$raw))
2608100TFif $data and $data->{'config'}
2618100TFif (my $ini = "Config::IniFiles"->new("-file", $tmp->filename))
2627100TFif ($@)
2630100TF$logger ? :
2645100TFif $key eq "DESTROY"
2660100TFif ($self->{'flatten'})
266150TF$sep ne '.' ? :
2662100TFif exists $data->{$dot_key}
2663100TFif exists $data->{$key}
2670100TFif (ref $val eq 'HASH' and exists $val->{$part}) { }