File Coverage

blib/lib/YAML/PP/Common.pm
Criterion Covered Total %
statement 81 85 95.2
branch 68 76 89.4
condition 4 6 66.6
subroutine 6 6 100.0
pod 2 2 100.0
total 161 175 92.0


line stmt bran cond sub pod time code
1 60     60   1157205 use strict;
  60         118  
  60         1943  
2 60     60   269 use warnings;
  60         93  
  60         3861  
3             package YAML::PP::Common;
4              
5             our $VERSION = 'v0.39.0'; # VERSION
6              
7 60     60   293 use base 'Exporter';
  60         2094  
  60         13948  
8              
9             my @p = qw/
10             PRESERVE_ALL PRESERVE_ORDER PRESERVE_SCALAR_STYLE PRESERVE_FLOW_STYLE
11             PRESERVE_ALIAS
12             /;
13             my @s = qw/
14             YAML_ANY_SCALAR_STYLE YAML_PLAIN_SCALAR_STYLE
15             YAML_SINGLE_QUOTED_SCALAR_STYLE YAML_DOUBLE_QUOTED_SCALAR_STYLE
16             YAML_LITERAL_SCALAR_STYLE YAML_FOLDED_SCALAR_STYLE
17             YAML_QUOTED_SCALAR_STYLE
18              
19             YAML_ANY_SEQUENCE_STYLE
20             YAML_BLOCK_SEQUENCE_STYLE YAML_FLOW_SEQUENCE_STYLE
21              
22             YAML_ANY_MAPPING_STYLE
23             YAML_BLOCK_MAPPING_STYLE YAML_FLOW_MAPPING_STYLE
24             /;
25             our @EXPORT_OK = (@s, @p);
26              
27             our %EXPORT_TAGS = (
28             PRESERVE => [@p],
29             STYLES => [@s],
30             );
31              
32             use constant {
33 60         72081 YAML_ANY_SCALAR_STYLE => 0,
34             YAML_PLAIN_SCALAR_STYLE => 1,
35             YAML_SINGLE_QUOTED_SCALAR_STYLE => 2,
36             YAML_DOUBLE_QUOTED_SCALAR_STYLE => 3,
37             YAML_LITERAL_SCALAR_STYLE => 4,
38             YAML_FOLDED_SCALAR_STYLE => 5,
39             YAML_QUOTED_SCALAR_STYLE => 'Q', # deprecated
40              
41             YAML_ANY_SEQUENCE_STYLE => 0,
42             YAML_BLOCK_SEQUENCE_STYLE => 1,
43             YAML_FLOW_SEQUENCE_STYLE => 2,
44              
45             YAML_ANY_MAPPING_STYLE => 0,
46             YAML_BLOCK_MAPPING_STYLE => 1,
47             YAML_FLOW_MAPPING_STYLE => 2,
48              
49             PRESERVE_ORDER => 2,
50             PRESERVE_SCALAR_STYLE => 4,
51             PRESERVE_FLOW_STYLE => 8,
52             PRESERVE_ALIAS => 16,
53              
54             PRESERVE_ALL => 31,
55 60     60   328 };
  60         109  
