File Coverage

blib/lib/Random/Day.pm
Criterion Covered Total %
statement 83 94 88.3
branch 13 24 54.1
condition n/a
subroutine 19 19 100.0
pod 9 9 100.0
total 124 146 84.9


line stmt bran cond sub pod time code
1              
2             use strict;
3 11     11   180055 use warnings;
  11         88  
  11         277  
4 11     11   45  
  11         20  
  11         292  
5             use Class::Utils qw(set_params);
6 11     11   4197 use DateTime;
  11         196382  
  11         178  
7 11     11   9241 use DateTime::Event::Random;
  11         4864088  
  11         457  
8 11     11   4978 use DateTime::Event::Recurrence;
  11         450802  
  11         353  
9 11     11   5108 use English;
  11         58173  
  11         357  
10 11     11   78 use Error::Pure qw(err);
  11         25  
  11         90  
11 11     11   4612  
  11         26  
  11         12180  
12             our $VERSION = 0.11;
13              
14             # Constructor.
15             my ($class, @params) = @_;
16              
17 26     26 1 51798 # Create object.
18             my $self = bless {}, $class;
19              
20 26         62 # Day.
21             $self->{'day'} = undef;
22              
23 26         79 # DateTime object from.
24             $self->{'dt_from'} = DateTime->new(
25             'year' => 1900,
26 26         138 );
27              
28             # DateTime object to.
29             $self->{'dt_to'} = DateTime->new(
30             'year' => 2050,
31 26         7982 );
32              
33             # Month.
34             $self->{'month'} = undef;
35              
36 26         6028 # Year.
37             $self->{'year'} = undef;
38              
39 26         55 # Process parameters.
40             set_params($self, @params);
41              
42 26         91 return $self;
43             }
44 24         242  
45             # Get DateTime object with random date.
46             my ($self, $date) = @_;
47              
48             if ($self->{'year'}) {
49 1     1 1 5 if ($self->{'month'}) {
50             if ($self->{'day'}) {
51 1 50       3 $date = $self->random_day_month_year(
52 0 0       0 $self->{'day'},
53 0 0       0 $self->{'month'},
54             $self->{'year'},
55             );
56             } else {
57 0         0 $date = $self->random_month_year(
58             $self->{'month'},
59             $self->{'year'},
60             );
61             }
62 0         0 } else {
63             if ($self->{'day'}) {
64             $date = $self->random_day_year(
65             $self->{'day'},
66 0 0       0 $self->{'year'},
67             );
68             } else {
69 0         0 $date = $self->random_year($self->{'year'});
70             }
71             }
72 0         0 } else {
73             if ($self->{'month'}) {
74             if ($self->{'day'}) {
75             $date = $self->random_day_month(
76 1 50       7 $self->{'day'},
77 0 0       0 $self->{'month'},
78             );
79             } else {
80 0         0 $date = $self->random_month($self->{'month'});
81             }
82             } else {
83 0         0 if ($self->{'day'}) {
84             $date = $self->random_day($self->{'day'});
85             } else {
86 1 50       3 $date = $self->random;
87 0         0 }
88             }
89 1         2 }
90              
91             return $date;
92             }
93              
94 1         5818 # Random DateTime object for day.
95             my $self = shift;
96              
97             my $daily = DateTime::Event::Recurrence->daily;
98              
99 7     7 1 11 return $daily->next($self->_range);
100             }
101 7         28  
102             # Random DateTime object for day defined by day.
103 7         2306 my ($self, $day) = @_;
104              
105             $self->_check_day($day);
106             my $monthly_day = DateTime::Event::Recurrence->monthly(
107             'days' => $day,
108 6     6 1 35 );
109              
110 6         15 return $monthly_day->next($self->random);
111 2         13 }
112              
113             # Random DateTime object for day defined by day and month.
114             my ($self, $day, $month) = @_;
115 2         788  
116             $self->_check_day($day);
117             my $yearly_day_month = DateTime::Event::Recurrence->yearly(
118             'days' => $day,
119             'months' => $month,
120 5     5 1 28 );
121             my $dt = $yearly_day_month->next($self->random);
122 5         13 if (! defined $dt) {
123 3         18 err 'Cannot create DateTime object.';
124             }
125              
126             return $dt;
127 3         1013 }
128 3 100       19731  
129 2         6 # DateTime object for day defined by day, month and year.
130             my ($self, $day, $month, $year) = @_;
131              
132 1         11 $self->_check_day($day);
133             my $dt = eval {
134             DateTime->new(
135             'day' => $day,
136             'month' => $month,
137 5     5 1 30 'year' => $year,
138             );
139 5         10 };
140 2         2 if ($EVAL_ERROR) {
141 2         6 err 'Cannot create DateTime object.',
142             'Error', $EVAL_ERROR;
143             }
144              
145             return $dt;
146             }
147 2 100       944  
148 1         1557 # Random DateTime object for day defined by month.
149             my ($self, $month) = @_;
150              
151             my $random_day = $self->_range;
152 1         2  
153             return $self->random_month_year($month, $random_day->year);
154             }
155              
156             # Random DateTime object for day defined by month and year.
157 2     2 1 12 my ($self, $month, $year) = @_;
158              
159 2         7 my $after = eval {
160             DateTime->new(
161 2         8797 'day' => 1,
162             'month' => $month,
163             'year' => $year,
164             );
165             };
166 4     4 1 29 if ($EVAL_ERROR) {
167             err 'Cannot create DateTime object.',
168 4         6 'Error', $EVAL_ERROR;
169 4         17 }
170              
171             my $before = $after->clone;
172             $before->add(months => 1)->subtract(days => 1);
173              
174             my $daily = DateTime::Event::Recurrence->daily;
175 4 100       1978 return $daily->next(DateTime::Event::Random->datetime(
176 2         4085 'after' => $after,
177             'before' => $before,
178             ));
179             }
180 2         8  
181 2         24 # Random DateTime object for day defined by year.
182             my ($self, $year) = @_;
183 2         3943  
184 2         1071 my $daily = DateTime::Event::Recurrence->daily;
185              
186             return $daily->next(DateTime::Event::Random->datetime(
187             'after' => DateTime->new(
188             'day' => 1,
189             'month' => 1,
190             'year' => $year,
191             ),
192 1     1 1 6 'before' => DateTime->new(
193             'day' => 31,
194 1         9 'month' => 12,
195             'year' => $year,
196 1         553 ),
197             ));
198             }
199              
200             # Check day.
201             my ($self, $day) = @_;
202              
203             if ($day !~ m/^\d+$/ms) {
204             err "Day isn't positive number.";
205             }
206             if ($day == 0) {
207             err 'Day cannot be a zero.';
208             }
209             return;
210             }
211              
212 16     16   38 # Random date in range.
213             my $self = shift;
214 16 100       73  
215 6         18 return DateTime::Event::Random->datetime(
216             'after' => $self->{'dt_from'},
217 10 100       24 'before' => $self->{'dt_to'},
218 3         16 );
219             }
220 7         12  
221             1;
222              
223              
224             =pod
225 9     9   23  
226             =encoding utf8
227              
228             =head1 NAME
229 9         65  
230             Random::Day - Class for random day generation.
231              
232             =head1 SYNOPSIS
233              
234             use Random::Day;
235              
236             my $obj = Random::Day->new(%params);
237             my $dt = $obj->get;
238             my $dt = $obj->random;
239             my $dt = $obj->random_day($day);
240             my $dt = $obj->random_day_month($day, $month);
241             my $dt = $obj->random_day_month_year($day, $month, $year);
242             my $dt = $obj->random_month($month);
243             my $dt = $obj->random_month_year($month, $year);
244             my $dt = $obj->random_year($year);
245              
246             =head1 METHODS
247              
248             =head2 C<new>
249              
250             my $obj = Random::Day->new(%params);
251              
252             Constructor.
253              
254             =over 8
255              
256             =item * C<day>
257              
258             Day.
259              
260             Default value is undef.
261              
262             =item * C<dt_from>
263              
264             DateTime object from.
265              
266             Default value is DateTime object for 1900 year.
267              
268             =item * C<dt_to>
269              
270             DateTime object to.
271              
272             Default value is DateTime object for 2050 year.
273              
274             =item * C<month>
275              
276             Month.
277              
278             Default value is undef.
279              
280             =item * C<year>
281              
282             Year.
283              
284             Default value is undef.
285              
286             =back
287              
288             =head2 C<get>
289              
290             my $dt = $obj->get;
291              
292             Get random date defined by constructor parameters.
293              
294             Returns DateTime object for date.
295              
296             =head2 C<random>
297              
298             my $dt = $obj->random;
299              
300             Get random date.
301              
302             Returns DateTime object for date.
303              
304             =head2 C<random_day>
305              
306             my $dt = $obj->random_day($day);
307              
308             Get random date defined by day.
309              
310             Returns DateTime object for date.
311              
312             =head2 C<random_day_month>
313              
314             my $dt = $obj->random_day_month($day, $month);
315              
316             Get random date defined by day and month.
317              
318             Returns DateTime object for date.
319              
320             =head2 C<random_day_month_year>
321              
322             my $dt = $obj->random_day_month_year($day, $month, $year);
323              
324             Get date defined by day, month and year.
325              
326             Returns DateTime object for date.
327              
328             =head2 C<random_month>
329              
330             my $dt = $obj->random_month($month);
331              
332             Get random date defined by month.
333              
334             Returns DateTime object for date.
335              
336             =head2 C<random_month_year>
337              
338             my $dt = $obj->random_month_year($month, $year);
339              
340             Get random date defined by month and year.
341              
342             Returns DateTime object for date.
343              
344             =head2 C<random_year>
345              
346             my $dt = $obj->random_year($year);
347              
348             Get random date defined by year.
349              
350             Returns DateTime object for date.
351              
352             =head1 ERRORS
353              
354             new():
355             From Class::Utils::set_params():
356             Unknown parameter '%s'.
357              
358             random_day():
359             Day cannot be a zero.
360             Day isn't number.
361              
362             random_day_month():
363             Cannot create DateTime object.
364             Day cannot be a zero.
365             Day isn't number.
366              
367             random_day_month_year():
368             Cannot create DateTime object.
369             Error: %s
370             Day cannot be a zero.
371             Day isn't number.
372              
373             random_month():
374             Cannot create DateTime object.
375             Error: %s
376              
377             random_month_year():
378             Cannot create DateTime object.
379             Error: %s
380              
381             =head1 EXAMPLE
382              
383             use strict;
384             use warnings;
385              
386             use Random::Day;
387              
388             # Object.
389             my $obj = Random::Day->new;
390              
391             # Get date.
392             my $dt = $obj->get;
393              
394             # Print out.
395             print $dt->ymd."\n";
396              
397             # Output like:
398             # \d\d\d\d-\d\d-\d\d
399              
400             =head1 DEPENDENCIES
401              
402             L<Class::Utils>,
403             L<DateTime>,
404             L<DateTime::Event::Random>,
405             L<DateTime::Event::Recurrence>,
406             L<English>,
407             L<Error::Pure>.
408              
409             =head1 SEE ALSO
410              
411             =over
412              
413             =item L<Data::Random>
414              
415             Perl module to generate random data
416              
417             =back
418              
419             =head1 REPOSITORY
420              
421             L<https://github.com/michal-josef-spacek/Random-Day>
422              
423             =head1 AUTHOR
424              
425             Michal Josef Špaček L<mailto:skim@cpan.org>
426              
427             L<http://skim.cz>
428              
429             =head1 LICENSE AND COPYRIGHT
430              
431             © 2013-2022 Michal Josef Špaček
432              
433             BSD 2-Clause License
434              
435             =head1 VERSION
436              
437             0.11
438              
439             =cut