kvx 1.1.0 → 1.1.2

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/kvx.rb +139 -137
  4. data.tar.gz.sig +0 -0
  5. metadata +31 -31
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0985854184a09b20770031ef31762156103e708c9a52d35f39442f35e454a3a
4
- data.tar.gz: 9f6ddacfe15e0189d8ee4875a70c4d1a0fc79c31dbbde264c528f7b3a6bc69ba
3
+ metadata.gz: 7f4470d45e160be12a005f238aa279f1fbee524685577307ae63bf5092395b89
4
+ data.tar.gz: e2dc7d72fb2905b14d44e1707296fd91584964f7d0790ab2c922566c02b13e6d
5
5
  SHA512:
6
- metadata.gz: 5675ccfb52ff495bf136f4bea6def10fa8481b669f4d653dec571fe9b6c13dad812485f225f7f49d195321d0fc380b04414e5f738027c0d6f8efffd1ffbf0670
7
- data.tar.gz: 7d2eb7037efcd05b8a94d552173d20c26ff6f0a2183e0e7b40e32546b05ddb0bd226f9d85d669aa05b5fc2183bed25488ca6ce207e9aa15cef83ebf082f56b15
6
+ metadata.gz: 4c3815f945237a18b5c3d6e6c659b04cf6fed79218c7584113918c6668abc2d017d59f426dcdbae67cb39ece6ce7f68b7d4ad43b686557df16bdce83f2b7cf83
7
+ data.tar.gz: d561ab4b23680593408bc67033d38e9d03fc3e0f67c3af5662934adbd13b5db4bffcb85de7a1067b0b63dcbf34ad42c7089a6d5a97789d36ff2d674240bf4328
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/kvx.rb CHANGED
@@ -16,7 +16,7 @@ hkey_gems
16
16
  require kvx
17
17
  class Kvx
18
18
  media_type kvx
19
- '
19
+ '
20
20
  end
21
21
  end
22
22
 
@@ -34,153 +34,155 @@ class Kvx
34
34
  attr_accessor :attributes, :summary
35
35
  attr_reader :to_h
36
36
 
37
- def initialize(x=nil, attributes: {}, debug: false)
37
+ def initialize(x=nil, summary: {}, body: {}, attributes: {}, debug: false)
38
38
 
39
39
  @header = attributes.any?
40
40
  @identifier = 'kvx'
41
- @summary = {}
41
+ @summary, @body = summary, body
42
42
  @ignore_blank_lines ||= false
43
-
43
+
44
44
  @attributes, @debug = attributes, debug
45
-
45
+
46
46
  h = {
47
- hash: :passthru,
48
- :'rexle::element' => :xml_to_h,
47
+ hash: :passthru,
48
+ :'rexle::element' => :xml_to_h,
49
49
  string: :parse_string,
50
50
  rexle: :doc_to_h,
51
51
  :"rexle::element::value" => :parse_string
52
52
  }
53
-
53
+
54
54
  if x then
55
-
55
+
56
56
  sym = h[x.class.to_s.downcase.to_sym]
57
57
  puts 'sym: ' + sym.inspect if @debug
58
58
  @body = method(sym).call x
59
- methodize(@body)
59
+
60
60
  end
61
61
 
62
- end
62
+ methodize(@body)
63
63
 
64
+ end
65
+
64
66
  def import(s)
65
67
  @body = parse_string(s)
66
68
  methodize(@body)
67
69
  end
68
-
70
+
69
71
  def item()
70
72
  @body
71
73
  end
72
-
73
- alias body item
74
-
74
+
75
+ alias body item
76
+
75
77
  def save(filename)
76
78
  FileX.write filename, self.to_s
77
79
  end
78
-
79
- # flattening is helpful when passing the Hash object to
80
+
81
+ # flattening is helpful when passing the Hash object to
80
82
  # RecordX as a new record
81
83
  #
82
84
  def to_h(flatten: false)
83
-
85
+
84
86
  if @summary.empty? then
85
-
87
+
86
88
  deep_clone @body
87
-
89
+
88
90
  else
89
-
91
+
90
92
  if flatten then
91
93
  @summary.merge @body
92
94
  else
