units-time 1.0.0 → 1.0.1
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/Manifest.txt +2 -0
- data/lib/units-time/timedelta.rb +92 -0
- data/lib/units-time/timestamp.rb +56 -0
- data/lib/units-time/version.rb +1 -1
- data/lib/units-time.rb +2 -149
- data/test/test_units_time.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76fe6741c76332996673e18c6d299f1fa85dc014
|
4
|
+
data.tar.gz: b7c77366854058091dd6223196cfdb63950269b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 074f4a4717ef00dd8023f4daa8dbe1760aa7caaf6dc056bf825cccd2c2c2dde311ca8d5e4761e888da96b8750f6d0c5f37644a2c4fb9ad2992f64c78f25d4ee4
|
7
|
+
data.tar.gz: df29e7ca34b97c40740e8e6fb450224c46f1a9cf1a6f92d6b4b483a6f15b2c65ebd6852f196e9f67c4ed64223910ac6ac0be69400447c87ead00d3ee24ec2cd8
|
data/Manifest.txt
CHANGED
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
class Timedelta
|
5
|
+
|
6
|
+
attr_reader :seconds
|
7
|
+
|
8
|
+
def initialize( seconds=0 )
|
9
|
+
@seconds = seconds
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def ==( other )
|
14
|
+
if other.is_a?( self.class )
|
15
|
+
@seconds == other.seconds
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
alias_method :eql?, :==
|
21
|
+
|
22
|
+
def *( other )
|
23
|
+
if other.is_a?( Integer )
|
24
|
+
self.class.new( @seconds * other )
|
25
|
+
else
|
26
|
+
raise TypeError.new( "[Timedelta] mul(tiplication) - wrong type >#{other.inspect}< #{other.class.name} - integer number expected" )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def +( other )
|
31
|
+
if other.is_a?( self.class )
|
32
|
+
self.class.new( @seconds + other.seconds )
|
33
|
+
else
|
34
|
+
raise TypeError.new( "[Timedelta] add(ition) - wrong type >#{other.inspect}< #{other.class.name} - Timedelta expected" )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def -( other )
|
39
|
+
if other.is_a?( self.class )
|
40
|
+
self.class.new( @seconds - other.seconds )
|
41
|
+
else
|
42
|
+
raise TypeError.new( "[Timedelta] sub(straction) - wrong type >#{other.inspect}< #{other.class.name} - Timedelta expected" )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
### for details on coerce
|
48
|
+
## see https://blog.dnsimple.com/2017/01/ruby-coercion-protocols-part-2/
|
49
|
+
## and http://wiki.c2.com/?RubyCoerce
|
50
|
+
##
|
51
|
+
## note: just switch left and right will NOT work with subtraction
|
52
|
+
## e.g. 2+3.seconds == 3.seconds+2 BUT
|
53
|
+
## 2-3.seconds != 3.seconds-2 !!!!!
|
54
|
+
|
55
|
+
## note: safe integer used for coerce dispatch
|
56
|
+
class SafeInteger
|
57
|
+
def initialize( value )
|
58
|
+
@value = value
|
59
|
+
end
|
60
|
+
## it's safe to swap left and right for multiplication (it's communicative)
|
61
|
+
def *( other ) other.*( @value ); end
|
62
|
+
end
|
63
|
+
|
64
|
+
def coerce( other )
|
65
|
+
if other.is_a?( Integer )
|
66
|
+
[SafeInteger.new(other), self]
|
67
|
+
else
|
68
|
+
raise TypeError.new( "[Timedelta] coerce - wrong type >#{other.inspect}< #{other.class.name} - Integer number expected" )
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
include Comparable
|
74
|
+
|
75
|
+
def <=>( other )
|
76
|
+
if other.is_a?( self.class )
|
77
|
+
@seconds <=> other.seconds
|
78
|
+
else
|
79
|
+
raise TypeError.new( "[Timedelta] <=> - wrong type >#{other.inspect}< #{other.class.name} - Timedelta expected" )
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
## todo/fix: always freeze by default (timedelta is immutable) - why? why not?
|
85
|
+
def self.zero() @@zero ||= new(0).freeze; end
|
86
|
+
|
87
|
+
alias_method :to_i, :seconds ## add to integer conversion - why? why not?
|
88
|
+
alias_method :to_int, :seconds
|
89
|
+
## note: same as:
|
90
|
+
## def to_i() @seconds; end ## add to integer conversion - why? why not?
|
91
|
+
## def to_int() @seconds; end
|
92
|
+
end # class Timedelta
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
class Timestamp
|
5
|
+
|
6
|
+
def self.now() new( Time.now.to_i ); end
|
7
|
+
|
8
|
+
attr_reader :seconds
|
9
|
+
|
10
|
+
def initialize( seconds=Time.now.to_i )
|
11
|
+
@seconds = seconds ## seconds since Jan 1st, 1970 (unix epoch time)
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==( other )
|
15
|
+
if other.is_a?( self.class )
|
16
|
+
@seconds == other.seconds
|
17
|
+
else
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
alias_method :eql?, :==
|
22
|
+
|
23
|
+
def +( other )
|
24
|
+
if other.is_a?( Timedelta )
|
25
|
+
self.class.new( @seconds + other.seconds )
|
26
|
+
else
|
27
|
+
raise TypeError.new( "[Timestamp] add(ition) - wrong type >#{other.inspect}< #{other.class.name} - Timedelta expected" )
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def -( other )
|
32
|
+
if other.is_a?( Timedelta )
|
33
|
+
self.class.new( @seconds - other.seconds )
|
34
|
+
else
|
35
|
+
raise TypeError.new( "[Timestamp] sub(straction) - wrong type >#{other.inspect}< #{other.class.name} - Timedelta expected" )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
include Comparable
|
41
|
+
|
42
|
+
def <=>( other )
|
43
|
+
if other.is_a?( self.class )
|
44
|
+
@seconds <=> other.seconds
|
45
|
+
else
|
46
|
+
raise TypeError.new( "[Timestamp] <=> - wrong type >#{other.inspect}< #{other.class.name} - Timestamp expected" )
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
## todo/fix: always freeze by default (timestamp is immutable) - why? why not?
|
52
|
+
def self.zero() @@zero ||= new(0).freeze; end
|
53
|
+
|
54
|
+
alias_method :to_i, :seconds ## add to integer conversion - why? why not?
|
55
|
+
alias_method :to_int, :seconds
|
56
|
+
end ## class Timestamp
|
data/lib/units-time/version.rb
CHANGED
data/lib/units-time.rb
CHANGED
@@ -7,6 +7,8 @@ require 'time'
|
|
7
7
|
|
8
8
|
## our own code
|
9
9
|
require 'units-time/version' # note: let version always go first
|
10
|
+
require 'units-time/timestamp'
|
11
|
+
require 'units-time/timedelta'
|
10
12
|
|
11
13
|
|
12
14
|
|
@@ -18,155 +20,6 @@ require 'units-time/version' # note: let version always go first
|
|
18
20
|
# - you CAN only compare (<=>) timestamp to timestamp but NOT timedelta !!
|
19
21
|
# - you CAN only compare (<=>) timedelta to timedelta but NOT timestamp !!
|
20
22
|
|
21
|
-
class Timestamp
|
22
|
-
|
23
|
-
def self.now() new( Time.now.to_i ); end
|
24
|
-
|
25
|
-
attr_reader :seconds
|
26
|
-
|
27
|
-
def initialize( seconds=Time.now.to_i )
|
28
|
-
@seconds = seconds ## seconds since Jan 1st, 1970 (unix epoch time)
|
29
|
-
end
|
30
|
-
|
31
|
-
def ==( other )
|
32
|
-
if other.is_a?( self.class )
|
33
|
-
@seconds == other.seconds
|
34
|
-
else
|
35
|
-
## note: allow for now integer comparision too - why? why not?
|
36
|
-
if other.is_a?( Integer )
|
37
|
-
@seconds == other
|
38
|
-
else
|
39
|
-
false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
alias_method :eql?, :==
|
44
|
-
|
45
|
-
def +( other )
|
46
|
-
if other.is_a?( Timedelta )
|
47
|
-
self.class.new( @seconds + other.seconds )
|
48
|
-
else
|
49
|
-
## fix/todo: use TypeError!!!!
|
50
|
-
raise ArgumentError.new( "[Timestamp] add(ition) - wrong type #{other.inspect} - Timedelta expected" )
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def -( other )
|
55
|
-
if other.is_a?( Timedelta )
|
56
|
-
self.class.new( @seconds - other.seconds )
|
57
|
-
else
|
58
|
-
## fix/todo: use TypeError!!!!
|
59
|
-
raise ArgumentError.new( "[Timestamp] sub(straction) - wrong type #{other.inspect} - Timedelta expected" )
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
|
-
include Comparable
|
65
|
-
|
66
|
-
def <=>( other )
|
67
|
-
if other.is_a?( self.class )
|
68
|
-
@seconds <=> other.seconds
|
69
|
-
else
|
70
|
-
## fix/todo: use TypeError!!!!
|
71
|
-
raise ArgumentError.new( "[Timestamp] <=> - wrong type #{other.inspect} - Timestamp expected" )
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
## todo/fix: always freeze by default (timestamp is immutable) - why? why not?
|
77
|
-
def self.zero() @@zero ||= new(0).freeze; end
|
78
|
-
|
79
|
-
alias_method :to_i, :seconds ## add to integer conversion - why? why not?
|
80
|
-
alias_method :to_int, :seconds
|
81
|
-
end ## class Timestamp
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
class Timedelta
|
86
|
-
|
87
|
-
attr_reader :seconds
|
88
|
-
|
89
|
-
def initialize( seconds=0 )
|
90
|
-
@seconds = seconds
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
def ==( other )
|
95
|
-
if other.is_a?( self.class )
|
96
|
-
@seconds == other.seconds
|
97
|
-
else
|
98
|
-
## note: allow for now integer comparision too - why? why not?
|
99
|
-
if other.is_a?( Integer )
|
100
|
-
@seconds == other
|
101
|
-
else
|
102
|
-
false
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
alias_method :eql?, :==
|
107
|
-
|
108
|
-
def *( other )
|
109
|
-
if other.is_a?( Integer )
|
110
|
-
self.class.new( @seconds * other )
|
111
|
-
else
|
112
|
-
## fix/todo: use TypeError!!!!
|
113
|
-
raise ArgumentError.new( "[Timedelta] mul(tiplication) - wrong type #{other.inspect} - integer number expected" )
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def +( other )
|
118
|
-
if other.is_a?( self.class )
|
119
|
-
self.class.new( @seconds + other.seconds )
|
120
|
-
else
|
121
|
-
## fix/todo: use TypeError!!!!
|
122
|
-
raise ArgumentError.new( "[Timedelta] add(ition) - wrong type #{other.inspect} - Timedelta expected" )
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def -( other )
|
127
|
-
if other.is_a?( self.class )
|
128
|
-
self.class.new( @seconds - other.seconds )
|
129
|
-
else
|
130
|
-
## fix/todo: use TypeError!!!!
|
131
|
-
raise ArgumentError.new( "[Timedelta] sub(straction) - wrong type #{other.inspect} - Timedelta expected" )
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
|
-
### for details on coerce
|
137
|
-
## see https://blog.dnsimple.com/2017/01/ruby-coercion-protocols-part-2/
|
138
|
-
def coerce( other )
|
139
|
-
if other.is_a?( Integer )
|
140
|
-
[self, other] ## allow communitative - switch left and right e.g. 365*24.hours to 24.hours*365
|
141
|
-
else
|
142
|
-
## fix/todo: use TypeError!!!!
|
143
|
-
raise ArgumentError.new( "[Timedelta] coerce - wrong type #{other.inspect} - Integer number expected" )
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
|
148
|
-
include Comparable
|
149
|
-
|
150
|
-
def <=>( other )
|
151
|
-
if other.is_a?( self.class )
|
152
|
-
@seconds <=> other.seconds
|
153
|
-
else
|
154
|
-
## fix/todo: use TypeError!!!!
|
155
|
-
raise ArgumentError.new( "[Timedelta] <=> - wrong type #{other.inspect} - Timedelta expected" )
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
|
160
|
-
## todo/fix: always freeze by default (timedelta is immutable) - why? why not?
|
161
|
-
def self.zero() @@zero ||= new(0).freeze; end
|
162
|
-
|
163
|
-
alias_method :to_i, :seconds ## add to integer conversion - why? why not?
|
164
|
-
alias_method :to_int, :seconds
|
165
|
-
## note: same as:
|
166
|
-
## def to_i() @seconds; end ## add to integer conversion - why? why not?
|
167
|
-
## def to_int() @seconds; end
|
168
|
-
end # class Timedelta
|
169
|
-
|
170
23
|
|
171
24
|
### "global" converter functions use like
|
172
25
|
## Timestamp(0) or Timedelta(0)
|
data/test/test_units_time.rb
CHANGED
@@ -13,7 +13,7 @@ class TestUnitsTime < MiniTest::Test
|
|
13
13
|
def test_timstamp
|
14
14
|
now = Timestamp.now
|
15
15
|
|
16
|
-
assert_equal now.to_i, now
|
16
|
+
assert_equal Timestamp.new( now.to_i ), now
|
17
17
|
|
18
18
|
assert_equal now+31_536_000.secs, now+1.year
|
19
19
|
assert_equal now+1_209_600.secs, now+1.fortnight
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: units-time
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -55,6 +55,8 @@ files:
|
|
55
55
|
- README.md
|
56
56
|
- Rakefile
|
57
57
|
- lib/units-time.rb
|
58
|
+
- lib/units-time/timedelta.rb
|
59
|
+
- lib/units-time/timestamp.rb
|
58
60
|
- lib/units-time/version.rb
|
59
61
|
- test/helper.rb
|
60
62
|
- test/test_units_time.rb
|