File Coverage

blib/lib/App/Kritika/Settings.pm
Criterion Covered Total %
statement 63 67 94.0
branch 12 20 60.0
condition n/a
subroutine 11 11 100.0
pod 0 2 0.0
total 86 100 86.0


line stmt bran cond sub pod time code
1             package App::Kritika::Settings;
2              
3 1     1   415 use strict;
  1         2  
  1         24  
4 1     1   4 use warnings;
  1         2  
  1         23  
5              
6 1     1   4 use Cwd qw(getcwd);
  1         2  
  1         41  
7 1     1   6 use File::Basename qw(dirname);
  1         2  
  1         43  
8 1     1   4 use File::Spec;
  1         2  
  1         17  
9 1     1   364 use File::HomeDir ();
  1         4065  
  1         438  
10              
11             sub new {
12 5     5 0 8956 my $class = shift;
13 5         16 my (%params) = @_;
14              
15 5         11 my $self = {};
16 5         12 bless $self, $class;
17              
18 5         18 $self->{file} = $params{file};
19              
20 5         17 return $self;
21             }
22              
23             sub settings {
24 5     5 0 24 my $self = shift;
25              
26 5         14 my $rc_file = $self->_detect;
27 5 50       19 die "Error: Can't find rc file\n" unless defined $rc_file;
28              
29 5 50       7 my $config = do { local $/; open my $fh, '<', $rc_file or die $!; <$fh> };
  5         21  
  5         131  
  5         88  
30              
31 5         18 my $settings = $self->_parse($config);
32              
33 5 100       26 if (!$settings->{root}) {
34 4         103 $settings->{root} = dirname $rc_file;
35             }
36              
37 5         36 return $settings;
38             }
39              
40             sub _detect {
41 5     5   7 my $self = shift;
42              
43 5         186 my $dirname = dirname($self->{file});
44              
45 5 100       51 if (!File::Spec->file_name_is_absolute($dirname)) {
46 1         14 $dirname = File::Spec->catdir(getcwd(), $dirname);
47             }
48              
49 5         58 my ($volume, $dirs, $file) = File::Spec->splitpath($dirname);
50 5 50       47 $dirs = File::Spec->catdir($dirs, $file) if $file ne '';
51              
52 5         41 my @dir = File::Spec->splitdir($dirs);
53 5 50       21 unshift @dir, $volume if $volume;
54              
55 5         14 while (@dir) {
56 9         22 for ($self->_rc_names) {
57 14         100 my $location = File::Spec->catfile(@dir, $_);
58 14 100       252 return $location if -f $location;
59             }
60              
61 4         14 pop @dir;
62             }
63              
64 0         0 for ($self->_rc_names) {
65 0         0 my $location = File::Spec->catfile(File::HomeDir->my_home, $_);
66 0 0       0 return $location if -f $location;
67             }
68              
69 0         0 return;
70             }
71              
72             sub _parse {
73 5     5   6 my $self = shift;
74 5         12 my ($input) = @_;
75              
76 5         18 my @lines = split /\r?\n/, $input;
77              
78 5         10 my $options = {};
79 5         10 foreach my $line (@lines) {
80 5 50       14 next if $line =~ m/^\s*#/;
81 5 50       13 next if $line eq '';
82              
83 5         14 my ($key, $value) = split /=/, $line, 2;
84 5         25 $key =~ s{^\s+}{};
85 5         16 $key =~ s{\s+$}{};
86 5         8 $value =~ s{^\s+}{};
87 5         9 $value =~ s{\s+$}{};
88              
89 5         17 $options->{$key} = $value;
90             }
91              
92 5         11 return $options;
93             }
94              
95             sub _rc_names {
96 9     9   21 return ('.kritikarc', '_kritikarc');
97             }
98              
99             1;