periodoxical 1.2.0 → 2.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9f062ec6b1b65c56a01d48386370fe8f1e12b91f0426228ca625bac03272d1b
4
- data.tar.gz: 101efa2d001ca56deb4ff3d5cef552f4aeaa98e6cecbe043ea1f990b38b8bc36
3
+ metadata.gz: 9a17e3bd272fdd537b16689e871aa834c6388202d36d5ed5bf420150c0ff62bd
4
+ data.tar.gz: 8c08b584338f8d2e14cb8c0c8ce1ec4171d5fa4c946328911b25302aa621e92e
5
5
  SHA512:
6
- metadata.gz: 7f0a45cb869fd3ec84bd097f0c793f1f0561ce292f48a3bc2521ad714685cd3cc1582956cc572fc4b23c045ea2fe853706467dcbb39fc328254d5855fcf4da2e
7
- data.tar.gz: 4ab479448dbfc960996e8535f962cefd58392452f32f9e116d6faf1a373767c6062949e2959f9d64844fe0168c0e92b3edf313a9b5a3499e4c29771c6b0bd4bd
6
+ metadata.gz: 76df9351805289b310b079dd0a44587630db263101a18777ffa4612dacd5e846313fc56b8836ffa42fe7126926456d11273c218187dda0542d5b76c65a6a0451
7
+ data.tar.gz: afed95be8919055c47c5b118b6e01f944b03e16fc2c87046157ece131d35d0078c1dc5cbad804140afb9cdc975283c9d464536a4b65d7549181b5e0781afb628
data/Gemfile.lock CHANGED
@@ -1,9 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- periodoxical (1.2.0)
4
+ periodoxical (2.2.1)
5
5
  tzinfo (~> 2.0, >= 2.0.0)
6
- week_of_month (= 1.2.6)
7
6
 
8
7
  GEM
9
8
  remote: https://rubygems.org/
@@ -41,7 +40,6 @@ GEM
41
40
  rspec-support (3.13.1)
42
41
  tzinfo (2.0.6)
43
42
  concurrent-ruby (~> 1.0)
44
- week_of_month (1.2.6)
45
43
 
46
44
  PLATFORMS
47
45
  arm64-darwin-22
data/README.md CHANGED
@@ -209,7 +209,7 @@ Periodoxical.generate(
209
209
  )
210
210
  ```
211
211
 
212
- ### Specifying time blocks using rules for day-of-month and/or week-of-month and/or month.
212
+ ### Specifying time blocks using rules for month(s) and/or day-of-month.
213
213
 
214
214
  As a Ruby dev, I want to generate the next 3 timeblocks for **8AM - 9AM** for the **5th** and **10th** day of every month starting from **June**. I can do this using the `days_of_month` parameter.
215
215
 
@@ -240,42 +240,8 @@ Periodoxical.generate(
240
240
  ]
241
241
  ```
242
242
 
243
- As a Ruby dev, I want to generate **4** timeblocks for **8AM - 9AM** on **Mondays** but only in the **first two weeks** in the months of **April, May, and June**. I can do this using the `months` parameter.
243
+ ### Specify nth day-of-week in month (ie. first Monday of the Month, second Tuesday of the Month, last Friday of Month)
244
244
 
245
- ```
246
- Periodoxical.generate(
247
- time_zone: 'America/Los_Angeles',
248
- starting_from: '2024-04-01',
249
- limit: 4,
250
- weeks_of_month: [1 2],
251
- months: [4, 5, 6],
252
- days_of_week: %w(mon),
253
- time_blocks: [
254
- { start_time: '8:00AM', end_time: '9:00AM' },
255
- ],
256
- )
257
- #=>
258
- [
259
- {
260
- start_time: #<DateTime: 2024-04-01T08:00:00-0700>,
261
- end_time: #<DateTime: 2024-04-01T09:00:00-0700>,
262
- },
263
- {
264
- start_time: #<DateTime: 2024-04-08T08:00:00-0700>,
265
- end_time: #<DateTime: 2024-04-08T09:00:00-0700>,
266
- },
267
- {
268
- start_time: #<DateTime: 2024-05-06T08:00:00-0700>,
269
- end_time: #<DateTime: 2024-05-06T09:00:00-0700>,
270
- },
271
- {
272
- start_time: #<DateTime: 2024-06-03T08:00:00-0700>,
273
- end_time: #<DateTime: 2024-06-03T09:00:00-0700>,
274
- },
275
- ]
276
- ```
277
-
278
- ### Example 6 - Specify nth day-of-week in month (ie. first Monday of the Month, second Tuesday of the Month, last Friday of Month)
279
245
  As a Ruby dev, I want to generate timeblocks for **8AM - 9AM** on the **first and second Mondays** and **last Fridays** of every month starting in June 2024. I can do this with the `nth_day_of_week_in_month` param.