93
95
  {summary: deep_clone(@summary), body: deep_clone(@body)}
94
96
  end
95
-
97
+
96
98
  end
97
-
99
+
98
100
  end
99
-
101
+
100
102
  def to_doc()
101
-
103
+
102
104
  a = if @summary.empty? then
103
-
104
- [self.class.to_s.downcase, @attributes, '', *make_xml(@body)]
105
-
105
+
106
+ [self.class.to_s.downcase, @attributes, '', *make_xml(@body)]
107
+
106
108
  else
107
-
109
+
108
110
  summary = make_xml(@summary)
109
-
111
+
110
112
  tags_found = summary.assoc(:tags)
111
-
113
+
112
114
  if tags_found then
113
115
  tags = tags_found.pop
114
- tags_found.push *tags.split.map {|x| [:tag,{},x]}
116
+ tags_found.push *tags.split.map {|x| [:tag,{},x]}
115
117
  end
116
118
 
117
119
  summary = [:summary, {}, *summary]
118
-
120
+
119
121
  # -- use the nested description Hash object if there are multiple lines
120
122
  h = {}
121
-
123
+
122
124
  @body.each do |key, value|
123
-
125
+
124
126
  h[key] = value.is_a?(String) ? value : value[:description]
125
-
127
+
126
128
  end
127
-
129
+
128
130
  body = [:body, {}, *make_xml(h)]
129
- [self.class.to_s.downcase, @attributes, '', summary, body]
130
-
131
- end
132
-
131
+ [self.class.to_s.downcase, @attributes, '', summary, body]
132
+
133
+ end
134
+
133
135
  puts 'a: ' + a.inspect if @debug
134
136
  doc = Rexle.new a
135
137
  doc.instructions = @instructions || []
136
138
  doc
137
-
139
+
138
140
  end
139
-
141
+
140
142
  def to_s()
141
-
143
+
142
144
  header = ''
143
-
145
+
144
146
  if @header or (@summary and @summary.any?) then
145
-
147
+
146
148
  attr = @attributes ? ' ' + @attributes\
147
149
  .map {|x| "%s='%s'" % x }.join(' ') : ''
148
150
  header = '<?' + @identifier
149
151
  header += attr
150
152
  header += "?>\n"
151
-
153
+
152
154
  if @summary and @summary.any? then
153
155
  header += scan_to_s @summary
154
156
  header += "\n----------------------------------\n\n"
155
157
  end
156
-
158
+
157
159
  end
158
160
 
159
161
  # -- use the nested description Hash object if there are multiple lines
160
162
  h = {}
161
-
163
+
162
164
  @body.each do |key, value|
163
-
165
+
164
166
  h[key] = if value.is_a?(String) then
165
-
167
+
166
168
  if value.lines.length < 2 then
167
- value
169
+ value
168
170
  else
169
- "\n" + value.lines.map {|x| ' ' + x }.join
171
+ "\n" + value.lines.map {|x| ' ' + x }.join
170
172
  end
171
-
173
+
172
174
  else
173
175
  "\n" + value[:description].lines.map {|x| ' ' + x }.join
174
176
  end
175
-
176
- end
177
-
177
+
178
+ end
179
+
178
180
  header + scan_to_s(h)
179
181
 
180
- end
182
+ end
181
183
 
182
184
  def to_xml(options={pretty: true})
183
-
185
+
184
186
  doc = self.to_doc
185
187
  doc.xml(options)
186
188
 
@@ -241,7 +243,7 @@ s = "
241
243
  "
242
244
 
243
245
  end
244
-
246
+
245
247
  # used by RecordX to update a KVX record
246
248
  # id is unnecssary because there is only 1 record mapped to RecordX
247
249
  #
@@ -250,9 +252,9 @@ s = "
250
252
  end
251
253
 
252
254
  private
253
-
255
+
254
256
  def deep_clone(h)
255
-
257
+
256
258
  h.inject({}) do |r, x|
257
259
 
258
260
  h2 = if x.last.is_a? Hash then
@@ -262,31 +264,31 @@ s = "
262
264
  end
263
265
  r.merge h2[0] => h2[1]
264
266
  end
