subunit 0.8.5 → 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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/subunit.rb +72 -62
  4. data.tar.gz.sig +0 -0
  5. metadata +26 -27
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e76018bbc5927b0645dc9b7b35df35041719bbcac77e078306edd8f00a83f04
4
- data.tar.gz: 68057c6ef69c1cf21d554502f8c9055da642729614dadd3d2418f7fa8c55af51
3
+ metadata.gz: 0c676bd895436a156711b39cfa244a46524112df81d678cd6c2f790560f3155f
4
+ data.tar.gz: 54a45610aa7c71050fe011d6b74fee408f378fc7c00564d0546cbdacba187f12
5
5
  SHA512:
6
- metadata.gz: c322cef743c9ab764bd35158e68867cf5879e254427aad7351a2f3a0e222effc4a9597637f22f69250df7d058e4ad8e2ab42b74218a98db8e47d47da71433fe3
7
- data.tar.gz: '09affcc2c6235d9bd29a03441b6bf64298a3aa7a46062b3a47753302a0f7d1088fec5d6c73c186e232181447dafeb6da1a1bb296303c109197aca89f9074a568'
6
+ metadata.gz: 247d4cd835390d9452d31cea931177c3f4b1cf52bd6104460c600d21e5652114b7b6a7447de4d66733956ca93c3a47638cf985ba8b7e58f2cb51ac010bc4b745
7
+ data.tar.gz: 0605cff7b8f350e8785c82366f365300f72fb70b5a698f6b5361e958fa3c898460d4ded752d6a4cfc751ffa58fe9ad422a8424a638ac8086fc9448dcd275d1de
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/subunit.rb CHANGED
@@ -3,62 +3,62 @@
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
  #
@@ -67,90 +67,100 @@ class Subunit
67
67
  # %X e.g. 11 minutes 1 second
68
68
  # %Xi e.g. 11 minutes
69
69
  # %c e.g. 00:11:01
70
- # %s e.g. 11m # returns the 1st most significant value while
70
+ # %sc e.g. 11:01 # supresses leading zeros
71
+ # %s e.g. 11m # returns the 1st most significant value while
71
72
  # ignoring the remainder
72
73
  #
73
- def strfunit(s)
74
-
75
- # The i switch postfixed to the x or X switch will format the output
74
+ def strfunit(s)
75
+
76
+ # The i switch postfixed to the x or X switch will format the output
76
77
  # without seconds unless there are no minutes.
77
-
78
+
78
79
  s.sub!(/%xi?/) do |x|
79
-
80
+
80
81
  h = to_h
81
82
  a = h.to_a
82
83
  a2 = (a.length > 1 and x[-1][/i$/] and h[:seconds]) ? a[0..-2] : a
83
84
  a2.map {|label, val| val.to_s + label[0]}.join(' ')
84
-
85
+
85
86
  end
86
-
87
+
87
88
  s.sub!(/%Xi?/) do |x|
88
89
 
89
90
  h = to_h
90
91
  a = h.to_a
91
92
  a2 = (a.length > 1 and x[-1][/i$/] and h[:seconds]) ? a[0..-2] : a
92
-
93
- a2.map do |label, val|
94
-
93
+
94
+ a2.map do |label, val|
95
+
95
96
  next if val == 0
96
97
  label2 = val > 1 ? label.to_s : label.to_s.sub(/s$/,'')
97
98
  val.to_s + ' ' + label2
98
-
99
+
99
100
  end.compact.join(' ')
100
-
101
- end
102
-
101
+
102
+ end
103
+
103
104
  s.sub!('%c') do |x|
104
-
105
+
105
106
  a = @raw_units.values.reverse
106
107
  a << a[-1]
107
-
108
+
108
109
  fmt = a.map {|v| "%0" + v.to_s.length.to_s + "d"}.join(":")
109
110
  fmt % to_a
110
- end
111
-
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
+
112
122
  s.sub!('%s') do |x|
113
- label, val = to_h.first
123
+ label, val = to_h.first
114
124
  val.to_s + label[0]
115
- end
125
+ end
116
126
 
117
127
  s
118
128
  end
119
-
129
+
120
130
  def to_s(omit: [], verbose: true)
121
-
131
+
122
132
  if not verbose then
123
-
133
+
124
134
  r = self.to_a.reverse.take_while {|x| x > 0}.reverse\
125
135
  .map {|x| "%02d" % x}.join(':')
126
-
136
+
127
137
  if r.length < 2 then
128
138
  return '00:00'
129
- elsif r.length == 2
139
+ elsif r.length == 2
130
140
  return '00:' + r
131
141
  else
132
142
  return r
133
143
  end
134
-
144
+
135
145
  end
136
-
146
+
137
147
  h = @to_h
138
148
  omit.each {|x| h.delete x}
139
149
 
140
150
  list = h.to_a
141
151
  n = list.find {|_,v| v > 0 }
142
- a = list[list.index(n)..-1].map {|x|"%d %s" % x.reverse}
143
-
152
+ a = list[list.index(n)..-1].map {|x|"%d %s" % x.reverse}
153
+
144
154
  duration = case a.length
