File Coverage

blib/lib/Config/Yacp.pm
Criterion Covered Total %
statement 130 148 87.8
branch 43 78 55.1
condition 0 2 0.0
subroutine 25 27 92.5
pod 0 14 0.0
total 198 269 73.6


line stmt bran cond sub pod time code
1             package Config::Yacp;
2             {
3 5     5   133516 use Object::InsideOut;
  5         348037  
  5         31  
4 5     5   9836 use Parse::RecDescent;
  5         270691  
  5         49  
5 5     5   249 use Fcntl qw/:flock/;
  5         14  
  5         946  
6 5     5   31 use Carp;
  5         10  
  5         338  
7 5     5   25 use strict;
  5         10  
  5         158  
8 5     5   6412 use Data::Dumper;
  5         42458  
  5         449  
9 5     5   50 use vars qw($VERSION $grammar $CONFIG);
  5         10  
  5         455  
10              
11             $VERSION='2.00';
12 5     5   1206 BEGIN{ $::RD_AUTOACTION=q{ [@item[1..$#item]] }; }
13              
14             # Define the grammar
15             $grammar = q(
16             file: section(s)
17             section: header pair(s?)
18             header: /\[(\w+)\]/ { $1 }
19             pair: /(\w+)\s?=\s?(\w+)?(\s+[;#][\s\w]+)?\n/
20             {
21             if(!defined $3){
22             [$1,$2];
23             }else{
24             [$1,$2,$3];
25             }
26             }
27             );
28             my @FileName :Field('Standard'=>'FileName','Type'=>'LIST');
29             my @CommentMarker :Field('Standard'=>'CommentMarker','Type'=>'LIST');
30              
31             my %init_args :InitArgs=(
32             'FileName'=>{
33             'Regex' => qr/^FileName$/i,
34             'Mandatory' => 1,
35             },
36             'CommentMarker'=>{
37             'Regex' => qr/^CommentMarker$/i,
38             'Default' => '#',
39             }
40             );
41              
42             sub _init :Init{
43 8         5886 my ($self,$args)=@_;
44 8 50       37 if(exists($args->{'FileName'})){
45 8         57 $self->set(\@FileName,$args->{'FileName'});
46             }
47 8 50       357 if(exists($args->{'CommentMarker'})){
48 8         38 $self->set(\@CommentMarker,$args->{'CommentMarker'});
49             }
50 8         460 my $cm=$self->get_CommentMarker;
51 8 100       92 if($cm!~/[#;]/){
52 1         295 croak "Incorrect Comment Marker detected. Use either # or ; to mark comments";
53             }
54 7         78 my $parser = Parse::RecDescent->new($grammar);
55 7         110261 my $file=$self->get_FileName;
56 7         72 my $ini;
57             {
58 5     5   27 no strict 'subs';
  5         10  
  5         965  
  7         14  
59 7         29 $/=undef;
60 7 50       555 open(FILE,"$file")||croak "Can't open $file: $!";
61 7 50       94 flock(FILE,LOCK_SH) or die "Unable to obtain a file lock: $!\n";
62 7         203 $ini=;
63 7         44 flock(FILE,LOCK_UN);
64 7         142 close FILE;
65             }
66              
67 7         135 my $tree = $parser->file($ini);
68 7         26558 $CONFIG = deparse($tree);
69 5     5   28 }
  5         9  
  5         100  
70              
71             sub retrieve_sections{
72 4     4 0 562 my @sections = sort keys %$CONFIG;
73 4         18 return @sections;
74             }
75              
76             sub retrieve_parameters{
77 4     4 0 733 my ($self,$section)=@_;
78 4 50       216 croak "No section given" if !defined $section;
79 4 50       20 croak "Non-existent section given" if !exists $CONFIG->{$section};
80 4         9 my @params = sort keys %{$CONFIG->{$section}};
  4         28  
81 4         24 return @params;
82             }
83              
84             sub retrieve_value{
85 2     2 0 252 my($self,$section,$parameter)=@_;
86 2 50       8 croak "Missing arguments" if scalar @_ < 3;
87 2 50       9 croak "Non-existent section given" if !exists $CONFIG->{$section};
88 2 50       8 croak "Non-existent parameter given" if !exists $CONFIG->{$section}->{$parameter};
89 2         6 my $value=$CONFIG->{$section}->{$parameter}->[0];
90 2         6 return $value;
91             }
92              
93             sub change_value{
94 1     1 0 478 my($self,$section,$parameter,$value)=@_;
95 1 50       6 croak "Missing arguments" if scalar @_ < 4;
96 1 50       5 croak "Non-existent section given" if !exists $CONFIG->{$section};
97 1 50       5 croak "Non-existent parameter given" if !exists $CONFIG->{$section}->{$parameter};
98 1         5 $CONFIG->{$section}->{$parameter}->[0]=$value;
99             }
100              
101             sub retrieve_comment{
102 4     4 0 1172 my($self,$section,$parameter)=@_;
103 4 50       17 croak"Missing arguments" if scalar @_ < 3;
104 4 50       17 croak"Invalid section argument" if !exists $CONFIG->{$section};
105 4 50       15 croak"Invalid parameter argument" if !exists $CONFIG->{$section}->{$parameter};
106 4 100       18 if (!defined $CONFIG->{$section}->{$parameter}->[1]){
107 1     1   7 local $SIG{__WARN__}=sub{ $@=shift; };
  1         97  
108 1         175 carp"No comment available for this parameter";
109             }else{
110 3         6 my $comment=$CONFIG->{$section}->{$parameter}->[1];
111 3         11 return $comment;
112             }
113             }
114              
115             sub add_section{
116 3     3 0 987 my ($self,$section)=@_;
117 3 50       14 croak"Missing arguments" if scalar @_ < 2;
118 3 100       184 croak"Section exists!" if exists $CONFIG->{$section};
119 2         7 $CONFIG->{$section}=undef;
120             }
121              
122             sub add_parameter{
123 2     2 0 1094 my ($self,$section,$para,$value,$comment)=@_;
124 2 50       8 croak"Missing arguments" if scalar @_ < 4;
125 2 100       7 if(!exists $CONFIG->{$section}){
126 1         4 $self->add_section($section);
127             }
128 2 50       7 croak"Parameter exists" if exists $CONFIG->{$section}->{$para};
129 2         6 $CONFIG->{$section}->{$para}=[$value];
130 2 100       8 if(defined $comment){ push @{$CONFIG->{$section}->{$para}},$comment; }
  1         2  
  1         4  
131             }
132              
133             sub add_comment{
134 1     1 0 462 my ($self,$section,$para,$comment)=@_;
135 1 50       4 croak"Missing arguments" if scalar @_ < 4;
136 1 50       9 croak"Non-Existent section" if !exists $CONFIG->{$section};
137 1 50       6 croak"Non-Existent parameter" if !exists $CONFIG->{$section}->{$para};
138 1         4 $CONFIG->{$section}->{$para}->[1]=$comment;
139             }
140              
141             sub display_config{
142 0     0 0 0 print Dumper($CONFIG);
143             }
144              
145             sub delete_section{
146 1     1 0 723 my ($self,$section)=@_;
147 1 50       6 croak"Missing arguments" if scalar @_ < 2;
148 1 50       11 croak"Non-Existent section" if !exists $CONFIG->{$section};
149 1         7 delete $CONFIG->{$section};
150             }
151              
152             sub delete_parameter{
153 1     1 0 433 my ($self,$section,$para)=@_;
154 1 50       4 croak"Missing arguments" if scalar @_ < 3;
155 1 50       4 croak"Non-Existent section" if !exists $CONFIG->{$section};
156 1 50       4 croak"Non-Existent parameter" if !exists $CONFIG->{$section}->{$para};
157 1         6893 delete $CONFIG->{$section}->{$para};
158             }
159              
160             sub delete_comment{
161 2     2 0 843 my ($self,$section,$para)=@_;
162 2 50       9 croak"Missing arguments" if scalar @_ < 3;
163 2 50       9 croak"Non-Existent section" if !exists $CONFIG->{$section};
164 2 50       9 croak"Non-Existent parameter" if !exists $CONFIG->{$section}->{$para};
165 2 100       10 if(defined $CONFIG->{$section}->{$para}->[1]){
166 1         2 pop @{$CONFIG->{$section}->{$para}};
  1         4  
167             }else{
168 1     1   9 local $SIG{__WARN__}=sub{ $@=shift; };
  1         94  
169 1         174 carp"No comment located for that parameter";
170             }
171             }
172              
173             sub save{
174 5     5   6794 no strict "refs";
  5         12  
  5         2489  
175 0     0 0 0 my $self=shift;
176 0         0 my $file=$self->get_FileName;
177 0         0 my $CM=$self->get_CommentMarker;
178 0   0     0 open FH,">$file"||die"Unable to open $file: $!\n";
179 0 0       0 flock(FH,LOCK_EX) or die "Unable to obtain file lock: $!\n";
180 0         0 foreach my $section(sort keys %{$CONFIG}){
  0         0  
181 0         0 print FH "[$section]\n";
182 0         0 foreach my $para(sort keys %{$CONFIG->{$section}}){
  0         0  
183 0         0 print FH "$para = $CONFIG->{$section}{$para}[0]";
184 0 0       0 if(defined $CONFIG->{$section}{$para}[1]){
185 0         0 print FH " $CM$CONFIG->{$section}{$para}[1]\n";
186             }else{
187 0         0 print FH "\n";
188             }
189             }
190 0         0 print FH "\n";
191             }
192 0 0       0 flock(FH,LOCK_UN) or die"Unable to unlock file: $!\n";
193 0         0 close FH;
194             }
195              
196             sub deparse{
197 7     7 0 15 my $tree=shift;
198 7         116 my $deparsed={};
199 7         20 for my $aref(@$tree){
200 7         17 for my $sec(@$aref){
201 15         41 my $hash=$deparsed->{$sec->[0]}={};
202 15         21 for my $aref(@{$sec->[1]}){
  15         31  
203 29         84 $hash->{$aref->[0]}=[$aref->[1]];
204 29 100       90 if(my $cmmnt=$aref->[2]){
205 14         54 $cmmnt=~s/^\s+[#;]//;
206 14         21 push @{$hash->{$aref->[0]}},$cmmnt;
  14         57  
207             }
208             }
209             }
210             }
211 7         79 return $deparsed;
212             }
213             1;
214             }
215             __END__