280
246
 
281
247
  ```rb
@@ -316,7 +282,7 @@ Periodoxical.generate(
316
282
  ]
317
283
  ```
318
284
 
319
- ### Example 7 - Exclude time blocks using the `exclusion_dates` and `exclusion_times` parameters
285
+ ### Exclude time blocks using the `exclusion_dates` and `exclusion_times` parameters
320
286
  As a Ruby dev, I want to generate timeblocks for **8AM - 9AM** on **Mondays**, except for the **Monday of June 10, 2024**. I can do this using the `exlcusion_dates` parameter.
321
287
 
322
288
  ```rb
@@ -402,7 +368,7 @@ Periodoxical.generate(
402
368
  ]
403
369
  ```
404
370
 
405
- ### Example 8 - Every-other-nth day-of-week rules (ie. every other Tuesday, every 3rd Wednesday, every 10th Friday)
371
+ ### Every-other-nth day-of-week rules (ie. every other Tuesday, every 3rd Wednesday, every 10th Friday)
406
372
 
407
373
  As a Ruby dev, I want to generate timeblocks for **9AM- 10AM** on **every Monday**, but **every other Tuesday**, and **every other 3rd Wednesday**. I can do this using the `days_of_week` parameter with the `every` and `every_other_nth` keys to specify the every-other-nth-rules.
408
374
 
@@ -27,11 +27,14 @@ module Periodoxical
27
27
  tb_2_start = time_block_2[:start]
28
28
  tb_2_end = time_block_2[:end]
29
29
 
30
- # Basicall overlap is when one starts before the other has ended
30
+ # Basically overlap is when one starts before the other has ended
31
31
  return true if tb_1_end > tb_2_start && tb_1_end < tb_2_end
32
32
  # By symmetry
33
33
  return true if tb_2_end > tb_1_start && tb_2_end < tb_1_end
34
34
 
35
+ # Handle the edge case where they start/end at the same time
36
+ return true if tb_1_start == tb_2_start || tb_1_end == tb_2_end
37
+
35
38
  false
36
39
  end
37
40
 
@@ -1,3 +1,3 @@
1
1
  module Periodoxical
2
- VERSION = "1.2.0"
2
+ VERSION = "2.2.1"
3
3
  end
data/lib/periodoxical.rb CHANGED
@@ -4,7 +4,6 @@ require "periodoxical/helpers"
4
4
  require "date"
5
5
  require "time"
6
6
  require "tzinfo"
7
- require "week_of_month"
8
7
 
9
8
  module Periodoxical
10
9
  class << self
@@ -84,7 +83,6 @@ module Periodoxical
84
83
  days_of_week: nil,
85
84
  nth_day_of_week_in_month: nil,
86
85
  days_of_month: nil,
87
- weeks_of_month: nil,
88
86
  duration: nil,
89
87
  months: nil
90
88
  )
@@ -97,7 +95,6 @@ module Periodoxical
97
95
  end
98
96
  @nth_day_of_week_in_month = deep_symbolize_keys(nth_day_of_week_in_month)
99
97
  @days_of_month = days_of_month
100
- @weeks_of_month = weeks_of_month
101
98
  @months = months
102
99
  @time_blocks = deep_symbolize_keys(time_blocks)
103
100
  @day_of_week_time_blocks = deep_symbolize_keys(day_of_week_time_blocks)
@@ -151,7 +148,7 @@ module Periodoxical
151
148
  # Ex: '9:00AM'
152
149
  # @param [Date] date
153
150
  def time_str_to_object(date, time_str)
