periodoxical 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +52 -8
- data/lib/periodoxical/version.rb +1 -1
- data/lib/periodoxical.rb +51 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9f062ec6b1b65c56a01d48386370fe8f1e12b91f0426228ca625bac03272d1b
|
4
|
+
data.tar.gz: 101efa2d001ca56deb4ff3d5cef552f4aeaa98e6cecbe043ea1f990b38b8bc36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f0a45cb869fd3ec84bd097f0c793f1f0561ce292f48a3bc2521ad714685cd3cc1582956cc572fc4b23c045ea2fe853706467dcbb39fc328254d5855fcf4da2e
|
7
|
+
data.tar.gz: 4ab479448dbfc960996e8535f962cefd58392452f32f9e116d6faf1a373767c6062949e2959f9d64844fe0168c0e92b3edf313a9b5a3499e4c29771c6b0bd4bd
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -47,20 +47,20 @@ Periodoxical.generate(
|
|
47
47
|
#=>
|
48
48
|
[
|
49
49
|
{
|
50
|
-
|
51
|
-
|
50
|
+
start: #<DateTime: 2024-05-23T09:00:00-0700>,
|
51
|
+
end: #<DateTime: 2024-05-23T10:30:00-0700>,
|
52
52
|
},
|
53
53
|
{
|
54
|
-
|
55
|
-
|
54
|
+
start: #<DateTime: 2024-05-24T09:00:00-0700>,
|
55
|
+
end: #<DateTime: 2024-05-24T10:30:00-0700>,
|
56
56
|
},
|
57
57
|
{
|
58
|
-
|
59
|
-
|
58
|
+
start: #<DateTime: 2024-05-25T09:00:00-0700>,
|
59
|
+
end: #<DateTime: 2024-05-25T10:30:00-0700>,
|
60
60
|
},
|
61
61
|
{
|
62
|
-
|
63
|
-
|
62
|
+
start: #<DateTime: 2024-05-26T09:00:00-0700>,
|
63
|
+
end: #<DateTime: 2024-05-26T10:30:00-0700>,
|
64
64
|
}
|
65
65
|
]
|
66
66
|
```
|
@@ -474,6 +474,50 @@ Periodoxical.generate(
|
|
474
474
|
]
|
475
475
|
```
|
476
476
|
|
477
|
+
### Use the `duration` key, to automatically partition the provided `time_blocks` into smaller chunks to the given duration.
|
478
|
+
|
479
|
+
As a Ruby dev, I want to generate **30 minute** time blocks between **9:00AM - 1:00PM, and 2:00PM - 5:00PM**. Because it is too tedious to generate all 14 of these time blocks, I prefer to pass in the `duration` key and have `periodoxical` generate them for me.
|
480
|
+
|
481
|
+
N.B. If you provide a duration that conflicts with your time blocks, `periodoxical` will not return any time blocks. For example, if you specify **9:00AM - 10:00AM** but set your **duration** as 90 minutes, no time blocks are generated since we can't fit 90 minutes into an hour!
|
482
|
+
|
483
|
+
|
484
|
+
```rb
|
485
|
+
Periodoxical.generate(
|
486
|
+
time_zone: 'America/Los_Angeles',
|
487
|
+
time_blocks: [
|
488
|
+
{
|
489
|
+
start_time: '9:00AM',
|
490
|
+
end_time: '1:00PM'
|
491
|
+
},
|
492
|
+
{
|
493
|
+
start_time: '2:00PM',
|
494
|
+
end_time: '5:00PM'
|
495
|
+
},
|
496
|
+
],
|
497
|
+
duration: 30, #(minutes)
|
498
|
+
starting_from: '2024-05-23',
|
499
|
+
ending_at: '2024-05-26',
|
500
|
+
)
|
501
|
+
# => [
|
502
|
+
{
|
503
|
+
start: #<DateTime: 2024-05-23T09:00:00--0700>
|
504
|
+
end: #<DateTime: 2024-05-23T09:30:00--0700>
|
505
|
+
},
|
506
|
+
{
|
507
|
+
start: #<DateTime: 2024-05-23T09:30:00--0700>
|
508
|
+
end: #<DateTime: 2024-05-23T10:00:00--0700>
|
509
|
+
},
|
510
|
+
{
|
511
|
+
start: #<DateTime: 2024-05-23T10:00:00--0700>
|
512
|
+
end: #<DateTime: 2024-05-23T10:30:00--0700>
|
513
|
+
},
|
514
|
+
{
|
515
|
+
start: #<DateTime: 2024-05-23T10:30:00--0700>
|
516
|
+
end: #<DateTime: 2024-05-23T11:00:00--0700>
|
517
|
+
}
|
518
|
+
]
|
519
|
+
```
|
520
|
+
|
477
521
|
### Having Some Fun
|
478
522
|
|
479
523
|
Generate all the Friday the 13ths ever since May 1980 (when the first Friday the 13th film was released).
|
data/lib/periodoxical/version.rb
CHANGED
data/lib/periodoxical.rb
CHANGED
@@ -66,6 +66,12 @@ module Periodoxical
|
|
66
66
|
# tue: { start_time: '11:30PM', end_time: '12:00AM' },
|
67
67
|
# fri: { start_time: '7:00PM', end_time: '9:00PM' },
|
68
68
|
# }
|
69
|
+
# @param [Integer] duration
|
70
|
+
# Splits the time_blocks into this duration (in minutes). For example, if time_block is 9:00AM - 10:00AM,
|
71
|
+
# and duration is 20 minutes. It creates 3 timeblocks of:
|
72
|
+
# - 9:00AM - 9:20AM
|
73
|
+
# - 9:20AM - 9:40AM
|
74
|
+
# - 9:40AM - 10:00AM
|
69
75
|
def initialize(
|
70
76
|
starting_from:,
|
71
77
|
ending_at: nil,
|
@@ -79,6 +85,7 @@ module Periodoxical
|
|
79
85
|
nth_day_of_week_in_month: nil,
|
80
86
|
days_of_month: nil,
|
81
87
|
weeks_of_month: nil,
|
88
|
+
duration: nil,
|
82
89
|
months: nil
|
83
90
|
)
|
84
91
|
|
@@ -97,6 +104,14 @@ module Periodoxical
|
|
97
104
|
@starting_from = date_object_from(starting_from)
|
98
105
|
@ending_at = date_object_from(ending_at)
|
99
106
|
@limit = limit
|
107
|
+
|
108
|
+
if duration
|
109
|
+
unless duration.is_a?(Integer)
|
110
|
+
raise "duration must be an integer"
|
111
|
+
else
|
112
|
+
@duration = duration
|
113
|
+
end
|
114
|
+
end
|
100
115
|
@exclusion_dates = if exclusion_dates && !exclusion_dates.empty?
|
101
116
|
exclusion_dates.map { |ed| Date.parse(ed) }
|
102
117
|
end
|
@@ -201,19 +216,31 @@ module Periodoxical
|
|
201
216
|
return if overlaps_with_an_excluded_time?(time_block)
|
202
217
|
return if before_starting_from_or_after_ending_at?(time_block)
|
203
218
|
|
204
|
-
@
|
205
|
-
|
206
|
-
end: time_str_to_object(@current_date, time_block[:end_time])
|
207
|
-
}
|
219
|
+
strtm = time_str_to_object(@current_date, time_block[:start_time])
|
220
|
+
endtm = time_str_to_object(@current_date, time_block[:end_time])
|
208
221
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
@
|
213
|
-
|
222
|
+
if @duration
|
223
|
+
split_by_duration_and_append(strtm, endtm)
|
224
|
+
else
|
225
|
+
@output << {
|
226
|
+
start: strtm,
|
227
|
+
end: endtm
|
228
|
+
}
|
229
|
+
increment_and_check_limit
|
214
230
|
end
|
215
231
|
end
|
216
232
|
|
233
|
+
# increment count, if `limit` is used to stop generating
|
234
|
+
def increment_and_check_limit
|
235
|
+
return unless @limit
|
236
|
+
|
237
|
+
@current_count += 1
|
238
|
+
return if @current_count < @limit
|
239
|
+
|
240
|
+
@keep_generating = false
|
241
|
+
throw :done
|
242
|
+
end
|
243
|
+
|
217
244
|
def advance_current_date_and_check_if_reached_end_date
|
218
245
|
@current_date = @current_date + 1
|
219
246
|
|
@@ -409,5 +436,20 @@ module Periodoxical
|
|
409
436
|
|
410
437
|
false
|
411
438
|
end
|
439
|
+
|
440
|
+
def split_by_duration_and_append(strtm, endtm)
|
441
|
+
delta = Rational(@duration, 24 * 60)
|
442
|
+
si = strtm
|
443
|
+
ei = strtm + delta
|
444
|
+
while ei <= endtm
|
445
|
+
@output << {
|
446
|
+
start: si,
|
447
|
+
end: ei
|
448
|
+
}
|
449
|
+
si += delta
|
450
|
+
ei += delta
|
451
|
+
increment_and_check_limit
|
452
|
+
end
|
453
|
+
end
|
412
454
|
end
|
413
455
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: periodoxical
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Li
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tzinfo
|