subunit 0.8.3 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
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