145
155
 
146
156
  when 1
147
- a.first
157
+ a.first
148
158
  when 2
149
159
  a.join ' and '
150
- else
160
+ else
151
161
  "%s and %s" % [a[0..-2].join(', '), a[-1]]
152
162
  end
153
-
163
+
154
164
  duration.gsub(/(\b1 \w+)s/, '\1')
155
165
 
156
166
  end
@@ -164,18 +174,18 @@ class Subunit
164
174
  def fixnum_subunit(v)
165
175
  [v, :remainder]
166
176
  end
167
-
177
+
168
178
  def integer_subunit(v)
169
179
  [v, :remainder]
170
- end
171
-
180
+ end
181
+
172
182
  def hash_units(raw_units={}, u=nil)
173
-
183
+
174
184
  val, label = method((u.class.to_s.downcase + '_subunit').to_sym).call(u)
175
185
  units = multiply_units(raw_units.values).reverse
176
186
  puts 'units: ' + units.inspect if @debug
177
- @to_a = a = scan_units(units, val).map(&:to_i)
178
-
187
+ @to_a = a = scan_units(units, val).map(&:to_i)
188
+
179
189
  puts 'a: ' + a.inspect if @debug
180
190
  pairs = (raw_units.keys.reverse + [label]).reverse.take(a.length)\
181
191
  .reverse.zip(a).select {|x| x[1] > 0}
@@ -191,8 +201,8 @@ class Subunit
191
201
  def multiply_units(x) x.inject([]){|r,x| r + [x.to_i * (r[-1] || 1)]} end
192
202
 
193
203
  def scan_units(unit_list,raw_subunit)
194
- n = unit_list.shift
195
- unit, subunit = [:/,:%].map{|x| raw_subunit.send x, n}
204
+ n = unit_list.shift
205
+ unit, subunit = [:/,:%].map{|x| raw_subunit.send x, n}
196
206
  unit_list.length > 0 ? [unit] + scan_units(unit_list, subunit) : [unit, subunit]
197
207
  end
198
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.5
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
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwNjExMTMxNTI0WhcN
15
- MjEwNjExMTMxNTI0WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDYDasD
17
- frBDuzdjPpkYhCiMX91fqK5KPRp1SD8Wms+WXaLYTqyK2bWSWarsGVuYmKculwT0
18
- Am6q5L99yRPvYJmxNcd42V2+FuYmPtXTwi4aeiV8uuIFHqABp73fv6EYFdIfrRvC
19
- Ws0ZH5+xjTbPNoewXWfi6JeXuWiM3aA89g8AX9PHaZY9lNN2cNC77kkxbcmDkwCK
20
- H4aOIlbscw85T4L7neA78b01WaNcGr6TnQeUYTrae7viihb3E1CQVWcg/N4e3yMV
21
- km1eArbQYCnp4nkRyonsNTlUoWc0tVxF/ilemZBXiMaubNi81CVEIQHHjDVNbfyS
22
- +6mFmwKhII55CqyFq+NwqLNgVUVxTnXEFJvKAhjWbnUUmnXgtsk9cHzyMaFl4YOK
23
- Fx8RLiXqIREfnNmSg4P5gpYnAcm58UcXoraZiAJUKA6ntU1FIOrShzHj8IqtXvRu
24
- FDbS8jAhda67n1gbVUMs2OY/sogmFGVKFO5xVarD35/BtzgfRNQK1wU4Yy8CAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUOf0mcfDe
26
- dXRdAXtTj85vBERBHqUwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
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
- BgkqhkiG9w0BAQsFAAOCAYEAhaQ9BCV0ZKQeCdslSmkOLWKzKk6rffiOYUTQaqdv
29
- FxLZb7I7ug6uzZdtdb7Y7yGgXes+Z0zR6VhNSwWlpFcHSIznWYJh5e6ET/3lDetk
30
- wk204TgTuLDPA3USRS5BKWKi1sdqnWXJVLynJCZPIyV7ilbFKSl77Wa8IwWjyj7g
31
- F05N7bMe3g0vECYHFBJJWCfy2d6jcv0/GG0BwEsLf91LwVg5bIAJ481EaWaKseWR
32
- PAmD0vI08ssZY68aO08XgHP1JTLDXYeTqMS5BGeFWCkKhjlLnH+pamLB6lTD4ojL
33
- uBZU7l7zO3ksoWsWIIp1bhvSZHE5sCaZmOKXPSN4gW065ieajGR0Ccv7k6JZK8pC
34
- skCxe0yd2TnDrW5R51ocplcGDzryzTdvzaI4af8OQUWwshF+Ad7x4J7jdyu3WK1B
35
- HowcHg4GymtLLITCF/QtA5tta5SmHAca1POGncsO9QiramFQ9S3Q4O4wcjboVJOp
36
- SSxk4InmYoY9Cl2GVQ+d9owo
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: 2021-04-07 00:00:00.000000000 Z
38
+ date: 2022-03-22 00:00:00.000000000 Z
39
39
  dependencies: []
40
40
  description:
41
- email: james@jamesrobertson.eu
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
- rubyforge_project:
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