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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/subunit.rb +85 -61
  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: 807d54d4b08e3eedaacc7d9a9970d5cc8ee5c5e18bf75282a49c8ccf9ebcf7f6
4
- data.tar.gz: a5e43fca0a05710ce581a25cceb13da735ad7b9e36102bf162a966ac4fcb9dae
3
+ metadata.gz: 0c676bd895436a156711b39cfa244a46524112df81d678cd6c2f790560f3155f
4
+ data.tar.gz: 54a45610aa7c71050fe011d6b74fee408f378fc7c00564d0546cbdacba187f12
5
5
  SHA512:
6
- metadata.gz: a43cd22965a80bbeda08484b5939c4cea4a96e89940f37b14867f15f4a4370b672593c559d8eb57ba3667da1cf8ca11cbfa110f82cce335cf3c786f0631bb1ca
7
- data.tar.gz: 3b66e9c0bab9872d7738a896df2fbf7fd7492cc45ed0ac76b9cf12f633788fcd87a6fcc541d0b011bec5122a5aed6c3ff10b694168076ba9ac1dcb7d3d395cc9
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
- # %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
69
72
  # ignoring the remainder
70
73
  #
71
- def strfunit(s)
72
-
73
- s.sub!('%x') do |x|
74
- to_h.map {|label, val| val.to_s + label[0]}.join(' ')
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!('%X') do |x|
78
-
79
- to_h.map do |label, val|
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.3
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-02-22 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