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