kvx 1.1.0 → 1.1.2

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/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