File Coverage

blib/lib/App/envfile.pm
Criterion Covered Total %
statement 48 56 85.7
branch 15 20 75.0
condition 2 2 100.0
subroutine 9 10 90.0
pod 3 3 100.0
total 77 91 84.6


line stmt bran cond sub pod time code
1             package App::envfile;
2              
3 5     5   237001 use strict;
  5         12  
  5         271  
4 5     5   27 use warnings;
  5         11  
  5         140  
5 5     5   143 use 5.008_001;
  5         24  
  5         225  
6 5     5   30 use Carp ();
  5         19  
  5         5695  
7              
8             our $VERSION = '0.07';
9              
10             our $EXTENTIONS_MAP = {
11             pl => 'Perl',
12             perl => 'Perl',
13             js => 'JSON',
14             json => 'JSON',
15             yml => 'YAML',
16             yaml => 'YAML',
17             };
18              
19             sub new {
20 13     13 1 33564 my $class = shift;
21 13         54 bless {}, $class;
22             }
23              
24             sub run_with_env {
25 2     2 1 17 my ($self, $env, $commands) = @_;
26 2         136 local %ENV = %ENV;
27 2         18 for my $key (keys %$env) {
28 3         17 $ENV{$key} = $env->{$key};
29             }
30 2         11 exec(@$commands);
31             }
32              
33             sub parse_envfile {
34 9     9 1 33 my ($self, $file) = @_;
35 9 50       26 Carp::croak "Usage: $self->parse_envfile(\$file)" unless defined $file;
36              
37 9         12 my $env = {};
38 9 50       24 return $env if $env = $self->_try_any_config_file($file);
39              
40 9 100       511 open my $fh, '<', $file or Carp::croak "$file: $!";
41 8         80 while (defined (my $line = readline $fh)) {
42 12         16 chomp $line;
43 12 100       29 next if index($line, '#') == 0;
44 11 100       51 next if $line =~ /^\s*$/;
45 9         18 my ($key, $value) = $self->_parse_line($line);
46 9         67 $env->{$key} = $value;
47             }
48 8         67 close $fh;
49              
50 8         28 return $env;
51             }
52              
53             sub _try_any_config_file {
54 16     16   12763 my ($self, $file) = @_;
55              
56 16         66 my ($ext) = $file =~ /\.(\w+)$/;
57 16 100 100     109 if (my $type = $EXTENTIONS_MAP->{lc($ext || '')}) {
58 5         8 my $env;
59 5 50       17 if ($type eq 'Perl') {
60 5         2308 $env = do "$file";
61 5 100       35 die $@ if $@;
62             }
63             else {
64 0         0 require Data::Encoder;
65 0         0 $env = Data::Encoder->load($type)->decode($self->_slurp($file));
66             }
67 4 100       28 die "$file: Should be return HASHREF\n" unless ref $env eq 'HASH';
68 2         9 return $env;
69             }
70              
71 11         35 return;
72             }
73              
74             sub _slurp {
75 0     0   0 my ($self, $file) = @_;
76 0         0 my $data = do {
77 0         0 local $\;
78 0 0       0 open my $fh, '<', $file or die "$file: $!\n";
79 0         0 <$fh>;
80             };
81 0         0 return $data;
82             }
83              
84             sub _parse_line {
85 9     9   18 my ($self, $line) = @_;
86 9         25 my ($key, $value) = map { my $str = $_; $str =~ s/^\s+|\s+$//g; $str } split '=', $line, 2;
  18         21  
  18         66  
  18         38  
87 9         26 return $key, $value;
88             }
89              
90             1;
91             __END__