availability 0.0.4 → 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 +4 -4
- data/README.md +1 -1
- data/availability.gemspec +1 -1
- data/examples/scheduler.rb +1 -1
- data/lib/availability.rb +2 -1
- data/lib/availability/abstract_availability.rb +7 -1
- data/lib/availability/exclusion.rb +14 -9
- data/lib/availability/instance_variable_comparability.rb +16 -0
- data/lib/availability/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5694685226c41dca7879ede7f7465d55bef2e355
|
4
|
+
data.tar.gz: bcd53b5d00090dfc2460500343fc938a6bb951f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61392ce35039f61bb39d9d71c0801586e10a572c68befaf3f8ea000cfb8e6d538205a3f18049e4b21db28fc3ca158d768870ee92906e35b1d5066e31bc38afaa
|
7
|
+
data.tar.gz: 440aeb3e3f13046b00855e5e3a917ea07d2e6478a941ad87a7e2201279d91610ea3e69e91aacc32374c84e0f7adaa8962b8211845831916abecb83fc0034487c
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[](https://badge.fury.io/rb/availability)
|
6
6
|
[read the docs][DOCS]
|
7
7
|
|
8
|
-
This library uses modular arithmetic and residue classes to calculate schedule availability for dates.
|
8
|
+
This library uses modular arithmetic and residue classes to calculate schedule availability for dates. The goal is to create an easy-to-use API for schedule availability that is very fast and lightweight that is also easy and lightweight to persist in a database.
|
9
9
|
|
10
10
|
Shout out to @dpmccabe for his [original article](http://dmcca.be/2014/01/09/recurring-subscriptions-with-ruby-rspec-and-modular-arithmetic.html) and code.
|
11
11
|
|
data/availability.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["jacaetevha@gmail.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{Calculating schedule availability}
|
13
|
-
spec.description = %q{Use modular arithmetic and residue classes to calculate schedule availability for dates
|
13
|
+
spec.description = %q{Use modular arithmetic and residue classes to calculate schedule availability for dates and times.}
|
14
14
|
spec.homepage = "https://github.com/upper-hand/availability"
|
15
15
|
spec.license = "Unlicense"
|
16
16
|
spec.required_ruby_version = '>= 2.0'
|
data/examples/scheduler.rb
CHANGED
@@ -8,7 +8,7 @@ class Scheduler
|
|
8
8
|
attr_reader :availabilities, :scheduled
|
9
9
|
|
10
10
|
#
|
11
|
-
# availabilities: a list of Availability instances defining when the resource is available
|
11
|
+
# availabilities: a list of Availability::AbstractAvailability instances defining when the resource is available
|
12
12
|
#
|
13
13
|
def initialize(availabilities)
|
14
14
|
@availabilities = validate_availabilities availabilities
|
data/lib/availability.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
require 'active_support/core_ext'
|
3
|
-
require_relative
|
3
|
+
require_relative 'availability/version'
|
4
|
+
require_relative 'availability/instance_variable_comparability'
|
4
5
|
require_relative 'availability/createable'
|
5
6
|
require_relative 'availability/exclusion'
|
6
7
|
require_relative 'availability/abstract_availability'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Availability
|
2
2
|
# @abstract see concrete classes: Once, Daily, Weekly, Monthly and Yearly
|
3
|
-
class AbstractAvailability
|
3
|
+
class AbstractAvailability < InstanceVariableComparability
|
4
4
|
private_class_method :new # :nodoc:
|
5
5
|
|
6
6
|
attr_accessor :capacity, :duration, :stops_by
|
@@ -201,6 +201,12 @@ module Availability
|
|
201
201
|
|
202
202
|
# @!endgroup
|
203
203
|
|
204
|
+
protected
|
205
|
+
|
206
|
+
def comparability_ivar_names
|
207
|
+
%w{@capacity @exclusions @stops_by @duration @interval @start_time}
|
208
|
+
end
|
209
|
+
|
204
210
|
private
|
205
211
|
|
206
212
|
def compute_residue
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Availability
|
2
|
-
class Exclusion
|
2
|
+
class Exclusion < InstanceVariableComparability
|
3
3
|
attr_reader :rule
|
4
4
|
|
5
5
|
def self.after_day(date)
|
@@ -48,13 +48,18 @@ module Availability
|
|
48
48
|
@rule = rule
|
49
49
|
end
|
50
50
|
|
51
|
+
def <=>(other)
|
52
|
+
return 1 if other.nil?
|
53
|
+
rule <=> other.rule
|
54
|
+
end
|
55
|
+
|
51
56
|
def violated_by?(time)
|
52
57
|
@rule.violated_by? time
|
53
58
|
end
|
54
59
|
|
55
60
|
private
|
56
61
|
module Rule
|
57
|
-
class AfterDate
|
62
|
+
class AfterDate < InstanceVariableComparability
|
58
63
|
def initialize(date)
|
59
64
|
@date = date
|
60
65
|
end
|
@@ -64,7 +69,7 @@ module Availability
|
|
64
69
|
end
|
65
70
|
end
|
66
71
|
|
67
|
-
class AfterDateAndTime
|
72
|
+
class AfterDateAndTime < InstanceVariableComparability
|
68
73
|
def initialize(time)
|
69
74
|
@after_date = AfterDate.new time.to_date
|
70
75
|
@after_time = AfterTime.new time
|
@@ -75,7 +80,7 @@ module Availability
|
|
75
80
|
end
|
76
81
|
end
|
77
82
|
|
78
|
-
class AfterTime
|
83
|
+
class AfterTime < InstanceVariableComparability
|
79
84
|
def initialize(date_or_time)
|
80
85
|
@compare_to = date_or_time.to_time
|
81
86
|
end
|
@@ -85,7 +90,7 @@ module Availability
|
|
85
90
|
end
|
86
91
|
end
|
87
92
|
|
88
|
-
class BeforeDate
|
93
|
+
class BeforeDate < InstanceVariableComparability
|
89
94
|
def initialize(date)
|
90
95
|
@date = date
|
91
96
|
end
|
@@ -95,7 +100,7 @@ module Availability
|
|
95
100
|
end
|
96
101
|
end
|
97
102
|
|
98
|
-
class BeforeDateAndTime
|
103
|
+
class BeforeDateAndTime < InstanceVariableComparability
|
99
104
|
def initialize(time)
|
100
105
|
@before_date = BeforeDate.new time.to_date
|
101
106
|
@before_time = BeforeTime.new time
|
@@ -106,7 +111,7 @@ module Availability
|
|
106
111
|
end
|
107
112
|
end
|
108
113
|
|
109
|
-
class BeforeTime
|
114
|
+
class BeforeTime < InstanceVariableComparability
|
110
115
|
def initialize(date_or_time)
|
111
116
|
@compare_to = date_or_time.to_time
|
112
117
|
end
|
@@ -116,7 +121,7 @@ module Availability
|
|
116
121
|
end
|
117
122
|
end
|
118
123
|
|
119
|
-
class OnDate
|
124
|
+
class OnDate < InstanceVariableComparability
|
120
125
|
def initialize(date)
|
121
126
|
@date = date
|
122
127
|
end
|
@@ -126,7 +131,7 @@ module Availability
|
|
126
131
|
end
|
127
132
|
end
|
128
133
|
|
129
|
-
class OnDayOfWeek
|
134
|
+
class OnDayOfWeek < InstanceVariableComparability
|
130
135
|
def initialize(day_of_week)
|
131
136
|
@day_of_week = day_of_week
|
132
137
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class InstanceVariableComparability
|
2
|
+
include Comparable
|
3
|
+
def <=>(other)
|
4
|
+
return 1 if other.nil?
|
5
|
+
comparisons = comparability_ivar_names.map do |ivar|
|
6
|
+
instance_variable_get(ivar) <=> other.instance_variable_get(ivar)
|
7
|
+
end.reject { |c| c == 0 }
|
8
|
+
return 0 if comparisons.empty?
|
9
|
+
comparisons.inject(0) { |acc, each| acc + each } >= 1 ? 1 : -1
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
def comparability_ivar_names
|
14
|
+
instance_variables
|
15
|
+
end
|
16
|
+
end
|
data/lib/availability/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: availability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Rogers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
description: Use modular arithmetic and residue classes to calculate schedule availability
|
112
|
-
for dates
|
112
|
+
for dates and times.
|
113
113
|
email:
|
114
114
|
- jacaetevha@gmail.com
|
115
115
|
executables: []
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- lib/availability/exclusion.rb
|
143
143
|
- lib/availability/factory_methods.rb
|
144
144
|
- lib/availability/hourly.rb
|
145
|
+
- lib/availability/instance_variable_comparability.rb
|
145
146
|
- lib/availability/monthly.rb
|
146
147
|
- lib/availability/once.rb
|
147
148
|
- lib/availability/version.rb
|