business_time 0.7.3 → 0.7.4
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 +7 -0
- data/README.rdoc +14 -0
- data/lib/business_time.rb +1 -1
- data/lib/business_time/business_days.rb +10 -15
- data/lib/business_time/business_hours.rb +2 -2
- data/lib/business_time/core_ext/active_support/time_with_zone.rb +1 -0
- data/lib/business_time/core_ext/date.rb +6 -8
- data/lib/business_time/core_ext/time.rb +1 -0
- data/lib/business_time/time_extensions.rb +32 -10
- data/lib/business_time/version.rb +1 -1
- metadata +19 -39
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5bdd88444abb3662202edb5a58a7966198095d0c
|
4
|
+
data.tar.gz: d3bb972b85a2f229c34a88511bcb6eb9595f8589
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b4d19b1491299ca47b3a765f701ba6ba909a5af84925005c75262679b4d193c70520d7938bc23c694fc03d5ee509c742f472285d82da75050aa457513d2f5f5f
|
7
|
+
data.tar.gz: c959f75f0cc63e165e7a55bceaddbc9dceefb0db9491cbeec38bf75944359c0113e20aa9a22460ee650071e6a7af515b7de6e3c3ceb4fa71004bda8f76f5e0fd
|
data/README.rdoc
CHANGED
@@ -90,6 +90,9 @@ I needed this, but taking into account business hours/days and holidays.
|
|
90
90
|
ticket_resolved = Time.parse("February 4, 2012, 10:50 am")
|
91
91
|
ticket_reported.business_time_until(ticket_resolved) #=> 8.hours + 10.minutes
|
92
92
|
|
93
|
+
# you can also determine if a given time is within business hours
|
94
|
+
Time.parse("February 3, 2012, 10:00 am").during_business_hours?
|
95
|
+
|
93
96
|
# note that counterintuitively, durations might not be quite what you expect when involving weekends.
|
94
97
|
# Consider the following example:
|
95
98
|
ticket_reported = Time.parse("February 3, 2012, 10:40 am")
|
@@ -100,6 +103,16 @@ I needed this, but taking into account business hours/days and holidays.
|
|
100
103
|
# Monday, Feb 6th 2012, 9:00am. The business time between 10:40am friday and 9am monday is
|
101
104
|
# 6 hours and 20 minutes. From a quick inspection of the code, it looks like it should be 8 hours.
|
102
105
|
|
106
|
+
# or you can calculate business dates between two dates
|
107
|
+
monday = Date.parse("December 20, 2010")
|
108
|
+
wednesday = Date.parse("December 22, 2010")
|
109
|
+
monday.business_dates_until(wednesday) #=> [Mon, 20 Dec 2010, Tue, 21 Dec 2010]
|
110
|
+
|
111
|
+
# you can get the first workday after a time or return itself if it is a workday
|
112
|
+
saturday = Time.parse("Sat Aug 9, 18:00:00, 2014")
|
113
|
+
monday = Time.parse("Mon Aug 11, 18:00:00, 2014")
|
114
|
+
Time.first_business_day(saturday) #=> "Mon Aug 11, 18:00:00, 2014"
|
115
|
+
Time.first_business_day(monday) #=> "Mon Aug 11, 18:00:00, 2014"
|
103
116
|
== Rails generator
|
104
117
|
|
105
118
|
rails generate business_time:config
|
@@ -158,6 +171,7 @@ I'm hoping Arild and I write some good blog entries on the subject at http://blo
|
|
158
171
|
* Piotr Jakubowski http://github.com/piotrj
|
159
172
|
* Glenn Vanderburg http://github.com/glv
|
160
173
|
* Michael Grosser http://github.com/grosser
|
174
|
+
* Michael Curtis http://github.com/mcurtis
|
161
175
|
|
162
176
|
(Special thanks for Arild on the complexities of dealing with TimeWithZone)
|
163
177
|
|
data/lib/business_time.rb
CHANGED
@@ -7,9 +7,9 @@ require 'yaml'
|
|
7
7
|
require 'business_time/config'
|
8
8
|
require 'business_time/business_hours'
|
9
9
|
require 'business_time/business_days'
|
10
|
-
require 'business_time/core_ext/date'
|
11
10
|
require 'business_time/core_ext/fixnum'
|
12
11
|
|
13
12
|
require 'business_time/time_extensions'
|
13
|
+
require 'business_time/core_ext/date'
|
14
14
|
require 'business_time/core_ext/time'
|
15
15
|
require 'business_time/core_ext/active_support/time_with_zone'
|
@@ -1,38 +1,33 @@
|
|
1
1
|
require 'active_support/time'
|
2
2
|
|
3
3
|
module BusinessTime
|
4
|
-
|
5
4
|
class BusinessDays
|
6
5
|
def initialize(days)
|
7
6
|
@days = days
|
8
7
|
end
|
9
8
|
|
10
|
-
def after(time = Time.
|
11
|
-
time = Time.zone ? Time.zone.parse(time.strftime('%Y-%m-%d %H:%M:%S %z')) : Time.parse(time.strftime('%Y-%m-%d %H:%M:%S %z'))
|
9
|
+
def after(time = Time.current)
|
12
10
|
days = @days
|
13
|
-
while days > 0 || !
|
14
|
-
days -= 1 if
|
11
|
+
while days > 0 || !time.workday?
|
12
|
+
days -= 1 if time.workday?
|
15
13
|
time = time + 1.day
|
16
14
|
end
|
17
15
|
time
|
18
16
|
end
|
19
|
-
|
17
|
+
|
20
18
|
alias_method :from_now, :after
|
21
19
|
alias_method :since, :after
|
22
|
-
|
23
|
-
def before(time = Time.
|
24
|
-
time = Time.zone ? Time.zone.parse(time.rfc822) : Time.parse(time.rfc822)
|
20
|
+
|
21
|
+
def before(time = Time.current)
|
25
22
|
days = @days
|
26
|
-
while days > 0 || !
|
27
|
-
days -= 1 if
|
23
|
+
while days > 0 || !time.workday?
|
24
|
+
days -= 1 if time.workday?
|
28
25
|
time = time - 1.day
|
29
26
|
end
|
30
27
|
time
|
31
28
|
end
|
32
|
-
|
29
|
+
|
33
30
|
alias_method :ago, :before
|
34
31
|
alias_method :until, :before
|
35
|
-
|
36
|
-
end
|
37
|
-
|
32
|
+
end
|
38
33
|
end
|
@@ -28,7 +28,7 @@ module BusinessTime
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# Ignore weekends and holidays
|
31
|
-
while !
|
31
|
+
while !after_time.workday?
|
32
32
|
after_time = after_time + 1.day
|
33
33
|
end
|
34
34
|
end
|
@@ -56,7 +56,7 @@ module BusinessTime
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# Ignore weekends and holidays
|
59
|
-
while !
|
59
|
+
while !before_time.workday?
|
60
60
|
before_time = before_time - 1.day
|
61
61
|
end
|
62
62
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
# Add workday and weekday concepts to the Date class
|
2
2
|
class Date
|
3
|
-
|
4
|
-
weekday? && !BusinessTime::Config.holidays.include?(self)
|
5
|
-
end
|
3
|
+
include BusinessTime::TimeExtensions
|
6
4
|
|
7
|
-
def
|
8
|
-
|
5
|
+
def business_days_until(to_date)
|
6
|
+
business_dates_until(to_date).size
|
9
7
|
end
|
10
8
|
|
11
|
-
def
|
12
|
-
(self...to_date).select{ |day| day.workday? }
|
9
|
+
def business_dates_until(to_date)
|
10
|
+
(self...to_date).select { |day| day.workday? }
|
13
11
|
end
|
14
|
-
end
|
12
|
+
end
|
@@ -1,7 +1,14 @@
|
|
1
1
|
module BusinessTime
|
2
2
|
module TimeExtensions
|
3
|
-
|
4
|
-
|
3
|
+
# True if this time is on a workday (between 00:00:00 and 23:59:59), even if
|
4
|
+
# this time falls outside of normal business hours.
|
5
|
+
def workday?
|
6
|
+
weekday? && !BusinessTime::Config.holidays.include?(to_date)
|
7
|
+
end
|
8
|
+
|
9
|
+
# True if this time falls on a weekday.
|
10
|
+
def weekday?
|
11
|
+
BusinessTime::Config.weekdays.include?(wday)
|
5
12
|
end
|
6
13
|
|
7
14
|
module ClassMethods
|
@@ -26,13 +33,14 @@ module BusinessTime
|
|
26
33
|
# True if this time is on a workday (between 00:00:00 and 23:59:59), even if
|
27
34
|
# this time falls outside of normal business hours.
|
28
35
|
def workday?(day)
|
29
|
-
Time.
|
30
|
-
|
36
|
+
ActiveSupport::Deprecation.warn("`Time.workday?(time)` is deprecated. Please use `time.workday?`")
|
37
|
+
day.workday?
|
31
38
|
end
|
32
39
|
|
33
40
|
# True if this time falls on a weekday.
|
34
41
|
def weekday?(day)
|
35
|
-
|
42
|
+
ActiveSupport::Deprecation.warn("`Time.weekday?(time)` is deprecated. Please use `time.weekday?`")
|
43
|
+
day.weekday?
|
36
44
|
end
|
37
45
|
|
38
46
|
def before_business_hours?(time)
|
@@ -47,7 +55,7 @@ module BusinessTime
|
|
47
55
|
# when the time is outside of business hours
|
48
56
|
def roll_forward(time)
|
49
57
|
|
50
|
-
if Time.before_business_hours?(time) || !
|
58
|
+
if Time.before_business_hours?(time) || !time.workday?
|
51
59
|
next_business_time = Time.beginning_of_workday(time)
|
52
60
|
elsif Time.after_business_hours?(time) || Time.end_of_workday(time) == time
|
53
61
|
next_business_time = Time.beginning_of_workday(time + 1.day)
|
@@ -55,17 +63,27 @@ module BusinessTime
|
|
55
63
|
next_business_time = time.clone
|
56
64
|
end
|
57
65
|
|
58
|
-
while !
|
66
|
+
while !next_business_time.workday?
|
59
67
|
next_business_time = Time.beginning_of_workday(next_business_time + 1.day)
|
60
68
|
end
|
61
69
|
|
62
70
|
next_business_time
|
63
71
|
end
|
64
72
|
|
73
|
+
# Returns the time parameter itself if it is a business day
|
74
|
+
# or else returns the next business day
|
75
|
+
def first_business_day(time)
|
76
|
+
while !time.workday?
|
77
|
+
time = time + 1.day
|
78
|
+
end
|
79
|
+
|
80
|
+
time
|
81
|
+
end
|
82
|
+
|
65
83
|
# Rolls backwards to the previous end_of_workday when the time is outside
|
66
84
|
# of business hours
|
67
85
|
def roll_backward(time)
|
68
|
-
prev_business_time = if (Time.before_business_hours?(time) || !
|
86
|
+
prev_business_time = if (Time.before_business_hours?(time) || !time.workday?)
|
69
87
|
Time.end_of_workday(time - 1.day)
|
70
88
|
elsif Time.after_business_hours?(time)
|
71
89
|
Time.end_of_workday(time)
|
@@ -73,7 +91,7 @@ module BusinessTime
|
|
73
91
|
time.clone
|
74
92
|
end
|
75
93
|
|
76
|
-
while !
|
94
|
+
while !prev_business_time.workday?
|
77
95
|
prev_business_time = Time.end_of_workday(prev_business_time - 1.day)
|
78
96
|
end
|
79
97
|
|
@@ -81,7 +99,7 @@ module BusinessTime
|
|
81
99
|
end
|
82
100
|
|
83
101
|
def work_hours_total(day)
|
84
|
-
return 0 unless
|
102
|
+
return 0 unless day.workday?
|
85
103
|
|
86
104
|
day = day.strftime('%a').downcase.to_sym
|
87
105
|
|
@@ -141,5 +159,9 @@ module BusinessTime
|
|
141
159
|
first_day + days_in_between + last_day
|
142
160
|
end * direction
|
143
161
|
end
|
162
|
+
|
163
|
+
def during_business_hours?
|
164
|
+
self.workday? && self.to_i.between?(Time.beginning_of_workday(self).to_i, Time.end_of_workday(self).to_i)
|
165
|
+
end
|
144
166
|
end
|
145
167
|
end
|
metadata
CHANGED
@@ -1,110 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: business_time
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- bokmann
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-04-12 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 3.1.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 3.1.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: tzinfo
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rake
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rdoc
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: minitest
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - ">="
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - ">="
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: minitest-rg
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - ">="
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: '0'
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - ">="
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: '0'
|
110
97
|
description: Have you ever wanted to do things like "6.business_days.from_now" and
|
@@ -133,32 +120,25 @@ files:
|
|
133
120
|
homepage: https://github.com/bokmann/business_time
|
134
121
|
licenses:
|
135
122
|
- MIT
|
123
|
+
metadata: {}
|
136
124
|
post_install_message:
|
137
125
|
rdoc_options: []
|
138
126
|
require_paths:
|
139
127
|
- lib
|
140
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
129
|
requirements:
|
143
|
-
- -
|
130
|
+
- - ">="
|
144
131
|
- !ruby/object:Gem::Version
|
145
132
|
version: '0'
|
146
|
-
segments:
|
147
|
-
- 0
|
148
|
-
hash: -1720097037897540308
|
149
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
134
|
requirements:
|
152
|
-
- -
|
135
|
+
- - ">="
|
153
136
|
- !ruby/object:Gem::Version
|
154
137
|
version: '0'
|
155
|
-
segments:
|
156
|
-
- 0
|
157
|
-
hash: -1720097037897540308
|
158
138
|
requirements: []
|
159
139
|
rubyforge_project:
|
160
|
-
rubygems_version:
|
140
|
+
rubygems_version: 2.2.2
|
161
141
|
signing_key:
|
162
|
-
specification_version:
|
142
|
+
specification_version: 4
|
163
143
|
summary: Support for doing time math in business hours and days
|
164
144
|
test_files: []
|