slotty 0.1.0 → 1.0.0

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: 87691a9de20b669f0f555aa296d7b3bdca7a60ed8388760b2842a603d431eb9d
4
- data.tar.gz: d531edfa52945ea463d3ebb4beaee295a1f8e2e8122ebd3c83671dbde52bdc58
3
+ metadata.gz: 3ce087830c3a4b050ffdf7c1b22b7421e643fd377d1a5011995c5eb8a301d649
4
+ data.tar.gz: fba230d41f3fd7732de6b871b80cc5f7509ab2d54b204eab97913f0e60bb62d1
5
5
  SHA512:
6
- metadata.gz: dae671c77e03776d70cb76e2b6811bcdbb0dd0570e502ecec0c633043aa9fb86268bb61430c12b0f9e562106661caa4300ba879d64a80f8603187e8a41eb3d6a
7
- data.tar.gz: d95d422495cf2deb9eb8879d5ae9f3dfe8e23ef3619723c1809e5e98df507c3967bf5dc34503a1ade345df020bc97aff35c48cbed131d706d90c3bb91d87631e
6
+ metadata.gz: ab763cbad35a6322583759c42d9b38f8d31e566ad94885b3fbbc66c16a1c2efb28059841a52e1350ce48b57f8a5d4d908cc2adba4b5790a34d98629e3e8b1b36
7
+ data.tar.gz: c05da44d9004438d64389b0954e68a0718880fd39e4b0871eeaf03ced25b727beaad3b26544e080d0e468288b28ea148e18bece6ac9ac7e30fc577be34d2c9ef
@@ -0,0 +1 @@
1
+ ruby 2.5.0
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- slotty (0.1.0)
4
+ slotty (1.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  diff-lcs (1.3)
10
- rake (10.5.0)
10
+ rake (12.3.3)
11
11
  rspec (3.9.0)
12
12
  rspec-core (~> 3.9.0)
13
13
  rspec-expectations (~> 3.9.0)
@@ -27,9 +27,9 @@ PLATFORMS
27
27
 
28
28
  DEPENDENCIES
29
29
  bundler (~> 1.17)
30
- rake (~> 10.0)
30
+ rake (~> 12.3.3)
31
31
  rspec (~> 3.0)
32
32
  slotty!
33
33
 
34
34
  BUNDLED WITH
35
- 1.17.2
35
+ 1.17.3
data/README.md CHANGED
@@ -22,12 +22,11 @@ Or install it yourself as:
22
22
 
23
23
  ```ruby
24
24
  Slotty.get_slots(
25
- from: Time.new(2020, 05, 01, 8, 00),
26
- to: Time.new(2020, 05, 01, 11, 00),
27
- slot_length: 60 * 60,
28
- timeframe: 15 * 60,
25
+ for_range: Time.new(2020, 05, 01, 8, 00)..Time.new(2020, 05, 01, 11, 00),
26
+ slot_length_mins: 60,
27
+ interval_mins: 15,
29
28
  exclude_times: [
30
- { start: Time.new(2020, 05, 01, 9, 01), end: Time.new(2020, 05, 01, 9, 59) },
29
+ Time.new(2020, 05, 01, 9, 00)..Time.new(2020, 05, 01, 10, 00)
31
30
  ]
32
31
  )
33
32
 
@@ -45,6 +44,8 @@ Slotty.get_slots(
45
44
  # ]
46
45
  ```
47
46
 
47
+ If you want to just receive the human times back (i.e. "10:00 AM"), you can pass `for: :to_s` to `#get_slots`
48
+
48
49
  ## Development
49
50
 
50
51
  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.
@@ -1,29 +1,40 @@
1
1
  require "slotty/version"
2
- require "slotty/validator"
2
+ require "slotty/timeframe"
3
+ require "slotty/slot"
3
4
 
4
5
  module Slotty
5
- class Error < StandardError; end
6
+ InvalidFormatError = Class.new(StandardError)
7
+ InvalidDateError = Class.new(StandardError)
8
+ InvalidSlotLengthError = Class.new(StandardError)
9
+ InvalidIntervalError = Class.new(StandardError)
10
+ InvalidExclusionError = Class.new(StandardError)
6
11
 
7
12
  class << self
8
- def get_slots(from:, to:, slot_length:, timeframe:, exclude_times: [])
13
+ def get_slots(for_range:, slot_length_mins:, interval_mins:, as: :full, exclude_times: [])
14
+ raise InvalidDateError, "for_value must be type of Range" unless for_range.is_a?(Range)
15
+ raise InvalidSlotLengthError, "slot_length_mins must be an integer" unless slot_length_mins.is_a?(Integer)
16
+ raise InvalidIntervalError, "interval_mins must be an integer" unless interval_mins.is_a?(Integer)
17
+ raise InvalidExclusionError, "exclude_times must be an array of time ranges" unless exclude_times.is_a?(Array) && exclude_times.all? { |t| t.is_a?(Range) }
18
+
19
+ slot_length = slot_length_mins * 60
20
+ interval = interval_mins * 60
21
+
9
22
  slots = Array.new(0)
10
23
 
11
- potential_slot = from..(from + slot_length)
24
+ potential_slot = Slot.new(range: for_range.begin..(for_range.begin + slot_length))
12
25
 
13
- while (from..to).cover?(potential_slot)
14
- if Validator.has_overlaps?(potential_slot, exclude_times)
15
- potential_slot = (potential_slot.begin + timeframe)..(potential_slot.begin + timeframe + slot_length)
26
+ while Timeframe.covers?(for_range, potential_slot)
27
+ if potential_slot.has_overlaps?(exclude_times)
28
+ potential_slot = Slot.new(range: (potential_slot.begin + interval)..(potential_slot.begin + interval + slot_length))
16
29
 
17
30
  next
18
31
  end
19
32
 
20
- slots << {
21
- start_time: potential_slot.begin,
22
- end_time: potential_slot.end,
23
- time: potential_slot.begin.strftime('%H:%M %p')
24
- }
33
+ raise InvalidFormatError, "cannot format slot in this way" unless potential_slot.respond_to?(as)
34
+
35
+ slots << potential_slot.send(as)
25
36
 
26
- potential_slot = (potential_slot.begin + timeframe)..(potential_slot.begin + timeframe + slot_length)
37
+ potential_slot = Slot.new(range: (potential_slot.begin + interval)..(potential_slot.begin + interval + slot_length))
27
38
  end
28
39
 
29
40
  slots
@@ -0,0 +1,33 @@
1
+ require "slotty/timeframe"
2
+
3
+ module Slotty
4
+ class Slot
5
+ attr_reader :range, :begin, :end
6
+
7
+ def initialize(range:)
8
+ @range = range
9
+ @begin = range.begin
10
+ @end = range.end
11
+ end
12
+
13
+ def has_overlaps?(excluded_slots = [])
14
+ return false if excluded_slots.empty?
15
+
16
+ excluded_slots.any? do |exc_slot|
17
+ Timeframe.contains?(exc_slot, range)
18
+ end
19
+ end
20
+
21
+ def to_s
22
+ range.begin.strftime('%I:%M %p')
23
+ end
24
+
25
+ def full
26
+ {
27
+ start_time: range.begin,
28
+ end_time: range.end,
29
+ time: to_s
30
+ }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ module Slotty
2
+ class Timeframe
3
+ class << self
4
+ def covers?(surrounding_range, included_range)
5
+ starts_before = surrounding_range.begin <= included_range.begin
6
+ ends_after = surrounding_range.end >= included_range.end
7
+
8
+ starts_before && ends_after
9
+ end
10
+
11
+ def contains?(excluder, potential_slot)
12
+ start_within = potential_slot.begin >= excluder.begin && potential_slot.begin < excluder.end
13
+ end_within = potential_slot.end > excluder.begin && potential_slot.end <= excluder.end
14
+
15
+ start_within || end_within
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -1,3 +1,3 @@
1
1
  module Slotty
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
Binary file
@@ -24,6 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ["lib"]
25
25
 
26
26
  spec.add_development_dependency "bundler", "~> 1.17"
27
- spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rake", "~> 12.3.3"
28
28
  spec.add_development_dependency "rspec", "~> 3.0"
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slotty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hayden Rouille
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-06 00:00:00.000000000 Z
11
+ date: 2020-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -62,6 +62,7 @@ extra_rdoc_files: []
62
62
  files:
63
63
  - ".gitignore"
64
64
  - ".rspec"
65
+ - ".tool-versions"
65
66
  - ".travis.yml"
66
67
  - CODE_OF_CONDUCT.md
67
68
  - Gemfile
@@ -72,8 +73,10 @@ files:
72
73
  - bin/console
73
74
  - bin/setup
74
75
  - lib/slotty.rb
75
- - lib/slotty/validator.rb
76
+ - lib/slotty/slot.rb
77
+ - lib/slotty/timeframe.rb
76
78
  - lib/slotty/version.rb
79
+ - slotty-0.1.0.gem
77
80
  - slotty.gemspec
78
81
  homepage: https://github.com/haydenrou/slotty
79
82
  licenses:
@@ -94,7 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
97
  - !ruby/object:Gem::Version
95
98
  version: '0'
96
99
  requirements: []
97
- rubygems_version: 3.0.1
100
+ rubyforge_project:
101
+ rubygems_version: 2.7.3
98
102
  signing_key:
99
103
  specification_version: 4
100
104
  summary: Generate available slots between time ranges
@@ -1,21 +0,0 @@
1
- module Slotty
2
- class Validator
3
- class << self
4
- def has_overlaps?(slot, excluded_slots = [])
5
- return false if excluded_slots.empty?
6
-
7
- excluded_slots.any? do |excluder|
8
- excluder_overlaps_slot_start = (excluder[:start]..excluder[:end]).include? slot.begin
9
- excluder_overlaps_slot_end = (excluder[:start]..excluder[:end]).include? slot.end
10
- slot_overlaps_excluder_start = (slot.begin..slot.end).include? excluder[:start]
11
- slot_overlaps_excluder_end = (slot.begin..slot.end).include? excluder[:end]
12
-
13
- excluder_overlaps_slot_start |
14
- excluder_overlaps_slot_end |
15
- slot_overlaps_excluder_start |
16
- slot_overlaps_excluder_end
17
- end
18
- end
19
- end
20
- end
21
- end