biz 1.3.4 → 1.4.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/lib/biz/calculation/for_duration.rb +7 -1
- data/lib/biz/configuration.rb +7 -2
- data/lib/biz/core_ext/fixnum.rb +1 -1
- data/lib/biz/date.rb +8 -3
- data/lib/biz/dates.rb +1 -1
- data/lib/biz/day_of_week.rb +28 -41
- data/lib/biz/day_time.rb +21 -55
- data/lib/biz/duration.rb +9 -17
- data/lib/biz/holiday.rb +17 -3
- data/lib/biz/interval.rb +14 -3
- data/lib/biz/periods/after.rb +1 -1
- data/lib/biz/periods/before.rb +3 -3
- data/lib/biz/time.rb +64 -12
- data/lib/biz/time_segment.rb +11 -10
- data/lib/biz/validation.rb +10 -10
- data/lib/biz/version.rb +1 -1
- data/lib/biz/week.rb +8 -20
- data/lib/biz/week_time/abstract.rb +8 -32
- data/lib/biz/week_time/end.rb +1 -3
- data/lib/biz/week_time/start.rb +4 -4
- data/lib/biz.rb +0 -1
- metadata +3 -5
- data/lib/biz/day.rb +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44d8fc924a2b8a852ff1764be148922e4008590d
|
4
|
+
data.tar.gz: 29ac9f7b0423c1b3d329b1d5e7485071fcf32ef3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4a37ee33bd1d466bc7fd6bab13a36ccc6c1fad2ecad17f4ea3332aec2fd5233fd7bd8419354966eba261eee22a74fc2c137458fd22cf2d9cda5ace0d909db8a
|
7
|
+
data.tar.gz: 54078121bab03914cbbeac6a03d2cc4c9dae945c8fbd36d387badf48bdafa5afbc7d3e40e76a818495cddc92b833144cb418905f836a4778655ea5559d6b93ed
|
@@ -2,7 +2,13 @@ module Biz
|
|
2
2
|
module Calculation
|
3
3
|
class ForDuration
|
4
4
|
|
5
|
-
UNITS =
|
5
|
+
UNITS = %i[second seconds minute minutes hour hours day days].freeze
|
6
|
+
|
7
|
+
private_constant :UNITS
|
8
|
+
|
9
|
+
def self.units
|
10
|
+
UNITS
|
11
|
+
end
|
6
12
|
|
7
13
|
def self.with_unit(schedule, scalar, unit)
|
8
14
|
unless UNITS.include?(unit)
|
data/lib/biz/configuration.rb
CHANGED
@@ -2,7 +2,9 @@ module Biz
|
|
2
2
|
class Configuration
|
3
3
|
|
4
4
|
def initialize
|
5
|
-
@raw = Raw.new
|
5
|
+
@raw = Raw.new
|
6
|
+
|
7
|
+
yield raw if block_given?
|
6
8
|
|
7
9
|
Validation.perform(raw)
|
8
10
|
end
|
@@ -12,7 +14,7 @@ module Biz
|
|
12
14
|
raw
|
13
15
|
.hours
|
14
16
|
.flat_map { |weekday, hours| weekday_intervals(weekday, hours) }
|
15
|
-
.
|
17
|
+
.sort
|
16
18
|
.freeze
|
17
19
|
end
|
18
20
|
end
|
@@ -78,5 +80,8 @@ module Biz
|
|
78
80
|
alias_method :business_hours=, :hours=
|
79
81
|
end
|
80
82
|
|
83
|
+
private_constant :Raw,
|
84
|
+
:Default
|
85
|
+
|
81
86
|
end
|
82
87
|
end
|
data/lib/biz/core_ext/fixnum.rb
CHANGED
data/lib/biz/date.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
module Biz
|
2
2
|
class Date
|
3
3
|
|
4
|
-
EPOCH = ::Date.new(2006, 1, 1)
|
4
|
+
EPOCH = ::Date.new(2006, 1, 1).freeze
|
5
|
+
|
6
|
+
private_constant :EPOCH
|
7
|
+
|
8
|
+
def self.epoch
|
9
|
+
EPOCH
|
10
|
+
end
|
5
11
|
|
6
12
|
def self.from_day(day)
|
7
13
|
EPOCH + day
|
8
14
|
end
|
9
15
|
|
10
16
|
def self.for_dst(date, day_time)
|
11
|
-
date +
|
12
|
-
(day_time.day_second + Time::SECONDS_IN_HOUR) / Time::SECONDS_IN_DAY
|
17
|
+
date + (day_time.day_second + Time.hour_seconds) / Time.day_seconds
|
13
18
|
end
|
14
19
|
|
15
20
|
end
|
data/lib/biz/dates.rb
CHANGED
data/lib/biz/day_of_week.rb
CHANGED
@@ -3,44 +3,30 @@ module Biz
|
|
3
3
|
|
4
4
|
SYMBOLS = %i[sun mon tue wed thu fri sat].freeze
|
5
5
|
|
6
|
-
|
7
|
-
DAYS.fetch(time.wday)
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.from_symbol(symbol)
|
11
|
-
DAYS.fetch(SYMBOLS.index(symbol))
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.first
|
15
|
-
DAYS.first
|
16
|
-
end
|
6
|
+
include Comparable
|
17
7
|
|
18
|
-
def self.
|
19
|
-
|
8
|
+
def self.all
|
9
|
+
ALL
|
20
10
|
end
|
21
11
|
|
22
|
-
|
23
|
-
|
24
|
-
alias from_date from_time
|
25
|
-
|
12
|
+
def self.from_symbol(symbol)
|
13
|
+
ALL.fetch(SYMBOLS.index(symbol))
|
26
14
|
end
|
27
15
|
|
28
|
-
attr_reader :wday
|
29
|
-
|
30
16
|
def initialize(wday)
|
31
17
|
@wday = Integer(wday)
|
32
18
|
end
|
33
19
|
|
34
|
-
def contains?(
|
35
|
-
minutes.cover?(
|
20
|
+
def contains?(week_minute)
|
21
|
+
minutes.cover?(week_minute)
|
36
22
|
end
|
37
23
|
|
38
24
|
def start_minute
|
39
|
-
wday * Time
|
25
|
+
wday * Time.day_minutes
|
40
26
|
end
|
41
27
|
|
42
28
|
def end_minute
|
43
|
-
start_minute + Time
|
29
|
+
start_minute + Time.day_minutes
|
44
30
|
end
|
45
31
|
|
46
32
|
def minutes
|
@@ -52,30 +38,31 @@ module Biz
|
|
52
38
|
end
|
53
39
|
|
54
40
|
def day_minute(week_minute)
|
55
|
-
(week_minute - 1) % Time
|
41
|
+
(week_minute - 1) % Time.day_minutes + 1
|
56
42
|
end
|
57
43
|
|
58
44
|
def symbol
|
59
45
|
SYMBOLS.fetch(wday)
|
60
46
|
end
|
61
47
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
48
|
+
def wday?(other_wday)
|
49
|
+
wday == other_wday
|
50
|
+
end
|
51
|
+
|
52
|
+
def <=>(other)
|
53
|
+
return unless other.is_a?(self.class)
|
54
|
+
|
55
|
+
wday <=> other.wday
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
attr_reader :wday
|
61
|
+
|
62
|
+
ALL = (0..6).map(&method(:new)).freeze
|
63
|
+
|
64
|
+
private_constant :SYMBOLS,
|
65
|
+
:ALL
|
79
66
|
|
80
67
|
end
|
81
68
|
end
|
data/lib/biz/day_time.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Biz
|
2
2
|
class DayTime
|
3
3
|
|
4
|
-
VALID_SECONDS = 0..Time
|
4
|
+
VALID_SECONDS = (0..Time.day_seconds).freeze
|
5
5
|
|
6
6
|
module Timestamp
|
7
7
|
FORMAT = '%02d:%02d'.freeze
|
@@ -10,31 +10,29 @@ module Biz
|
|
10
10
|
|
11
11
|
include Comparable
|
12
12
|
|
13
|
-
extend Forwardable
|
14
|
-
|
15
13
|
class << self
|
16
14
|
|
17
15
|
def from_time(time)
|
18
16
|
new(
|
19
|
-
time.hour * Time
|
20
|
-
time.min * Time
|
17
|
+
time.hour * Time.hour_seconds +
|
18
|
+
time.min * Time.minute_seconds +
|
21
19
|
time.sec
|
22
20
|
)
|
23
21
|
end
|
24
22
|
|
25
23
|
def from_minute(minute)
|
26
|
-
new(minute * Time
|
24
|
+
new(minute * Time.minute_seconds)
|
27
25
|
end
|
28
26
|
|
29
27
|
def from_hour(hour)
|
30
|
-
new(hour * Time
|
28
|
+
new(hour * Time.hour_seconds)
|
31
29
|
end
|
32
30
|
|
33
31
|
def from_timestamp(timestamp)
|
34
32
|
timestamp.match(Timestamp::PATTERN) { |match|
|
35
33
|
new(
|
36
|
-
match[:hour].to_i * Time
|
37
|
-
match[:minute].to_i * Time
|
34
|
+
match[:hour].to_i * Time.hour_seconds +
|
35
|
+
match[:minute].to_i * Time.minute_seconds +
|
38
36
|
match[:second].to_i
|
39
37
|
)
|
40
38
|
}
|
@@ -44,29 +42,12 @@ module Biz
|
|
44
42
|
MIDNIGHT
|
45
43
|
end
|
46
44
|
|
47
|
-
alias am midnight
|
48
|
-
|
49
|
-
def noon
|
50
|
-
NOON
|
51
|
-
end
|
52
|
-
|
53
|
-
alias pm noon
|
54
|
-
|
55
45
|
def endnight
|
56
46
|
ENDNIGHT
|
57
47
|
end
|
58
48
|
|
59
49
|
end
|
60
50
|
|
61
|
-
attr_reader :day_second
|
62
|
-
|
63
|
-
delegate strftime: :format_time
|
64
|
-
|
65
|
-
delegate %i[
|
66
|
-
to_i
|
67
|
-
to_int
|
68
|
-
] => :day_second
|
69
|
-
|
70
51
|
def initialize(day_second)
|
71
52
|
@day_second = Integer(day_second)
|
72
53
|
|
@@ -75,60 +56,45 @@ module Biz
|
|
75
56
|
end
|
76
57
|
end
|
77
58
|
|
59
|
+
attr_reader :day_second
|
60
|
+
|
78
61
|
def hour
|
79
|
-
day_second / Time
|
62
|
+
day_second / Time.hour_seconds
|
80
63
|
end
|
81
64
|
|
82
65
|
def minute
|
83
|
-
day_second % Time
|
66
|
+
day_second % Time.hour_seconds / Time.minute_seconds
|
84
67
|
end
|
85
68
|
|
86
69
|
def second
|
87
|
-
day_second % Time
|
70
|
+
day_second % Time.minute_seconds
|
88
71
|
end
|
89
72
|
|
90
73
|
def day_minute
|
91
|
-
hour * Time
|
74
|
+
hour * Time.hour_minutes + minute
|
92
75
|
end
|
93
76
|
|
94
77
|
def for_dst
|
95
|
-
self.class.new(
|
96
|
-
(day_second + Time::SECONDS_IN_HOUR) % Time::SECONDS_IN_DAY
|
97
|
-
)
|
78
|
+
self.class.new((day_second + Time.hour_seconds) % Time.day_seconds)
|
98
79
|
end
|
99
80
|
|
100
81
|
def timestamp
|
101
82
|
format(Timestamp::FORMAT, hour, minute)
|
102
83
|
end
|
103
84
|
|
104
|
-
def coerce(other)
|
105
|
-
[self.class.new(other), self]
|
106
|
-
end
|
107
|
-
|
108
|
-
protected
|
109
|
-
|
110
85
|
def <=>(other)
|
111
|
-
return
|
112
|
-
|
113
|
-
day_second <=> other.to_i
|
114
|
-
end
|
86
|
+
return unless other.is_a?(self.class)
|
115
87
|
|
116
|
-
|
117
|
-
|
118
|
-
def format_time
|
119
|
-
::Time.new(
|
120
|
-
Date::EPOCH.year,
|
121
|
-
Date::EPOCH.month,
|
122
|
-
Date::EPOCH.mday,
|
123
|
-
hour,
|
124
|
-
minute,
|
125
|
-
second
|
126
|
-
)
|
88
|
+
day_second <=> other.day_second
|
127
89
|
end
|
128
90
|
|
129
91
|
MIDNIGHT = from_hour(0)
|
130
|
-
NOON = from_hour(12)
|
131
92
|
ENDNIGHT = from_hour(24)
|
132
93
|
|
94
|
+
private_constant :VALID_SECONDS,
|
95
|
+
:Timestamp,
|
96
|
+
:MIDNIGHT,
|
97
|
+
:ENDNIGHT
|
98
|
+
|
133
99
|
end
|
134
100
|
end
|
data/lib/biz/duration.rb
CHANGED
@@ -3,8 +3,6 @@ module Biz
|
|
3
3
|
|
4
4
|
include Comparable
|
5
5
|
|
6
|
-
extend Forwardable
|
7
|
-
|
8
6
|
class << self
|
9
7
|
|
10
8
|
def seconds(seconds)
|
@@ -14,23 +12,19 @@ module Biz
|
|
14
12
|
alias second seconds
|
15
13
|
|
16
14
|
def minutes(minutes)
|
17
|
-
new(minutes * Time
|
15
|
+
new(minutes * Time.minute_seconds)
|
18
16
|
end
|
19
17
|
|
20
18
|
alias minute minutes
|
21
19
|
|
22
20
|
def hours(hours)
|
23
|
-
new(hours * Time
|
21
|
+
new(hours * Time.hour_seconds)
|
24
22
|
end
|
25
23
|
|
26
24
|
alias hour hours
|
27
25
|
|
28
26
|
end
|
29
27
|
|
30
|
-
attr_reader :seconds
|
31
|
-
|
32
|
-
delegate to_i: :seconds
|
33
|
-
|
34
28
|
def initialize(seconds)
|
35
29
|
@seconds = Integer(seconds)
|
36
30
|
end
|
@@ -40,11 +34,11 @@ module Biz
|
|
40
34
|
end
|
41
35
|
|
42
36
|
def in_minutes
|
43
|
-
seconds / Time
|
37
|
+
seconds / Time.minute_seconds
|
44
38
|
end
|
45
39
|
|
46
40
|
def in_hours
|
47
|
-
seconds / Time
|
41
|
+
seconds / Time.hour_seconds
|
48
42
|
end
|
49
43
|
|
50
44
|
def +(other)
|
@@ -63,17 +57,15 @@ module Biz
|
|
63
57
|
self.class.new(seconds.abs)
|
64
58
|
end
|
65
59
|
|
66
|
-
def
|
67
|
-
|
60
|
+
def <=>(other)
|
61
|
+
return unless other.is_a?(self.class)
|
62
|
+
|
63
|
+
seconds <=> other.seconds
|
68
64
|
end
|
69
65
|
|
70
66
|
protected
|
71
67
|
|
72
|
-
|
73
|
-
return nil unless other.respond_to?(:to_i)
|
74
|
-
|
75
|
-
seconds <=> other.to_i
|
76
|
-
end
|
68
|
+
attr_reader :seconds
|
77
69
|
|
78
70
|
end
|
79
71
|
end
|
data/lib/biz/holiday.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Biz
|
2
2
|
class Holiday
|
3
3
|
|
4
|
-
|
5
|
-
:time_zone
|
4
|
+
include Comparable
|
6
5
|
|
7
6
|
def initialize(date, time_zone)
|
8
7
|
@date = date
|
@@ -20,7 +19,22 @@ module Biz
|
|
20
19
|
)
|
21
20
|
end
|
22
21
|
|
23
|
-
|
22
|
+
def <=>(other)
|
23
|
+
return unless other.is_a?(self.class)
|
24
|
+
|
25
|
+
[date, time_zone] <=> [other.date, other.time_zone]
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
attr_reader :date,
|
31
|
+
:time_zone
|
32
|
+
|
33
|
+
public
|
34
|
+
|
35
|
+
def to_date
|
36
|
+
date
|
37
|
+
end
|
24
38
|
|
25
39
|
end
|
26
40
|
end
|
data/lib/biz/interval.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
module Biz
|
2
2
|
class Interval
|
3
3
|
|
4
|
-
|
5
|
-
:end_time,
|
6
|
-
:time_zone
|
4
|
+
include Comparable
|
7
5
|
|
8
6
|
def initialize(start_time, end_time, time_zone)
|
9
7
|
@start_time = start_time
|
@@ -29,5 +27,18 @@ module Biz
|
|
29
27
|
)
|
30
28
|
end
|
31
29
|
|
30
|
+
def <=>(other)
|
31
|
+
return unless other.is_a?(self.class)
|
32
|
+
|
33
|
+
[start_time, end_time, time_zone] <=>
|
34
|
+
[other.start_time, other.end_time, other.time_zone]
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
attr_reader :start_time,
|
40
|
+
:end_time,
|
41
|
+
:time_zone
|
42
|
+
|
32
43
|
end
|
33
44
|
end
|
data/lib/biz/periods/after.rb
CHANGED
data/lib/biz/periods/before.rb
CHANGED
@@ -9,9 +9,9 @@ module Biz
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def weeks
|
12
|
-
Week
|
13
|
-
|
14
|
-
|
12
|
+
Week
|
13
|
+
.since_epoch(Time.new(time_zone).local(origin))
|
14
|
+
.downto(Week.since_epoch(Time.big_bang))
|
15
15
|
end
|
16
16
|
|
17
17
|
def relevant?(period)
|
data/lib/biz/time.rb
CHANGED
@@ -1,22 +1,70 @@
|
|
1
1
|
module Biz
|
2
2
|
class Time
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
MINUTE_SECONDS = 60
|
5
|
+
HOUR_MINUTES = 60
|
6
|
+
DAY_HOURS = 24
|
7
|
+
WEEK_DAYS = 7
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
SECONDS_IN_WEEK = SECONDS_IN_DAY * DAYS_IN_WEEK
|
9
|
+
HOUR_SECONDS = HOUR_MINUTES * MINUTE_SECONDS
|
10
|
+
DAY_SECONDS = DAY_HOURS * HOUR_SECONDS
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
DAY_MINUTES = DAY_HOURS * HOUR_MINUTES
|
13
|
+
WEEK_MINUTES = WEEK_DAYS * DAY_MINUTES
|
15
14
|
|
16
|
-
BIG_BANG = ::Time.new(-10**100)
|
17
|
-
HEAT_DEATH = ::Time.new(10**100)
|
15
|
+
BIG_BANG = ::Time.new(-10**100).freeze
|
16
|
+
HEAT_DEATH = ::Time.new(10**100).freeze
|
18
17
|
|
19
|
-
|
18
|
+
private_constant :MINUTE_SECONDS,
|
19
|
+
:HOUR_MINUTES,
|
20
|
+
:DAY_HOURS,
|
21
|
+
:WEEK_DAYS,
|
22
|
+
:HOUR_SECONDS,
|
23
|
+
:DAY_SECONDS,
|
24
|
+
:DAY_MINUTES,
|
25
|
+
:WEEK_MINUTES,
|
26
|
+
:BIG_BANG,
|
27
|
+
:HEAT_DEATH
|
28
|
+
|
29
|
+
def self.minute_seconds
|
30
|
+
MINUTE_SECONDS
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.hour_minutes
|
34
|
+
HOUR_MINUTES
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.day_hours
|
38
|
+
DAY_HOURS
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.week_days
|
42
|
+
WEEK_DAYS
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.hour_seconds
|
46
|
+
HOUR_SECONDS
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.day_seconds
|
50
|
+
DAY_SECONDS
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.day_minutes
|
54
|
+
DAY_MINUTES
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.week_minutes
|
58
|
+
WEEK_MINUTES
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.big_bang
|
62
|
+
BIG_BANG
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.heat_death
|
66
|
+
HEAT_DEATH
|
67
|
+
end
|
20
68
|
|
21
69
|
def initialize(time_zone)
|
22
70
|
@time_zone = time_zone
|
@@ -46,5 +94,9 @@ module Biz
|
|
46
94
|
on_date(week.start_date + week_time.wday, week_time.day_time)
|
47
95
|
end
|
48
96
|
|
97
|
+
protected
|
98
|
+
|
99
|
+
attr_reader :time_zone
|
100
|
+
|
49
101
|
end
|
50
102
|
end
|
data/lib/biz/time_segment.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
module Biz
|
2
2
|
class TimeSegment
|
3
3
|
|
4
|
+
include Comparable
|
5
|
+
|
4
6
|
def self.before(time)
|
5
|
-
new(Time
|
7
|
+
new(Time.big_bang, time)
|
6
8
|
end
|
7
9
|
|
8
10
|
def self.after(time)
|
9
|
-
new(time, Time
|
11
|
+
new(time, Time.heat_death)
|
10
12
|
end
|
11
13
|
|
12
|
-
attr_reader :start_time,
|
13
|
-
:end_time
|
14
|
-
|
15
14
|
def initialize(start_time, end_time)
|
16
15
|
@start_time = start_time
|
17
16
|
@end_time = end_time
|
18
17
|
end
|
19
18
|
|
19
|
+
attr_reader :start_time,
|
20
|
+
:end_time
|
21
|
+
|
20
22
|
def duration
|
21
23
|
Duration.new(end_time - start_time)
|
22
24
|
end
|
@@ -40,11 +42,10 @@ module Biz
|
|
40
42
|
)
|
41
43
|
end
|
42
44
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
].reject(&:empty?).map { |potential| self & potential }
|
45
|
+
def <=>(other)
|
46
|
+
return unless other.is_a?(self.class)
|
47
|
+
|
48
|
+
[start_time, end_time] <=> [other.start_time, other.end_time]
|
48
49
|
end
|
49
50
|
|
50
51
|
private
|
data/lib/biz/validation.rb
CHANGED
@@ -37,16 +37,16 @@ module Biz
|
|
37
37
|
|
38
38
|
end
|
39
39
|
|
40
|
-
RULES =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
40
|
+
RULES = [
|
41
|
+
Rule.new('Hours must be hash-like.') { |raw|
|
42
|
+
raw.hours.respond_to?(:to_h)
|
43
|
+
},
|
44
|
+
Rule.new('Hours must be provided.') { |raw|
|
45
|
+
raw.hours.to_h.any?
|
46
|
+
}
|
47
|
+
].freeze
|
48
|
+
|
49
|
+
private_constant :RULES
|
50
50
|
|
51
51
|
end
|
52
52
|
end
|
data/lib/biz/version.rb
CHANGED
data/lib/biz/week.rb
CHANGED
@@ -3,10 +3,8 @@ module Biz
|
|
3
3
|
|
4
4
|
include Comparable
|
5
5
|
|
6
|
-
extend Forwardable
|
7
|
-
|
8
6
|
def self.from_date(date)
|
9
|
-
new(
|
7
|
+
new((date - Date.epoch).to_i / Time.week_days)
|
10
8
|
end
|
11
9
|
|
12
10
|
def self.from_time(time)
|
@@ -19,20 +17,12 @@ module Biz
|
|
19
17
|
|
20
18
|
end
|
21
19
|
|
22
|
-
attr_reader :week
|
23
|
-
|
24
|
-
delegate %i[
|
25
|
-
to_s
|
26
|
-
to_i
|
27
|
-
to_int
|
28
|
-
] => :week
|
29
|
-
|
30
20
|
def initialize(week)
|
31
21
|
@week = Integer(week)
|
32
22
|
end
|
33
23
|
|
34
24
|
def start_date
|
35
|
-
Date.from_day(week * Time
|
25
|
+
Date.from_day(week * Time.week_days)
|
36
26
|
end
|
37
27
|
|
38
28
|
def succ
|
@@ -42,7 +32,7 @@ module Biz
|
|
42
32
|
def downto(final_week)
|
43
33
|
return enum_for(:downto, final_week) unless block_given?
|
44
34
|
|
45
|
-
week.downto(final_week.
|
35
|
+
week.downto(final_week.week).each do |raw_week|
|
46
36
|
yield self.class.new(raw_week)
|
47
37
|
end
|
48
38
|
end
|
@@ -51,17 +41,15 @@ module Biz
|
|
51
41
|
self.class.new(week + other.week)
|
52
42
|
end
|
53
43
|
|
54
|
-
def
|
55
|
-
|
44
|
+
def <=>(other)
|
45
|
+
return unless other.is_a?(self.class)
|
46
|
+
|
47
|
+
week <=> other.week
|
56
48
|
end
|
57
49
|
|
58
50
|
protected
|
59
51
|
|
60
|
-
|
61
|
-
return nil unless other.respond_to?(:to_i)
|
62
|
-
|
63
|
-
week <=> other.to_i
|
64
|
-
end
|
52
|
+
attr_reader :week
|
65
53
|
|
66
54
|
end
|
67
55
|
end
|
@@ -2,20 +2,18 @@ module Biz
|
|
2
2
|
module WeekTime
|
3
3
|
class Abstract
|
4
4
|
|
5
|
-
include Comparable
|
6
|
-
|
7
5
|
extend Forwardable
|
8
6
|
|
7
|
+
include Comparable
|
8
|
+
|
9
9
|
def self.from_time(time)
|
10
10
|
new(
|
11
|
-
time.wday * Time
|
12
|
-
time.hour * Time
|
11
|
+
time.wday * Time.day_minutes +
|
12
|
+
time.hour * Time.hour_minutes +
|
13
13
|
time.min
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
|
-
attr_reader :week_minute
|
18
|
-
|
19
17
|
def initialize(week_minute)
|
20
18
|
@week_minute = Integer(week_minute)
|
21
19
|
end
|
@@ -24,10 +22,6 @@ module Biz
|
|
24
22
|
day_of_week.symbol
|
25
23
|
end
|
26
24
|
|
27
|
-
def coerce(other)
|
28
|
-
[self.class.new(other), self]
|
29
|
-
end
|
30
|
-
|
31
25
|
delegate wday: :day_of_week
|
32
26
|
|
33
27
|
delegate %i[
|
@@ -39,33 +33,15 @@ module Biz
|
|
39
33
|
timestamp
|
40
34
|
] => :day_time
|
41
35
|
|
42
|
-
delegate strftime: :week_time
|
43
|
-
|
44
|
-
delegate %i[
|
45
|
-
to_s
|
46
|
-
to_i
|
47
|
-
to_int
|
48
|
-
] => :week_minute
|
49
|
-
|
50
|
-
protected
|
51
|
-
|
52
36
|
def <=>(other)
|
53
|
-
return
|
37
|
+
return unless other.is_a?(WeekTime::Abstract)
|
54
38
|
|
55
|
-
week_minute <=> other.
|
39
|
+
week_minute <=> other.week_minute
|
56
40
|
end
|
57
41
|
|
58
|
-
|
42
|
+
protected
|
59
43
|
|
60
|
-
|
61
|
-
::Time.new(
|
62
|
-
Date::EPOCH.year,
|
63
|
-
Date::EPOCH.month,
|
64
|
-
Date::EPOCH.mday + wday,
|
65
|
-
hour,
|
66
|
-
minute
|
67
|
-
)
|
68
|
-
end
|
44
|
+
attr_reader :week_minute
|
69
45
|
|
70
46
|
end
|
71
47
|
end
|
data/lib/biz/week_time/end.rb
CHANGED
data/lib/biz/week_time/start.rb
CHANGED
@@ -3,16 +3,16 @@ module Biz
|
|
3
3
|
class Start < Abstract
|
4
4
|
|
5
5
|
def day_time
|
6
|
-
@day_time ||= DayTime.from_minute(week_minute % Time
|
6
|
+
@day_time ||= DayTime.from_minute(week_minute % Time.day_minutes)
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def day_of_week
|
12
12
|
@day_of_week ||= begin
|
13
|
-
DayOfWeek
|
14
|
-
week_minute / Time
|
15
|
-
|
13
|
+
DayOfWeek.all.find { |day_of_week|
|
14
|
+
day_of_week.wday?(week_minute / Time.day_minutes % Time.week_days)
|
15
|
+
}
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
data/lib/biz.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: biz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Little
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-03-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: clavius
|
@@ -89,7 +89,6 @@ files:
|
|
89
89
|
- lib/biz/core_ext/time.rb
|
90
90
|
- lib/biz/date.rb
|
91
91
|
- lib/biz/dates.rb
|
92
|
-
- lib/biz/day.rb
|
93
92
|
- lib/biz/day_of_week.rb
|
94
93
|
- lib/biz/day_time.rb
|
95
94
|
- lib/biz/duration.rb
|
@@ -136,9 +135,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
135
|
version: '0'
|
137
136
|
requirements: []
|
138
137
|
rubyforge_project:
|
139
|
-
rubygems_version: 2.
|
138
|
+
rubygems_version: 2.5.1
|
140
139
|
signing_key:
|
141
140
|
specification_version: 4
|
142
141
|
summary: Business hours calculations
|
143
142
|
test_files: []
|
144
|
-
has_rdoc:
|
data/lib/biz/day.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
module Biz
|
2
|
-
class Day
|
3
|
-
|
4
|
-
include Comparable
|
5
|
-
|
6
|
-
extend Forwardable
|
7
|
-
|
8
|
-
def self.from_date(date)
|
9
|
-
new((date - Date::EPOCH).to_i)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.from_time(time)
|
13
|
-
from_date(time.to_date)
|
14
|
-
end
|
15
|
-
|
16
|
-
class << self
|
17
|
-
|
18
|
-
alias since_epoch from_time
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
attr_reader :day
|
23
|
-
|
24
|
-
delegate %i[
|
25
|
-
to_s
|
26
|
-
to_i
|
27
|
-
to_int
|
28
|
-
] => :day
|
29
|
-
|
30
|
-
def initialize(day)
|
31
|
-
@day = Integer(day)
|
32
|
-
end
|
33
|
-
|
34
|
-
def to_date
|
35
|
-
Date.from_day(day)
|
36
|
-
end
|
37
|
-
|
38
|
-
def coerce(other)
|
39
|
-
[self.class.new(other), self]
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
|
44
|
-
def <=>(other)
|
45
|
-
return nil unless other.respond_to?(:to_i)
|
46
|
-
|
47
|
-
day <=> other.to_i
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|