File Coverage

lib/Google/RestApi/SheetsApi4/Request/Spreadsheet/Worksheet/Range.pm
Criterion Covered Total %
statement 121 206 58.7
branch 14 20 70.0
condition 14 18 77.7
subroutine 64 106 60.3
pod 0 97 0.0
total 213 447 47.6


line stmt bran cond sub pod time code
1              
2             our $VERSION = '1.0.2';
3              
4             use Google::RestApi::Setup;
5 1     1   730  
  1         3  
  1         7  
6             use Scalar::Util qw( looks_like_number );
7 1     1   19511 use aliased "Google::RestApi::SheetsApi4::Range";
  1         2  
  1         49  
8 1     1   8 use parent "Google::RestApi::SheetsApi4::Request::Spreadsheet::Worksheet";
  1         3  
  1         6  
9 1     1   168  
  1         3  
  1         6  
10              
11 0     0 0 0  
12              
13 0     0 0 0  
14 1     1 0 9  
15 0     0 0 0  
16 1     1 0 6 shift->user_entered_format(
17             {
18 0     0 0 0 numberFormat => {
19 0     0 0 0 type => shift,
20 0     0 0 0 defined $_[0] ? (pattern => shift) : ()
21 0     0 0 0 }
22             },
23 2     2 0 1326 );
24 3     3 0 1364 }
25 4     4 0 1513  
26 2     2 0 1364  
27 2     2 0 1393  
28 2     2 0 1373  
29              
30 11   100 11   84  
31 6     6 0 1350 my $self = shift;
32 2     2 0 1525 my ($format, $fields) = @_;
33 2     2 0 1555 ($fields) = each %$format if !defined $fields;
34 1     1 0 1529 $self->user_entered_format(
35 1     1 0 1532 { textFormat => $format },
36 1     1 0 2304 'textFormat.' . $fields,
37 13     13 0 66 );
38             }
39 4   50 4   23  
40 1     1 0 36 my $self = shift;
41 1     1 0 1634 my ($format, $fields) = @_;
42 1     1 0 1257 ($fields) = each %$format if !defined $fields;
43 1     1 0 1286 $self->repeat_cell(
44 2     2 0 1279 cell => {
45 2     2 0 2469 userEnteredFormat => $format,
46 8     8 0 28 },
47             fields => 'userEnteredFormat.' . $fields,
48 0     0 0 0 );
49 0     0 0 0 return $self;
50 0     0 0 0 }
51 0     0 0 0  
52 0     0 0 0 my $self = shift;
53 0     0 0 0  
54 0     0 0 0 state $check = compile_named(
55 0     0 0 0 cell => HashRef,
56             fields => Str, { optional => 1 },
57             );
58             my $p = $check->(@_);
59 0 0   0 0 0  
60             my $cell = $p->{cell};
61             my $fields = $p->{fields} || join(',', sort keys %$cell);
62              
63             $self->batch_requests(
64             repeatCell => {
65             range => $self->range_to_index(),
66             cell => $cell,
67 1     1 0 29 fields => $fields,
  1         6  
  1         5  
68             },
69 0     0 0 0 );
70 1     1 0 1364  
71 0     0 0 0 return $self;
72 1     1 0 5 }
73              
74 0     0 0 0 my $self = shift;
75 1     1 0 1344 $self->center()->bold()->white()->bk_black()->font_size(12);
76 1     1 0 6 return $self;
77             }
78 1     1 0 1369  
79 1     1 0 1454  
80 2     2 0 8  
81             # allows:
82 1     1 0 1391 # bd_red() turns it all on
83 0     0 0 0 # bd_red(0) turns it all off
84             # bd_red(0.3, 'top')
85             # bd_red(0.3)
86 28     28 0 56 # bd_red('top')
87 28         63 my $self = shift;
88 28 50       109 my $color = shift;
89 28         143 my $value;
90             $value = shift if looks_like_number($_[0]);
91             $value //= 1;
92             return $self->bd_color({ $color => $value }, @_);
93             }
94              
95             # borders can be set for a range or each individual cell
96 44     44 0 79 # in a range. bd_repeat_cell is turned on to redirect
97 44         102 # border calls to repeat_cell above.
98 44 100       156 my $self = shift;
99 44         219 $self->{bd_repeat_cell} = shift;
100             $self->{bd_repeat_cell} //= 1; # bd_repeat_cell() turns it on, bd_repeat_cell(0) turns it off.
101             delete $self->{bd_repeat_cell} if !$self->{bd_repeat_cell};
102             return $self;
103             }
104              
105 44         294 my $self = shift;
106              
107             # allow an array of borders to be passed, recurse with each one.
108             my %p = @_;
109 44     44 0 80 if ($p{border} && ref($p{border}) eq 'ARRAY') {
110             $self->borders(border => $_, properties => $p{properties})
111 44         77 foreach (@{ $p{border} });
112             return $self;
113             }
114              
115 44         1196 state $check = compile_named(
116             border =>
117 44         1313 StrMatch[qr/^(top|bottom|left|right|around|vertical|horizontal|inner|all|)$/],
118 44   33     158 { default => 'around' },
119             properties => HashRef,
120 44         185 );
121             my $p = $check->(@_);
122             $p->{border} ||= 'around';
123              
124             # recurse with border groups.
125             my %groups = (
126             around => [qw(top bottom left right)],
127             inner => [qw(vertical horizontal)],
128 44         139 all => [qw(around inner)],
129             );
130             my $group = $groups{ $p->{border} };
131             if ($group) {
132 0     0 0 0 $self->borders(border => $_, properties => $p->{properties})
133 0         0 foreach (@$group);
134 0         0 return $self;
135             }
136              
137 30   100 30   93 # now we finally get to the guts of the borders.
138 5     5 0 137 # if these borders are to be part of repeatCell request, redirect
139 1     1 0 1157 # the borders to it.
140 1     1 0 1104 if ($self->{bd_repeat_cell}) {
141 1     1 0 1122 LOGDIE "Cannot use vertical|horizontal|inner when bd_repeat_cell is turned on"
142 2     2 0 1104 if $p->{border} =~ /^(vertical|horizontal|inner)$/;
143 2     2 0 2263 return $self->user_entered_format(
144 12     12 0 37 {
145             borders => {
146 12     12 0 6526 $p->{border} => $p->{properties},
147 1     1 0 992 }
148 1     1 0 986 },
149 1     1 0 960 );
150 1     1 0 977 }
151 1     1 0 944  
152 1     1 0 946 # change vertical to innerVertical. horizontal same same.
153 18     18 0 59 $p->{border} =~ s/^(vertical|horizontal)$/"'inner' . '" . ucfirst($1) . "'"/ee;
154              
155             $self->batch_requests(
156             updateBorders => {
157             range => $self->range_to_index(),
158             $p->{border} => $p->{properties},
159             }
160             );
161              
162 8     8   14 return $self;
163 8         13 }
164 8         13  
165 8 100       30 my $self = shift;
166 8   100     29  
167 8         29 state $check = compile_named(
168             merge_type => DimColRow | DimAll,
169             );
170             my $p = $check->(@_);
171             $p->{merge_type} = dims_all($p->{merge_type});
172              
173             $self->batch_requests(
174 1     1 0 26 mergeCells => {
175 1         3 range => $self->range_to_index(),
176 1   50     7 mergeType => "MERGE_$p->{merge_type}",
177 1 50       4 },
178 1         6 );
179              
180             return $self;
181             }
182 57     57 0 84  
183             my $self = shift;
184             $self->batch_requests(
185 57         151 unmergeCells => {
186 57 100 100     243 range => $self->range_to_index(),
187             },
188 1         2 );
  1         6  
