File Coverage

blib/lib/Random/Day.pm
Criterion Covered Total %
statement 84 96 87.5
branch 14 26 53.8
condition n/a
subroutine 19 19 100.0
pod 9 9 100.0
total 126 150 84.0


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