biz 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -8
- data/lib/biz.rb +1 -0
- data/lib/biz/calculation/duration_within.rb +2 -2
- data/lib/biz/calculation/for_duration.rb +5 -5
- data/lib/biz/configuration.rb +10 -8
- data/lib/biz/core_ext/time.rb +1 -1
- data/lib/biz/schedule.rb +11 -3
- data/lib/biz/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f865f5197acf9cc026d7d77c15626a7d03a5e8c1
|
4
|
+
data.tar.gz: 5d150d70060e27513f373c3b32e96dbd0e4f68fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3eb38f1f622c23d1d1524ad053ae07bd789277d0a3b5b5a8bb42a2aef7453d8a976eed7878e97b8207861b0e58860d6a6e5950bc5507468e44ea62ba82c6e3e
|
7
|
+
data.tar.gz: 6871ae32bf137626682626e80f8f4ae115b162b1d7ac104ed1b615e0a3b06baa7979a3ea79ab5628d25c79b54d42910ddd415e28b2ce6e0bfc28de1a44b1a7fc
|
data/README.md
CHANGED
@@ -1,16 +1,21 @@
|
|
1
1
|
# biz
|
2
|
-
[![
|
3
|
-
[![
|
4
|
-
[![
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/biz.svg)](http://badge.fury.io/rb/biz)
|
3
|
+
[![Build Status](https://travis-ci.org/zendesk/biz.svg?branch=master)](https://travis-ci.org/zendesk/biz)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/zendesk/biz/badges/gpa.svg)](https://codeclimate.com/github/zendesk/biz)
|
5
|
+
[![Test Coverage](https://codeclimate.com/github/zendesk/biz/badges/coverage.svg)](https://codeclimate.com/github/zendesk/biz)
|
6
|
+
[![Dependency Status](https://gemnasium.com/zendesk/biz.svg)](https://gemnasium.com/zendesk/biz)
|
5
7
|
|
6
8
|
Time calculations using business hours.
|
7
9
|
|
8
10
|
## Features
|
9
11
|
|
12
|
+
* Support for:
|
13
|
+
- Intervals spanning the entire day.
|
14
|
+
- Interday intervals and holidays.
|
15
|
+
- Multiple intervals per day.
|
16
|
+
- Multiple schedule configurations.
|
10
17
|
* Second-level precision on all calculations.
|
11
18
|
* Accurate handling of Daylight Saving Time.
|
12
|
-
* Support for intervals spanning any period of the day, including the entirety.
|
13
|
-
* Support for interday intervals and holidays.
|
14
19
|
* Thread-safe.
|
15
20
|
|
16
21
|
## Anti-Features
|
@@ -36,7 +41,7 @@ Or install it yourself as:
|
|
36
41
|
|
37
42
|
```ruby
|
38
43
|
Biz.configure do |config|
|
39
|
-
config.
|
44
|
+
config.hours = {
|
40
45
|
mon: {'09:00' => '17:00'},
|
41
46
|
tue: {'00:00' => '24:00'},
|
42
47
|
wed: {'09:00' => '17:00'},
|
@@ -58,6 +63,9 @@ Biz::Schedule.new do |config|
|
|
58
63
|
end
|
59
64
|
```
|
60
65
|
|
66
|
+
Note that times must be specified in 24-hour clock format and time zones
|
67
|
+
must be [IANA identifiers](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
|
68
|
+
|
61
69
|
## Usage
|
62
70
|
|
63
71
|
```ruby
|
@@ -71,7 +79,41 @@ Biz.time(2, :hours).after(Time.utc(2015, 12, 25, 9, 30))
|
|
71
79
|
Biz.within(Time.utc(2015, 3, 7), Time.utc(2015, 3, 14)).in_seconds
|
72
80
|
|
73
81
|
# Determine if a time is in business hours
|
74
|
-
Biz.
|
82
|
+
Biz.in_hours?(Time.utc(2015, 1, 10, 9))
|
83
|
+
```
|
84
|
+
|
85
|
+
Note that all returned times are in UTC.
|
86
|
+
|
87
|
+
By dropping down a level, you can get access to the underlying time segments,
|
88
|
+
which you can use to do your own custom calculations or just get a better idea
|
89
|
+
of what's happening under the hood:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
Biz.periods
|
93
|
+
.after(Time.utc(2015, 1, 10, 10))
|
94
|
+
.timeline.forward
|
95
|
+
.until(Time.utc(2015, 1, 17, 10)).to_a
|
96
|
+
|
97
|
+
#=> [#<Biz::TimeSegment start_time=2015-01-10 18:00:00 UTC end_time=2015-01-10 22:00:00 UTC>,
|
98
|
+
# #<Biz::TimeSegment start_time=2015-01-12 17:00:00 UTC end_time=2015-01-13 01:00:00 UTC>,
|
99
|
+
# #<Biz::TimeSegment start_time=2015-01-13 08:00:00 UTC end_time=2015-01-14 08:00:00 UTC>,
|
100
|
+
# #<Biz::TimeSegment start_time=2015-01-14 17:00:00 UTC end_time=2015-01-15 01:00:00 UTC>,
|
101
|
+
# #<Biz::TimeSegment start_time=2015-01-15 17:00:00 UTC end_time=2015-01-15 20:00:00 UTC>,
|
102
|
+
# #<Biz::TimeSegment start_time=2015-01-15 21:00:00 UTC end_time=2015-01-16 01:00:00 UTC>]
|
103
|
+
|
104
|
+
Biz.periods
|
105
|
+
.before(Time.utc(2015, 5, 5, 12, 34, 57))
|
106
|
+
.timeline.backward
|
107
|
+
.for(Biz::Duration.minutes(3_598)).to_a
|
108
|
+
|
109
|
+
#=> [#<Biz::TimeSegment start_time=2015-05-05 07:00:00 UTC end_time=2015-05-05 12:34:57 UTC>,
|
110
|
+
# #<Biz::TimeSegment start_time=2015-05-04 16:00:00 UTC end_time=2015-05-05 00:00:00 UTC>,
|
111
|
+
# #<Biz::TimeSegment start_time=2015-05-02 17:00:00 UTC end_time=2015-05-02 21:00:00 UTC>,
|
112
|
+
# #<Biz::TimeSegment start_time=2015-04-30 20:00:00 UTC end_time=2015-05-01 00:00:00 UTC>,
|
113
|
+
# #<Biz::TimeSegment start_time=2015-04-30 16:00:00 UTC end_time=2015-04-30 19:00:00 UTC>,
|
114
|
+
# #<Biz::TimeSegment start_time=2015-04-29 16:00:00 UTC end_time=2015-04-30 00:00:00 UTC>,
|
115
|
+
# #<Biz::TimeSegment start_time=2015-04-28 07:00:00 UTC end_time=2015-04-29 07:00:00 UTC>,
|
116
|
+
# #<Biz::TimeSegment start_time=2015-04-27 20:36:57 UTC end_time=2015-04-28 00:00:00 UTC>]
|
75
117
|
```
|
76
118
|
|
77
119
|
## Core Extensions
|
@@ -114,12 +156,17 @@ To open a console with the gem and sample schedule loaded:
|
|
114
156
|
|
115
157
|
script/console
|
116
158
|
|
159
|
+
## Alternatives
|
160
|
+
|
161
|
+
* [`business_time`](https://github.com/bokmann/business_time)
|
162
|
+
* [`working_hours`](https://github.com/Intrepidd/working_hours)
|
163
|
+
|
117
164
|
## Copyright and license
|
118
165
|
|
119
166
|
Copyright 2015 Zendesk
|
120
167
|
|
121
168
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
122
|
-
this
|
169
|
+
this gem except in compliance with the License.
|
123
170
|
|
124
171
|
You may obtain a copy of the License at
|
125
172
|
http://www.apache.org/licenses/LICENSE-2.0.
|
data/lib/biz.rb
CHANGED
@@ -2,9 +2,9 @@ module Biz
|
|
2
2
|
module Calculation
|
3
3
|
class DurationWithin < SimpleDelegator
|
4
4
|
|
5
|
-
def initialize(
|
5
|
+
def initialize(periods, calculation_period)
|
6
6
|
super(
|
7
|
-
|
7
|
+
periods.after(calculation_period.start_time)
|
8
8
|
.timeline.forward
|
9
9
|
.until(calculation_period.end_time)
|
10
10
|
.map(&:duration)
|
@@ -2,27 +2,27 @@ module Biz
|
|
2
2
|
module Calculation
|
3
3
|
class ForDuration
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :periods,
|
6
6
|
:duration
|
7
7
|
|
8
|
-
def initialize(
|
8
|
+
def initialize(periods, duration)
|
9
9
|
unless duration.positive?
|
10
10
|
fail ArgumentError, 'Duration adjustment must be positive.'
|
11
11
|
end
|
12
12
|
|
13
|
-
@
|
13
|
+
@periods = periods
|
14
14
|
@duration = duration
|
15
15
|
end
|
16
16
|
|
17
17
|
def before(time)
|
18
|
-
|
18
|
+
periods.before(time)
|
19
19
|
.timeline.backward
|
20
20
|
.for(duration).to_a
|
21
21
|
.last.start_time
|
22
22
|
end
|
23
23
|
|
24
24
|
def after(time)
|
25
|
-
|
25
|
+
periods.after(time)
|
26
26
|
.timeline.forward
|
27
27
|
.for(duration).to_a
|
28
28
|
.last.end_time
|
data/lib/biz/configuration.rb
CHANGED
@@ -8,7 +8,7 @@ module Biz
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def intervals
|
11
|
-
raw.
|
11
|
+
raw.hours.flat_map { |weekday, hours|
|
12
12
|
weekday_intervals(weekday, hours)
|
13
13
|
}.sort_by(&:start_time)
|
14
14
|
end
|
@@ -46,28 +46,30 @@ module Biz
|
|
46
46
|
memoize :intervals,
|
47
47
|
:holidays
|
48
48
|
|
49
|
-
Raw = Struct.new(:
|
49
|
+
Raw = Struct.new(:hours, :holidays, :time_zone) do
|
50
50
|
module Default
|
51
51
|
|
52
|
-
|
52
|
+
HOURS = {
|
53
53
|
mon: {'09:00' => '17:00'},
|
54
54
|
tue: {'09:00' => '17:00'},
|
55
55
|
wed: {'09:00' => '17:00'},
|
56
56
|
thu: {'09:00' => '17:00'},
|
57
57
|
fri: {'09:00' => '17:00'}
|
58
58
|
}
|
59
|
-
HOLIDAYS
|
60
|
-
TIME_ZONE
|
59
|
+
HOLIDAYS = []
|
60
|
+
TIME_ZONE = 'Etc/UTC'
|
61
61
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def initialize(*)
|
65
65
|
super
|
66
66
|
|
67
|
-
self.
|
68
|
-
self.holidays
|
69
|
-
self.time_zone
|
67
|
+
self.hours ||= Default::HOURS
|
68
|
+
self.holidays ||= Default::HOLIDAYS
|
69
|
+
self.time_zone ||= Default::TIME_ZONE
|
70
70
|
end
|
71
|
+
|
72
|
+
alias_method :business_hours=, :hours=
|
71
73
|
end
|
72
74
|
|
73
75
|
end
|
data/lib/biz/core_ext/time.rb
CHANGED
data/lib/biz/schedule.rb
CHANGED
@@ -18,17 +18,25 @@ module Biz
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def time(scalar, unit)
|
21
|
-
Calculation::ForDuration.new(
|
21
|
+
Calculation::ForDuration.new(
|
22
|
+
periods,
|
23
|
+
Duration.with_unit(scalar, unit)
|
24
|
+
)
|
22
25
|
end
|
23
26
|
|
24
27
|
def within(origin, terminus)
|
25
|
-
Calculation::DurationWithin.new(
|
28
|
+
Calculation::DurationWithin.new(
|
29
|
+
periods,
|
30
|
+
TimeSegment.new(origin, terminus)
|
31
|
+
)
|
26
32
|
end
|
27
33
|
|
28
|
-
def
|
34
|
+
def in_hours?(time)
|
29
35
|
Calculation::Active.new(self, time).active?
|
30
36
|
end
|
31
37
|
|
38
|
+
alias_method :business_hours?, :in_hours?
|
39
|
+
|
32
40
|
protected
|
33
41
|
|
34
42
|
attr_reader :configuration
|
data/lib/biz/version.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.1.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: 2015-02-
|
12
|
+
date: 2015-02-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: abstract_type
|
@@ -140,7 +140,7 @@ files:
|
|
140
140
|
- lib/biz/week_time/start.rb
|
141
141
|
homepage: https://github.com/zendesk/biz
|
142
142
|
licenses:
|
143
|
-
-
|
143
|
+
- Apache 2.0
|
144
144
|
metadata: {}
|
145
145
|
post_install_message:
|
146
146
|
rdoc_options: []
|
@@ -150,7 +150,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
150
|
requirements:
|
151
151
|
- - ">="
|
152
152
|
- !ruby/object:Gem::Version
|
153
|
-
version: '0'
|
153
|
+
version: '2.0'
|
154
154
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
155
|
requirements:
|
156
156
|
- - ">="
|