dxlite 0.3.5 → 0.5.1
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/dxlite.rb +177 -147
- data.tar.gz.sig +0 -0
- metadata +35 -35
- 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: b148c28af592acb924e4ff94ea19a1b0cc85d84c03c948942fb2f156fdca1504
|
4
|
+
data.tar.gz: 17d5cd22ba53cc5fb4c650f0df7f396591118b8c75865ad82ee8c10641291793
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8116413a89279f69d23d2bb2552786846014f11da6d00c18b63852ab8a58b678e064f7401b391cc6194a62baf6f812bf127e504e2c7f44eafadf4a355e915f27
|
7
|
+
data.tar.gz: 587433a7d25d395348d36a1dbb685bc549e78111c9683a92d9dad99a9208a41e8c797fc3ce31118d5c36ba305b2c5e9b79e4c481996835771d77dd82c2020a6c
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/dxlite.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# file: dxlite.rb
|
4
4
|
|
5
5
|
require 'c32'
|
6
|
+
require 'kvx'
|
6
7
|
require 'json'
|
7
8
|
require 'recordx'
|
8
9
|
require 'rxfhelper'
|
@@ -11,8 +12,8 @@ require 'rxfhelper'
|
|
11
12
|
class DxLite
|
12
13
|
using ColouredText
|
13
14
|
|
14
|
-
attr_accessor :summary, :filepath
|
15
|
-
attr_reader :records
|
15
|
+
attr_accessor :summary, :filepath
|
16
|
+
attr_reader :records, :schema
|
16
17
|
|
17
18
|
def initialize(s=nil, autosave: false, debug: false)
|
18
19
|
|
@@ -20,189 +21,188 @@ class DxLite
|
|
20
21
|
|
21
22
|
return unless s
|
22
23
|
buffer, type = RXFHelper.read(s)
|
23
|
-
|
24
|
+
|
24
25
|
@filepath = s if type == :file or type == :dfs
|
25
|
-
|
26
|
+
|
26
27
|
puts 'type: ' + type.inspect if @debug
|
27
28
|
puts 'buffer: ' + buffer.inspect if @debug
|
28
29
|
|
29
30
|
@records = []
|
30
|
-
|
31
|
+
|
31
32
|
case type
|
32
|
-
|
33
|
+
|
34
|
+
when :dfs
|
35
|
+
|
36
|
+
read buffer
|
37
|
+
|
33
38
|
when :file
|
34
|
-
|
39
|
+
|
35
40
|
read buffer
|
36
|
-
|
41
|
+
|
37
42
|
when :text
|
38
|
-
|
39
|
-
@summary = {schema: s}
|
40
43
|
|
41
|
-
|
42
|
-
when :url
|
43
|
-
|
44
|
-
read buffer
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
puts '@summary: ' + @summary.inspect
|
49
|
-
@schema = @summary[:schema]
|
50
|
-
|
51
|
-
summary_attributes = {
|
52
|
-
recordx_type: 'dynarex',
|
53
|
-
default_key: @schema[/(?<=\()\w+/]
|
54
|
-
}
|
44
|
+
new_summary(s)
|
55
45
|
|
56
|
-
|
57
|
-
@summary.merge!(summary_attributes)
|
46
|
+
when :url
|
58
47
|
|
59
|
-
|
60
|
-
|
61
|
-
if summary then
|
48
|
+
read buffer
|
62
49
|
|
63
|
-
|
64
|
-
@summary[x] = nil unless @summary[x]
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
make_methods()
|
50
|
+
end
|
70
51
|
|
71
|
-
end
|
52
|
+
end
|
72
53
|
|
73
54
|
def all()
|
74
55
|
|
75
56
|
@records.map do |h|
|
76
|
-
|
57
|
+
|
77
58
|
puts 'h: ' + h.inspect if @debug
|
78
|
-
RecordX.new(h[:body], self, h[:id], h[:created],
|
59
|
+
RecordX.new(h[:body], self, h[:id], h[:created],
|
79
60
|
h[:last_modified])
|
80
61
|
end
|
81
62
|
|
82
|
-
end
|
83
|
-
|
63
|
+
end
|
64
|
+
|
84
65
|
def delete(id)
|
85
66
|
found = @records.find {|x| x[:id] == id}
|
86
|
-
|
67
|
+
|
87
68
|
if found then
|
88
|
-
@records.delete found
|
69
|
+
@records.delete found
|
89
70
|
save() if @autosave
|
90
71
|
end
|
91
|
-
|
72
|
+
|
92
73
|
end
|
93
|
-
|
74
|
+
|
94
75
|
def create(rawh, id: nil, custom_attributes: {created: Time.now})
|
95
76
|
|
77
|
+
if @debug then
|
78
|
+
puts 'create:: rawh: ' + rawh.inspect
|
79
|
+
puts 'custom_attributes: ' + custom_attributes.inspect
|
80
|
+
end
|
81
|
+
|
82
|
+
key = @summary[:default_key]
|
83
|
+
|
84
|
+
if key then
|
85
|
+
|
86
|
+
r = records.find {|x| x[:body][key.to_sym] == rawh[key.to_sym]}
|
87
|
+
if r then
|
88
|
+
r[:last_modified] = Time.now.to_s
|
89
|
+
return false
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
96
94
|
if id.nil? then
|
97
|
-
|
95
|
+
|
98
96
|
puts '@records: ' + @records.inspect if @debug
|
99
|
-
|
97
|
+
|
100
98
|
if @records then
|
101
99
|
id = @records.map {|x| x[:id].to_i}.max.to_i + 1
|
102
100
|
else
|
103
101
|
@records = []
|
104
102
|
id = 1
|
105
103
|
end
|
106
|
-
|
104
|
+
|
107
105
|
end
|
108
|
-
|
106
|
+
|
109
107
|
h2 = custom_attributes
|
110
|
-
|
111
|
-
fields = rawh.keys
|
112
|
-
puts 'fields: ' + fields.inspect if @debug
|
108
|
+
|
109
|
+
fields = rawh.keys
|
110
|
+
puts 'fields: ' + fields.inspect if @debug
|
113
111
|
|
114
112
|
h3 = fields.map {|x| [x.to_sym, nil] }.to_h.merge(rawh)
|
115
113
|
h = {id: id.to_s, created: h2[:created], last_modified: nil, body: h3}
|
116
114
|
@records << h
|
117
|
-
|
115
|
+
|
118
116
|
save() if @autosave
|
119
|
-
|
117
|
+
|
120
118
|
RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
|
121
|
-
|
119
|
+
|
122
120
|
end
|
123
|
-
|
121
|
+
|
124
122
|
def fields()
|
125
123
|
@fields
|
126
124
|
end
|
127
|
-
|
125
|
+
|
128
126
|
def inspect()
|
129
|
-
"#<DxLite:%s @debug=%s, @summary=%s, ...>" % [object_id, @debug,
|
127
|
+
"#<DxLite:%s @debug=%s, @summary=%s, ...>" % [object_id, @debug,
|
130
128
|
@summary.inspect]
|
131
129
|
end
|
132
|
-
|
130
|
+
|
133
131
|
# Parses 1 or more lines of text to create or update existing records.
|
134
132
|
|
135
133
|
def parse(obj=nil)
|
136
|
-
|
134
|
+
|
135
|
+
@records ||= []
|
136
|
+
|
137
137
|
if obj.is_a? Array then
|
138
|
-
|
138
|
+
|
139
139
|
unless schema() then
|
140
140
|
puts 'obj.first: ' + obj.first.inspect if @debug
|
141
|
-
cols = obj.first.keys.map {|c| c == 'id' ? 'uid' : c}
|
141
|
+
cols = obj.first.keys.map {|c| c == 'id' ? 'uid' : c}
|
142
142
|
puts 'after cols' if @debug
|
143
|
-
|
143
|
+
new_summary "items/item(%s)" % cols.join(', ')
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
obj.each do |x|
|
147
147
|
#puts 'x: ' + x.inspect if @debug
|
148
148
|
self.create x, id: nil
|
149
149
|
end
|
150
|
-
|
151
|
-
return self
|
152
|
-
|
153
|
-
end
|
150
|
+
|
151
|
+
return self
|
152
|
+
|
153
|
+
end
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
alias import parse
|
157
|
-
|
157
|
+
|
158
158
|
def parse_xml(buffer)
|
159
|
-
|
159
|
+
|
160
160
|
doc = Rexle.new(buffer)
|
161
|
-
|
161
|
+
|
162
162
|
asummary = doc.root.xpath('summary/*').map do |node|
|
163
163
|
puts 'node: ' + node.xml.inspect if @debug
|
164
164
|
[node.name, node.text.to_s]
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
summary = Hash[asummary]
|
168
168
|
summary[:schema] = summary['schema']
|
169
169
|
%w(recordx_type format_mask schema).each {|x| summary.delete x}
|
170
|
-
|
171
|
-
schema = summary[:schema]
|
170
|
+
|
171
|
+
@schema = summary[:schema]
|
172
172
|
puts 'schema: ' + schema.inspect if @debug
|
173
|
-
|
174
|
-
@fields = schema[/\(([^\)]+)/,1].split(/ *, +/)
|
173
|
+
|
174
|
+
@fields = @schema[/\(([^\)]+)/,1].split(/ *, +/)
|
175
175
|
puts 'fields: ' + @fields.inspect if @debug
|
176
|
-
|
176
|
+
|
177
|
+
@summary = summary
|
178
|
+
|
177
179
|
a = doc.root.xpath('records/*').each do |node|
|
178
|
-
|
180
|
+
|
179
181
|
h = Hash[@fields.map {|field| [field.to_sym, node.text(field).to_s] }]
|
180
|
-
self.create h, id: nil
|
181
|
-
|
182
|
+
self.create h, id: nil, custom_attributes: node.attributes
|
183
|
+
|
182
184
|
end
|
183
185
|
|
184
|
-
@summary = summary
|
185
|
-
|
186
186
|
end
|
187
187
|
|
188
188
|
def save(file=@filepath)
|
189
|
-
|
189
|
+
|
190
190
|
return unless file
|
191
191
|
@filepath = file
|
192
|
-
|
192
|
+
|
193
193
|
s = File.extname(file) == '.json' ? to_json() : to_xml()
|
194
194
|
File.write file, s
|
195
195
|
end
|
196
|
-
|
196
|
+
|
197
197
|
def to_a()
|
198
198
|
@records.map {|x| x[:body]}
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
def to_h()
|
202
|
-
|
202
|
+
|
203
203
|
root_name = schema()[/^\w+/]
|
204
204
|
record_name = schema()[/(?<=\/)[^\(]+/]
|
205
|
-
|
205
|
+
|
206
206
|
h = {
|
207
207
|
root_name.to_sym =>
|
208
208
|
{
|
@@ -210,139 +210,169 @@ class DxLite
|
|
210
210
|
records: @records.map {|h| {record_name.to_sym => h} }
|
211
211
|
}
|
212
212
|
}
|
213
|
-
|
213
|
+
|
214
214
|
end
|
215
|
-
|
215
|
+
|
216
216
|
def to_json(pretty: true)
|
217
217
|
pretty ? JSON.pretty_generate(to_h()) : to_h()
|
218
218
|
end
|
219
|
-
|
219
|
+
|
220
220
|
def to_xml()
|
221
|
-
|
221
|
+
|
222
222
|
root_name = schema()[/^\w+/]
|
223
223
|
record_name = schema()[/(?<=\/)[^\(]+/]
|
224
|
-
|
224
|
+
|
225
225
|
a = RexleBuilder.build do |xml|
|
226
|
-
|
226
|
+
|
227
227
|
xml.send(root_name.to_sym) do
|
228
228
|
xml.summary({}, @summary)
|
229
229
|
xml.records do
|
230
|
-
|
230
|
+
|
231
231
|
all().each do |x|
|
232
|
-
|
233
|
-
h = {id: x.id, created: x.created, last_modified: x.last_modified}
|
232
|
+
|
233
|
+
h = {id: x.id, created: x.created, last_modified: x.last_modified}
|
234
234
|
puts 'x.to_h: ' + x.to_h.inspect if @debug
|
235
235
|
xml.send(record_name.to_sym, h, x.to_h)
|
236
|
-
|
236
|
+
|
237
237
|
end
|
238
|
-
|
238
|
+
|
239
239
|
end
|
240
240
|
end
|
241
241
|
end
|
242
242
|
|
243
|
-
Rexle.new(a).xml pretty: true
|
244
|
-
|
245
|
-
|
243
|
+
Rexle.new(a).xml pretty: true
|
244
|
+
|
245
|
+
|
246
246
|
end
|
247
|
-
|
247
|
+
|
248
248
|
# Updates a record from an id and a hash containing field name and field value.
|
249
|
-
# dynarex.update 4, name: Jeff, age: 38
|
250
|
-
|
249
|
+
# dynarex.update 4, name: Jeff, age: 38
|
250
|
+
|
251
251
|
def update(id, obj)
|
252
|
-
|
252
|
+
|
253
253
|
if @debug then
|
254
254
|
puts 'inside update'.info
|
255
255
|
puts ('id: ' + id.inspect).debug
|
256
256
|
puts ('obj.class: ' + obj.class.inspect).debug
|
257
257
|
end
|
258
|
-
|
258
|
+
|
259
259
|
r = @records.find {|x| x[:id] == id}
|
260
|
-
|
260
|
+
|
261
261
|
if r then
|
262
|
-
|
262
|
+
|
263
263
|
r[:body].merge!(obj)
|
264
264
|
save() if @autosave
|
265
|
-
|
265
|
+
|
266
266
|
end
|
267
|
-
|
267
|
+
|
268
268
|
end
|
269
|
-
|
269
|
+
|
270
270
|
private
|
271
|
-
|
271
|
+
|
272
272
|
def find_record(rec, value, x)
|
273
|
-
r = value.is_a?(Regexp) ? rec[x.to_sym] =~ value : rec[x.to_sym] == value
|
273
|
+
r = value.is_a?(Regexp) ? rec[x.to_sym] =~ value : rec[x.to_sym] == value
|
274
274
|
end
|
275
|
-
|
275
|
+
|
276
276
|
def make_methods()
|
277
|
-
|
277
|
+
|
278
278
|
# for each summary item create get and set methods
|
279
|
-
|
279
|
+
|
280
280
|
@summary.each do |key, value|
|
281
|
-
|
281
|
+
|
282
282
|
define_singleton_method(key) { @summary[key] }
|
283
|
-
|
283
|
+
|
284
284
|
define_singleton_method (key.to_s + '=').to_sym do |value|
|
285
285
|
@summary[key] = value
|
286
|
-
end
|
287
|
-
|
286
|
+
end
|
287
|
+
|
288
288
|
end
|
289
|
-
|
289
|
+
|
290
290
|
@fields = @summary[:schema][/(?<=\()[^\)]+/].split(',').map(&:strip)
|
291
291
|
|
292
292
|
@fields.each do |x|
|
293
293
|
|
294
294
|
define_singleton_method ('find_all_by_' + x).to_sym do |value|
|
295
|
-
|
295
|
+
|
296
296
|
a = @records.select {|rec| find_record(rec[:body], value, x) }
|
297
|
-
|
297
|
+
|
298
298
|
a.map do |h|
|
299
299
|
RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
|
300
300
|
end
|
301
|
-
|
301
|
+
|
302
302
|
end
|
303
303
|
|
304
304
|
define_singleton_method ('find_by_' + x).to_sym do |value|
|
305
|
-
|
305
|
+
|
306
306
|
h = @records.find {|rec| find_record(rec[:body], value, x) }
|
307
307
|
return nil unless h
|
308
|
-
|
309
|
-
RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
|
310
|
-
|
308
|
+
|
309
|
+
RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
|
310
|
+
|
311
|
+
end
|
312
|
+
|
313
|
+
end
|
314
|
+
|
315
|
+
end
|
316
|
+
|
317
|
+
def new_summary(schema)
|
318
|
+
|
319
|
+
@summary = {schema: schema}
|
320
|
+
|
321
|
+
puts '@summary: ' + @summary.inspect if @debug
|
322
|
+
@schema = @summary[:schema]
|
323
|
+
|
324
|
+
summary_attributes = {
|
325
|
+
recordx_type: 'dynarex',
|
326
|
+
default_key: schema[/(?<=\()\w+/]
|
327
|
+
}
|
328
|
+
|
329
|
+
puts 'before merge' if @debug
|
330
|
+
@summary.merge!(summary_attributes)
|
331
|
+
|
332
|
+
summary = @summary[:schema][/(?<=\[)[^\]]+/]
|
333
|
+
|
334
|
+
if summary then
|
335
|
+
|
336
|
+
summary.split(/ *, */).each do |x|
|
337
|
+
@summary[x] = nil unless @summary[x]
|
311
338
|
end
|
312
339
|
|
313
340
|
end
|
314
|
-
|
341
|
+
|
342
|
+
make_methods()
|
315
343
|
end
|
316
|
-
|
344
|
+
|
317
345
|
def read(buffer)
|
318
|
-
|
346
|
+
|
319
347
|
if buffer[0] == '<' then
|
320
|
-
|
348
|
+
|
321
349
|
parse_xml buffer
|
322
|
-
|
350
|
+
|
323
351
|
else
|
324
|
-
|
352
|
+
|
325
353
|
h1 = JSON.parse(buffer, symbolize_names: true)
|
326
|
-
|
327
|
-
|
354
|
+
puts 'h1:' + h1.inspect if @debug
|
355
|
+
|
328
356
|
h = h1[h1.keys.first]
|
329
|
-
|
357
|
+
|
330
358
|
@summary = {}
|
331
|
-
|
359
|
+
|
332
360
|
h[:summary].each do |key, value|
|
333
|
-
|
361
|
+
|
334
362
|
if %i(recordx_type format_mask schema).include? key then
|
335
363
|
@summary[key] = value
|
336
|
-
else
|
364
|
+
else
|
337
365
|
@summary[key.to_s] = value
|
338
366
|
end
|
339
|
-
|
367
|
+
|
340
368
|
end
|
341
|
-
|
369
|
+
|
342
370
|
@records = h[:records].map {|x| x[x.keys.first]}
|
343
|
-
|
371
|
+
|
344
372
|
end
|
345
|
-
|
373
|
+
|
374
|
+
make_methods()
|
375
|
+
|
346
376
|
end
|
347
|
-
|
377
|
+
|
348
378
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dxlite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -11,74 +11,74 @@ 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
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjExMjE0MTkxMzA1WhcN
|
15
|
+
MjIxMjE0MTkxMzA1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDr8u3b
|
17
|
+
GnmbKxnrbY0y31GqwbhURpvc6bArdtA+PLcVgPHAVPUbPxoriPsyUQKcnXD/Ema+
|
18
|
+
QYUqHzph0SxI2PYrFdskTIVKQwXdUFGy6eYSW3CHvsXV4e5gg+zmSoW93tm2sd+w
|
19
|
+
7lxgkkxri7KhguwmXpWsTHCfMBHyBXxP/2E2IGaEuyATjUposENy9Mfe7BKDMMAf
|
20
|
+
e3k7o6AJx16OmLRKAch0BkEYd0M9TqdYSYjcvKbX/BxSwm3zfz+T0erG56h3D425
|
21
|
+
ljBig7CZxCNXJqq2wSzmnVMoattGhCDLCNa9+JMN/G4bGqswnjk/MupSYhTV608s
|
22
|
+
jXrQ8yk9YIGrYi3+KW1hT25aS7HEqeFdrPax5/M/2TLyPJ+Yz+2vCm89T92rW6e5
|
23
|
+
IMDkjsQZjomhgOFjiTjn81wtr+4jfYCyclV+dFpNP+GHTXes9GtL0wzrSBMtfPkJ
|
24
|
+
AE5YlIKE6m2a40k+hhp6v3sRqPldu07L9yWxLGuz7ugiQyLc08jh7ApmnqUCAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUxW2m/eFG
|
26
|
+
Ic5LrIOJvXpDgkUIXfUwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
27
|
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEANUi0iJeImMVeBp8DW0SYTE7fi64K55TzV82BUWTx
|
29
|
+
kGmMfNyBDXkRPVqfZeubCNOUBhpe3zpziO26TIzZ+7lqXkTOWDNkGdYVNMp2rbLd
|
30
|
+
exukFDYOuLStjGnAl5KUfIj3fTKC9T9HGDvSaJec2KwnY2RIQhal8FGicLX5kkUx
|
31
|
+
BO3X5S9uHFZP2HY0VZq4CpGvuhz3ikCWxRLSVfypsJR9EXod8SkPpHhtP9JHUfAV
|
32
|
+
7+dqSt7LPuHaYoiEWezPyfaZEn0oHFTFkLaDPtUDN1UvkMNaDwIQ9UBeQrscz3rm
|
33
|
+
8tXnf5YUbiM9Ngft4jVa4FjEqjARjRB/l4OlO8cxIHZG+7KU7PhlbsqT/2ISjo+f
|
34
|
+
k0RwIfy2uAZ/no0qaVtnTkbeFBw4JKNnH5jrNEMUyEsbWkkeSg67vCHjZ+YLxdgn
|
35
|
+
9pK+pqislEMFrWscGeMsc6YMS7ALxEujTuwTWyxmWAXnYft4ff2O1Zh2sPmdOlgf
|
36
|
+
camg7d8q+VZZzAtz0cFc4pip
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2022-02-09 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
|
-
name:
|
41
|
+
name: kvx
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '0
|
46
|
+
version: '1.0'
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.
|
49
|
+
version: 1.0.1
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
54
|
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '0
|
56
|
+
version: '1.0'
|
57
57
|
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: 0.
|
59
|
+
version: 1.0.1
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
61
|
+
name: recordx
|
62
62
|
requirement: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
64
|
- - "~>"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
66
|
+
version: '0.5'
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 0.5.5
|
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: '
|
76
|
+
version: '0.5'
|
77
77
|
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version:
|
79
|
+
version: 0.5.5
|
80
80
|
description:
|
81
|
-
email:
|
81
|
+
email: digital.robertson@gmail.com
|
82
82
|
executables: []
|
83
83
|
extensions: []
|
84
84
|
extra_rdoc_files: []
|
metadata.gz.sig
CHANGED
Binary file
|