int_time 0.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 +7 -0
- data/lib/int_time.rb +101 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5f547f2d8bc9699c363a7f6298d04c71071a50a7
|
4
|
+
data.tar.gz: 933baea6574a016cbbdaf303ca26c8c53c5c78ab
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f2cdc7d8cd8e24409f495317b0a60241ce7ae4db560bd569726ca9232ab549412c4d61be0f421c4a893876ad7a116e65adb8e8a941501749240e5549cbde049d
|
7
|
+
data.tar.gz: 929ec08b70e66c49a29460dedd8efa57c56f51d5ca1faabf4e9c1099556aa652027712b3e052a9705c2bc0307599475796b7ac1a6a46c8ddeefac8a448cc6290
|
data/lib/int_time.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
class IntTime
|
2
|
+
attr_reader :hour, :minute
|
3
|
+
|
4
|
+
MAX_HOUR = 24
|
5
|
+
MAX_MINUTE = 60
|
6
|
+
TIME_PATTERN = /(\d{2}):(\d{2})/
|
7
|
+
|
8
|
+
def initialize(hour, minute)
|
9
|
+
@hour = hour
|
10
|
+
@minute = minute
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
##########################
|
15
|
+
## Instance Methods ##
|
16
|
+
##########################
|
17
|
+
|
18
|
+
def +(other)
|
19
|
+
new_minute = @minute + other.minute
|
20
|
+
new_hour = @hour + other.hour + new_minute / MAX_MINUTE
|
21
|
+
IntTime.new(new_hour % MAX_HOUR, new_minute % MAX_MINUTE)
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_minute(minute)
|
25
|
+
new_minute = @minute + minute
|
26
|
+
new_hour = @hour + new_minute / MAX_MINUTE
|
27
|
+
IntTime.new(new_hour % MAX_HOUR, new_minute % MAX_MINUTE)
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_hour(hour)
|
31
|
+
new_hour = @hour + hour
|
32
|
+
IntTime.new(new_hour % MAX_HOUR, @minute)
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_i
|
36
|
+
@hour * 100 + @minute
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
format('%02d:%02d', @hour, @minute)
|
41
|
+
end
|
42
|
+
|
43
|
+
def inspect
|
44
|
+
"IntTime #{self}"
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
#######################
|
49
|
+
## Class Methods ##
|
50
|
+
#######################
|
51
|
+
|
52
|
+
def self.valid?(number)
|
53
|
+
number.is_a?(Integer) &&
|
54
|
+
number >= 0 &&
|
55
|
+
valid_hour?(number % 10_000 / 100) &&
|
56
|
+
valid_minute?(number % 100)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.from(token)
|
60
|
+
if token.class <= Integer
|
61
|
+
from_int(token)
|
62
|
+
elsif token.class <= String
|
63
|
+
from_str(token)
|
64
|
+
else
|
65
|
+
raise "Invalid input: #{token}; expect integer or string"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.from_int(time)
|
70
|
+
raise "Input #{time} is not a valid int time" unless valid?(time)
|
71
|
+
IntTime.new(time % 10_000 / 100 % MAX_HOUR, time % 100 % MAX_MINUTE)
|
72
|
+
end
|
73
|
+
private_class_method :from_int
|
74
|
+
|
75
|
+
def self.from_str(time)
|
76
|
+
match = TIME_PATTERN.match(time)
|
77
|
+
if match.nil? || match.size != 3
|
78
|
+
raise "Input #{time} is not a valid string time"
|
79
|
+
end
|
80
|
+
IntTime.new(match[1].to_i, match[2].to_i)
|
81
|
+
end
|
82
|
+
private_class_method :from_str
|
83
|
+
|
84
|
+
def self.to_str(time)
|
85
|
+
from(time).to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.to_int(time)
|
89
|
+
from(time).to_i
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.valid_hour?(number)
|
93
|
+
number.is_a?(Integer) && number < MAX_HOUR && number >= 0
|
94
|
+
end
|
95
|
+
private_class_method :valid_hour?
|
96
|
+
|
97
|
+
def self.valid_minute?(number)
|
98
|
+
number.is_a?(Integer) && number < MAX_MINUTE && number >= 0
|
99
|
+
end
|
100
|
+
private_class_method :valid_minute?
|
101
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: int_time
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Liren Tu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-26 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A value class for time
|
14
|
+
email: tuliren@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/int_time.rb
|
20
|
+
homepage: http://rubygems.org/gems/int_time
|
21
|
+
licenses:
|
22
|
+
- MIT
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubyforge_project:
|
40
|
+
rubygems_version: 2.5.1
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Integer Time Class
|
44
|
+
test_files: []
|