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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/int_time.rb +101 -0
  3. 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: []