hour-ruby 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/lib/hour.rb +38 -19
- data/spec/hour_spec.rb +21 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b8bac3638cd0e4086e0929f7fc05aae9d6e165495dc9427a2a02a587f1b1f20
|
4
|
+
data.tar.gz: 2afec0e7ad09044471bf724c2d09070a3d251c7eb676538484f4f62ec3d29b8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61261cd9e0c2e96aaa73b97f3429ed99c2a3a6880f6e9e7a32efba3fb22b8f517c4b3b3f3e6f2c5e05a52061063e213872366c2cb9ded37329d9c83cd1383f86
|
7
|
+
data.tar.gz: e242de3802e2e9b424968617b49900d280e0e95d18b002cf48c87551c42e1931ef70522753693afe94783ac0fae0991bc773e9bc8778cc838862b944c5d55fed
|
data/README.md
CHANGED
@@ -28,10 +28,13 @@ puts "It's #{hour.to_s}!"
|
|
28
28
|
puts "The system time is #{Hour.now}!"
|
29
29
|
```
|
30
30
|
|
31
|
+
# Development
|
32
|
+
|
33
|
+
Use `vagrant up` to start a VM. Once everything's ready, it's `vagrant ssh`. Upon login, you'll be connected to a tmux session. To sleep, it's `vagrant suspend`.
|
34
|
+
|
31
35
|
# TODO
|
32
36
|
|
33
37
|
- Rubocop.
|
34
|
-
- Travis.
|
35
38
|
- Release version 0.1.
|
36
39
|
|
37
40
|
[Gem version]: https://rubygems.org/gems/hour-ruby
|
data/lib/hour.rb
CHANGED
@@ -56,13 +56,13 @@ class Hour
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# TODO: Test me and document me.
|
59
|
-
def self.now
|
60
|
-
self.from_time(Time.now)
|
59
|
+
def self.now(**opts)
|
60
|
+
self.from_time(Time.now, **opts)
|
61
61
|
end
|
62
62
|
|
63
63
|
# TODO: document and write tests.
|
64
|
-
def self.from_time(time)
|
65
|
-
self.new(time.hour, time.min, time.sec)
|
64
|
+
def self.from_time(time, s: true)
|
65
|
+
self.new(time.hour, time.min, s ? time.sec : false)
|
66
66
|
end
|
67
67
|
|
68
68
|
# Build an hour instance from an hour string.
|
@@ -71,17 +71,17 @@ class Hour
|
|
71
71
|
# Hour.parse("1:00", "%h:%m?") # Will work with "1:00" or just "1".
|
72
72
|
#
|
73
73
|
# TODO: Implement me, test me and document me.
|
74
|
-
def self.parse(serialised_hour,
|
74
|
+
def self.parse(serialised_hour, s: true)
|
75
75
|
args = serialised_hour.split(':').map(&:to_i)
|
76
76
|
|
77
|
-
|
78
|
-
when 3
|
77
|
+
if args.length == 3 && s
|
79
78
|
self.new(*args)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
79
|
+
elsif args.length == 2 && !s
|
80
|
+
self.new(*(args << false))
|
81
|
+
elsif ((0..2).include?(args.length) && s) || ((0..1).include?(args.length) && !s)
|
82
|
+
raise ArgumentError, "Too few segments (#{args.inspect})."
|
83
|
+
elsif ((4..Float::INFINITY).include?(args.length) && s) || ((3..Float::INFINITY).include?(args.length) && !s)
|
84
|
+
raise ArgumentError, "Too many segments (#{args.inspect})."
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -95,7 +95,7 @@ class Hour
|
|
95
95
|
raise ArgumentError.new("Use either minutes OR seconds, not both.")
|
96
96
|
end
|
97
97
|
|
98
|
-
if minutes > 0
|
98
|
+
if minutes > 0 || (minutes == 0 && seconds == 0)
|
99
99
|
self.new(h: minutes / 60, m: minutes % 60)
|
100
100
|
else
|
101
101
|
self.from(minutes: seconds / 60) + self.new(s: seconds % 60)
|
@@ -121,7 +121,7 @@ class Hour
|
|
121
121
|
raise ArgumentError.new("Minutes must be a number between 0 and 60.")
|
122
122
|
end
|
123
123
|
|
124
|
-
if @s > 60
|
124
|
+
if @s.respond_to?(:round) && @s > 60
|
125
125
|
raise ArgumentError.new("Seconds must be a number between 0 and 60.")
|
126
126
|
end
|
127
127
|
end
|
@@ -132,7 +132,15 @@ class Hour
|
|
132
132
|
def +(other)
|
133
133
|
hours = @h + other.h + (@m + other.m + ((@s + other.s) / 60)) / 60
|
134
134
|
minutes = (@m + other.m + ((@s + other.s) / 60)) % 60
|
135
|
-
|
135
|
+
|
136
|
+
if @s && other.s
|
137
|
+
seconds = (@s + other.s) % 60
|
138
|
+
elsif (!@s) && (!other.s)
|
139
|
+
seconds = false
|
140
|
+
else
|
141
|
+
raise "TODO: how to resolve this?"
|
142
|
+
end
|
143
|
+
|
136
144
|
self.class.new(hours, minutes, seconds)
|
137
145
|
end
|
138
146
|
|
@@ -159,17 +167,28 @@ class Hour
|
|
159
167
|
# Hour.new(m: 1, s: 10).seconds.value # => 10
|
160
168
|
# Hour.new(1, 45, 10 ).seconds.total # => (1 * 60 * 60) + (45 * 60) + 10
|
161
169
|
def seconds
|
162
|
-
SecondUnit.new(self)
|
170
|
+
SecondUnit.new(self) if @s
|
163
171
|
end
|
164
172
|
|
165
|
-
#
|
166
|
-
#
|
173
|
+
# Returns string representation of the hour instance.
|
174
|
+
#
|
175
|
+
# Hour.new(m: 1, s: 10 ).to_s # => "1:10"
|
176
|
+
# Hour.new(1, 45, false).to_s # => "1:45"
|
177
|
+
#
|
178
|
+
# TODO: Allow formatting string (to format hours to 2 digits etc).
|
167
179
|
def to_s(format = nil)
|
168
|
-
|
180
|
+
[(@h unless @h.zero?), format('%02d', @m), (format('%02d', @s) if @s)].compact.join(':')
|
169
181
|
end
|
170
182
|
|
171
183
|
alias_method :inspect, :to_s
|
172
184
|
|
185
|
+
# Provisional.
|
186
|
+
def to_decimal
|
187
|
+
decimal = (@m / 60.0) + (@s / 3600.0)
|
188
|
+
"#{@h}.#{decimal}"
|
189
|
+
@h + decimal
|
190
|
+
end
|
191
|
+
|
173
192
|
def to_time(today = Time.now)
|
174
193
|
Time.new(today.year, today.month, today.day, self.hours, self.minutes_over_the_hour)
|
175
194
|
end
|
data/spec/hour_spec.rb
CHANGED
@@ -18,9 +18,27 @@ describe Hour do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
describe "#to_s" do
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
it "pads minutes and seconds with zeros" do
|
22
|
+
hour = Hour.new(1, 9, 5)
|
23
|
+
expect(hour.to_s).to eql('1:09:05')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "omits hours if it's less than 60 minutes" do
|
27
|
+
hour = Hour.new(m: 52)
|
28
|
+
expect(hour.to_s).to eql('52:00')
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with seconds disabled" do
|
32
|
+
it "returns %HH:%MM" do
|
33
|
+
hour = Hour.new(1, 9, false)
|
34
|
+
expect(hour.to_s).to eql('1:09')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with hours disabled" do
|
39
|
+
# This would be 90:00 for 1.5 hours.
|
40
|
+
pending "not implemented"
|
41
|
+
end
|
24
42
|
end
|
25
43
|
|
26
44
|
describe "#+" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hour-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James C Russell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: "."
|
14
14
|
email: james@101ideas.cz
|