File Coverage

blib/lib/YAML/Tidy/Config.pm
Criterion Covered Total %
statement 106 115 92.1
branch 34 42 80.9
condition 11 14 78.5
subroutine 17 19 89.4
pod 0 11 0.0
total 168 201 83.5


line stmt bran cond sub pod time code
1             # ABSTRACT: yamltidy config module
2 6     6   34 use strict;
  6         10  
  6         171  
3 6     6   26 use warnings;
  6         11  
  6         116  
4 6     6   50 use v5.20;
  6         16  
5 6     6   26 use experimental qw/ signatures /;
  6         9  
  6         29  
6             package YAML::Tidy::Config;
7              
8             our $VERSION = '0.007'; # VERSION
9              
10 6     6   695 use Cwd;
  6         10  
  6         471  
11 6         5931 use YAML::PP::Common qw/
12             YAML_PLAIN_SCALAR_STYLE YAML_SINGLE_QUOTED_SCALAR_STYLE
13             YAML_DOUBLE_QUOTED_SCALAR_STYLE YAML_LITERAL_SCALAR_STYLE
14             YAML_FOLDED_SCALAR_STYLE
15             YAML_FLOW_SEQUENCE_STYLE YAML_FLOW_MAPPING_STYLE
16 6     6   44 /;
  6         12  
17             my %stylemap = (
18             plain => YAML_PLAIN_SCALAR_STYLE,
19             single => YAML_SINGLE_QUOTED_SCALAR_STYLE,
20             double => YAML_DOUBLE_QUOTED_SCALAR_STYLE,
21             # literal => YAML_LITERAL_SCALAR_STYLE,
22             # folded => YAML_FOLDED_SCALAR_STYLE,
23             );
24              
25 24     24 0 767412 sub new($class, %args) {
  24         43  
  24         44  
  24         31  
26 24         44 my $yaml;
27 24         42 my $overridespaces = delete $args{indentspaces};
28 24 50       55 if (defined $args{configdata}) {
29 0         0 $yaml = $args{configdata};
30             }
31             else {
32 24         40 my $file = $args{configfile};
33 24 100       57 unless (defined $file) {
34 3         8 my ($home) = $class->_homedir;
35 3         15 my $cwd = $class->_cwd;
36 3         12 my @candidates = (
37             "$cwd/.yamltidy",
38             "$home/.config/yamltidy/config.yaml",
39             "$home/.yamltidy",
40             );
41 3         7 for my $c (@candidates) {
42 9 50       111 if (-f $c) {
43 0         0 $file = $c;
44 0         0 last;
45             }
46             }
47             }
48 24 100       51 if (defined $file) {
49 21 50       1021 open my $fh, '<', $file or die $!;
50 21         56 $yaml = do { local $/; <$fh> };
  21         86  
  21         1172  
51 21         254 close $fh;
52             }
53             }
54 24 100       75 unless (defined $yaml) {
55 3         8 $yaml = $class->standardcfg('default');
56             }
57 24         33 my $cfg;
58 24         171 my $yp = YAML::PP->new(
59             schema => [qw/ + Merge /],
60             cyclic_refs => 'fatal',
61             );
62 24         52378 $cfg = $yp->load_string($yaml);
63 24         138510 my $v = delete $cfg->{v};
64 24   50     80 my $indent = delete $cfg->{indentation} || {};
65 24 50       63 $indent->{spaces} = $overridespaces if defined $overridespaces;
66 24   50     67 $indent->{spaces} //= 2; # TODO support keeping original indent
67 24   100     109 $indent->{'block-sequence-in-mapping'} //= 0;
68 24   50     61 my $trimtrailing = $cfg->{'trailing-spaces'} || '';
69 24 100       58 if ($trimtrailing eq 'fix') {
70 23         36 $trimtrailing = 1;
71             }
72             else {
73 1         2 $trimtrailing = 0;
74             }
75 24         59 my $scalarstyle = { default => YAML_PLAIN_SCALAR_STYLE };
76 24 50       70 if (my $scalar = delete $cfg->{'scalar-style'}) {
77 24         37 my $default = $scalar->{default};
78 24 100       58 $scalarstyle->{default} = $default ? $stylemap{ $default } : undef;
79             }
80              
81 24         67 delete @args{qw/ configfile configdata /};
82 24 100       73 if (my @unknown = keys %args) {
83 1         49 die "Unknown configuration parameters: @unknown";
84             }
85             my $self = bless {
86             version => $v,
87             indentation => $indent,
88             trimtrailing => $trimtrailing,
89             header => delete $cfg->{header} // 'keep',
90             footer => delete $cfg->{footer} // 'keep',
91 23   100     299 adjacency => delete $cfg->{adjacency} // 'keep',
      100        
      100        
92             scalar_style => $scalarstyle,
93             }, $class;
94 23         1069 return $self;
95             }
96              
97             sub _cwd {
98 0     0   0 return Cwd::cwd();
99             }
100              
101 0     0   0 sub _homedir($class) {
  0         0  
  0         0  
102 0         0 return <~>;
103             }
104              
105 25445     25445 0 28426 sub indent($self) {
  25445         28319  
  25445         25054  
106 25445         53169 return $self->{indentation}->{spaces};
107             }
108 370     370 0 542 sub indent_seq_in_map($self) {
  370         508  
  370         496  
109 370         898 return $self->{indentation}->{'block-sequence-in-mapping'};
110             }
111              
112 24473     24473 0 27488 sub trimtrailing($self) {
  24473         27800  
  24473         25519  
113 24473         47391 return $self->{trimtrailing};
114             }
115              
116 2043     2043 0 2562 sub addheader($self) {
  2043         2617  
  2043         2221  
117 2043         3516 my $header = $self->{header};
118 2043 100       11946 return 0 if $header eq 'keep';
119 678 100       4192 return $header ? 1 : 0;
120             }
121              
122 3200     3200 0 3801 sub addfooter($self) {
  3200         3738  
  3200         3457  
123 3200         4766 my $footer = $self->{footer};
124 3200 100       14513 return 0 if $footer eq 'keep';
125 1062 100       5832 return $footer ? 1 : 0;
126             }
127              
128 749     749 0 959 sub adjacency($self) {
  749         873  
  749         866  
129 749         1297 my $adjacency = $self->{adjacency};
130 749 50       2054 return undef if $adjacency eq 'keep';
131 0 0       0 return $adjacency ? 1 : 0;
132             }
133              
134 955     955 0 1392 sub removeheader($self) {
  955         1420  
  955         1276  
135 955         1825 my $header = $self->{header};
136 955 100       4191 return 0 if $header eq 'keep';
137 318 100       1565 return $header ? 0 : 1;
138             }
139              
140 147     147 0 222 sub removefooter($self) {
  147         220  
  147         203  
141 147         280 my $footer = $self->{footer};
142 147 100       682 return 0 if $footer eq 'keep';
143 54 100       310 return $footer ? 0 : 1;
144             }
145              
146 10419     10419 0 12085 sub default_scalar_style($self) {
  10419         11182  
  10419         10997  
147 10419         22410 return $self->{scalar_style}->{default};
148             }
149              
150             sub standardcfg {
151 3     3 0 6 my $yaml = <<'EOM';
152             ---
153             v: v0.1
154             indentation:
155             spaces: 2
156             block-sequence-in-mapping: 0
157             trailing-spaces: fix
158             header: true
159             scalar-style:
160             default: plain
161             adjacency: 0
162             EOM
163             }
164              
165             1;