File Coverage

blib/lib/Date/Holidays/AW.pm
Criterion Covered Total %
statement 70 73 95.8
branch 22 28 78.5
condition 8 14 57.1
subroutine 11 11 100.0
pod 3 3 100.0
total 114 129 88.3


line stmt bran cond sub pod time code
1             package Date::Holidays::AW;
2             our $VERSION = '0.006';
3 2     2   274034 use strict;
  2         7  
  2         97  
4 2     2   13 use warnings;
  2         4  
  2         159  
5              
6             # ABSTRACT: Aruba's official holidays
7              
8 2     2   15 use Exporter qw(import);
  2         35  
  2         138  
9              
10             our @EXPORT = qw(
11             holidays
12             is_holiday
13             is_holiday_dt
14             );
15              
16 2     2   15 use base qw(Date::Holidays::Abstract);
  2         7  
  2         1479  
17 2     2   22330 use DateTime::Event::Easter;
  2         1324603  
  2         121  
18 2     2   19 use DateTime;
  2         9  
  2         2203  
19              
20             my %FIXED_DATES = (
21             'newyears' => {
22             m => 1,
23             d => 1,
24             pap => "A\x{00F1}a Nobo",
25             nl => 'Nieuwjaarsdag',
26             en => 'New years day',
27             },
28             'betico' => {
29             m => 1,
30             d => 25,
31             pap => 'Dia di Betico',
32             nl => 'Betico-dag',
33             en => 'Betico day',
34             },
35             'flagday' => {
36             m => 3,
37             d => 18,
38             pap => 'Dia di Himno y Bandera',
39             nl => 'Nationale vlag en volkslied',
40             en => 'Flag day',
41             },
42             'wimlex' => {
43             m => 4,
44             d => 27,
45             nl => 'Koningsdag',
46             en => 'Kings day',
47             pap => 'Dia di Rei',
48             # change day of week if it falls on a sunday
49             dow => { 7 => -1 },
50             year_started => 2014,
51             },
52             'minna-princess' => {
53             m => 8,
54             d => 31,
55             nl => 'Prinsessedag',
56             en => "Princess's day",
57             pap => 'Dia di Prensesa',
58              
59             # change day of week if it falls on a sunday
60             dow => { 7 => 1 },
61             year_started => 1885,
62             year_ended => 1890,
63             },
64             'minna-queen' => {
65             m => 8,
66             d => 31,
67             nl => 'Koninginnedag',
68             en => "Queen's day",
69             pap => 'Dia di Reina',
70              
71             # change day of week if it falls on a sunday
72             dow => { 7 => 1 },
73             year_started => 1891,
74             year_ended => 1948,
75             },
76             'juliana-beatrix' => {
77             m => 4,
78             d => 30,
79             nl => 'Koninginnedag',
80             en => "Queen's day",
81             pap => 'Dia di Reina',
82              
83             # change day of week if it falls on a sunday
84             dow => { 7 => 1 },
85             year_started => 1949,
86             year_ended => 1979,
87             },
88             'juliana-beatrix-2' => {
89             m => 4,
90             d => 30,
91             nl => 'Koninginnedag',
92             en => "Queen's day",
93             pap => 'Dia di Reina',
94              
95             # change day of week if it falls on a sunday
96             dow => { 7 => -1 },
97             year_started => 1980,
98             year_ended => 2013,
99             },
100             'labor' => {
101             m => 5,
102             d => 1,
103             pap => 'Dia di Labor/Dia di Obrero',
104             nl => 'Dag van de arbeid',
105             en => 'Labor day',
106             # change day of week if it falls on a sunday
107             dow => { 7 => 1 },
108             },
109             'xmas' => {
110             m => 12,
111             d => 25,
112             pap => 'Pasco di Nacemento',
113             nl => 'Kerst',
114             en => 'Christmas',
115             },
116             'boxing' => {
117             m => 12,
118             d => 26,
119             pap => 'Di dos dia di Pasco di Nacemento',
120             nl => 'Tweede kerstdag',
121             en => 'Boxing day',
122             },
123             );
124              
125             my %EASTER_BASED = (
126             'carnaval' => {
127             d => -48,
128             pap => 'Despues di Carnaval grandi',
129             nl => 'Carnavalsmaandag',
130             en => 'Carnaval monday',
131             },
132             'goodfri' => {
133             d => -2,
134             pap => 'Bierna Santo',
135             nl => 'Goede vrijdag',
136             en => 'Good friday',
137             },
138             'easter' => {
139             d => 0,
140             pap => 'Pasco Grandi',
141             nl => 'Pasen',
142             en => 'Easter',
143             },
144             'easter2' => {
145             d => 1,
146             pap => 'Pasco Grandi',
147             nl => 'Tweede paasdag',
148             en => 'Second day of easter',
149             },
150             'ascension' => {
151             d => 39,
152             pap => 'Dia di Asuncion',
153             nl => 'Hemelvaartsdag',
154             en => 'Ascension day',
155             }
156             );
157              
158             my %cache;
159              
160             sub holidays {
161 17     17 1 245108 my $year = shift;
162 17         47 my %args = @_;
163              
164 17   66     68 $year //= DateTime->now()->year;
165              
166 17         410 my $key = $year;
167 17 50       70 if ($args{gov}) {
168 0         0 $key .= 'gov';
169             }
170              
171 17 100       79 return $cache{$key} if $cache{$key};
172              
173 9         20 my %h;
174 9         68 foreach (keys %FIXED_DATES) {
175 99         1206 my $holiday = $FIXED_DATES{$_};
176              
177 99 50       278 if (my $int = $holiday->{interval}) {
178 0 0 0     0 if ($args{gov} && $holiday->{gov}) {
179             # We should have this
180             }
181             else {
182 0 0       0 next if $year % $int != 0;
183             }
184             }
185              
186 99 100       282 if (my $start = $holiday->{year_started}) {
187 45 100       114 next if $year < $start;
188             }
189              
190 93 100       212 if (my $end = $holiday->{year_ended}) {
191 34 100       104 next if $year > $end;
192             }
193              
194 63         182 my $dt = _to_date($holiday->{d}, $holiday->{m}, $year);
195              
196 63 100       28996 if (my $dow = $holiday->{dow}) {
197 18         71 my $cur = $dt->dow();
198 18         117 foreach (keys %$dow) {
199 18 100       81 next unless $cur == $_;
200 3         18 $dt->add(days => $dow->{$_});
201 3         3794 last;
202             }
203             }
204              
205 63         216 _to_holidays(\%h, $dt, $holiday);
206             }
207              
208 9         191 my $dt = _to_date(1, 1, $year);
209 9         4161 foreach (keys %EASTER_BASED) {
210 45         891 my $holiday = $EASTER_BASED{$_};
211             my $easter = DateTime::Event::Easter->new(
212             easter => 'western',
213             day => $holiday->{d}
214 45         252 );
215 45         11138 my $dt = $easter->following($dt);
216 45         125282 _to_holidays(\%h, $dt, $holiday);
217             }
218              
219 9         234 $cache{$key} = \%h;
220              
221 9         64 return \%h;
222             }
223              
224             sub _to_holidays {
225 108     108   324 my ($cache, $dt, $info) = @_;
226             $cache->{ sprintf("%02i", $dt->day) . sprintf("%02i", $dt->month) }
227 108         235 = [ map { $info->{$_} } qw(pap nl en)];
  324         1195  
228             }
229              
230             sub _to_date {
231 86     86   190 my ($day, $month, $year) = @_;
232 86         311 return DateTime->new(
233             day => $day,
234             month => $month,
235             year => $year,
236             hour => 0,
237             minute => 0,
238             second => 0,
239             time_zone => 'UTC',
240             );
241             }
242              
243             sub is_holiday {
244 14     14 1 6145 my $year = shift;
245 14         30 my $month = shift;
246 14         31 my $day = shift;
247              
248 14         44 my $dt = _to_date($day, $month, $year);
249 14         7009 return is_holiday_dt($dt, @_);
250             }
251              
252             sub is_holiday_dt {
253 15     15 1 418 my $dt = shift;
254              
255 15         43 my %args = @_;
256              
257 15         60 my $holidays = holidays($dt->year, @_);
258 15         66 my $key = sprintf("%02i", $dt->day) . sprintf("%02i", $dt->month);
259              
260 15 100       226 if (exists $holidays->{$key}) {
261 13   100     76 my $lang = lc(delete $args{lang} // 'pap');
262 13 100 66     114 if ($lang eq 'nl' || $lang eq 'nld') {
263 1         12 return $holidays->{$key}[1];
264             }
265 12 100 66     57 if ($lang eq 'en' || $lang eq 'eng') {
266 1         11 return $holidays->{$key}[2];
267             }
268             # default to pap
269 11         128 return $holidays->{$key}[0];
270             }
271 2         26 return;
272             }
273              
274             'Aruba dushi terra';
275              
276             __END__
277              
278             =pod
279              
280             =encoding UTF-8
281              
282             =head1 NAME
283              
284             Date::Holidays::AW - Aruba's official holidays
285              
286             =head1 VERSION
287              
288             version 0.006
289              
290             =head1 SYNOPSIS
291              
292             use Date::Holidays::AW;
293              
294             if (my $thing = is_holiday(2020, 3, 18, lang => 'en')) {
295             print "It is $thing!", $/; # prints 'It is Betico day!'
296             }
297              
298             =head1 DESCRIPTION
299              
300             A L<Date::Holidays> family member from Aruba
301              
302             =head1 METHODS
303              
304             This module implements the C<is_holiday> and C<holiday> functions from
305             L<Date::Holidays::Abstract>.
306              
307             =head2 is_holiday(yyyy, mm, dd, %additional)
308              
309             is_holiday(
310             '2020', '3', '18',
311             gov => 1, # Important for government institutions
312             lang => 'en' # defaults to pap, alternatively nl/nld or en/eng can be used.
313             );
314              
315             =head2 is_holiday_dt(dt, %additional)
316              
317             is_holiday_dt(
318             DateTime->new(
319             year => 2020,
320             month => 3,
321             day => 18,
322             time_zone => 'America/Curacao',
323             ),
324             gov => 1, # Important for government institutions
325             lang => 'en' # defaults to pap, alternatively nl/nld or en/eng can be used.
326             );
327              
328             =head2 holidays(yyyy, gov => 1)
329              
330             holidays('2022', gov => 1);
331              
332             Similar API to the other functions, returns an hashref for the year.
333              
334             =head1 UTF-8
335              
336             Be aware that we return UTF-8 when Papiamento is chosen. So make sure you set
337             your enconding to UTF-8, otherwise you may see weird things.
338              
339             =head1 AUTHOR
340              
341             Wesley Schwengle <waterkip@cpan.org>
342              
343             =head1 COPYRIGHT AND LICENSE
344              
345             This software is Copyright (c) 2020 by Wesley Schwengle.
346              
347             This is free software, licensed under:
348              
349             The (three-clause) BSD License
350              
351             =cut