File Coverage

blib/lib/Tapper/Config.pm
Criterion Covered Total %
statement 58 59 98.3
branch 15 22 68.1
condition 6 12 50.0
subroutine 15 15 100.0
pod 2 2 100.0
total 96 110 87.2


line stmt bran cond sub pod time code
1             package Tapper::Config;
2             # git description: v5.0.2-1-g2d181a9
3              
4             our $AUTHORITY = 'cpan:TAPPER';
5             # ABSTRACT: Tapper - Context sensitive configuration hub for all Tapper libs
6             $Tapper::Config::VERSION = '5.0.3';
7 3     3   76711 use 5.010;
  3         14  
8              
9 3     3   18 use strict;
  3         5  
  3         97  
10 3     3   15 use warnings;
  3         9  
  3         106  
11              
12 3     3   2153 use YAML::Syck;
  3         7929  
  3         267  
13 3     3   2536 use File::Slurp 'slurp';
  3         71485  
  3         389  
14 3     3   2798 use File::ShareDir 'module_file';
  3         30087  
  3         429  
15 3     3   3201 use Hash::Merge 'merge';
  3         11003  
  3         322  
16 3     3   29 use File::ShareDir 'module_file';
  3         6  
  3         276  
17              
18              
19             # --- The configuration file is lib/auto/Tapper/Config/tapper.yml ---
20             {
21             # closure to forbid direct access to the config hash
22             my $Config;
23              
24              
25              
26             sub default_merge
27             {
28 10     10 1 26 my ($config) = @_;
29              
30 3     3   22 no warnings 'uninitialized'; # $ENV{HOME} can be undef
  3         4  
  3         2281  
31              
32 10 50       94 foreach my $filename ("/etc/tapper.cfg",
33             $ENV{HOME} ? "$ENV{HOME}/.tapper/tapper.cfg" : '',
34             "$ENV{TAPPER_CONFIG_FILE}",
35             )
36             {
37 30 100       576 if (-e $filename) {
38 8         14 my $new_config;
39 8         14 eval { $new_config = LoadFile($filename) };
  8         41  
40 8 50       8343 die "Can not load config file '$filename': $@\n" if $@;
41 8         43 Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );
42 8         181 $config = merge($config, $new_config);
43 8         89305 $config->{_last_used_tapper_config_file} = $filename;
44             }
45             }
46 10         38 return $config;
47             }
48              
49             sub _getenv
50             {
51             return
52             $ENV{HARNESS_ACTIVE} ? 'test'
53 14 100   14   122 : $ENV{TAPPER_DEVELOPMENT} ? 'development'
    100          
54             : 'live';
55             }
56              
57              
58             # TODO: automatically recognize context switch
59             sub _switch_context
60             {
61 10 50 66 10   7614 shift if @_ && $_[0] && $_[0] eq 'Tapper::Config'; # throw away class if called as method
      33        
62              
63 10   33     58 my $env = shift // _getenv();
64              
65 10 50       82 return unless $env =~ /^test|live|development$/;
66              
67 10         43 my $yaml = slurp module_file('Tapper::Config', 'tapper.yml');
68 10         7255 $Config = Load($yaml);
69 10         10981 $Config = default_merge($Config);
70              
71 10         372 Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );
72 10         200 $Config = merge( $Config, $Config->{$env} );
73 10         30310 $Config = _prepare_special_entries( $Config );
74             }
75              
76              
77             sub _prepare_special_entries {
78 10     10   24 my ($Config) = @_;
79              
80             # Log4Perl: prepend sharedir path
81 10 50       74 if (not $Config->{files}{log4perl_cfg} =~ m,^/,) {
82 10         76 $Config->{files}{log4perl_cfg} = module_file('Tapper::Config', $Config->{files}{log4perl_cfg});
83             }
84              
85             # DB config can be overridden triggered by env var
86 10         6322 my $dbms = $ENV{TAPPERDBMS};
87 10 100 66     60 if ($dbms and _getenv ne 'test') {
88 4 50       21 if ($dbms =~ m/^mysql|postgresql$/) {
89 4         11 my $val = $Config->{database}{by_TAPPERDBMS}{$dbms}{TestrunDB};
90 4 50       19 $Config->{database}{TestrunDB} = $val if defined $val;
91             } else {
92 0         0 die 'Unsupported Tapper DBMS $TAPPERDBMS='.$ENV{TAPPERDBMS};
93             }
94             }
95 10         181 return $Config;
96             }
97              
98 20     20 1 217 sub subconfig { $Config }
99              
100             }
101              
102 3     3   46 BEGIN { _switch_context() }
103              
104             1;
105              
106             __END__