availabiliter 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b67cc74bfc51556d4ec00b9fc2a1a98364d78aca1ea7975a8970e36858b023c
4
- data.tar.gz: e6c267b060c68affa3d4c122d97f821221c76f543486db80a8b8704b5a3e09c1
3
+ metadata.gz: e4398863d21393841d616f4fd47c7cfd3d5c7c3c04839735e4508cae695f07f1
4
+ data.tar.gz: dc7736e7c8a5ee4498719a8976e73b5923b35b0f32154bac151009db6eeb98b7
5
5
  SHA512:
6
- metadata.gz: 3a4607aff951f4a9538cacc901ed45dd3f50f739d4b3662de249fb58257cd44e24621713bfabe585b2fac257ddc45016879dc372dc031e2dc5c74a91faca99e8
7
- data.tar.gz: f48c05946d0488765966a6b8bb1bc130b833fa1d132cfc0a382bc4e5e40163e06ab8aff51782ef0fb004634a6066a74ef8ca431e8c2194e954116c0952ff6a22
6
+ metadata.gz: 60eb5709da8cd9dedee6e7246c517f27117e23aa04cfeb69e8945e67acdaada2e5b86e1b0c5ba67a94dcd2e88b06841b8881b5a9bd179e8d76f090cb09c66240
7
+ data.tar.gz: cf00b270e3afbef8253100d3784ce435ada6f2ef69a00ba6af41e01e26a6473295f339dc6f9ceaaa1f21ec9136c806c1d7bccb8c06e54bc6233b9773d40a89d5
@@ -1,6 +1,6 @@
1
- name: Ruby
1
+ name: Tests
2
2
 