189 1         7 return $self;
190             }
191              
192 56         83 my $self = shift;
193              
194             state $check = compile_named(
195             dimension => Str,
196             inherit => Bool, { default => 0 }
197             );
198 56         2033 my $p = $check->(@_);
199 56   100     1724  
200             $self->batch_requests(
201             insertDimension => {
202 56         202 range => $self->range_to_dimension($p->{dimension}),
203             inheritFromBefore => $p->{inherit},
204             },
205             );
206              
207 56         120 return $self;
208 56 100       115 }
209              
210 9         32 my $self = shift;
211 8         43  
212             state $check = compile_named(
213             dimension => Str,
214             );
215             my $p = $check->(@_);
216              
217 47 100       117 $self->batch_requests(
218             insertRange => {
219 4 100       22 range => $self->range_to_dimension($p->{dimension}),
220             },
221             shiftDimension => $p->{dimension},
222             );
223              
224             return $self;
225             }
226 1         7  
227             my $self = shift;
228              
229             state $check = compile_named(
230 43         101 dimension => Str,
  8         460  
231             destination => HasMethods['range_to_index'],
232             );
233             my $p = $check->(@_);
234              
235             $self->batch_requests(
236             insertDimension => {
237 43         142 range => $self->range_to_dimension($p->{dimension}),
238             destinationIndex => $p->{destination},
239 43         294 },
240             );
241              
242 1     1 0 6 return $self;
243 1     1 0 1794 }
244 1     1 0 4  
245 1     1 0 1575 my $self = shift;
246              
247 3     3 0 7 state $check = compile_named(
248             destination => HasMethods['range_to_index'],
249 3         11 type => Str, { default => 'normal' },
250             orientation => Str, { default => 'normal' },
251             );
252 3         17568 my $p = $check->(@_);
253 3         210 $p->{type} = "PASTE_" . uc($p->{type});
254             $p->{orientation} = uc($p->{orientation});
255 3         17  
256             $self->batch_requests(
257             copyPaste => {
258             source => $self->range_to_index(),
259             destination => $p->{destination}->range_to_index(),
260             type => $p->{type},
261             orientation => $p->{orientation},
262 3         12 },
263             );
264              
265 0     0 0   return $self;
266             }
267 0     0 0    
268 0           my $self = shift;
269              
270             state $check = compile_named(
271             destination => HasMethods['range_to_index'],
272             type => Str, { default => 'normal' },
273 0           );
274             my $p = $check->(@_);
275             $p->{type} = "PASTE_" . uc($p->{type});
276 0     0 0    
277             $self->batch_requests(
278 0     0 0   cutPaste => {
279             source => $self->range_to_index(),
280 0           destination => $p->{destination}->range_to_index(),
281             type => $p->{type},
282             },
283             );
284 0            
285             return $self;
286             }
287              
288             my $self = shift;
289              
290             state $check = compile_named(dimension => Str);
291 0           my $p = $check->(@_);
292              
293 0           $self->batch_requests(
294             deleteDimension => {
295             range => $self->range_to_dimension($p->{dimension}),
296 0     0 0   },
297             );
298 0     0 0    
299             return $self;
300 0           }
301              
302             my $self = shift;
303 0            
304             state $check = compile_named(dimension => Str);
305             my $p = $check->(@_);
306              
307             $self->batch_requests(
308             deleteRange => {
309             range => $self->range_to_dimension($p->{dimension}),
310 0           },
311             shiftDimension => $p->{dimension},
312 0           );
313              
314             return $self;
315 0     0 0   }
316              
317 0     0 0   my $self = shift;
318              
319 0           state $check = compile_named(name => Str);
320             my $p = $check->(@_);
321              
322             $self->batch_requests(
323 0           addNamedRange => {
324             namedRange => {
325             name => $p->{name},
326             range => $self->range_to_index(),
327             },
328             }
329             );
330 0            
331             return $self;
332 0           }
333              
334             my $self = shift;
335              
336 0     0 0   my $named = $self->named() or LOGDIE "Not a named range";
337             $self->batch_requests(
338 0           deleteNamedRange => {
339             namedRangeId => $named,
340             },
341             );
342              
343 0           return $self;
344 0           }
345 0            
346             my $self = shift;
347             return $self->SUPER::_clear(@_, $self->range_to_index());
348             }
349              
350              
351             1;
352              
353              
354 0           =head1 NAME
355              
356 0           Google::RestApi::SheetsApi4::Request::Spreadsheet::Worksheet::Range - Build Google API's batchRequests for a Range.
357              
358             =head1 DESCRIPTION
359              
360 0     0 0   Deriving from the Request::Spreadsheet::Worksheet object, this adds the ability to create
361             requests that have to do with ranges (formatting, borders etc).
362 0            
363             See the description and synopsis at Google::RestApi::SheetsApi4::Request.
364             and Google::RestApi::SheetsApi4.
365              
366 0           =head1 AUTHORS
367 0            
368             =over
369              
370             =item
371              
372             Robin Murray mvsjes@cpan.org
373              
374             =back
375 0            
376             =head1 COPYRIGHT
377 0            
378             Copyright (c) 2021, Robin Murray. All rights reserved.
379              
380 0     0 0   This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.