tod 2.2.0 → 3.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/.travis.yml +1 -11
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +30 -32
- data/README.markdown +5 -16
- data/lib/tod/railtie.rb +4 -1
- data/lib/tod/shift.rb +34 -14
- data/lib/tod/time_of_day.rb +10 -26
- data/lib/tod/time_of_day_type.rb +10 -3
- data/lib/tod/version.rb +1 -1
- data/test/test_helper.rb +0 -1
- data/test/tod/shift_test.rb +43 -0
- data/test/tod/time_of_day_attribute_test.rb +74 -0
- data/test/tod/time_of_day_test.rb +7 -0
- data/tod.gemspec +1 -2
- metadata +19 -31
- data/gemfiles/4.0.gemfile +0 -5
- data/gemfiles/4.1.gemfile +0 -5
- data/gemfiles/4.2.gemfile +0 -5
- data/gemfiles/5.0.gemfile +0 -5
- data/gemfiles/5.2.gemfile +0 -5
- data/lib/tod/arel_extensions.rb +0 -25
- data/test/tod/time_of_day_serializable_attribute_test.rb +0 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8986b140f4dcc736d253b188cd5f9a46a72110f38887cd6e8ff93ecee823c438
|
4
|
+
data.tar.gz: 95d31c83abc1264946bf2ce6aa6ba6fac45dcaeca1362b76a22d54eab27f402f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d1c3b50deb1df502928666b38e113fb7d58b4a25c140119bac8155ad3ff3add0689cffba810b7bdd6ab1461493838873a839ac259895630210e47679ae9ef89
|
7
|
+
data.tar.gz: 98a76ddcb2b8c866f602efe1def27c236b88ffcc6bbb12812580794113dc964d5b6df1bd95b0f055a48e9e95ca4b69ccf3dea93b20f866ca72be7932596e1aaf
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
# 3.0.0 (March 6, 2021)
|
2
|
+
|
3
|
+
* Support and require Rails 6
|
4
|
+
|
1
5
|
# 2.2.0 (October 10, 2018)
|
2
6
|
|
3
7
|
* Add string formatting compatible with Rails (Tate Johnson)
|
4
8
|
* Add ability to use ActiveRecord's attribute API (Brent Wheeldon)
|
9
|
+
* Add method for use in Rails database quoting (Ben Jackson)
|
5
10
|
|
6
11
|
# 2.1.1 (April 14, 2017)
|
7
12
|
|
data/Gemfile.lock
CHANGED
@@ -1,48 +1,46 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
tod (
|
4
|
+
tod (3.0.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
activemodel (
|
10
|
-
activesupport (=
|
11
|
-
activerecord (
|
12
|
-
activemodel (=
|
13
|
-
activesupport (=
|
14
|
-
|
15
|
-
activesupport (5.2.0)
|
9
|
+
activemodel (6.1.3)
|
10
|
+
activesupport (= 6.1.3)
|
11
|
+
activerecord (6.1.3)
|
12
|
+
activemodel (= 6.1.3)
|
13
|
+
activesupport (= 6.1.3)
|
14
|
+
activesupport (6.1.3)
|
16
15
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
|
-
i18n (>=
|
18
|
-
minitest (
|
19
|
-
tzinfo (~>
|
20
|
-
|
21
|
-
byebug (
|
22
|
-
coderay (1.1.
|
23
|
-
concurrent-ruby (1.
|
24
|
-
i18n (1.
|
16
|
+
i18n (>= 1.6, < 2)
|
17
|
+
minitest (>= 5.1)
|
18
|
+
tzinfo (~> 2.0)
|
19
|
+
zeitwerk (~> 2.3)
|
20
|
+
byebug (11.1.3)
|
21
|
+
coderay (1.1.3)
|
22
|
+
concurrent-ruby (1.1.8)
|
23
|
+
i18n (1.8.9)
|
25
24
|
concurrent-ruby (~> 1.0)
|
26
|
-
method_source (0.
|
27
|
-
minitest (5.
|
28
|
-
pry (0.
|
29
|
-
coderay (~> 1.1
|
30
|
-
method_source (~>
|
31
|
-
pry-byebug (3.
|
32
|
-
byebug (~>
|
33
|
-
pry (~> 0.
|
34
|
-
rake (
|
35
|
-
sqlite3 (1.
|
36
|
-
|
37
|
-
|
38
|
-
|
25
|
+
method_source (1.0.0)
|
26
|
+
minitest (5.14.4)
|
27
|
+
pry (0.13.1)
|
28
|
+
coderay (~> 1.1)
|
29
|
+
method_source (~> 1.0)
|
30
|
+
pry-byebug (3.9.0)
|
31
|
+
byebug (~> 11.0)
|
32
|
+
pry (~> 0.13.0)
|
33
|
+
rake (13.0.3)
|
34
|
+
sqlite3 (1.4.2)
|
35
|
+
tzinfo (2.0.4)
|
36
|
+
concurrent-ruby (~> 1.0)
|
37
|
+
zeitwerk (2.4.2)
|
39
38
|
|
40
39
|
PLATFORMS
|
41
40
|
ruby
|
42
41
|
|
43
42
|
DEPENDENCIES
|
44
|
-
activerecord (>=
|
45
|
-
arel
|
43
|
+
activerecord (>= 6.0.0)
|
46
44
|
minitest
|
47
45
|
pry-byebug
|
48
46
|
rake
|
@@ -51,4 +49,4 @@ DEPENDENCIES
|
|
51
49
|
tzinfo
|
52
50
|
|
53
51
|
BUNDLED WITH
|
54
|
-
|
52
|
+
2.0.2
|
data/README.markdown
CHANGED
@@ -226,32 +226,21 @@ produce an object with the correct time and time zone, pass in an
|
|
226
226
|
tod.on time, Time.find_zone!("US/Mountain") # => Mon, 24 Sep 2018 08:30:00 MDT -06:00
|
227
227
|
Date.tomorrow.at tod, Time.find_zone!("US/Mountain") # => Tue, 25 Sep 2018 08:30:00 MDT -06:00
|
228
228
|
|
229
|
-
ActiveRecord
|
229
|
+
ActiveRecord Attribute Support
|
230
230
|
=======================
|
231
|
-
Tod::TimeOfDay
|
231
|
+
Tod::TimeOfDay can be used as an ActiveRecord attribute to store Tod::TimeOfDay directly
|
232
232
|
in a column of the time type.
|
233
233
|
|
234
234
|
Example:
|
235
235
|
|
236
236
|
```ruby
|
237
237
|
class Order < ActiveRecord::Base
|
238
|
-
|
238
|
+
attribute :time, :time_only
|
239
239
|
end
|
240
240
|
order = Order.create(time: Tod::TimeOfDay.new(9,30))
|
241
241
|
order.time # => 09:30:00
|
242
242
|
```
|
243
243
|
|
244
|
-
By default Rails 5.1 treats database `time` values as if time zones are
|
245
|
-
meaningful. Tod::TimeOfDay cannot correctly save and restore values when Rails
|
246
|
-
automatically shifts values based on time zone and the normal `serialize`
|
247
|
-
interface is not able to override this behavior. To correctly serialize
|
248
|
-
Tod::TimeOfDay values with Rails 5.1 time zone handling must be disabled for
|
249
|
-
database `time` types. This can be done with the following config:
|
250
|
-
|
251
|
-
```
|
252
|
-
config.active_record.time_zone_aware_types = [:datetime]
|
253
|
-
```
|
254
|
-
|
255
244
|
MongoDB Support
|
256
245
|
===============
|
257
246
|
|
@@ -294,10 +283,10 @@ Compatibility
|
|
294
283
|
|
295
284
|
[](https://travis-ci.org/jackc/tod)
|
296
285
|
|
297
|
-
Tod is
|
286
|
+
Tod is tested against Ruby 2.6.x and Rails 6.x.
|
298
287
|
|
299
288
|
|
300
289
|
License
|
301
290
|
=======
|
302
291
|
|
303
|
-
Copyright (c) 2010-
|
292
|
+
Copyright (c) 2010-2021 Jack Christensen, released under the MIT license
|
data/lib/tod/railtie.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
require "active_model/type"
|
2
|
+
require "active_record/type"
|
1
3
|
require "tod/time_of_day_type"
|
2
4
|
|
3
5
|
module Tod
|
4
6
|
class Railtie < Rails::Railtie
|
5
|
-
initializer "tod.
|
7
|
+
initializer "tod.register_active_model_type" do
|
8
|
+
ActiveModel::Type.register(:time_only, Tod::TimeOfDayType)
|
6
9
|
ActiveRecord::Type.register(:time_only, Tod::TimeOfDayType)
|
7
10
|
end
|
8
11
|
end
|
data/lib/tod/shift.rb
CHANGED
@@ -33,20 +33,40 @@ module Tod
|
|
33
33
|
|
34
34
|
# Returns true if ranges overlap, false otherwise.
|
35
35
|
def overlaps?(other)
|
36
|
-
|
37
|
-
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
#
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
36
|
+
a, b = [self, other].map(&:range)
|
37
|
+
#
|
38
|
+
# Although a Shift which passes through midnight is stored
|
39
|
+
# internally as lasting more than TimeOfDay::NUM_SECONDS_IN_DAY
|
40
|
+
# seconds from midnight, that's not how it is meant to be
|
41
|
+
# handled. Rather, it consists of two chunks:
|
42
|
+
#
|
43
|
+
# range.first => Midnight
|
44
|
+
# Midnight => range.last
|
45
|
+
#
|
46
|
+
# The second one is *before* the first. None of it is more than
|
47
|
+
# TimeOfDay::NUM_SECONDS_IN_DAY after midnight. We thus need to shift
|
48
|
+
# each of our ranges to cover all overlapping possibilities.
|
49
|
+
#
|
50
|
+
one_day = TimeOfDay::NUM_SECONDS_IN_DAY
|
51
|
+
ashifted =
|
52
|
+
Range.new(a.first + one_day, a.last + one_day, a.exclude_end?)
|
53
|
+
bshifted =
|
54
|
+
Range.new(b.first + one_day, b.last + one_day, b.exclude_end?)
|
55
|
+
#
|
56
|
+
# For exclusive ranges we need:
|
57
|
+
#
|
58
|
+
# a.ending > b.beginning && b.ending > a.beginning
|
59
|
+
#
|
60
|
+
# and for inclusive we need:
|
61
|
+
#
|
62
|
+
# a.ending >= b.beginning && b.ending >= a.beginning
|
63
|
+
#
|
64
|
+
aop = a.exclude_end? ? :> : :>=
|
65
|
+
bop = b.exclude_end? ? :> : :>=
|
66
|
+
#
|
67
|
+
(a.last.send(aop, b.first) && b.last.send(bop, a.first)) ||
|
68
|
+
(ashifted.last.send(aop, b.first) && b.last.send(bop, ashifted.first)) ||
|
69
|
+
(a.last.send(aop, bshifted.first) && bshifted.last.send(bop, a.first))
|
50
70
|
end
|
51
71
|
|
52
72
|
def contains?(shift)
|
data/lib/tod/time_of_day.rb
CHANGED
@@ -34,8 +34,8 @@ module Tod
|
|
34
34
|
/x
|
35
35
|
|
36
36
|
WORDS = {
|
37
|
-
"noon" => "12pm",
|
38
|
-
"midnight" => "12am"
|
37
|
+
"noon" => "12pm".freeze,
|
38
|
+
"midnight" => "12am".freeze
|
39
39
|
}
|
40
40
|
|
41
41
|
NUM_SECONDS_IN_DAY = 86400
|
@@ -43,9 +43,9 @@ module Tod
|
|
43
43
|
NUM_SECONDS_IN_MINUTE = 60
|
44
44
|
|
45
45
|
FORMATS = {
|
46
|
-
short: "%-l:%M %P",
|
47
|
-
medium: "%-l:%M:%S %P",
|
48
|
-
time: "%H:%M"
|
46
|
+
short: "%-l:%M %P".freeze,
|
47
|
+
medium: "%-l:%M:%S %P".freeze,
|
48
|
+
time: "%H:%M".freeze
|
49
49
|
}
|
50
50
|
|
51
51
|
def initialize(h, m=0, s=0)
|
@@ -89,7 +89,7 @@ module Tod
|
|
89
89
|
def strftime(format_string)
|
90
90
|
# Special case 2400 because strftime will load TimeOfDay into Time which
|
91
91
|
# will convert 24 to 0
|
92
|
-
format_string.gsub
|
92
|
+
format_string = format_string.gsub(/%H|%k/, '24') if @hour == 24
|
93
93
|
Time.local(2000,1,1, @hour, @minute, @second).strftime(format_string)
|
94
94
|
end
|
95
95
|
|
@@ -106,6 +106,10 @@ module Tod
|
|
106
106
|
end
|
107
107
|
alias_method :to_s, :to_formatted_s
|
108
108
|
|
109
|
+
def value_for_database
|
110
|
+
to_s
|
111
|
+
end
|
112
|
+
|
109
113
|
# Return a new TimeOfDay num_seconds greater than self. It will wrap around
|
110
114
|
# at midnight.
|
111
115
|
def +(num_seconds)
|
@@ -200,25 +204,5 @@ module Tod
|
|
200
204
|
def self.time_zone
|
201
205
|
(Time.respond_to?(:zone) && Time.zone) || Time
|
202
206
|
end
|
203
|
-
|
204
|
-
def self.dump(time_of_day)
|
205
|
-
time_of_day =
|
206
|
-
if time_of_day.is_a? Hash
|
207
|
-
# rails multiparam attribute
|
208
|
-
# get hour, minute and second and construct new TimeOfDay object
|
209
|
-
::Tod::TimeOfDay.new(time_of_day[4], time_of_day[5], time_of_day[6])
|
210
|
-
else
|
211
|
-
# return nil, if input is not parsable
|
212
|
-
Tod::TimeOfDay(time_of_day){}
|
213
|
-
end
|
214
|
-
time_of_day.to_s if time_of_day
|
215
|
-
end
|
216
|
-
|
217
|
-
def self.load(time)
|
218
|
-
if time && !time.to_s.empty?
|
219
|
-
return ::Tod::TimeOfDay.new(24) if time.respond_to?(:day) && time.day == 2 && time.hour == 0 && time.min == 0 && time.sec == 0
|
220
|
-
::Tod::TimeOfDay(time)
|
221
|
-
end
|
222
|
-
end
|
223
207
|
end
|
224
208
|
end
|
data/lib/tod/time_of_day_type.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
module Tod
|
2
|
-
class TimeOfDayType <
|
2
|
+
class TimeOfDayType < ActiveModel::Type::Value
|
3
3
|
def cast(value)
|
4
|
-
|
4
|
+
if value.is_a? Hash
|
5
|
+
# rails multiparam attribute
|
6
|
+
# get hour, minute and second and construct new TimeOfDay object
|
7
|
+
::Tod::TimeOfDay.new(value[4], value[5], value[6])
|
8
|
+
else
|
9
|
+
# return nil, if input is not parsable
|
10
|
+
Tod::TimeOfDay(value){}
|
11
|
+
end
|
5
12
|
end
|
6
13
|
|
7
14
|
def serialize(value)
|
8
|
-
|
15
|
+
value.to_s if value.present?
|
9
16
|
end
|
10
17
|
end
|
11
18
|
end
|
data/lib/tod/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
data/test/tod/shift_test.rb
CHANGED
@@ -99,6 +99,49 @@ describe "Shift" do
|
|
99
99
|
shift2 = Tod::Shift.new(Tod::TimeOfDay.new(5), Tod::TimeOfDay.new(12), true)
|
100
100
|
refute shift1.overlaps?(shift2)
|
101
101
|
end
|
102
|
+
|
103
|
+
it "copes correctly with mixed shifts" do
|
104
|
+
shift1 = Tod::Shift.new(Tod::TimeOfDay.new(1), Tod::TimeOfDay.new(5))
|
105
|
+
shift2 = Tod::Shift.new(Tod::TimeOfDay.new(5), Tod::TimeOfDay.new(12), true)
|
106
|
+
assert shift1.overlaps?(shift2)
|
107
|
+
assert shift2.overlaps?(shift1)
|
108
|
+
shift1 = Tod::Shift.new(Tod::TimeOfDay.new(1), Tod::TimeOfDay.new(5), true)
|
109
|
+
shift2 = Tod::Shift.new(Tod::TimeOfDay.new(5), Tod::TimeOfDay.new(12))
|
110
|
+
refute shift1.overlaps?(shift2)
|
111
|
+
refute shift2.overlaps?(shift1)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "copes correctly with zero length inclusive end shifts" do
|
115
|
+
shift1 = Tod::Shift.new(Tod::TimeOfDay.new(9), Tod::TimeOfDay.new(17))
|
116
|
+
shift2 = Tod::Shift.new(Tod::TimeOfDay.new(10), Tod::TimeOfDay.new(10))
|
117
|
+
shift3 = Tod::Shift.new(Tod::TimeOfDay.new(9), Tod::TimeOfDay.new(9))
|
118
|
+
shift4 = Tod::Shift.new(Tod::TimeOfDay.new(17), Tod::TimeOfDay.new(17))
|
119
|
+
assert shift1.overlaps?(shift2)
|
120
|
+
assert shift2.overlaps?(shift1)
|
121
|
+
|
122
|
+
assert shift1.overlaps?(shift3)
|
123
|
+
assert shift3.overlaps?(shift1)
|
124
|
+
|
125
|
+
assert shift1.overlaps?(shift4)
|
126
|
+
assert shift4.overlaps?(shift1)
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
it "copes correctly with zero length exclusive end shifts" do
|
131
|
+
shift1 = Tod::Shift.new(Tod::TimeOfDay.new(9), Tod::TimeOfDay.new(17), true)
|
132
|
+
shift2 = Tod::Shift.new(Tod::TimeOfDay.new(10), Tod::TimeOfDay.new(10), true)
|
133
|
+
shift3 = Tod::Shift.new(Tod::TimeOfDay.new(9), Tod::TimeOfDay.new(9), true)
|
134
|
+
shift4 = Tod::Shift.new(Tod::TimeOfDay.new(17), Tod::TimeOfDay.new(17), true)
|
135
|
+
assert shift1.overlaps?(shift2)
|
136
|
+
assert shift2.overlaps?(shift1)
|
137
|
+
|
138
|
+
refute shift1.overlaps?(shift3)
|
139
|
+
refute shift3.overlaps?(shift1)
|
140
|
+
|
141
|
+
refute shift1.overlaps?(shift4)
|
142
|
+
refute shift4.overlaps?(shift1)
|
143
|
+
|
144
|
+
end
|
102
145
|
end
|
103
146
|
|
104
147
|
describe "contains?" do
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','support/active_record'))
|
3
|
+
|
4
|
+
require 'tod/time_of_day_type'
|
5
|
+
|
6
|
+
ActiveModel::Type.register(:time_only, Tod::TimeOfDayType)
|
7
|
+
ActiveRecord::Type.register(:time_only, Tod::TimeOfDayType)
|
8
|
+
|
9
|
+
class Order < ActiveRecord::Base
|
10
|
+
attribute :time, :time_only
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "TimeOfDay with ActiveRecord Attribute" do
|
14
|
+
it "sets time of day" do
|
15
|
+
Order.create!(time: Tod::TimeOfDay.new(9, 30))
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets nil as value" do
|
19
|
+
Order.create!(time: nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "works with multiparam time arguments" do
|
23
|
+
order = Order.create!({"time(4i)" => "8", "time(5i)" => "6", "time(6i)" => "5"})
|
24
|
+
assert_equal Tod::TimeOfDay.new(8,6,5), order.time
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not raise Exception on access of unparsable values" do
|
28
|
+
order = Order.new(time: 'unparsable')
|
29
|
+
order.time
|
30
|
+
assert order.valid?
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should dump unparsable values to nil" do
|
34
|
+
assert_nil Order.new(time: '').time
|
35
|
+
assert_nil Order.new(time: 'unparsable').time
|
36
|
+
assert_nil Order.new(time: nil).time
|
37
|
+
end
|
38
|
+
|
39
|
+
it "loads set Tod::TimeOfDay" do
|
40
|
+
time_of_day = Tod::TimeOfDay.new(9, 30)
|
41
|
+
order = Order.create!(time: time_of_day)
|
42
|
+
order.reload
|
43
|
+
assert_equal order.time, time_of_day
|
44
|
+
end
|
45
|
+
|
46
|
+
it "loads set Time" do
|
47
|
+
time_of_day = Time.new(2015, 10, 21, 16, 29, 0, "-07:00")
|
48
|
+
order = Order.create!(time: time_of_day)
|
49
|
+
order.reload
|
50
|
+
assert_equal order.time, Tod::TimeOfDay.new(16, 29)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns nil if time is not set" do
|
54
|
+
order = Order.create!(time: nil)
|
55
|
+
order.reload
|
56
|
+
assert_nil order.time
|
57
|
+
end
|
58
|
+
|
59
|
+
it "dump 24:00:00 and get it back" do
|
60
|
+
time_of_day = Tod::TimeOfDay.new(24, 0, 0)
|
61
|
+
order = Order.create!(time: time_of_day)
|
62
|
+
order.reload
|
63
|
+
assert_equal Tod::TimeOfDay.new(24), order.time
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "Order.where" do
|
67
|
+
it "handles TimeOfDay as a parameter" do
|
68
|
+
tod = Tod::TimeOfDay.new(11, 11)
|
69
|
+
expected = Order.create!(time: tod)
|
70
|
+
actual = Order.where(time: tod).first
|
71
|
+
assert_equal expected, actual
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -176,6 +176,13 @@ describe "TimeOfDay" do
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
+
describe "value_for_database" do
|
180
|
+
it "returns a formatted value for database query serialization" do
|
181
|
+
t = Tod::TimeOfDay.new(12,15,05)
|
182
|
+
assert_equal "12:15:05", t.value_for_database
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
179
186
|
describe "to_s" do
|
180
187
|
it "is aliased to to_formatted_s" do
|
181
188
|
t = Tod::TimeOfDay.new(8,15,30)
|
data/tod.gemspec
CHANGED
@@ -16,10 +16,9 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_development_dependency "minitest"
|
17
17
|
s.add_development_dependency "tzinfo"
|
18
18
|
s.add_development_dependency "rake"
|
19
|
-
s.add_development_dependency "activerecord", ">=
|
19
|
+
s.add_development_dependency "activerecord", ">= 6.0.0"
|
20
20
|
s.add_development_dependency "sqlite3"
|
21
21
|
s.add_development_dependency "pry-byebug"
|
22
|
-
s.add_development_dependency "arel"
|
23
22
|
|
24
23
|
s.files = `git ls-files`.split("\n")
|
25
24
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
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:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Christensen
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 6.0.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 6.0.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,20 +94,6 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: arel
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
97
|
description: Supplies TimeOfDay and Shift class that includes parsing, strftime, comparison,
|
112
98
|
and arithmetic.
|
113
99
|
email:
|
@@ -124,13 +110,7 @@ files:
|
|
124
110
|
- MIT-LICENSE
|
125
111
|
- README.markdown
|
126
112
|
- Rakefile
|
127
|
-
- gemfiles/4.0.gemfile
|
128
|
-
- gemfiles/4.1.gemfile
|
129
|
-
- gemfiles/4.2.gemfile
|
130
|
-
- gemfiles/5.0.gemfile
|
131
|
-
- gemfiles/5.2.gemfile
|
132
113
|
- lib/tod.rb
|
133
|
-
- lib/tod/arel_extensions.rb
|
134
114
|
- lib/tod/conversions.rb
|
135
115
|
- lib/tod/core_extensions.rb
|
136
116
|
- lib/tod/date_extensions.rb
|
@@ -146,7 +126,7 @@ files:
|
|
146
126
|
- test/tod/conversion_test.rb
|
147
127
|
- test/tod/date_test.rb
|
148
128
|
- test/tod/shift_test.rb
|
149
|
-
- test/tod/
|
129
|
+
- test/tod/time_of_day_attribute_test.rb
|
150
130
|
- test/tod/time_of_day_test.rb
|
151
131
|
- test/tod/time_of_day_time_zone_with_active_support_test.rb
|
152
132
|
- test/tod/time_test.rb
|
@@ -155,7 +135,7 @@ homepage: https://github.com/JackC/tod
|
|
155
135
|
licenses:
|
156
136
|
- MIT
|
157
137
|
metadata: {}
|
158
|
-
post_install_message:
|
138
|
+
post_install_message:
|
159
139
|
rdoc_options: []
|
160
140
|
require_paths:
|
161
141
|
- lib
|
@@ -170,9 +150,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
150
|
- !ruby/object:Gem::Version
|
171
151
|
version: '0'
|
172
152
|
requirements: []
|
173
|
-
|
174
|
-
|
175
|
-
signing_key:
|
153
|
+
rubygems_version: 3.0.6
|
154
|
+
signing_key:
|
176
155
|
specification_version: 4
|
177
156
|
summary: Supplies TimeOfDay and Shift class
|
178
|
-
test_files:
|
157
|
+
test_files:
|
158
|
+
- test/support/active_record.rb
|
159
|
+
- test/test_helper.rb
|
160
|
+
- test/tod/conversion_test.rb
|
161
|
+
- test/tod/date_test.rb
|
162
|
+
- test/tod/shift_test.rb
|
163
|
+
- test/tod/time_of_day_attribute_test.rb
|
164
|
+
- test/tod/time_of_day_test.rb
|
165
|
+
- test/tod/time_of_day_time_zone_with_active_support_test.rb
|
166
|
+
- test/tod/time_test.rb
|
data/gemfiles/4.0.gemfile
DELETED
data/gemfiles/4.1.gemfile
DELETED
data/gemfiles/4.2.gemfile
DELETED
data/gemfiles/5.0.gemfile
DELETED
data/gemfiles/5.2.gemfile
DELETED
data/lib/tod/arel_extensions.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'arel'
|
2
|
-
|
3
|
-
module Tod
|
4
|
-
module ArelDepthFirstExtensions
|
5
|
-
def self.included(base)
|
6
|
-
base.send :alias_method, :visit_Tod_TimeOfDay, :terminal
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
module ArelDotExtensions
|
11
|
-
def self.included(base)
|
12
|
-
base.send :alias_method, :visit_Tod_TimeOfDay, :visit_String
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
module ArelToSqlExtensions
|
17
|
-
def visit_Tod_TimeOfDay(o, collector=nil)
|
18
|
-
quote Tod::TimeOfDay.dump(o)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
Arel::Visitors::DepthFirst.send :include, Tod::ArelDepthFirstExtensions
|
24
|
-
Arel::Visitors::Dot.send :include, Tod::ArelDotExtensions
|
25
|
-
Arel::Visitors::ToSql.send :include, Tod::ArelToSqlExtensions
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require_relative '../test_helper'
|
2
|
-
require File.expand_path(File.join(File.dirname(__FILE__),'..','support/active_record'))
|
3
|
-
|
4
|
-
class Order < ActiveRecord::Base
|
5
|
-
serialize :time, Tod::TimeOfDay
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "TimeOfDay with ActiveRecord Serializable Attribute" do
|
9
|
-
describe ".dump" do
|
10
|
-
it "sets time of day" do
|
11
|
-
Order.create!(time: Tod::TimeOfDay.new(9, 30))
|
12
|
-
end
|
13
|
-
|
14
|
-
it "sets nil as value" do
|
15
|
-
Order.create!(time: nil)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "works with multiparam time arguments" do
|
19
|
-
order = Order.create!({"time(4i)" => "8", "time(5i)" => "6", "time(6i)" => "5"})
|
20
|
-
assert_equal Tod::TimeOfDay.new(8,6,5), order.time
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should not raise Exception on access of unparsable values" do
|
24
|
-
order = Order.new(time: 'unparsable')
|
25
|
-
order.time
|
26
|
-
assert order.valid?
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should dump unparsable values to nil" do
|
30
|
-
assert_nil Tod::TimeOfDay.dump('')
|
31
|
-
assert_nil Tod::TimeOfDay.dump('unparsable')
|
32
|
-
assert_nil Tod::TimeOfDay.dump(nil)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe ".load" do
|
37
|
-
it "loads set Tod::TimeOfDay" do
|
38
|
-
time_of_day = Tod::TimeOfDay.new(9, 30)
|
39
|
-
order = Order.create!(time: time_of_day)
|
40
|
-
order.reload
|
41
|
-
assert_equal order.time, time_of_day
|
42
|
-
end
|
43
|
-
|
44
|
-
it "loads set Time" do
|
45
|
-
time_of_day = Time.new(2015, 10, 21, 16, 29, 0, "-07:00")
|
46
|
-
order = Order.create!(time: time_of_day)
|
47
|
-
order.reload
|
48
|
-
assert_equal order.time, Tod::TimeOfDay.new(16, 29)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "returns nil if time is not set" do
|
52
|
-
order = Order.create!(time: nil)
|
53
|
-
order.reload
|
54
|
-
assert_nil order.time
|
55
|
-
end
|
56
|
-
|
57
|
-
it "dump 24:00:00 and get it back" do
|
58
|
-
time_of_day = Tod::TimeOfDay.new(24, 0, 0)
|
59
|
-
order = Order.create!(time: time_of_day)
|
60
|
-
order.reload
|
61
|
-
assert_equal Tod::TimeOfDay.new(24), order.time
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe "Order.where" do
|
66
|
-
it "handles TimeOfDay as a parameter" do
|
67
|
-
tod = Tod::TimeOfDay.new(11, 11)
|
68
|
-
expected = Order.create!(time: tod)
|
69
|
-
actual = Order.where(time: tod).first
|
70
|
-
assert_equal expected, actual
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|