3
- on: [push,pull_request]
3
+ on: [pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
@@ -10,9 +10,12 @@ jobs:
10
10
  - name: Set up Ruby
11
11
  uses: ruby/setup-ruby@v1
12
12
  with:
13
- ruby-version: 3.0.1
14
- - name: Run the default task
13
+ ruby-version: 2.7.2
14
+ - name: Set up gems
15
15
  run: |
16
16
  gem install bundler -v 2.2.15
17
17
  bundle install
18
- bundle exec rake
18
+ - name: Run rspec
19
+ run: rspec spec
20
+ - name: Run rubocop
21
+ run: rubocop
data/.gitignore CHANGED
@@ -6,6 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /Gemfile.lock
9
10
 
10
11
  # rspec failure tracking
11
12
  .rspec_status
data/CHANGELOG.md CHANGED
@@ -1,2 +1,9 @@
1
+ ## Future releases
2
+ - DateTime calculation
3
+
4
+ ## 0.2.0
5
+ - Active Support dependency removal
6
+ - Minor changes: removal of Gemfile.lock / wrap classes in a module to avoid clash with other code sources
7
+
1
8
  ## 0.1.0
2
9
  - Availabilities calculation with dates
data/README.md CHANGED
@@ -5,7 +5,7 @@ Availabiliter is a Ruby availability calculator for date ranges. It handles the
5
5
  - endless date ranges
6
6
  - overlapping date ranges
7
7
  - consecutive date ranges
8
- - one day ranges
8
+ - one day date ranges
9
9
 
10
10
  It also allows to calculate availabilities from a dedicated date in time.
11
11
 
@@ -29,29 +29,24 @@ Or install it yourself as:
29
29
 
30
30
  ```ruby
31
31
  # Build an array with all the date ranges you are looking an availability for
32
- range_array = [Date.new(1999, 1, 2)..Date.new(1999, 5, 1), Date.new(2000, 1, 1)..Date.new(2000, 2, 1), Date.new(2000, 3, 1)..nil]
32
+ holidays = [Date.new(1999, 1, 2)..Date.new(1999, 5, 1), Date.new(2000, 1, 1)..Date.new(2000, 2, 1), Date.new(2000, 3, 1)..nil]
33
33
 
34
- Availabiliter.get_availabilities(range_array)
34
+ Availabiliter.get_availabilities(holidays)
35
35
  # => [Date.new(1999, 5, 2)..Date.new(1999, 12, 31), Date.new(2000, 2, 2)..Date.new(2000, 2, 29)]
36
36
 
37
37
  # If you want to retrieve availabilities starting from a specific date simply add it as a second argument
38
- Availabiliter.get_availabilities(range_array, Date.new(1999, 12, 15))
38
+ Availabiliter.get_availabilities(holidays, Date.new(1999, 12, 15))
39
39
  # => [Date.new(1999, 12, 15)..Date.new(1999, 12, 31), Date.new(2000, 2, 2)..Date.new(2000, 2, 29)]
40
40
 
41
41
  # If all of your date ranges have an end the last availability will be endless
42
- range_array = [Date.new(1999, 1, 2)..Date.new(1999, 5, 1)]
42
+ holidays = [Date.new(1999, 1, 2)..Date.new(1999, 5, 1)]
43
43
 
44
- Availabiliter.get_availabilities(range_array)
44
+ Availabiliter.get_availabilities(holidays)
45
45
  # => [Date.new(1999, 5, 2)..]
46
46
 
47
47
  ```
48
- ## Dependencies
49
-
50
- This gem depends solely on Active Support gem. One of the future planned improvement is to remove this dependency.
51
-
52
48
  ## Future improvements
53
49
 
54
- - remove any dependency from the project
55
50
  - support Datetime
56
51
  - support beginless ranges
57
52
 
@@ -28,7 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
 
31
- spec.add_dependency "activesupport", "~> 6.1.3.2"
32
31
  spec.add_development_dependency "byebug", "~> 11.1.3"
33
32
  spec.add_development_dependency "rake", "~> 13.0.3"
34
33
  spec.add_development_dependency "rspec", "~> 3.10"
@@ -1,66 +1,68 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/date/calculations"
3
+ require "date"
4
4
 
5
- # DateRange is a Range with only dates
6
- # DateRange start_date is always the earliest date and end_date the latest date
7
- class DateRange < Range
8
- include Comparable
5
+ module Availabiliter
6
+ # DateRange is a Range with only dates
7
+ # DateRange start_date is always the earliest date and end_date the latest date
8
+ class DateRange < Range
9
+ include Comparable
9
10
 
10
- alias start_date begin
11
- alias end_date end
11
+ alias start_date begin
12
+ alias end_date end
12
13
 
13
- def initialize(start_date, end_date)
14
- super
15
- raise ArgumentError, "bad value for DateRange" unless valid?
16
- end
14
+ def initialize(start_date, end_date)
15
+ super
16
+ raise ArgumentError, "bad value for DateRange" unless valid?
17
+ end
17
18
 
18
- def independent?(other)
19
- return true if other.nil?
19
+ def independent?(other)
20
+ return true if other.nil?
20
21
 
21
- !overlaps?(other) && !adjacent?(other)
22
- end
22
+ !overlaps?(other) && !adjacent?(other)
23
+ end
23
24
 
24
- def tomorrow
25
- end_date&.tomorrow
26
- end
25
+ def tomorrow
26
+ end_date&.next_day
27
+ end
27
28
 
28
- def yesterday
29
- start_date.yesterday
30
- end
29
+ def yesterday
30
+ start_date.prev_day
31
+ end
31
32
 
32
- ## adjacent == touches but doesn't overlap other DateRange
33
- def adjacent?(other)
34
- return other.end_date == yesterday if end_date.nil?
33
+ ## adjacent == touches but doesn't overlap other DateRange
34
+ def adjacent?(other)
35
+ return other.end_date == yesterday if end_date.nil?
35
36
 
36
- other.end_date == yesterday || other.start_date == tomorrow
37
- end
37
+ other.end_date == yesterday || other.start_date == tomorrow
38
+ end
38
39
 
39
- def overlaps?(other)
40
- cover?(other.begin) || other.cover?(first)
41
- end
40
+ def overlaps?(other)
41
+ cover?(other.begin) || other.cover?(first)
42
+ end
42
43
 
43
- def next_availability(next_date_range)
44
- return if end_date.nil?
45
- return tomorrow..nil if next_date_range.nil?
46
- return unless independent?(next_date_range)
44
+ def next_availability(next_date_range)
45
+ return if end_date.nil?
46
+ return tomorrow..nil if next_date_range.nil?
47
+ return unless independent?(next_date_range)
47
48
 
48
- gap_start = tomorrow
49
- gap_end = next_date_range.yesterday
49
+ gap_start = tomorrow
50
+ gap_end = next_date_range.yesterday
50
51
 
51
- gap_start..gap_end
52
- end
52
+ gap_start..gap_end
53
+ end
53
54
 
54
- def furthest(other)
55
- return self if end_date.nil? || other.nil?
56
- return other if other.end_date.nil?
55
+ def furthest(other)
56
+ return self if end_date.nil? || other.nil?
57
+ return other if other.end_date.nil?
57
58
 
58
- [self, other].max_by(&:end_date)
59
- end
59
+ [self, other].max_by(&:end_date)
60
+ end
60
61
 
61
- private
62
+ private
62
63
 
63
- def valid?
64
- start_date.instance_of?(Date) && (end_date.nil? || start_date < end_date)
64
+ def valid?
65
+ start_date.instance_of?(Date) && (end_date.nil? || start_date < end_date)
66
+ end
65
67
  end
66
68
  end
@@ -2,66 +2,68 @@
2
2
 
3
3
  require_relative "date_range"
4
4
 
5
- # A TimeFrame is an object representing several DateRange instances. It can have a start.
6
- # It can have only one endless DateRange.
7
- class TimeFrame
8
- attr_reader :start_date, :date_ranges
5
+ module Availabiliter
6
+ # A TimeFrame is an object representing several DateRange instances. It can have a start.
7
+ # It can have only one endless DateRange.
8
+ class TimeFrame
9
+ attr_reader :start_date, :date_ranges
9
10
 
10
- def initialize(array, start_date = nil)
11
- @start_date = start_date
12
- @date_ranges = build_date_ranges(array)
11
+ def initialize(array, start_date = nil)
12
+ @start_date = start_date
13
+ @date_ranges = build_date_ranges(array)
13
14
 
14
- raise ArgumentError unless valid?
15
- end
15
+ raise ArgumentError unless valid?
16
+ end
16
17
 
17
- def availabilities
18
- return [start_date..nil] if date_ranges.empty?
19
- return build_availabilities if start_date.nil?
18
+ def availabilities
19
+ return [start_date..nil] if date_ranges.empty?
20
+ return build_availabilities if start_date.nil?
20
21
 
21
- availabilities = build_availabilities
22
- start_date < first_date_range.start_date ? availabilities.unshift(first_availability) : availabilities
23
- end
22
+ availabilities = build_availabilities
23
+ start_date < first_date_range.start_date ? availabilities.unshift(first_availability) : availabilities
24
+ end
24
25
 
25
- private
26
+ private
26
27
 
27
- def build_date_ranges(array)
28
- date_range_array = array.filter_map do |range|
29
- next if out_of_timeframe?(range.end)
28
+ def build_date_ranges(array)
29
+ date_range_array = array.filter_map do |range|
30
+ next if out_of_timeframe?(range.end)
30
31
 
31
- DateRange.new(range.begin, range.end)
32
- end
32
+ DateRange.new(range.begin, range.end)
33
+ end
33
34
 
34
- date_range_array.sort_by(&:start_date)
35
- end
35
+ date_range_array.sort_by(&:start_date)
36
+ end
36
37
 
37
- def build_availabilities
38
- furthest_date_range = first_date_range
38
+ def build_availabilities
39
+ furthest_date_range = first_date_range
39
40
 
40
- date_ranges.filter_map.with_index do |date_range, index|
41
- next_date_range = date_ranges[index + 1]
41
+ date_ranges.filter_map.with_index do |date_range, index|
42
+ next_date_range = date_ranges[index + 1]
42
43
 
43
- furthest_date_range = furthest_date_range.furthest(date_range)
44
- furthest_date_range.next_availability(next_date_range)
44
+ furthest_date_range = furthest_date_range.furthest(date_range)
45
+ furthest_date_range.next_availability(next_date_range)
46
+ end
45
47
  end
46
- end
47
48
 
48
- def out_of_timeframe?(range_end)
49
- start_date.present? && (range_end.present? && range_end < start_date)
50
- end
49
+ def out_of_timeframe?(range_end)
50
+ !start_date.nil? && (!range_end.nil? && range_end < start_date)
51
+ end
51
52
 
52
- def first_availability
53
- start_date..first_date_range.yesterday
54
- end
53
+ def first_availability
54
+ start_date..first_date_range.yesterday
55
+ end
55
56
 
56
- def first_date_range
57
- date_ranges.first
58
- end
57
+ def first_date_range
58
+ date_ranges.first
59
+ end
59
60
 
60
- def valid?
61
- end_date_valid? && date_ranges.count { |date_range| date_range.end_date.nil? } <= 1
62
- end
61
+ def valid?
62
+ end_date_valid? && date_ranges.count { |date_range| date_range.end_date.nil? } <= 1
63
+ end
63
64
 
64
- def end_date_valid?
65
- start_date.instance_of?(Date) || start_date.instance_of?(NilClass)
65
+ def end_date_valid?
66
+ start_date.instance_of?(Date) || start_date.instance_of?(NilClass)
67
+ end
66
68
  end
67
69
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Availabiliter
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: availabiliter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - lioneldebauge
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-13 00:00:00.000000000 Z
11
+ date: 2021-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 6.1.3.2
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 6.1.3.2
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: byebug
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +66,7 @@ dependencies:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
68
  version: 1.16.1
83
- description:
69
+ description:
84
70
  email:
85
71
  - lionel@livecolonies.com
86
72
  executables: []
@@ -93,7 +79,6 @@ files:
93
79
  - ".rubocop.yml"
94
80
  - CHANGELOG.md
95
81
  - Gemfile
96
- - Gemfile.lock
97
82
  - LICENSE.txt
98
83
  - README.md
99
84
  - Rakefile
@@ -112,7 +97,7 @@ metadata:
112
97
  homepage_uri: https://github.com/lioneldebauge/availabiliter.git
113
98
  source_code_uri: https://github.com/lioneldebauge/availabiliter.git
114
99
  changelog_uri: https://github.com/lioneldebauge/availabiliter/blob/main/CHANGELOG.md
115
- post_install_message:
100
+ post_install_message:
116
101
  rdoc_options: []
117
102
  require_paths:
118
103
  - lib
@@ -127,8 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
112
  - !ruby/object:Gem::Version
128
113
  version: '0'
129
114
  requirements: []
130
- rubygems_version: 3.2.15
131
- signing_key:
115
+ rubygems_version: 3.1.4
116
+ signing_key:
132
117
  specification_version: 4
133
118
  summary: Availabiliter calculates availabilities for ruby ranges within a given time
134
119
  frame.
data/Gemfile.lock DELETED
@@ -1,71 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- availabiliter (0.1.0)
5
- activesupport (~> 6.1.3.2)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- activesupport (6.1.3.2)
11
- concurrent-ruby (~> 1.0, >= 1.0.2)
12
- i18n (>= 1.6, < 2)
13
- minitest (>= 5.1)
14
- tzinfo (~> 2.0)
15
- zeitwerk (~> 2.3)
16
- ast (2.4.2)
17
- byebug (11.1.3)
18
- concurrent-ruby (1.1.9)
19
- diff-lcs (1.4.4)
20
- i18n (1.8.10)
21
- concurrent-ruby (~> 1.0)
22
- minitest (5.14.4)
23
- parallel (1.20.1)
24
- parser (3.0.1.1)
25
- ast (~> 2.4.1)
26
- rainbow (3.0.0)
27
- rake (13.0.3)
28
- regexp_parser (2.1.1)
29
- rexml (3.2.5)
30
- rspec (3.10.0)
31
- rspec-core (~> 3.10.0)
32
- rspec-expectations (~> 3.10.0)
33
- rspec-mocks (~> 3.10.0)
34
- rspec-core (3.10.1)
35
- rspec-support (~> 3.10.0)
36
- rspec-expectations (3.10.1)
37
- diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.10.0)
39
- rspec-mocks (3.10.2)
40
- diff-lcs (>= 1.2.0, < 2.0)
41
- rspec-support (~> 3.10.0)
42
- rspec-support (3.10.2)
43
- rubocop (1.16.1)
44
- parallel (~> 1.10)
45
- parser (>= 3.0.0.0)
46
- rainbow (>= 2.2.2, < 4.0)
47
- regexp_parser (>= 1.8, < 3.0)
48
- rexml
49
- rubocop-ast (>= 1.7.0, < 2.0)
50
- ruby-progressbar (~> 1.7)
51
- unicode-display_width (>= 1.4.0, < 3.0)
52
- rubocop-ast (1.7.0)
53
- parser (>= 3.0.1.1)
54
- ruby-progressbar (1.11.0)
55
- tzinfo (2.0.4)
56
- concurrent-ruby (~> 1.0)
57
- unicode-display_width (2.0.0)
58
- zeitwerk (2.4.2)
59
-
60
- PLATFORMS
61
- arm64-darwin-20
62
-
63
- DEPENDENCIES
64
- availabiliter!
65
- byebug (~> 11.1.3)
66
- rake (~> 13.0.3)
67
- rspec (~> 3.10)
68
- rubocop (~> 1.16.1)
69
-
70
- BUNDLED WITH
71
- 2.2.15