265
-
266
- end
267
-
267
+
268
+ end
269
+
268
270
  def doc_to_h(doc)
269
271
  xml_to_h(doc.root)
270
272
  end
271
273
 
272
274
  def get_attributes(raw_attributes)
273
- #
275
+ #
274
276
  r1 = /([\w\-:]+\='[^']*)'/
275
277
  r2 = /([\w\-:]+\="[^"]*)"/
276
-
278
+
277
279
  r = raw_attributes.scan(/#{r1}|#{r2}/).map(&:compact)\
278
280
  .flatten.inject(Attributes.new) do |r, x|
279
- attr_name, raw_val = x.split(/=/,2)
281
+ attr_name, raw_val = x.split(/=/,2)
280
282
  val = attr_name != 'class' ? raw_val[1..-1] : raw_val[1..-1].split
281
283
  r.merge(attr_name.to_sym => val)
282
284
  end
283
285
 
284
286
  return r
285
287
  end
286
-
288
+
287
289
  def hashify(e)
288
290
 
289
- v = if e.has_elements? then
291
+ v = if e.has_elements? then
290
292
  e.elements.inject({}) do |r, x|
291
293
  r.merge hashify(x)
292
294
  end
@@ -295,17 +297,17 @@ s = "
295
297
  end
296
298
 
297
299
  {e.name.to_sym => v}
298
- end
300
+ end
299
301
 
300
302
  def make_xml(h)
301
-
303
+
302
304
  puts 'inside make_xml: ' + h.inspect if @debug
303
305
  h2 = h.clone
304
306
  h2.each {|key,value| value.delete :items if value.is_a?(Hash) }
305
307
 
306
308
  RexleBuilder.new(h2, debug: false).to_a[3..-1]
307
309
  end
308
-
310
+
309
311
  def parse_string(s)
310
312
 
311
313
  buffer, type = RXFReader.read(s)
@@ -325,9 +327,9 @@ s = "
325
327
  end
326
328
 
327
329
  end
328
-
330
+
329
331
  def methodize(h)
330
-
332
+
331
333
  h.each do |k,v|
332
334
 
333
335
  define_singleton_method(k){v} unless self.methods.include? k
@@ -336,68 +338,68 @@ s = "
336
338
  define_singleton_method((k.to_s + '=').to_sym){|x| h[k] = x}
337
339
  end
338
340
 
339
- end
340
-
341
+ end
342
+
341
343
  end
342
344
 
343
345
  def parse_to_h(s, header_pattern: %r(^<\?kvx[\s\?]))
344
346
 
345
347
  raw_txt, _ = RXFReader.read(s)
346
348
 
347
- # does the raw_txt contain header information?
349
+ # does the raw_txt contain header information?
348
350
  a = s.strip.lines
349
351
 
350
352
  txt = if a[0] =~ header_pattern then
351
-
353
+
352
354
  raw_header = a.shift
353
355
  attr = get_attributes(raw_header)
354
-
356
+
355
357
  if attr[:created] then
356
358
  attr[:last_modified] = Time.now.to_s
357
359
  else
358
- attr[:created] = Time.now.to_s
360
+ attr[:created] = Time.now.to_s
359
361
  end
360
-
362
+
361
363
  @attributes.merge! attr
362
364
  @header = true
363
- body, summary = a.join.strip.split(/^----*$/).reverse
365
+ body, summary = a.join.strip.split(/^----*$/).reverse
364
366
  @summary = scan_to_h summary if summary
365
-
367
+
366
368
  body
367
369
  else
368
370
  raw_txt
369
371
  end
370
-
372
+
371
373
  scan_to_h(txt)
372
374
  end
373
375
 
374
376
  def passthru(x)
375
-
377
+
376
378
  if x[:summary] and x[:body]
377
379
  @summary = deep_clone x[:summary]
378
380
  deep_clone x[:body]
379
- else
381
+ else
380
382
  deep_clone x
381
383
  end
382
-
384
+
383
385
  end
384
-
386
+
385
387
  def pretty_print(a, indent='')
386
-
387
- a.map do |x|
388
+
389
+ a.map do |x|
388
390
  (x.is_a?(String) or x.nil?) ? x.to_s : pretty_print(x, indent + ' ')
389
391
  end.join("\n" + indent)
390
-
392
+
391
393
  end
392
-
393
-
394
+
395
+
394
396
  def scan_to_h(txt)
395
-
397
+
396
398
  txt.gsub!(/^\w+:(?=$)/,'\0 ')
397
399
  puts 'txt:' + txt.inspect if @debug
398
-
400
+
399
401
  # auto indent any multiline values which aren't already indented
400
-
402
+
401
403
  indent = ''
402
404
 
403
405
  lines = txt.gsub(/^-+$/m,'').lines.map do |line|
@@ -409,89 +411,89 @@ s = "
409
411
  line
410
412
  end
411
413
 
412
- end
414
+ end
413
415
  puts ('lines: ' + lines.inspect).debug if @debug
414
-
416
+
415
417
  puts ('inside scan_to_h').info if @debug
416
- raw_a = LineTree.new(lines.join.gsub(/(^-*$)|(?<=\S) +#.*/,'').strip,
418
+ raw_a = LineTree.new(lines.join.gsub(/(^-*$)|(?<=\S) +#.*/,'').strip,
417
419
  ignore_blank_lines: @ignore_blank_lines).to_a
418
420
  puts ('raw_a: ' + raw_a.inspect).debug if @debug
419
-
420
- # if there are any orphan lines which aren't nested underneath a
421
+
422
+ # if there are any orphan lines which aren't nested underneath a
421
423
  # label, they will be fixed using the following statement
422
-
424
+
423
425
  a = raw_a.chunk {|x| x[0][/^[^:]+:/]}.inject([]) do |r,y|
424
426
 
425
-
427
+
426
428
  puts 'r: ' + r.inspect if @debug
427
-
429
+
428
430
  if r.last and !y.first[/[^:]+:/] then
429
431
  r.last << y.last[-1]
430
432
  else
431
433
  puts 'y: ' + y.inspect if @debug
432
434
  r << y.last[-1]
433
435
  end
434
-
436
+
435
437
  r
436
-
438
+
437
439
  end
438
440
 
439
441
  @body = a.inject({}) do |r, line|
440
-
442
+
441
443
  s = line.shift
442
444
  puts ('s: ' + s.inspect).debug if @debug
443
-
445
+
444
446
  if line.join.length > 0 then
445
-
447
+
446
448
  puts 'line: ' + line.inspect if @debug
447
-
448
- padding = line[0].length < 2 ? "\n" : "\n "
449
+
450
+ padding = line[0].length < 2 ? "\n" : "\n "
449
451
  s10 = line.map{|x| x.join(padding)}.join("\n")
450
-
452
+
451
453
  r2 = if s10[/^ *\w+:[\n ]/] then
452
-
454
+
453
455
  scan_to_h(s10)
454
-
456
+
455
457
  else
456
458
 
457
- desc = pretty_print(line).split(/\n(?=\w+: )/)
459
+ desc = pretty_print(line).split(/\n(?=\w+: )/)
458
460
 
459
461
  txt2, remaining = desc
460
462
 
461
- h = txt2.lines.inject([]) do |r, x|
463
+ h = txt2.lines.inject([]) do |r, x|
462
464
  x.chomp!
463
465
  x.length > 0 ? r << x : r
464
466
  end
465
-
466
- r3 = {description: txt2, items: h}
467
+
468
+ r3 = {description: txt2, items: LineTree.new(txt2).to_a(normalize: true)}
467
469
 
468
470
  if remaining then
469
471
  r3.merge!(scan_to_h remaining + "\n ")
470
472
  end
471
-
473
+
472
474
  r3
473
475
  end
474
476
 
475
477
  r.merge({s[/[^:]+/].to_sym => r2})
476
-
478
+
477
479
  else
478
-
480
+
479
481
  value, name = s.split(/: */,2).reverse
480
- name ||= 'description'
482
+ name ||= 'description'
481
483
  v = value =~ /^\{\s*\}$/ ? {} : value.to_s
482
-
484
+
483
485
  r.merge({name.to_sym => v})
484
- end
486
+ end
485
487
 
486
488
  end
487
-
489
+
488
490
  puts ('@body: ' + @body.inspect).debug if @debug
489
491
  @body
490
492
 
491
- end
492
-
493
- def scan_to_s(h, indent='')
494
-
493
+ end
494
+
495
+ def scan_to_s(h, indent='')
496
+
495
497
  a = h.inject([]) do |r, x|
496
498
  if x.last.is_a? Hash then
497
499
  r << x.first.to_s + ":\n" + scan_to_s(x.last, ' ')
@@ -499,27 +501,27 @@ s = "
499
501
  r << "%s%s: %s" % [indent, *x]
500
502
  end
501
503
  end
502
-
504
+
503
505
  @to_s = a.join("\n")
504
506
  end
505
-
507
+
506
508
  def xml_to_h(node)
507
-
509
+
508
510
  puts 'node: ' + node.xml.inspect if @debug
509
511
  @attributes = node.attributes.to_h
510
-
512
+
511
513
  summary = node.element('summary')
512
-
514
+
513
515
  if summary then
514
516
 
515
517
  etags = summary.element 'tags'
516
-
518
+
517
519
  if etags then
518
520
 
519
521
  tags = etags.xpath('tag/text()')
520
522
  etags.delete 'tag'
521
523
  etags.text = tags.join(' ') if tags.any?
522
-
524
+
523
525
  end
524
526
 
525
527
  @summary = hashify(summary)[:summary]
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kvx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -11,31 +11,31 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwMjIwMjI0ODU5WhcN
15
- MjIwMjIwMjI0ODU5WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDEZUlA
17
- 5Xwb1PhCpUwcey7fBjLJHAHnBg9lFLAFNGWr1QDpH166qx7w9Q9ckPeFNMiH5ZFs
18
- /D9GrO+BVU3Lz5/CaL3q5eB3L8+JC+VjNiJijvynBa2TeB2aenlRqdUqvJ/RGTu0
19
- 9v8tWq/Mn3batCRCpuLJJ25C49hyzYts2UWetRAqfuvukJY+BoPISYntAs3g2elo
20
- Za/9sY69ezCvOmwyw+B8dGXjqINlZxJKfuR3xf87uR/4vBC9DI4EE7dS1pjsyDws
21
- d3e9fBWBKIMaZVdshc9rAnP6ARhWMnxYUjjqUDJiqXz5137HmWSOGWGGrnX0pfg2
22
- WPVI7jN39s6Gd2nNGOgaiwlNpcNS7IPYHGU2+mDJxWSKn+suMjendpi/WSTQlLG4
23
- PEZBk+B6CEy6yOLU4x5GN3US7wbwLOl0ASSAhb4vAG81pGIRYt5fGE4HdiYxDC/u
24
- ixTFr3lGZyyHAZ0VMsjIoq3cpbSHxe6TiwBncq1H7z9XeEP/LzFlhdjnHR0CAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU6BARnAgl
26
- 1R3h9OomhJPcgy+HzWEwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwNTI0MDgxNjAyWhcN
15
+ MjMwNTI0MDgxNjAyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDrYid0
17
+ 1US+AGdlo/dOcNSwqLze11+PczHc8pcpWglhsP+ArrSds3fNq5pszKJg/1fCPNi3
18
+ Qz+J7tL1dkCq0Pf7TzwZ9BHHRg00Vk6NlUSoi88HKDOlFNuW85MTCRKVLvOcTu4G
19
+ 2B5UI9jgN0V8uR7EFKsoet5T0d6SIW/7y5PaFbfnvumXb4OJnjAka9d62R+xyVSd
20
+ sbWVxS43f1oronOsWsxgOqoqUJkl5NXMkDZOeR10pbzQipyP3bUJZjtQjK6qDtPj
21
+ x67zxOySLas+5fJh/JVFTj0sDP9fhm6pIWwtS95hzDKwRIoAn/2UZFz7I0/KhVPk
22
+ mlxOsCxr4Q3N0mLY0q8fNvgF1EDDyakfYcx1sWAnTimfIuJV4RKvS1zNr7sSMx53
23
+ 69rX+PMIXI7y/xWubwmftremTF0dtjaC3hzj4NLesAqlRQmLbAOaYCW9+Md65VjD
24
+ iaVo7ylRxAs3rZZ93o10+eqswc55ct8KMY3xHh1cCLR20YoYWUfgNymhXS0CAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUf1SuHjhU
26
+ xLht5mANmWaa6tQmh/cwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
27
  c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAZZ3jLwdvRBNjGqxBFpwbE+6lOlMADiza+vUe5DLr
29
- Pwi54Wf+IF91M56S6zxw3BQ6aIzTqltXdHMkVJokQeGqzrGfJQO5Yhnh1Y1kxRtl
30
- ZXCMasMdAE6NvW+1FIT/ilZDAoeaoLcoQ4JylHW25Y/FZ9tt++6EEkDFWZn6zxxw
31
- wETcFLVEdzWeyJyTnjrfVYCJMlHr+mR9gXx2Fgz8vjqCu2O39NXuJqO9BrmoxkoD
32
- jGcTdRnq6g6KcNOHlJCw6jvZUHSTeTtBPUEGkSNS5L3GejW65iwHWLY/WNtI4kzQ
33
- 9uR/zCKdJ0zJ/N7OEpBBMg05VTSR2nBwlTmacHdL/keDUuIUDd2APddKSr5F+voZ
34
- ci+ozAEgQCeqDFapyRPqMGm8fO7Sa4i4BxGnDf6G3K9P6Rg9yEzpSbGTED9U+nlX
35
- m/+jxdgFjKKGxeZqunu9cp5ca9wSjjtKh/VA/3xZtPwokCa7vCMB+ZxUP0jvd++u
36
- OTXy8k/zqddw/VfD/It1UUK4
28
+ BgkqhkiG9w0BAQsFAAOCAYEAicVrydLWjfj1nI+UBsAelInmLwR+Jm6GmhlwIwVP
29
+ KxXojEY5ezMG9AKRcBSVB4+QRVzQS39ytywDF11CwM0ldzfLZ6uAEdv4LZG1GByN
30
+ RotgJaIzV8aMsQpn4ICCgDfOhrhAHM3LPTFEYvwjqHO4PvdWRt1YEpz006YD+Woj
31
+ P4OUQrI31O44jk5mdGX+fsMV6A/rLb4kAkieTlYqFjRtAG8k8tS/SsyKoi9CnFvR
32
+ qUvUuGh+BTRSo3CTdkGY4BnDD92fGb7Hb1/RZ+pxhlr0n9a/QwmB11m/M9765h0s
33
+ 2Z49RQpI282bp42VWEtldFWrCv9xunHOElHjUfTTmgcX5ib6llUmvHxQKMrKp5R2
34
+ jVFpUSnOFahigvADhfV06dXy+YMaFFUgn0TOCtT6ifCT4ZzrlhlXYqELlrNobwyr
35
+ kHNn+ERume1+043nzGdoGxJEUVUPYjRHDzWB1QG7OyRO+e9RZvsTQyTp2+EWVCPD
36
+ haPJ+LVlPvQPLLPI124YDQp8
37
37
  -----END CERTIFICATE-----
38
- date: 2022-02-20 00:00:00.000000000 Z
38
+ date: 2022-09-20 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: line-tree
@@ -46,7 +46,7 @@ dependencies:
46
46
  version: '0.9'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 0.9.3
49
+ version: 0.9.4
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
@@ -56,27 +56,27 @@ dependencies:
56
56
  version: '0.9'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 0.9.3
59
+ version: 0.9.4
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rxfreadwrite
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '0.1'
66
+ version: '0.2'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 0.1.1
69
+ version: 0.2.6
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '0.1'
76
+ version: '0.2'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 0.1.1
79
+ version: 0.2.6
80
80
  description:
81
81
  email: digital.robertson@gmail.com
82
82
  executables: []
@@ -103,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  requirements: []
106
- rubygems_version: 3.2.22
106
+ rubygems_version: 3.3.7
107
107
  signing_key:
108
108
  specification_version: 4
109
109
  summary: Kvx (Keys, Values, and XML) makes it convenient to store and retrieve the
metadata.gz.sig CHANGED
Binary file