56              
57             my %scalar_style_to_string = (
58             YAML_PLAIN_SCALAR_STYLE() => ':',
59             YAML_SINGLE_QUOTED_SCALAR_STYLE() => "'",
60             YAML_DOUBLE_QUOTED_SCALAR_STYLE() => '"',
61             YAML_LITERAL_SCALAR_STYLE() => '|',
62             YAML_FOLDED_SCALAR_STYLE() => '>',
63             );
64              
65              
66             sub event_to_test_suite {
67 48439     48439 1 287823 my ($event, $args) = @_;
68 48439         60475 my $ev = $event->{name};
69 48439         49079 my $string;
70 48439         56484 my $content = $event->{value};
71              
72 48439         49298 my $properties = '';
73 48439 100       72395 $properties .= " &$event->{anchor}" if defined $event->{anchor};
74 48439 100       70474 $properties .= " <$event->{tag}>" if defined $event->{tag};
75              
76 48439 100       136664 if ($ev eq 'document_start_event') {
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
77 4624         5345 $string = "+DOC";
78 4624 100       8454 $string .= " ---" unless $event->{implicit};
79             }
80             elsif ($ev eq 'document_end_event') {
81 4538         5167 $string = "-DOC";
82 4538 100       7906 $string .= " ..." unless $event->{implicit};
83             }
84             elsif ($ev eq 'stream_start_event') {
85 4212         5092 $string = "+STR";
86             }
87             elsif ($ev eq 'stream_end_event') {
88 4116         4609 $string = "-STR";
89             }
90             elsif ($ev eq 'mapping_start_event') {
91 4063         5377 $string = "+MAP";
92 4063 100 66     9217 if ($event->{style} and $event->{style} eq YAML_FLOW_MAPPING_STYLE) {
93 1032 100       1781 $string .= ' {}' if $args->{flow};
94             }
95 4063         5402 $string .= $properties;
96 4063         4026 if (0) {
97             # doesn't match yaml-test-suite format
98             }
99             }
100             elsif ($ev eq 'sequence_start_event') {
101 2628         3171 $string = "+SEQ";
102 2628 100 66     6343 if ($event->{style} and $event->{style} eq YAML_FLOW_SEQUENCE_STYLE) {
103 734 100       1435 $string .= ' []' if $args->{flow};
104             }
105 2628         3552 $string .= $properties;
106 2628         2590 if (0) {
107             # doesn't match yaml-test-suite format
108             }
109             }
110             elsif ($ev eq 'mapping_end_event') {
111 4012         4740 $string = "-MAP";
112             }
113             elsif ($ev eq 'sequence_end_event') {
114 2604         3157 $string = "-SEQ";
115             }
116             elsif ($ev eq 'scalar_event') {
117 17331         18545 $string = '=VAL';
118 17331         21391 $string .= $properties;
119              
120 17331         29473 $content =~ s/\\/\\\\/g;
121 17331         21575 $content =~ s/\t/\\t/g;
122 17331         19581 $content =~ s/\r/\\r/g;
123 17331         21638 $content =~ s/\n/\\n/g;
124 17331         19065 $content =~ s/[\b]/\\b/g;
125              
126             $string .= ' '
127             . $scalar_style_to_string{ $event->{style} }
128 17331         35003 . $content;
129             }
130             elsif ($ev eq 'alias_event') {
131 311         487 $string = "=ALI *$content";
132             }
133 48439         117972 return $string;
134             }
135              
136             sub test_suite_to_event {
137 30     30 1 95 my ($str) = @_;
138 30         35 my $event = {};
139 30 100       203 if ($str =~ s/^\+STR//) {
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
140 1         3 $event->{name} = 'stream_start_event';
141             }
142             elsif ($str =~ s/^\-STR//) {
143 1         2 $event->{name} = 'stream_end_event';
144             }
145             elsif ($str =~ s/^\+DOC//) {
146 1         3 $event->{name} = 'document_start_event';
147 1 50       3 if ($str =~ s/^ ---//) {
148 1         3 $event->{implicit} = 0;
149             }
150             else {
151 0         0 $event->{implicit} = 1;
152             }
153             }
154             elsif ($str =~ s/^\-DOC//) {
155 1         2 $event->{name} = 'document_end_event';
156 1 50       2 if ($str =~ s/^ \.\.\.//) {
157 0         0 $event->{implicit} = 0;
158             }
159             else {
160 1         2 $event->{implicit} = 1;
161             }
162             }
163             elsif ($str =~ s/^\+SEQ//) {
164 3         5 $event->{name} = 'sequence_start_event';
165 3 50       7 if ($str =~ s/^ \&(\S+)//) {
166 0         0 $event->{anchor} = $1;
167             }
168 3 100       9 if ($str =~ s/^ <(\S+)>//) {
169 1         3 $event->{tag} = $1;
170             }
171             }
172             elsif ($str =~ s/^\-SEQ//) {
173 3         7 $event->{name} = 'sequence_end_event';
174             }
175             elsif ($str =~ s/^\+MAP//) {
176 5         8 $event->{name} = 'mapping_start_event';
177 5 100       11 if ($str =~ s/^ \&(\S+)//) {
178 1         4 $event->{anchor} = $1;
179             }
180 5 100       10 if ($str =~ s/^ <(\S+)>//) {
181 2         4 $event->{tag} = $1;
182             }
183             }
184             elsif ($str =~ s/^\-MAP//) {
185 5         6 $event->{name} = 'mapping_end_event';
186             }
187             elsif ($str =~ s/^=VAL//) {
188 4         8 $event->{name} = 'scalar_event';
189 4 100       8 if ($str =~ s/^ <(\S+)>//) {
190 1         18 $event->{tag} = $1;
191             }
192 4 50       15 if ($str =~ s/^ [:'">|]//) {
193 4         8 $event->{style} = $1;
194             }
195 4 50       14 if ($str =~ s/^(.*)//) {
196 4         8 $event->{value} = $1;
197             }
198             }
199             elsif ($str =~ s/^=ALI//) {
200 6         10 $event->{name} = 'alias_event';
201 6 50       19 if ($str =~ s/^ \*(.*)//) {
202 6         11 $event->{value} = $1;
203             }
204             }
205             else {
206 0         0 die "Could not parse event '$str'";
207             }
208 30         43 return $event;
209             }
210              
211              
212             1;
213              
214             __END__
215              
216             =pod
217              
218             =encoding utf-8
219              
220             =head1 NAME
221              
222             YAML::PP::Common - Constants and common functions
223              
224             =head1 SYNOPSIS
225              
226             use YAML::PP::Common ':STYLES';
227             # or
228             use YAML::PP::Common qw/
229             YAML_ANY_SCALAR_STYLE YAML_PLAIN_SCALAR_STYLE
230             YAML_SINGLE_QUOTED_SCALAR_STYLE YAML_DOUBLE_QUOTED_SCALAR_STYLE
231             YAML_LITERAL_SCALAR_STYLE YAML_FOLDED_SCALAR_STYLE
232             YAML_QUOTED_SCALAR_STYLE
233              
234             YAML_ANY_SEQUENCE_STYLE
235             YAML_BLOCK_SEQUENCE_STYLE YAML_FLOW_SEQUENCE_STYLE
236              
237             YAML_ANY_MAPPING_STYLE
238             YAML_BLOCK_MAPPING_STYLE YAML_FLOW_MAPPING_STYLE
239             /;
240              
241             use YAML::PP::Common ':PRESERVE';
242             # or
243             use YAML::PP::Common qw/
244             PRESERVE_ALL PRESERVE_ORDER PRESERVE_SCALAR_STYLE PRESERVE_FLOW_STYLE
245             PRESERVE_ALIAS
246             /:
247              
248             =head1 DESCRIPTION
249              
250             This module provides common constants and functions for modules working with
251             YAML::PP events.
252              
253             =head1 FUNCTIONS
254              
255             =over
256              
257             =item event_to_test_suite
258              
259             my $string = YAML::PP::Common::event_to_test_suite($event_prom_parser);
260              
261             For examples of the returned format look into this distributions's directory
262             C<yaml-test-suite> which is a copy of
263             L<https://github.com/yaml/yaml-test-suite>.
264              
265             =item test_suite_to_event
266              
267             my $event = YAML::PP::Common::test_suite_to_event($str);
268              
269             Turns an event string in test suite format into an event hashref. Not complete
270             yet.
271              
272             =back
273