Branch Coverage

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

line%coveragebranch
679100TFif (scalar @_ == 1) { }
688100TFif defined $ENV{'CONFIG_DIR'}
690100TFif $params->{'file'}
692100TFunless (defined $params->{'config_dirs'})
693100TFif ($params->{'config_file'} and 'File::Spec'->file_name_is_absolute($params->{'config_file'})) { }
69750TFif ($^O ne 'MSWin32') { }
702100TFif ($ENV{'HOME'}) { }
100TFelsif ($ENV{'DOCUMENT_ROOT'}) { }
71350TFif (my $dir = $ENV{'CONFIG_DIR'}) { }
723100TF$params->{'defaults'} ? :
732100TFif (my $logger = $self->{'logger'})
733100TFunless (&Scalar::Util::blessed($logger))
73650TFif ($@) { }
738100TFif (ref $logger eq "ARRAY")
7450TFif ($params->{'level'} and $self->{'logger'}->can("level"))
753100TFif (defined $self->{'encryption_key_file'})
755100TFunless -f $kf
758100TFif ($self->{'lazy'})
761100TFif $self->{'schema'}
762100TFif $self->{'validators'}
76350TFif $self->{'checker'}
769100TFif (my $schema = $params->{'schema'})
772100TFif (my $validators = $params->{'validators'})
775100TFif (my $checker = $params->{'checker'})
779100TFif (defined $self->{'config'} and scalar keys %{$$self{"config"};})
790100TFunless $self->{'lazy'}
793100TFif (my $schema = delete $self->{'_lazy_schema'})
796100TFif (my $validators = delete $self->{'_lazy_validators'})
79950TFif (my $checker = delete $self->{'_lazy_checker'})
814100TFif (defined $self->{'environment'}) { }
823100TFunless defined $env
824100TFif $env eq ""
826100TFunless ($env =~ /^[A-Za-z0-9_-]+$/)
840100TFif $r eq "CODE" or $r eq "GLOB"
841100TFif ($r eq "HASH")
844100TFif ($r eq "ARRAY")
858100TFunless (defined $raw)
863100TFunless (defined $raw)
868100TFif (defined $kf and -f $kf)
86950TFunless open my $fh, "<", $kf
87350TFif defined $raw
877100TFunless defined $raw
887100TFif length $raw == $_AES_KEY_SIZE
889100TFif (length $raw == $_HEX_KEY_LEN and $raw =~ /^[0-9A-Fa-f]{$_HEX_KEY_LEN}$/)
893100TFif (length $raw >= $_B64_KEY_MIN and length $raw <= $_B64_KEY_MAX)
89850TFif length $bytes == $_AES_KEY_SIZE
911100TFif $$seen{&Scalar::Util::refaddr($href)}++
914100TFif $k eq "config_path"
916100TFif (ref $v eq 'HASH') { }
100TFelsif (ref $v eq 'ARRAY') { }
100TFelsif (not ref $v and defined $v and $v =~ /^ENC\[/) { }
920100TFif (not ref $v->[$i] and defined $v->[$i] and $v->[$i] =~ /^ENC\[/)
936100TFunless ($token =~ /^            ENC\[            ([A-Za-z0-9]+)          # algorithm name  (e.g. AES256GCM)            ,            ([A-Za-z0-9_-]+)        # base64url payload (RFC 4648 \302\2475 alphabet)            \]    $/x)
947100TFunless (lc $algo eq "aes256gcm")
957100TFif (length $raw < $_ENC_PAYLOAD_MIN)
961100TFunless ($self->_load_driver("Crypt::AuthEnc::GCM"))
974100TFunless ($ok and not $@)
991100TFif (ref $spec eq 'CODE') { }
100TFelsif (ref $spec eq 'Regexp') { }
100TFelsif (ref $spec eq 'HASH') { }
100TFelsif (not ref $spec) { }
992100TFunless (&$spec($value))
996100TFunless (defined $value and $value =~ /$spec/)
997100TFdefined $value ? :
1015100TFif ($spec->{'required'} and not $self->exists($key) && defined $value)
1018100TFif (my $type = $spec->{'type'})
1021100TFif (my $pattern = $spec->{'pattern'})
1022100TFunless (defined $value and $value =~ /$pattern/)
102350TFdefined $value ? :
1027100TFif (defined(my $min = $spec->{'min'}))
1028100TFif defined $value and $value < $min
1031100TFif (defined(my $max = $spec->{'max'}))
1032100TFif defined $value and $value > $max
1044100TFif ($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') { }
1045100TFdefined $value ? :
100TFunless defined $value and $value =~ /^-?[0-9]+$/
1049100TFdefined $value ? :
100TFunless defined $value and &Scalar::Util::looks_like_number($value)
1053100TFdefined $value ? :
100TFunless defined $value and $value =~ /^(?:1|0|true|false|yes|no)$/i
1057100TFunless defined $value and not ref $value
1060100TFunless ref $value eq "ARRAY"
1063100TFunless ref $value eq "HASH"
107650TFunless ($self->_load_driver("Config::Checker"))
10840TFif $@
10870TFif $@
1098100TFunless defined $val
1099100TFif &Scalar::Util::blessed($val)
1100100TFif ref $val
111550TFunless ref $hash eq "HASH"
1117100TFif $seen->{$addr}++
1119100TFif $k eq "config_path"
1120100TFlength $prefix ? :
1121100TFif (ref $hash->{$k} eq 'HASH') { }
1139100TFunless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__))
1154100TFif ($self->{'data'})
1156100TFif (ref $self->{'data'} eq 'HASH') { }
1169100TFif ($logger)
1179100TF$environment ? :
100TF$environment ? :
1183100TFif ($self->{'config_file'} and scalar @dirs > 1)
1184100TFif ('File::Spec'->file_name_is_absolute($self->{'config_file'})) { }
1193100TFunless defined $dir
1201100TFif (my($host, $remote_dir) = $self->_parse_remote_dir($dir))
1202100TFif ($self->_is_local_host($host)) { }
1210100TFif (length $effective_dir and not -d $effective_dir)
1216100TFif ($logger)
1219100TFunless -f $path
1220100TFunless -r $path
1222100TFif ($logger)
1228100TFif ($file =~ /\.ya?ml$/) { }
100TFelsif ($file =~ /\.json$/) { }
100TFelsif ($file =~ /\.xml$/) { }
100TFelsif ($file =~ /\.ini$/) { }
50TFelsif ($file =~ /\.toml$/) { }
1231100TFif ($@)
1232100TFif ($logger) { }
1239100TFif defined $data and ref $data
1242100TFif ($@)
124350TFif ($logger) { }
125250TFif ($self->_load_driver("XML::Simple", ["XMLin"]))
12540TFif (defined $xml_raw and $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) { }
0TFelsif (defined $xml_raw) { }
12580TFif ($@) { }
0TFelsif ($rc) { }
12590TFif ($logger) { }
1270100TFif (not defined $rc and $self->_load_driver("XML::PP"))
1273100TFif (my $tree = $xml_pp->parse(\$data))
127450TFif ($data = $xml_pp->collapse_structure($tree))
1276100TFif ($data->{'config'})
1284100TFif (my $ini = 'Config::IniFiles'->new('-file', $path)) { }
129050TFif ($logger) { }
1297100TFif ($self->_load_driver("TOML::Tiny", ["from_toml"]))
1302100TFif ($toml_err) { }
50TFelsif (ref $toml_data eq 'HASH' and scalar keys %$toml_data) { }
130350TFif ($logger) { }
1313100TFif ($data)
1314100TFunless (ref $data)
1315100TFif ($logger)
1320100TFif (ref $data ne "HASH")
1321100TFif ($logger)
1326100TFif ($logger)
1340100TFunless ($self->{'script_name'})
134150TFunless "File::Basename"->can("basename")
1349100TFunless defined $config_file
1352100TFif $config_file eq $script_name and length $effective_dir == 0 || $effective_dir eq 'File::Spec'->curdir
1353100TFlength $effective_dir ? :
1354100TFif ($logger)
1357100TFif (-f $path and -r $path)
1360100TFif ($logger)
1364100TFif ($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) { }
136550TFif ($self->_load_driver('XML::Simple', ['XMLin'])) { }
50TFelsif ($self->_load_driver('XML::PP')) { }
13660TFif ($data =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i) { }
0TFelsif (my $xml_data = XMLin(\$data, 'ForceArray', 0, 'KeyAttr', scalar [])) { }
1375100TFif (my $tree = $xml_pp->parse(\$data))
137650TFif ($data = $xml_pp->collapse_structure($tree))
1378100TFif ($data->{'config'})
1395100TFif ($is_json) { }
1397100TFif ($@)
1403100TFif ($data)
1409100TFunless ($data or $raw_content =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i)
1411100TFif (eval {         do {         $data = LoadFile($path) } } and ref $data eq "HASH")
1417100TFunless (defined $v)
1425100TFunless _is_plain_scalar($v)
1427100TFif $v =~ /^"[^"]+"$/
1428100TFif ($v =~ /,/)
1432100TFif ($val =~ /([^=]+)=(.+)/) { }
144050TFif ($data)
1444100TFif (not $data or ref $data ne "HASH")
144550TFif ($self->_load_driver("TOML::Tiny", ["from_toml"]))
1450100TFif (not $toml_err and ref $toml_data eq "HASH" and scalar keys %$toml_data)
1456100TFif (not $data or ref $data ne "HASH")
1458100TFif (my $ini = "Config::IniFiles"->new("-file", $path))
146350TFif ($data)
1467100TFif (not $data or ref $data ne "HASH")
146950TFif ($self->_load_driver("XML::Simple", ["XMLin"]))
14710TFif (defined $xml_raw and not $xml_raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i)
147550TFif (not $data or ref $data ne "HASH")
147650TFif ($self->_load_driver("Config::Abstract"))
14830TFif ($err) { }
0TFelsif ($data) { }
14870TFif (scalar keys %{$data;} == 0)
149450TFif (not $data or ref $data ne "HASH")
1497100TFif ($data = $ca->parse)
1505100TFif ($logger)
1506100TFif ($@) { }
1513100TFif ($data and ref $data eq "HASH")
1520100TFif (scalar keys %merged) { }
100TFelsif ($data and ref $data eq 'HASH') { }
100TFelsif (not $@ and $logger) { }
1521100TFif ($data)
1541100TFunless $key =~ /^\Q$self->{'env_prefix'}\E(.*)$/i
1543100TFif ($path =~ /__/) { }
1565100TFunless $arg =~ /=/
1567100TFunless $key =~ /^--\Q$self->{'env_prefix'}\E(.*)$/
157150TFif (scalar @parts > 0)
1573100TFif (scalar @parts > 1)
1585100TFif ($self->{'flatten'}) { }
1592100TF$self->{'flatten'} ? :
1596100TFif (my $enc_key = $self->_get_encryption_key)
1652100TFunless defined $key
1656100TFif ($self->{'flatten'})
1661100TFunless ref $ref eq "HASH"
1662100TFunless exists $ref->{$part}
1665100TFif (defined $ref and ref $ref eq "HASH" and not $self->{'no_fixate'})
166650TFif ($self->_load_data_reuse)
16670TFif (ref $ref eq 'HASH') { }
0TFelsif (ref $ref eq 'ARRAY') { }
16680TFunless (tied %$ref)
1692100TFif $self->{'no_fixate'}
1695100TFif $self->{'reuse_loaded'}
1696100TFif $self->{'reuse_failed'}
170250TFif ($@)
1749100TFunless defined $key
1753100TFif ($self->{'flatten'})
1754100TFexists $self->{'config'}{$key} ? :
1758100TFunless ref $ref eq "HASH"
1759100TFunless exists $ref->{$part}
1808100TFunless $self->{'config'}
1815100TFscalar keys %{$$self{'config'};} ? :
1921100TFif (exists $layer->{'flat_data'}{$key})
1950100TFunless defined $key
1955100TF$sep eq '.' ? :
1959100TFunless $layer->{'type'} eq $type
1960100TFif (exists $layer->{'flat_data'}{$flat_key})
1997100TF$found ? :
2028100TF$found ? :
2063100TF$found ? :
2098100TF$found ? :
2161100TFunless my $key = $self->_get_encryption_key
2164100TFunless ($self->_load_driver("Crypt::AuthEnc::GCM"))
2167100TFunless ($self->_load_driver("Crypt::PRNG", ["random_bytes"]))
2231100TFif scalar @_ == 0
2235100TFunless defined $defaults
2250100TFif (exists $config->{'global'})
2251100TFif ($params->{'deep'}) { }
2258100TFif ($section and exists $config->{$section})
2262100TFif ($params->{'merge'}) { }
2280100TFif $self->{'loaded'}{$driver}
2281100TFif $self->{'failed'}{$driver}
2284100TFif ($@)
2285100TFif (my $logger = $self->{'logger'})
2438100TFunless defined $dir
2439100TFunless $dir =~ m[^\/\.\.\/([^/]+)(/.+)?$]
2455100TFunless defined $host and length $host
2459100TFif lc $bare eq "localhost"
2460100TFif $bare eq "127.0.0.1"
2461100TFif $bare eq "::1"
2465100TFunless (defined $self->{'_cached_hostname'})
2470100TFif lc $bare eq $self->{'_cached_hostname'}
2471100TFif lc $bare eq $self->{'_cached_short_hostname'}
2486100TFunless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__))
2493100TFunless ($self->_load_driver("File::Slurp::Remote"))
2495100TF$logger ? :
2501100TF$file_list ? :
2508100TFif ($logger)
2513100TFunless defined $raw
2515100TFif ($logger)
2520100TFunless defined $data
2522100TFif (ref $data ne "HASH")
2524100TF$logger ? :
2554100TFif ($@)
2555100TFif ($logger)
2574100TFunless (UNIVERSAL::isa((&CORE::GLOBAL::caller())[0], __PACKAGE__))
2583100TFif ($filename =~ /\.ya?ml$/i) { }
100TFelsif ($filename =~ /\.json$/i) { }
100TFelsif ($filename =~ /\.xml$/i) { }
100TFelsif ($filename =~ /\.ini$/i) { }
258650TFif defined $data and ref $data
259250TFif ($self->_load_driver('XML::Simple', ['XMLin'])) { }
50TFelsif ($self->_load_driver('XML::PP')) { }
25930TFunless ($raw =~ /<!ENTITY\s+\w+\s+(?:SYSTEM|PUBLIC)\b/i)
2598100TFif (my $tree = $pp->parse(\$raw))
2600100TFif $data and $data->{'config'}
2610100TFif (my $ini = "Config::IniFiles"->new("-file", $tmp->filename))
2619100TFif ($@)
2622100TF$logger ? :
2637100TFif $key eq "DESTROY"
2652100TFif ($self->{'flatten'})
265350TF$sep ne '.' ? :
2654100TFif exists $data->{$dot_key}
2655100TFif exists $data->{$key}
2662100TFif (ref $val eq 'HASH' and exists $val->{$part}) { }