subunit 0.8.3 → 0.8.6
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
- checksums.yaml.gz.sig +0 -0
- data/lib/subunit.rb +85 -61
- data.tar.gz.sig +0 -0
- metadata +26 -27
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0c676bd895436a156711b39cfa244a46524112df81d678cd6c2f790560f3155f
|
|
4
|
+
data.tar.gz: 54a45610aa7c71050fe011d6b74fee408f378fc7c00564d0546cbdacba187f12
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 247d4cd835390d9452d31cea931177c3f4b1cf52bd6104460c600d21e5652114b7b6a7447de4d66733956ca93c3a47638cf985ba8b7e58f2cb51ac010bc4b745
|
|
7
|
+
data.tar.gz: 0605cff7b8f350e8785c82366f365300f72fb70b5a698f6b5361e958fa3c898460d4ded752d6a4cfc751ffa58fe9ad422a8424a638ac8086fc9448dcd275d1de
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/lib/subunit.rb
CHANGED
|
@@ -3,140 +3,164 @@
|
|
|
3
3
|
# file: subunit.rb
|
|
4
4
|
|
|
5
5
|
module SubunitFracture
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
refine Integer do
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
def strfunit(s)
|
|
10
10
|
Subunit.seconds(self).strfunit(s)
|
|
11
11
|
end
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
end
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
class Subunit
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
def self.seconds(val, units: nil)
|
|
20
20
|
new(units={minutes:60, hours:60, days:24}, seconds: val)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
# e.g. Subunit.hms_to_seconds('5 minutes and 4 seconds')
|
|
24
|
-
# => 304
|
|
24
|
+
# => 304
|
|
25
25
|
#
|
|
26
26
|
def self.hms_to_seconds(obj)
|
|
27
27
|
new(units={hours:60, minutes:60,seconds: 60, }, obj).to_i
|
|
28
|
-
end
|
|
28
|
+
end
|
|
29
29
|
|
|
30
30
|
attr_reader :to_a, :to_h, :to_i
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
def initialize(raw_units={}, obj)
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
@debug = false
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
@raw_units = raw_units
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
accumulate = ->(a) {
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
len = raw_units.to_a.length
|
|
41
41
|
val = ([0]*(len-1) + a).slice(-(len), len).zip(raw_units.values)\
|
|
42
|
-
.inject(0) {|r,x| r * x[1] + x[0] }
|
|
42
|
+
.inject(0) {|r,x| r * x[1] + x[0] }
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
if obj.is_a? String
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
@to_i = accumulate.call obj.split(/\D+/).map(&:to_i)
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
elsif obj.is_a? Array then
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
@to_i = accumulate.call obj
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
else
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
raw_subunit = obj || 0
|
|
56
56
|
method((raw_units.class.to_s.downcase + '_units').to_sym)\
|
|
57
57
|
.call(raw_units, raw_subunit)
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
# usage: Subunit.new(units={minutes:60, hours:60}, seconds: 661)\
|
|
63
63
|
# .strfunit("%x") #=> 11m 1s
|
|
64
64
|
#
|
|
65
65
|
# %x e.g. 11m 1s
|
|
66
|
+
# %xi e.g. 11m
|
|
66
67
|
# %X e.g. 11 minutes 1 second
|
|
68
|
+
# %Xi e.g. 11 minutes
|
|
67
69
|
# %c e.g. 00:11:01
|
|
68
|
-
# %
|
|
70
|
+
# %sc e.g. 11:01 # supresses leading zeros
|
|
71
|
+
# %s e.g. 11m # returns the 1st most significant value while
|
|
69
72
|
# ignoring the remainder
|
|
70
73
|
#
|
|
71
|
-
def strfunit(s)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
def strfunit(s)
|
|
75
|
+
|
|
76
|
+
# The i switch postfixed to the x or X switch will format the output
|
|
77
|
+
# without seconds unless there are no minutes.
|
|
78
|
+
|
|
79
|
+
s.sub!(/%xi?/) do |x|
|
|
80
|
+
|
|
81
|
+
h = to_h
|
|
82
|
+
a = h.to_a
|
|
83
|
+
a2 = (a.length > 1 and x[-1][/i$/] and h[:seconds]) ? a[0..-2] : a
|
|
84
|
+
a2.map {|label, val| val.to_s + label[0]}.join(' ')
|
|
85
|
+
|
|
75
86
|
end
|
|
76
|
-
|
|
77
|
-
s.sub!(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
87
|
+
|
|
88
|
+
s.sub!(/%Xi?/) do |x|
|
|
89
|
+
|
|
90
|
+
h = to_h
|
|
91
|
+
a = h.to_a
|
|
92
|
+
a2 = (a.length > 1 and x[-1][/i$/] and h[:seconds]) ? a[0..-2] : a
|
|
93
|
+
|
|
94
|
+
a2.map do |label, val|
|
|
95
|
+
|
|
81
96
|
next if val == 0
|
|
82
97
|
label2 = val > 1 ? label.to_s : label.to_s.sub(/s$/,'')
|
|
83
98
|
val.to_s + ' ' + label2
|
|
84
|
-
|
|
99
|
+
|
|
85
100
|
end.compact.join(' ')
|
|
86
|
-
|
|
87
|
-
end
|
|
88
|
-
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
|
|
89
104
|
s.sub!('%c') do |x|
|
|
90
|
-
|
|
105
|
+
|
|
91
106
|
a = @raw_units.values.reverse
|
|
92
107
|
a << a[-1]
|
|
93
|
-
|
|
108
|
+
|
|
94
109
|
fmt = a.map {|v| "%0" + v.to_s.length.to_s + "d"}.join(":")
|
|
95
110
|
fmt % to_a
|
|
96
|
-
end
|
|
97
|
-
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
s.sub!('%sc') do |x|
|
|
114
|
+
|
|
115
|
+
a = @raw_units.values.reverse
|
|
116
|
+
a << a[-1]
|
|
117
|
+
|
|
118
|
+
fmt = a.map {|v| "%0" + v.to_s.length.to_s + "d"}.join(":")
|
|
119
|
+
(fmt % to_a).gsub(/^(?:00:)+/,'').sub(/^0/,'')
|
|
120
|
+
end
|
|
121
|
+
|
|
98
122
|
s.sub!('%s') do |x|
|
|
99
|
-
label, val = to_h.first
|
|
123
|
+
label, val = to_h.first
|
|
100
124
|
val.to_s + label[0]
|
|
101
|
-
end
|
|
125
|
+
end
|
|
102
126
|
|
|
103
127
|
s
|
|
104
128
|
end
|
|
105
|
-
|
|
129
|
+
|
|
106
130
|
def to_s(omit: [], verbose: true)
|
|
107
|
-
|
|
131
|
+
|
|
108
132
|
if not verbose then
|
|
109
|
-
|
|
133
|
+
|
|
110
134
|
r = self.to_a.reverse.take_while {|x| x > 0}.reverse\
|
|
111
135
|
.map {|x| "%02d" % x}.join(':')
|
|
112
|
-
|
|
136
|
+
|
|
113
137
|
if r.length < 2 then
|
|
114
138
|
return '00:00'
|
|
115
|
-
elsif r.length == 2
|
|
139
|
+
elsif r.length == 2
|
|
116
140
|
return '00:' + r
|
|
117
141
|
else
|
|
118
142
|
return r
|
|
119
143
|
end
|
|
120
|
-
|
|
144
|
+
|
|
121
145
|
end
|
|
122
|
-
|
|
146
|
+
|
|
123
147
|
h = @to_h
|
|
124
148
|
omit.each {|x| h.delete x}
|
|
125
149
|
|
|
126
150
|
list = h.to_a
|
|
127
151
|
n = list.find {|_,v| v > 0 }
|
|
128
|
-
a = list[list.index(n)..-1].map {|x|"%d %s" % x.reverse}
|
|
129
|
-
|
|
152
|
+
a = list[list.index(n)..-1].map {|x|"%d %s" % x.reverse}
|
|
153
|
+
|
|
130
154
|
duration = case a.length
|
|
131
155
|
|
|
132
156
|
when 1
|
|
133
|
-
a.first
|
|
157
|
+
a.first
|
|
134
158
|
when 2
|
|
135
159
|
a.join ' and '
|
|
136
|
-
else
|
|
160
|
+
else
|
|
137
161
|
"%s and %s" % [a[0..-2].join(', '), a[-1]]
|
|
138
162
|
end
|
|
139
|
-
|
|
163
|
+
|
|
140
164
|
duration.gsub(/(\b1 \w+)s/, '\1')
|
|
141
165
|
|
|
142
166
|
end
|
|
@@ -150,18 +174,18 @@ class Subunit
|
|
|
150
174
|
def fixnum_subunit(v)
|
|
151
175
|
[v, :remainder]
|
|
152
176
|
end
|
|
153
|
-
|
|
177
|
+
|
|
154
178
|
def integer_subunit(v)
|
|
155
179
|
[v, :remainder]
|
|
156
|
-
end
|
|
157
|
-
|
|
180
|
+
end
|
|
181
|
+
|
|
158
182
|
def hash_units(raw_units={}, u=nil)
|
|
159
|
-
|
|
183
|
+
|
|
160
184
|
val, label = method((u.class.to_s.downcase + '_subunit').to_sym).call(u)
|
|
161
185
|
units = multiply_units(raw_units.values).reverse
|
|
162
186
|
puts 'units: ' + units.inspect if @debug
|
|
163
|
-
@to_a = a = scan_units(units, val).map(&:to_i)
|
|
164
|
-
|
|
187
|
+
@to_a = a = scan_units(units, val).map(&:to_i)
|
|
188
|
+
|
|
165
189
|
puts 'a: ' + a.inspect if @debug
|
|
166
190
|
pairs = (raw_units.keys.reverse + [label]).reverse.take(a.length)\
|
|
167
191
|
.reverse.zip(a).select {|x| x[1] > 0}
|
|
@@ -177,8 +201,8 @@ class Subunit
|
|
|
177
201
|
def multiply_units(x) x.inject([]){|r,x| r + [x.to_i * (r[-1] || 1)]} end
|
|
178
202
|
|
|
179
203
|
def scan_units(unit_list,raw_subunit)
|
|
180
|
-
n = unit_list.shift
|
|
181
|
-
unit, subunit = [:/,:%].map{|x| raw_subunit.send x, n}
|
|
204
|
+
n = unit_list.shift
|
|
205
|
+
unit, subunit = [:/,:%].map{|x| raw_subunit.send x, n}
|
|
182
206
|
unit_list.length > 0 ? [unit] + scan_units(unit_list, subunit) : [unit, subunit]
|
|
183
207
|
end
|
|
184
208
|
end
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: subunit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.8.
|
|
4
|
+
version: 0.8.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- James Robertson
|
|
@@ -11,34 +11,34 @@ cert_chain:
|
|
|
11
11
|
- |
|
|
12
12
|
-----BEGIN CERTIFICATE-----
|
|
13
13
|
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMzIyMjAyNTUyWhcN
|
|
15
|
+
MjMwMzIyMjAyNTUyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDDRYH8
|
|
17
|
+
6rtefR26KsrSUUB5FUPwbzaILyNTP6eYNd3txbsYi8pnPauo61CgQ9uFrSPVWlmf
|
|
18
|
+
nb5DZOHEsGqwShs2S+n58i8IJB6bYCf0O0/8cvXBfvZ0uJUs+c5i+9FZID52w1Ph
|
|
19
|
+
AdWA9sa3ZkXM4gfGwZfbtV6HhWNPCz3WujQtslf/YrAaOrctnyQMOAkL3uFx0/hZ
|
|
20
|
+
PqoZ3zxGxjm1M5c9osWggZVZydIn/V1Lfu+bZRXRNRaHccHQK8sDNVbvJVWE4yw/
|
|
21
|
+
CSTRAQSV9a4WXi8qRxprtEfrJOHNGM3hiu8ma+E6j8+aJrRuyCILSDkx5brwv/16
|
|
22
|
+
p/IZr4K6ONpszYeXa4wtOMjR4vAJvYpF8jolzRNYEJZXui0XCrujhEq5HvuDLxuc
|
|
23
|
+
unQ9Ens+qFoMlTID2eDBgOgbZj1Msa/rj+GsXYglNGiwEmMsIqBTQ2CGs+u8t59L
|
|
24
|
+
sbMqTAa/4b0E18QQmvEPT1zVNf/wxH/cxYZGQJTTTihducAabi37LD2/1Q8CAwEA
|
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU4gbHY4s8
|
|
26
|
+
TUd/umYEir0d+OQYYUEwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
|
27
27
|
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEAkFvP0dx51fJOkit9bSNU+ZDmsGj5yRas5hN3Mpr8
|
|
29
|
+
zPr58Tek+sPXZZgJOxSSofA6XOoaw/Qf54Zvi12QvlACr8b9sBDh7LvKOJYr7AAx
|
|
30
|
+
KDnKBVLscp3Lma4jSSz+COLO5NKjyTJzoGNyrVWukcG+Q/od+F4gc9geaWkb4cAN
|
|
31
|
+
rk6xbh2OkmWKttaPYbfLrTCIJ47yjdPDWHTS1gzD/TGc3GkX/kEWEe3TrI1C0J9d
|
|
32
|
+
l8CJhRfqnM/Z7z9NgBcBYqEPcH50oZQfj+jPuC/aPCHYH6P6ERPCWxVrwjHdOa9P
|
|
33
|
+
0LCJ5kn6RqrhzfRKcO1+8c0whliNP+98DluwP+5pdM7HfbSpeArtA9DVf3vn+n+I
|
|
34
|
+
RpHzYUh8G2ASjUDDp1J7aNqtvJpa6M/a2HcDJJyAMw65Gq+QBaIYS/wOfvX8NJql
|
|
35
|
+
w3QFiPkdCGAc/OB+os5J5edPeaH3ohMnM+eLfMzu1TAb37QeREb9T3/+gCTv79XF
|
|
36
|
+
5EfsI7uk1Aib+1DtRwjU8kB0
|
|
37
37
|
-----END CERTIFICATE-----
|
|
38
|
-
date:
|
|
38
|
+
date: 2022-03-22 00:00:00.000000000 Z
|
|
39
39
|
dependencies: []
|
|
40
40
|
description:
|
|
41
|
-
email:
|
|
41
|
+
email: digital.robertson@gmail.com
|
|
42
42
|
executables: []
|
|
43
43
|
extensions: []
|
|
44
44
|
extra_rdoc_files: []
|
|
@@ -63,8 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
63
63
|
- !ruby/object:Gem::Version
|
|
64
64
|
version: '0'
|
|
65
65
|
requirements: []
|
|
66
|
-
|
|
67
|
-
rubygems_version: 2.7.10
|
|
66
|
+
rubygems_version: 3.2.22
|
|
68
67
|
signing_key:
|
|
69
68
|
specification_version: 4
|
|
70
69
|
summary: Input a raw unit and it returns the denomination.
|
metadata.gz.sig
CHANGED
|
Binary file
|