periodoxical 0.4.2 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +37 -0
- data/lib/periodoxical/version.rb +1 -1
- data/lib/periodoxical.rb +22 -3
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fa1a430d11ca7fdd0cea524011b7164f926f87bad37a49c4848bdbca934bdc79
|
|
4
|
+
data.tar.gz: fea338a55f3b095b4ac6c1ff57f235e8490a9b6683ae48b9a573b0b1afba22f0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74ec882770d5567ad292ad26c020777d9075cbb0bf77259f37fa0713ab239772dea1dd52fadb2d415ceb8820a10cbc2572ee4847ac181ae208d81d6d759b0517
|
|
7
|
+
data.tar.gz: e2a7c7b00eec3522ce4d2bd15a999a7f86de8826245c464f0e0844b3f7cd42d7eb942d80e7cad2ecbc48d66399f4962fd9f7be7d8a9d4a025e51d79b477112e2
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -148,6 +148,43 @@ Periodoxical.generate(
|
|
|
148
148
|
)
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
+
#### Example 4 - Exclude time blocks using the `exclusion_dates` parameter
|
|
152
|
+
As a Ruby dev, I want to generate slots for 8AM - 9AM on Mondays, except for the Monday of June 10, 2024.
|
|
153
|
+
|
|
154
|
+
```rb
|
|
155
|
+
Periodoxical.generate(
|
|
156
|
+
time_zone: 'America/Los_Angeles',
|
|
157
|
+
start_date: '2024-06-3',
|
|
158
|
+
limit: 4,
|
|
159
|
+
exclusion_dates: %w(2024-06-10),
|
|
160
|
+
day_of_week_time_blocks: {
|
|
161
|
+
mon: [
|
|
162
|
+
{ start_time: '8:00AM', end_time: '9:00AM' },
|
|
163
|
+
],
|
|
164
|
+
}
|
|
165
|
+
)
|
|
166
|
+
# Returns all Monday 8AM - 9AM blocks except for the june on June 10, 2024
|
|
167
|
+
# =>
|
|
168
|
+
[
|
|
169
|
+
{
|
|
170
|
+
start: <#DateTime: 2024-06-03T08:00:00-0700>,
|
|
171
|
+
end: <#DateTime: 2024-06-03T09:00:00-0700>,
|
|
172
|
+
}
|
|
173
|
+
{
|
|
174
|
+
start: <#DateTime: 2024-06-17T08:00:00-0700>,
|
|
175
|
+
end: <#DateTime: 2024-06-17T09:00:00-0700>,
|
|
176
|
+
}
|
|
177
|
+
{
|
|
178
|
+
start: <#DateTime: 2024-06-24T08:00:00-0700>,
|
|
179
|
+
end: <#DateTime: 2024-06-24T09:00:00-0700>,
|
|
180
|
+
}
|
|
181
|
+
{
|
|
182
|
+
start: <#DateTime: 2024-07-01T08:00:00-0700>,
|
|
183
|
+
end: <#DateTime: 2024-07-01T09:00:00-0700>,
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
```
|
|
187
|
+
|
|
151
188
|
## Development
|
|
152
189
|
|
|
153
190
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/periodoxical/version.rb
CHANGED
data/lib/periodoxical.rb
CHANGED
|
@@ -34,6 +34,9 @@ module Periodoxical
|
|
|
34
34
|
# Ex: %w(mon tue wed sat)
|
|
35
35
|
# @param [Integer] limit
|
|
36
36
|
# How many date times to generate. To be used when `end_date` is nil.
|
|
37
|
+
# @param [Aray<String>] exclusion_dates
|
|
38
|
+
# Dates to be excluded when generating the time blocks
|
|
39
|
+
# Ex: ['2024-06-10', '2024-06-14']
|
|
37
40
|
# @param [Hash<Hash>] day_of_week_time_blocks
|
|
38
41
|
# To be used when hours are different between days of the week
|
|
39
42
|
# Ex: {
|
|
@@ -42,7 +45,7 @@ module Periodoxical
|
|
|
42
45
|
# fri: { start_time: '7:00PM', end_time: '9:00PM' },
|
|
43
46
|
# }
|
|
44
47
|
def initialize(time_zone: 'Etc/UTC', days_of_week: nil,
|
|
45
|
-
start_date:, end_date: nil, time_blocks: nil, day_of_week_time_blocks: nil, limit: nil)
|
|
48
|
+
start_date:, end_date: nil, time_blocks: nil, day_of_week_time_blocks: nil, limit: nil, exclusion_dates: nil)
|
|
46
49
|
@time_zone = TZInfo::Timezone.get(time_zone)
|
|
47
50
|
@days_of_week = days_of_week
|
|
48
51
|
@time_blocks = time_blocks
|
|
@@ -50,6 +53,9 @@ module Periodoxical
|
|
|
50
53
|
@start_date = start_date.is_a?(String) ? Date.parse(start_date) : start_date
|
|
51
54
|
@end_date = end_date.is_a?(String) ? Date.parse(end_date) : end_date
|
|
52
55
|
@limit = limit
|
|
56
|
+
@exclusion_dates = if exclusion_dates && !exclusion_dates.empty?
|
|
57
|
+
exclusion_dates.map { |ed| Date.parse(ed) }
|
|
58
|
+
end
|
|
53
59
|
validate!
|
|
54
60
|
end
|
|
55
61
|
|
|
@@ -77,7 +83,7 @@ module Periodoxical
|
|
|
77
83
|
keep_generating = true
|
|
78
84
|
while keep_generating
|
|
79
85
|
day_of_week = day_of_week_long_to_short(current_date.strftime("%A"))
|
|
80
|
-
if @day_of_week_time_blocks[day_of_week.to_sym]
|
|
86
|
+
if @day_of_week_time_blocks[day_of_week.to_sym] && !excluded_date?(current_date)
|
|
81
87
|
time_blocks = @day_of_week_time_blocks[day_of_week.to_sym]
|
|
82
88
|
time_blocks.each do |tb|
|
|
83
89
|
times_output << {
|
|
@@ -106,7 +112,7 @@ module Periodoxical
|
|
|
106
112
|
keep_generating = true
|
|
107
113
|
while keep_generating
|
|
108
114
|
day_of_week = day_of_week_long_to_short(current_date.strftime("%A"))
|
|
109
|
-
if @days_of_week.include?(day_of_week)
|
|
115
|
+
if @days_of_week.include?(day_of_week) && !excluded_date?(current_date)
|
|
110
116
|
@time_blocks.each do |tb|
|
|
111
117
|
times_output << {
|
|
112
118
|
start: time_str_to_object(current_date, tb[:start_time]),
|
|
@@ -182,5 +188,18 @@ module Periodoxical
|
|
|
182
188
|
)
|
|
183
189
|
@time_zone.local_to_utc(date_time).new_offset(@time_zone.current_period.offset.utc_total_offset)
|
|
184
190
|
end
|
|
191
|
+
|
|
192
|
+
# @param [Date] current_date
|
|
193
|
+
# @return [Boolean]
|
|
194
|
+
# Whether or not the date is excluded
|
|
195
|
+
def excluded_date?(current_date)
|
|
196
|
+
return false unless @exclusion_dates
|
|
197
|
+
|
|
198
|
+
@exclusion_dates.each do |ed|
|
|
199
|
+
return true if current_date == ed
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
false
|
|
203
|
+
end
|
|
185
204
|
end
|
|
186
205
|
end
|