154
- time = Time.strptime(time_str, "%I:%M%p")
151
+ time = Time.strptime(time_str, '%I:%M%p')
155
152
  date_time = DateTime.new(
156
153
  date.year,
157
154
  date.month,
@@ -212,19 +209,19 @@ module Periodoxical
212
209
  # }
213
210
  # Generates time block but also checks if we should stop generating
214
211
  def append_to_output_and_check_limit(time_block)
215
- # Check if this particular time is conflicts with any times from `exclusion_times`.
216
- return if overlaps_with_an_excluded_time?(time_block)
217
- return if before_starting_from_or_after_ending_at?(time_block)
218
-
219
212
  strtm = time_str_to_object(@current_date, time_block[:start_time])
220
213
  endtm = time_str_to_object(@current_date, time_block[:end_time])
221
214
 
222
215
  if @duration
223
216
  split_by_duration_and_append(strtm, endtm)
224
217
  else
218
+ # Check if this particular time is conflicts with any times from `exclusion_times`.
219
+ return if before_starting_from_or_after_ending_at?(time_block)
220
+ return if overlaps_with_an_excluded_time?({ start: strtm, end: endtm })
221
+
225
222
  @output << {
226
223
  start: strtm,
227
- end: endtm
224
+ end: endtm
228
225
  }
229
226
  increment_and_check_limit
230
227
  end
@@ -267,11 +264,6 @@ module Periodoxical
267
264
  return false if @exclusion_dates.include?(@current_date)
268
265
  end
269
266
 
270
- # If weeks_of_months are specified but not satisified, return false
271
- if @weeks_of_month
272
- return false unless @weeks_of_month.include?(@current_date.week_of_month)
273
- end
274
-
275
267
  # If months are specified, but current_date does not satisfy months,
276
268
  # return false
277
269
  if @months
@@ -418,19 +410,22 @@ module Periodoxical
418
410
  false
419
411
  end
420
412
 
413
+ # @param [Hash] time_block
414
+ # Ex:
415
+ # {
416
+ # start: #<DateTime>,
417
+ # end: #<DateTime>,
418
+ # }
421
419
  # @return [Boolean]
422
420
  # Whether or not the given `time_block` in the @current_date and
423
421
  # @time_zone overlaps with the times in `exclusion_times`.
424
- def overlaps_with_an_excluded_time?(time_block)
422
+ def overlaps_with_an_excluded_time?(tm_blck)
425
423
  return false unless @exclusion_times
426
424
 
427
425
  @exclusion_times.each do |exclusion_timeblock|
428
426
  return true if overlap?(
429
427
  exclusion_timeblock,
430
- {
431
- start: time_str_to_object(@current_date, time_block[:start_time]),
432
- end: time_str_to_object(@current_date, time_block[:end_time]),
433
- }
428
+ tm_blck
434
429
  )
435
430
  end
436
431
 
@@ -442,13 +437,15 @@ module Periodoxical
442
437
  si = strtm
443
438
  ei = strtm + delta
444
439
  while ei <= endtm
445
- @output << {
446
- start: si,
447
- end: ei
448
- }
440
+ unless overlaps_with_an_excluded_time?({ start: si, end: ei })
441
+ @output << {
442
+ start: si,
443
+ end: ei
444
+ }
445
+ increment_and_check_limit
446
+ end
449
447
  si += delta
450
448
  ei += delta
451
- increment_and_check_limit
452
449
  end
453
450
  end
454
451
  end
data/periodoxical.gemspec CHANGED
@@ -35,7 +35,6 @@ Gem::Specification.new do |spec|
35
35
  spec.require_paths = ["lib"]
36
36
 
37
37
  spec.add_dependency 'tzinfo', '~> 2.0', '>= 2.0.0'
38
- spec.add_dependency 'week_of_month', '1.2.6'
39
38
 
40
39
  spec.add_development_dependency "bundler", "~> 2.4"
41
40
  spec.add_development_dependency "rake", "~> 12.3.3"
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.2.0
4
+ version: 2.2.1
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-14 00:00:00.000000000 Z
11
+ date: 2024-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tzinfo
@@ -30,20 +30,6 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 2.0.0
33
- - !ruby/object:Gem::Dependency
34
- name: week_of_month
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - '='
38
- - !ruby/object:Gem::Version
39
- version: 1.2.6
40
- type: :runtime
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - '='
45
- - !ruby/object:Gem::Version
46
- version: 1.2.6
47
33
  - !ruby/object:Gem::Dependency
48
34
  name: bundler
49
35
  requirement: !ruby/object:Gem::Requirement