tod 1.2.2 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0c54266418af0f1e8c33cd0fb4fff9208c49a15
4
- data.tar.gz: ca0769c6200f87813c4c444739b682979ae4be22
3
+ metadata.gz: 853fd23075cb8c0131b49bae9b571249cf01f940
4
+ data.tar.gz: 8fcb950ad2f427b980232962831d6ac53c25353a
5
5
  SHA512:
6
- metadata.gz: 0c208a905bbcc27834d337a9f089f8dc01addcaaacc21359e5999cc106142fe1439a759153c7ace52953986f6b7f5c5f52631d625cdb3a985deebef2c17da7fd
7
- data.tar.gz: 67eb3aec32aa2e424eecec91b219700687bd2ba33592d59587509a31f1e3819e03a679be16c7c23c5ceff81789c0a35ff6db0943a1528d9f50b699798c27271c
6
+ metadata.gz: 07c301bb3668574f5d1129d7fcaed0109c50e1a9e85ec663da88d2f863831c703b9f30160cd5078a4d8b7807cb875f8fdb54162551ff2facac491075d0eb445f
7
+ data.tar.gz: 49b0c82abd08efa118b80cd7c63b3d5c1c034a4e856ac79eea31c626034c868c9683ea825d6c4d6ab159331e19657d7a703eabc7d6aad1a286ac1796ec2e61d5
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tod (1.2.2)
4
+ tod (1.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.markdown CHANGED
@@ -4,6 +4,9 @@ Tod
4
4
  Supplies TimeOfDay class that includes parsing, strftime, comparison, and
5
5
  arithmetic.
6
6
 
7
+ Supplies Shift to represent a period of time, using a beginning and ending TimeOfDay. Allows to calculate its duration and
8
+ to determine if a TimeOfDay is included inside the shift. For nightly shifts (when beginning time is greater than ending time),
9
+ it supposes the shift ends the following day.
7
10
 
8
11
  Installation
9
12
  ============
@@ -84,6 +87,34 @@ then require 'tod/time_of_day' instead of 'tod'.
84
87
  Time.now.to_time_of_day # => 16:30:43
85
88
  DateTime.now.to_time_of_day # => 16:30:43
86
89
 
90
+
91
+ Shifts
92
+ =======================
93
+
94
+ Represents a period of time, using a beginning and ending TimeOfDay. Allows to calculate its duration and
95
+ to determine if a TimeOfDay is included inside the shift. For nightly shifts (when beginning time is greater than ending time),
96
+ it supposes the shift ends the following day.
97
+
98
+ Creating from TimeOfDay
99
+ --------------------------------------
100
+
101
+ Shift.new(TimeOfDay.new(9), TimeOfDay.new(17))
102
+ Shift.new(TimeOfDay.new(22), TimeOfDay.new(4))
103
+
104
+ Duration
105
+ --------------------
106
+
107
+ Shift.new(TimeOfDay.new(9), TimeOfDay.new(17)).duration # => 28800
108
+ Shift.new(TimeOfDay.new(20), TimeOfDay.new(2)).duration # => 21600
109
+
110
+ Include?
111
+ --------------------
112
+
113
+ Shift.new(TimeOfDay.new(9), TimeOfDay.new(17)).include?(TimeOfDay.new(12)) # => true
114
+ Shift.new(TimeOfDay.new(9), TimeOfDay.new(17)).include?(TimeOfDay.new(7)) # => false
115
+ Shift.new(TimeOfDay.new(20), TimeOfDay.new(4)).include?(TimeOfDay.new(2)) # => true
116
+ Shift.new(TimeOfDay.new(20), TimeOfDay.new(4)).include?(TimeOfDay.new(18)) # => false
117
+
87
118
  Rails Time Zone Support
88
119
  =======================
89
120
 
@@ -113,6 +144,10 @@ Tod is compatible with Ruby 1.9.3 and 2.0.0 and Rails 3.0, 3.1, 3.2, and 4.0.
113
144
  History
114
145
  =======
115
146
 
147
+ ## 1.3.0 (December 9, 2013)
148
+
149
+ * Add Shift class (Pablo Russo)
150
+
116
151
  ## 1.2.2 (November 16, 2013)
117
152
 
118
153
  * Fix dumping nil or empty string to PostgreSQL time column (Maik Arnold)
data/lib/tod/shift.rb ADDED
@@ -0,0 +1,41 @@
1
+ module Tod
2
+ class Shift
3
+ attr_reader :beginning, :ending
4
+
5
+ def initialize(beginning, ending)
6
+ raise ArgumentError, "beginning can not be nil" unless beginning
7
+ raise ArgumentError, "ending can not be nil" unless ending
8
+
9
+ @beginning = beginning
10
+ @ending = ending
11
+ freeze # Shift instances are value objects
12
+ end
13
+
14
+ # Returns true if the time of day is inside the shift (inclusive range), false otherwise
15
+ def include?(tod)
16
+ if ending >= beginning
17
+ tod >= beginning && tod <= ending
18
+ else
19
+ start_of_day = TimeOfDay.new(0,0,0)
20
+ end_of_day = TimeOfDay.new(23,59,59)
21
+ (tod >= beginning && tod <= end_of_day) || (tod >= start_of_day && tod <= ending)
22
+ end
23
+ end
24
+
25
+ # Return shift duration in seconds.
26
+ # if ending is lower than beginning this method will calculate the duration as the ending time is from the following day
27
+ def duration
28
+ if ending >= beginning
29
+ (ending.to_i - beginning.to_i)
30
+ else
31
+ start_of_day = TimeOfDay.new(0,0,0)
32
+ end_of_day = TimeOfDay.new(23,59,59)
33
+ duration_day_1 = (end_of_day.to_i - beginning.to_i) + 1
34
+ duration_day_2 = (ending.to_i - start_of_day.to_i)
35
+ duration_day_1 + duration_day_2
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ Shift = Tod::Shift
data/lib/tod/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- class TimeOfDay
2
- VERSION = "1.2.2"
1
+ module Tod
2
+ VERSION = "1.3.0"
3
3
  end
data/lib/tod.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require 'tod/time_of_day'
2
2
  require 'tod/date'
3
3
  require 'tod/time'
4
+ require 'tod/shift'
@@ -0,0 +1,94 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
2
+ require 'active_support/time'
3
+
4
+ class ShiftTest < Test::Unit::TestCase
5
+ context "duration" do
6
+ should "return correct duration when first time is lower than the second one" do
7
+ duration_expected = 4 * 60 * 60 + 30 * 60 + 30 # 4 hours, 30 min and 30 sec later
8
+ tod1 = TimeOfDay.new 8,30
9
+ tod2 = TimeOfDay.new 13,00,30
10
+ shift = Shift.new tod1, tod2
11
+ duration = shift.duration
12
+ assert_equal duration, duration_expected
13
+ end
14
+ should "return correct duration when first time is greater than the second one" do
15
+ duration_expected = 4 * 60 * 60 + 30 * 60 + 30 # 4 hours, 30 min and 30 sec later
16
+ tod1 = TimeOfDay.new 22,30
17
+ tod2 = TimeOfDay.new 3,00,30
18
+ shift = Shift.new tod1, tod2
19
+ duration = shift.duration
20
+ assert_equal duration, duration_expected
21
+ end
22
+ should "be zero when both times are equal" do
23
+ tod1 = TimeOfDay.new 3,00,30
24
+ shift = Shift.new tod1, tod1
25
+ duration = shift.duration
26
+ assert_equal duration, 0
27
+ end
28
+ end
29
+
30
+ context "include?" do
31
+ # |------------------------|--------T1----V----T2----|------------------------|
32
+ should "be true when value is between ToDs and boths tods are in the same day" do
33
+ tod1 = TimeOfDay.new 8
34
+ tod2 = TimeOfDay.new 16
35
+ value = TimeOfDay.new 12
36
+ shift = Shift.new tod1, tod2
37
+ assert_equal shift.include?(value), true
38
+ end
39
+
40
+ # |------------------T1----|-------V----------T2-----|------------------------|
41
+ should "be true when value is on second day between ToDs and start ToD is in a different day" do
42
+ tod1 = TimeOfDay.new 20
43
+ tod2 = TimeOfDay.new 15
44
+ value = TimeOfDay.new 12
45
+ shift = Shift.new tod1, tod2
46
+ assert_equal shift.include?(value), true
47
+ end
48
+
49
+ # |------------------T1--V-|------------------T2-----|------------------------|
50
+ should "be true when value is on first day between ToDs and start ToD is in a different day" do
51
+ tod1 = TimeOfDay.new 20
52
+ tod2 = TimeOfDay.new 15
53
+ value = TimeOfDay.new 22
54
+ shift = Shift.new tod1, tod2
55
+ assert_equal shift.include?(value), true
56
+ end
57
+
58
+ # |------------------------|--------T1----------V----|----T2------------------|
59
+ should "be true when value is on first day between ToDs and end ToD is in a different day" do
60
+ tod1 = TimeOfDay.new 16
61
+ tod2 = TimeOfDay.new 4
62
+ value = TimeOfDay.new 20
63
+ shift = Shift.new tod1, tod2
64
+ assert_equal shift.include?(value), true
65
+ end
66
+
67
+ # |------------------------|--------T1---------------|--V---T2----------------|
68
+ should "be true when value is on second day between ToDs and end ToD is in a different day" do
69
+ tod1 = TimeOfDay.new 16
70
+ tod2 = TimeOfDay.new 4
71
+ value = TimeOfDay.new 2
72
+ shift = Shift.new tod1, tod2
73
+ assert_equal shift.include?(value), true
74
+ end
75
+
76
+ # |------------------------|--------T1-----T2----V---|------------------------|
77
+ should "be false when value is after second ToD" do
78
+ tod1 = TimeOfDay.new 10
79
+ tod2 = TimeOfDay.new 16
80
+ value = TimeOfDay.new 20
81
+ shift = Shift.new tod1, tod2
82
+ assert_equal shift.include?(value), false
83
+ end
84
+
85
+ # |------------------------|--V-----T1-----T2--------|------------------------|
86
+ should "be false when value is before first ToD" do
87
+ tod1 = TimeOfDay.new 10
88
+ tod2 = TimeOfDay.new 16
89
+ value = TimeOfDay.new 8
90
+ shift = Shift.new tod1, tod2
91
+ assert_equal shift.include?(value), false
92
+ end
93
+ end
94
+ end
data/tod.gemspec CHANGED
@@ -4,13 +4,13 @@ require "tod/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "tod"
7
- s.version = TimeOfDay::VERSION
7
+ s.version = Tod::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Jack Christensen"]
10
10
  s.email = ["jack@jackchristensen.com"]
11
11
  s.homepage = "https://github.com/JackC/tod"
12
- s.summary = %q{Supplies TimeOfDay class}
13
- s.description = %q{Supplies TimeOfDay class that includes parsing, strftime, comparison, and arithmetic.}
12
+ s.summary = %q{Supplies TimeOfDay and Shift class}
13
+ s.description = %q{Supplies TimeOfDay and Shift class that includes parsing, strftime, comparison, and arithmetic.}
14
14
 
15
15
  s.add_development_dependency "test-unit"
16
16
  s.add_development_dependency "shoulda"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tod
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jack Christensen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-16 00:00:00.000000000 Z
11
+ date: 2013-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -108,7 +108,7 @@ dependencies:
108
108
  - - '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
- description: Supplies TimeOfDay class that includes parsing, strftime, comparison,
111
+ description: Supplies TimeOfDay and Shift class that includes parsing, strftime, comparison,
112
112
  and arithmetic.
113
113
  email:
114
114
  - jack@jackchristensen.com
@@ -129,6 +129,7 @@ files:
129
129
  - gemfiles/4.0.gemfile
130
130
  - lib/tod.rb
131
131
  - lib/tod/date.rb
132
+ - lib/tod/shift.rb
132
133
  - lib/tod/time.rb
133
134
  - lib/tod/time_of_day.rb
134
135
  - lib/tod/version.rb
@@ -136,6 +137,7 @@ files:
136
137
  - test/test_helper.rb
137
138
  - test/tod/a_a_a_time_of_day_time_zone_without_active_support_test.rb
138
139
  - test/tod/date_test.rb
140
+ - test/tod/shift_test.rb
139
141
  - test/tod/time_of_day_serializable_attribute_test.rb
140
142
  - test/tod/time_of_day_test.rb
141
143
  - test/tod/time_of_day_time_zone_with_active_support_test.rb
@@ -163,5 +165,15 @@ rubyforge_project:
163
165
  rubygems_version: 2.0.3
164
166
  signing_key:
165
167
  specification_version: 4
166
- summary: Supplies TimeOfDay class
167
- test_files: []
168
+ summary: Supplies TimeOfDay and Shift class
169
+ test_files:
170
+ - test/support/active_record.rb
171
+ - test/test_helper.rb
172
+ - test/tod/a_a_a_time_of_day_time_zone_without_active_support_test.rb
173
+ - test/tod/date_test.rb
174
+ - test/tod/shift_test.rb
175
+ - test/tod/time_of_day_serializable_attribute_test.rb
176
+ - test/tod/time_of_day_test.rb
177
+ - test/tod/time_of_day_time_zone_with_active_support_test.rb
178
+ - test/tod/time_test.rb
179
+ has_rdoc: