dxlite 0.2.3 → 0.3.0
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.tar.gz.sig +0 -0
- data/lib/dxlite.rb +188 -53
- metadata +12 -11
- 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: 6638bca4c2fef3679ec9d456318f51b51eeeb49230afadbd1baa8af4308620ca
|
4
|
+
data.tar.gz: 1fcaedf6a4692a244e5930ed1d8ec10e7784b5003958faafb45b8e32cdaa707a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54a8938acfd2116234f3a750c9e007adae6e2bc7cb894379702aebe2730b8a601c88f178a490f4b260275e5682c211efee2c5c9da57b9fa645f5146b66a5c7d9
|
7
|
+
data.tar.gz: ec2fde50afa20bbea953fc3ffb503ae07f160580248ecde88e99f1c272f64404cf6bea099c75e4286f411f3c83df27516df39394c27e78d3bc1846e2fce2b88d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/dxlite.rb
CHANGED
@@ -7,90 +7,98 @@ require 'json'
|
|
7
7
|
require 'recordx'
|
8
8
|
require 'rxfhelper'
|
9
9
|
|
10
|
+
|
10
11
|
class DxLite
|
11
12
|
using ColouredText
|
12
13
|
|
13
14
|
attr_accessor :summary
|
14
15
|
attr_reader :records
|
15
16
|
|
16
|
-
def initialize(s, filepath: nil, debug: false)
|
17
|
+
def initialize(s=nil, filepath: nil, debug: false)
|
17
18
|
|
18
19
|
@filepath, @debug = filepath, debug
|
19
20
|
|
21
|
+
return unless s
|
20
22
|
buffer, type = RXFHelper.read(s)
|
21
23
|
puts 'type: ' + type.inspect if @debug
|
22
|
-
|
24
|
+
puts 'buffer: ' + buffer.inspect if @debug
|
25
|
+
|
26
|
+
@records = []
|
27
|
+
|
23
28
|
case type
|
24
29
|
|
25
30
|
when :file
|
26
31
|
|
27
|
-
|
28
|
-
@filepath = s
|
32
|
+
read buffer
|
29
33
|
|
30
|
-
@summary = h[:summary]
|
31
|
-
@records = h[:records]
|
32
|
-
|
33
34
|
when :text
|
34
35
|
|
35
36
|
@summary = {schema: s}
|
36
|
-
@records = []
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
@schema = @summary[:schema]
|
41
37
|
|
42
|
-
summary = @summary[:schema][/(?<=\[)[^\]]+/]
|
43
|
-
|
44
|
-
if summary then
|
45
|
-
@summary.merge! summary.split(',').map {|x|[x.strip, nil] }.to_h
|
46
|
-
end
|
47
|
-
|
48
|
-
# for each summary item create get and set methods
|
49
|
-
|
50
|
-
@summary.each do |key, value|
|
51
38
|
|
52
|
-
|
39
|
+
when :url
|
53
40
|
|
54
|
-
|
55
|
-
@summary[key] = value
|
56
|
-
end
|
41
|
+
read buffer
|
57
42
|
|
58
43
|
end
|
59
44
|
|
60
|
-
@
|
45
|
+
puts '@summary: ' + @summary.inspect
|
46
|
+
@schema = @summary[:schema]
|
47
|
+
|
48
|
+
summary_attributes = {
|
49
|
+
recordx_type: 'dynarex',
|
50
|
+
default_key: @schema[/(?<=\()\w+/]
|
51
|
+
}
|
61
52
|
|
62
|
-
|
53
|
+
puts 'before merge' if @debug
|
54
|
+
@summary.merge!(summary_attributes)
|
63
55
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
value.is_a?(Regexp) ? rec[x.to_sym] =~ value : rec[x.to_sym] == value
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
56
|
+
summary = @summary[:schema][/(?<=\[)[^\]]+/]
|
57
|
+
|
58
|
+
if summary then
|
71
59
|
|
72
|
-
|
73
|
-
|
74
|
-
@records.find do |rec|
|
75
|
-
value.is_a?(Regexp) ? rec[x.to_sym] =~ value : rec[x.to_sym] == value
|
76
|
-
end
|
77
|
-
|
60
|
+
summary.split(/ *, */).each do |x|
|
61
|
+
@summary[x] = nil unless @summary[x]
|
78
62
|
end
|
79
|
-
|
80
|
-
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
make_methods()
|
81
67
|
|
82
68
|
end
|
83
69
|
|
84
70
|
def all()
|
85
71
|
|
86
72
|
@records.map do |h|
|
87
|
-
|
73
|
+
|
74
|
+
puts 'h: ' + h.inspect if @debug
|
75
|
+
RecordX.new(h[:body], self, h[:id], h[:created],
|
76
|
+
h[:last_modified])
|
88
77
|
end
|
89
78
|
|
90
79
|
end
|
91
80
|
|
92
|
-
def
|
93
|
-
@records
|
81
|
+
def delete(id)
|
82
|
+
found = @records.find {|x| x[:id] == id}
|
83
|
+
@records.delete found if found
|
84
|
+
end
|
85
|
+
|
86
|
+
def create(rawh, id: nil, custom_attributes: {created: Time.now})
|
87
|
+
|
88
|
+
id ||= @records.map {|x| x[:id].to_i}.max.to_i + 1
|
89
|
+
h2 = custom_attributes
|
90
|
+
h = fields.map {|x| [x.to_sym, nil] }.to_h.merge(rawh)
|
91
|
+
@records << {id: id.to_s, created: h2[:created], last_modified: nil,
|
92
|
+
body: h}
|
93
|
+
end
|
94
|
+
|
95
|
+
def fields()
|
96
|
+
@fields
|
97
|
+
end
|
98
|
+
|
99
|
+
def inspect()
|
100
|
+
"#<DxLite:%s @debug=%s, @summary=%s, ...>" % [object_id, @debug,
|
101
|
+
@summary.inspect]
|
94
102
|
end
|
95
103
|
|
96
104
|
# Parses 1 or more lines of text to create or update existing records.
|
@@ -104,22 +112,59 @@ class DxLite
|
|
104
112
|
self.schema = "items/item(%s)" % cols.join(', ')
|
105
113
|
end
|
106
114
|
|
107
|
-
obj.each
|
115
|
+
obj.each do |x|
|
116
|
+
#puts 'x: ' + x.inspect if @debug
|
117
|
+
self.create x, id: nil
|
118
|
+
end
|
119
|
+
|
108
120
|
return self
|
109
121
|
|
110
122
|
end
|
111
123
|
end
|
112
124
|
|
113
125
|
alias import parse
|
126
|
+
|
127
|
+
def parse_xml(buffer)
|
128
|
+
|
129
|
+
doc = Rexle.new(buffer)
|
130
|
+
|
131
|
+
asummary = doc.root.xpath('summary/*').map do |node|
|
132
|
+
puts 'node: ' + node.xml.inspect if @debug
|
133
|
+
[node.name, node.text.to_s]
|
134
|
+
end
|
135
|
+
|
136
|
+
summary = Hash[asummary]
|
137
|
+
summary[:schema] = summary['schema']
|
138
|
+
%w(recordx_type format_mask schema).each {|x| summary.delete x}
|
139
|
+
|
140
|
+
schema = summary[:schema]
|
141
|
+
puts 'schema: ' + schema.inspect if @debug
|
142
|
+
|
143
|
+
@fields = schema[/\(([^\)]+)/,1].split(/ *, +/)
|
144
|
+
puts 'fields: ' + @fields.inspect if @debug
|
145
|
+
|
146
|
+
a = doc.root.xpath('records/*').each do |node|
|
147
|
+
|
148
|
+
h = Hash[@fields.map {|field| [field.to_sym, node.text(field).to_s] }]
|
149
|
+
self.create h, id: nil
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
@summary = summary
|
154
|
+
|
155
|
+
end
|
114
156
|
|
115
157
|
def save(file=@filepath)
|
116
|
-
File.
|
158
|
+
s = File.extname(file) == '.json' ? to_json() : to_xml()
|
159
|
+
File.write file, s
|
117
160
|
end
|
118
161
|
|
119
|
-
|
162
|
+
def to_a()
|
163
|
+
@records.map {|x| x[:body]}
|
164
|
+
end
|
120
165
|
|
121
|
-
def
|
122
|
-
|
166
|
+
def to_h()
|
167
|
+
|
123
168
|
root_name = schema()[/^\w+/]
|
124
169
|
record_name = schema()[/(?<=\/)[^\(]+/]
|
125
170
|
|
@@ -130,8 +175,38 @@ class DxLite
|
|
130
175
|
records: @records.map {|h| {record_name.to_sym => h} }
|
131
176
|
}
|
132
177
|
}
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
def to_json(pretty: true)
|
182
|
+
pretty ? JSON.pretty_generate(to_h()) : to_h()
|
183
|
+
end
|
184
|
+
|
185
|
+
def to_xml()
|
186
|
+
|
187
|
+
root_name = schema()[/^\w+/]
|
188
|
+
record_name = schema()[/(?<=\/)[^\(]+/]
|
189
|
+
|
190
|
+
a = RexleBuilder.build do |xml|
|
191
|
+
|
192
|
+
xml.send(root_name.to_sym) do
|
193
|
+
xml.summary({}, @summary)
|
194
|
+
xml.records do
|
195
|
+
|
196
|
+
all().each do |x|
|
197
|
+
|
198
|
+
h = {id: x.id, created: x.created, last_modified: x.last_modified}
|
199
|
+
puts 'x.to_h: ' + x.to_h.inspect if @debug
|
200
|
+
xml.send(record_name.to_sym, h, x.to_h)
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
133
207
|
|
134
|
-
Rexle.new(
|
208
|
+
Rexle.new(a).xml pretty: true
|
209
|
+
|
135
210
|
|
136
211
|
end
|
137
212
|
|
@@ -146,8 +221,68 @@ class DxLite
|
|
146
221
|
puts ('obj.class: ' + obj.class.inspect).debug
|
147
222
|
end
|
148
223
|
|
149
|
-
r = @records.find {|x| x
|
150
|
-
r.merge!(obj)
|
224
|
+
r = @records.find {|x| x[:id] == id}
|
225
|
+
r[:body].merge!(obj)
|
226
|
+
end
|
227
|
+
|
228
|
+
private
|
229
|
+
|
230
|
+
def find_record(rec, value, x)
|
231
|
+
value.is_a?(Regexp) ? rec[x.to_sym] =~ value : rec[x.to_sym] == value
|
232
|
+
end
|
233
|
+
|
234
|
+
def make_methods()
|
235
|
+
|
236
|
+
# for each summary item create get and set methods
|
237
|
+
|
238
|
+
@summary.each do |key, value|
|
239
|
+
|
240
|
+
define_singleton_method(key) { @summary[key] }
|
241
|
+
|
242
|
+
define_singleton_method (key.to_s + '=').to_sym do |value|
|
243
|
+
@summary[key] = value
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
|
248
|
+
@fields = @summary[:schema][/(?<=\()[^\)]+/].split(',').map(&:strip)
|
249
|
+
|
250
|
+
@fields.each do |x|
|
251
|
+
|
252
|
+
define_singleton_method ('find_all_by_' + x).to_sym do |value|
|
253
|
+
|
254
|
+
@records.select {|rec| find_record(rec[:body], value, x) }
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
define_singleton_method ('find_by_' + x).to_sym do |value|
|
259
|
+
|
260
|
+
@records.find {|rec| find_record(rec[:body], value, x) }
|
261
|
+
|
262
|
+
end
|
263
|
+
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
|
268
|
+
def read(buffer)
|
269
|
+
|
270
|
+
if buffer[0] == '<' then
|
271
|
+
|
272
|
+
parse_xml buffer
|
273
|
+
|
274
|
+
else
|
275
|
+
|
276
|
+
h1 = JSON.parse(buffer, symbolize_names: true)
|
277
|
+
#puts 'h1:' + h1.inspect if @debug
|
278
|
+
|
279
|
+
h = h1[h1.keys.first]
|
280
|
+
|
281
|
+
@summary = h[:summary]
|
282
|
+
@records = h[:records].map {|x| x[x.keys.first]}
|
283
|
+
|
284
|
+
end
|
285
|
+
|
151
286
|
end
|
152
287
|
|
153
288
|
end
|
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.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
dwbAN6/wokoLVZAiMRG1vZlI6RhtSOTHvFHbfBE5JI9rhjRtui8yeV+t8iI8G4Zs
|
36
36
|
2NszuYzdlVfzlrUiPWY5jL9P
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2021-01-23 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: recordx
|
@@ -61,22 +61,22 @@ dependencies:
|
|
61
61
|
name: rxfhelper
|
62
62
|
requirement: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.0.0
|
67
64
|
- - "~>"
|
68
65
|
- !ruby/object:Gem::Version
|
69
|
-
version: '1.
|
66
|
+
version: '1.1'
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.1.3
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 1.0.0
|
77
74
|
- - "~>"
|
78
75
|
- !ruby/object:Gem::Version
|
79
|
-
version: '1.
|
76
|
+
version: '1.1'
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 1.1.3
|
80
80
|
description:
|
81
81
|
email: james@jamesrobertson.eu
|
82
82
|
executables: []
|
@@ -103,7 +103,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
|
-
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.7.10
|
107
108
|
signing_key:
|
108
109
|
specification_version: 4
|
109
110
|
summary: Handles Dynarex documents (in JSON format) faster and with less overheads.
|
metadata.gz.sig
CHANGED
Binary file
|