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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/kvx.rb +139 -137
- data.tar.gz.sig +0 -0
- metadata +31 -31
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f4470d45e160be12a005f238aa279f1fbee524685577307ae63bf5092395b89
|
4
|
+
data.tar.gz: e2dc7d72fb2905b14d44e1707296fd91584964f7d0790ab2c922566c02b13e6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
59
|
+
|
60
60
|
end
|
61
61
|
|
62
|
-
|
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:
|
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.
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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-
|
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.
|
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.
|
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.
|
66
|
+
version: '0.2'
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.
|
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.
|
76
|
+
version: '0.2'
|
77
77
|
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: 0.
|
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.
|
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
|