subunit 0.8.4 → 0.8.7

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 +78 -66
  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: 55e24efd3496c6090f8b887857fbefd3dc2a76f4a61fb4a8c3a6f19490bfa153
4
- data.tar.gz: fd0af0f6e4fd910898141aa6c7bc13049cd2cd728ba4a9e19a5ab5a8cf9bf558
3
+ metadata.gz: 7f00d0a7dead20614db36fec22d0ac28cc789a9c4a4c473921bc36ba4a8f320d
4
+ data.tar.gz: 0fa4731410ab2fa2c897ed450a46b9b7cdfa86e6d71c82c0fc28b0853e3c8eda
5
5
  SHA512:
6
- metadata.gz: 9c2ff98f077a42af3dffc3788961f99bd98fb6643c5987f472e640094a485c138a8a4065a0832c98f27fd4b578d3e0972f1c5ae44a019014471e5cb2ef8e5bc1
7
- data.tar.gz: 9ea37778dd9fe8cf32278572a70d4d188ee9b59a460e5e8139bc2e2ff28a13a8055d71d79a7205738c2504fdf595e76ab29c5825f7b749db392a30dedd8a784b
6
+ metadata.gz: 6aea09f2bbf2a1dcdfe4b252817150c3cc0bbe67de27bcf15eced3a6b3aeca709910ce2adb4bcd83d7474e7e784028f83acd8b30f895197d353dd62bb7679ccd
7
+ data.tar.gz: bbef449d9d5a448150cf66bf824a8f2a089bfbea362d275caad7874aab47bfd17db2b83a950e217866e54276edb730417f903a46175f818739d4af31c25ad799
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,88 +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
- a = to_h.to_a
81
- a2 = (a.length > 1 and x[-1][/i$/]) ? a[0..-2] : a
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
82
84
  a2.map {|label, val| val.to_s + label[0]}.join(' ')
83
-
85
+
84
86
  end
85
-
87
+
86
88
  s.sub!(/%Xi?/) do |x|
87
89
 
88
- a = to_h.to_a
89
- a2 = (a.length > 1 and x[-1][/i$/]) ? a[0..-2] : a
90
-
91
- a2.map do |label, val|
92
-
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
+
93
96
  next if val == 0
94
97
  label2 = val > 1 ? label.to_s : label.to_s.sub(/s$/,'')
95
98
  val.to_s + ' ' + label2
96
-
99
+
97
100
  end.compact.join(' ')
98
-
99
- end
100
-
101
+
102
+ end
103
+
101
104
  s.sub!('%c') do |x|
102
-
105
+
103
106
  a = @raw_units.values.reverse
104
107
  a << a[-1]
105
-
108
+
106
109
  fmt = a.map {|v| "%0" + v.to_s.length.to_s + "d"}.join(":")
107
110
  fmt % to_a
108
- end
109
-
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:)*(?=[0-9]{2}:[0-9]{2})/,'').sub(/^0/,'')
120
+ end
121
+
110
122
  s.sub!('%s') do |x|
111
- label, val = to_h.first
123
+ label, val = to_h.first
112
124
  val.to_s + label[0]
113
- end
125
+ end
114
126
 
115
127
  s
116
128
  end
117
-
129
+
118
130
  def to_s(omit: [], verbose: true)
119
-
131
+
120
132
  if not verbose then
121
-
133
+
122
134
  r = self.to_a.reverse.take_while {|x| x > 0}.reverse\
123
135
  .map {|x| "%02d" % x}.join(':')
124
-
136
+
125
137
  if r.length < 2 then
126
138
  return '00:00'
127
- elsif r.length == 2
139
+ elsif r.length == 2
128
140
  return '00:' + r
129
141
  else
130
142
  return r
131
143
  end
132
-
144
+
133
145
  end
134
-
146
+
135
147
  h = @to_h
136
148
  omit.each {|x| h.delete x}
137
149
 
138
150
  list = h.to_a
139
151
  n = list.find {|_,v| v > 0 }
140
- a = list[list.index(n)..-1].map {|x|"%d %s" % x.reverse}
141
-
152
+ a = list[list.index(n)..-1].map {|x|"%d %s" % x.reverse}
153
+
142
154
  duration = case a.length
143
155
 
144
156
  when 1
145
- a.first
157
+ a.first
146
158
  when 2
147
159
  a.join ' and '
148
- else
160
+ else
149
161
  "%s and %s" % [a[0..-2].join(', '), a[-1]]
150
162
  end
151
-
163
+
152
164
  duration.gsub(/(\b1 \w+)s/, '\1')
153
165
 
154
166
  end
@@ -162,18 +174,18 @@ class Subunit
162
174
  def fixnum_subunit(v)
163
175
  [v, :remainder]
164
176
  end
165
-
177
+
166
178
  def integer_subunit(v)
167
179
  [v, :remainder]
168
- end
169
-
180
+ end
181
+
170
182
  def hash_units(raw_units={}, u=nil)
171
-
183
+
172
184
  val, label = method((u.class.to_s.downcase + '_subunit').to_sym).call(u)
173
185
  units = multiply_units(raw_units.values).reverse
174
186
  puts 'units: ' + units.inspect if @debug
175
- @to_a = a = scan_units(units, val).map(&:to_i)
176
-
187
+ @to_a = a = scan_units(units, val).map(&:to_i)
188
+
177
189
  puts 'a: ' + a.inspect if @debug
178
190
  pairs = (raw_units.keys.reverse + [label]).reverse.take(a.length)\
179
191
  .reverse.zip(a).select {|x| x[1] > 0}
@@ -189,8 +201,8 @@ class Subunit
189
201
  def multiply_units(x) x.inject([]){|r,x| r + [x.to_i * (r[-1] || 1)]} end
190
202
 
191
203
  def scan_units(unit_list,raw_subunit)
192
- n = unit_list.shift
193
- unit, subunit = [:/,:%].map{|x| raw_subunit.send x, n}
204
+ n = unit_list.shift
205
+ unit, subunit = [:/,:%].map{|x| raw_subunit.send x, n}
194
206
  unit_list.length > 0 ? [unit] + scan_units(unit_list, subunit) : [unit, subunit]
195
207
  end
196
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
4
+ version: 0.8.7
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