dxlite 0.3.4 → 0.5.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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -4
  3. data/lib/dxlite.rb +187 -141
  4. data.tar.gz.sig +0 -0
  5. metadata +35 -35
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28362d972f8389e1b817f21be4fb9524ca4188761b4f4128c21a886eb67a11a5
4
- data.tar.gz: df45a19238f82766d2abd14f08dc0f105b6bb1d66e4ddf85c46e4089f2600c8a
3
+ metadata.gz: 26b439376d323ebf252c80b4beb705a078b4aafae6a8c454eade112ff2bafef1
4
+ data.tar.gz: 89a361d248390fed5cd385f2cb1ff9025dbd6e13df64b05413eab830eef0e454
5
5
  SHA512:
6
- metadata.gz: 515c3ed54028756c1ff4a5e660f204b878b0c2098f8de61ac43096c7b3191d2a2ffaf9b8d1f0a5f8fed62d80dd22845661c2927bc40bddc5a44c02986e1b32bc
7
- data.tar.gz: e8aa916f1ebf5118440c45d75c75ec116d64cd98215ba1a0b9d85c49d8c4d92530d7686f1833097506f6453e8370587700c1dd67aba88ab51ff4ee0c24703932
6
+ metadata.gz: 8348c12d469466b5915a9178e7fb15076bd2345768e4440a6ce99d1fee79ec1423754d65e922c03dac6f4a875ecb16dd23f7e3a477d73e4c1adb30b16f98a127
7
+ data.tar.gz: 57a73d0c80ea752eb8f79dbb99e04bb757ffa48fd0c389c48402a9387905f67a6fab637ea9e1074e9e53d09eb2c5902ca168c279297216bb6e78cebc0ea2a373
checksums.yaml.gz.sig CHANGED
@@ -1,4 +1,2 @@
1
- ^���D/��1��M���1�.k<�.Z4��cuװ'.������[�
2
- ��HErr�=��ÆXr�`�]��JS`xp VѤ�X5��x4DYOy[��}����3@����>6UC�BH&
3
- ��Rj4�Kl�: �����Yϖ?g���kiF�n����� ~ܞ({y3��eL�l�K�ЎVF7����߰z��w�(�"�"c�3p�&u�>e<���6�B��\�˲�(-+�P��ϐ��g���>�jb�j�r����%�`,��}��,��a�ot'.&_&82���\�]>�{bo .�o%���Ĝ7���ҙ
4
- ���X��-������ڇ���dIl�X�n�!�i?�Ɇ�aQ���4
1
+ S$C��9t��|�J���8Ua�M+5�����^62lGB�;��w�� ���}�yE�𜴨j+
2
+ �k�1��2��jLE��q��rQ�=t���c����G-d�JL�b��s 7��n�-�ih�2��b���@j� �ɠ�jh�I��p9w����'C��3Xh��y��n��$%H���:�!ŷ�
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'
@@ -12,7 +13,7 @@ class DxLite
12
13
  using ColouredText
13
14
 
14
15
  attr_accessor :summary, :filepath
15
- attr_reader :records
16
+ attr_reader :records, :schema
16
17
 
17
18
  def initialize(s=nil, autosave: false, debug: false)
18
19
 
@@ -20,171 +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
- puts 'before merge' if @debug
57
- @summary.merge!(summary_attributes)
46
+ when :url
58
47
 
59
- summary = @summary[:schema][/(?<=\[)[^\]]+/]
60
-
61
- if summary then
48
+ read buffer
62
49
 
63
- summary.split(/ *, */).each do |x|
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
-
96
- id ||= @records.map {|x| x[:id].to_i}.max.to_i + 1
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
+
94
+ if id.nil? then
95
+
96
+ puts '@records: ' + @records.inspect if @debug
97
+
98
+ if @records then
99
+ id = @records.map {|x| x[:id].to_i}.max.to_i + 1
100
+ else
101
+ @records = []
102
+ id = 1
103
+ end
104
+
105
+ end
106
+
97
107
  h2 = custom_attributes
108
+
109
+ fields = rawh.keys
110
+ puts 'fields: ' + fields.inspect if @debug
111
+
98
112
  h3 = fields.map {|x| [x.to_sym, nil] }.to_h.merge(rawh)
99
113
  h = {id: id.to_s, created: h2[:created], last_modified: nil, body: h3}
100
114
  @records << h
101
-
115
+
102
116
  save() if @autosave
103
-
117
+
104
118
  RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
105
-
119
+
106
120
  end
107
-
121
+
108
122
  def fields()
109
123
  @fields
110
124
  end
111
-
125
+
112
126
  def inspect()
113
- "#<DxLite:%s @debug=%s, @summary=%s, ...>" % [object_id, @debug,
127
+ "#<DxLite:%s @debug=%s, @summary=%s, ...>" % [object_id, @debug,
114
128
  @summary.inspect]
115
129
  end
116
-
130
+
117
131
  # Parses 1 or more lines of text to create or update existing records.
118
132
 
119
133
  def parse(obj=nil)
120
-
134
+
135
+ @records ||= []
136
+
121
137
  if obj.is_a? Array then
122
-
138
+
123
139
  unless schema() then
124
- cols = obj.first.keys.map {|c| c == 'id' ? 'uid' : c}
125
- self.schema = "items/item(%s)" % cols.join(', ')
140
+ puts 'obj.first: ' + obj.first.inspect if @debug
141
+ cols = obj.first.keys.map {|c| c == 'id' ? 'uid' : c}
142
+ puts 'after cols' if @debug
143
+ new_summary "items/item(%s)" % cols.join(', ')
126
144
  end
127
-
145
+
128
146
  obj.each do |x|
129
147
  #puts 'x: ' + x.inspect if @debug
130
148
  self.create x, id: nil
131
149
  end
132
-
133
- return self
134
-
135
- end
150
+
151
+ return self
152
+
153
+ end
136
154
  end
137
-
155
+
138
156
  alias import parse
139
-
157
+
140
158
  def parse_xml(buffer)
141
-
159
+
142
160
  doc = Rexle.new(buffer)
143
-
161
+
144
162
  asummary = doc.root.xpath('summary/*').map do |node|
145
163
  puts 'node: ' + node.xml.inspect if @debug
146
164
  [node.name, node.text.to_s]
147
165
  end
148
-
166
+
149
167
  summary = Hash[asummary]
150
168
  summary[:schema] = summary['schema']
151
169
  %w(recordx_type format_mask schema).each {|x| summary.delete x}
152
-
153
- schema = summary[:schema]
170
+
171
+ @schema = summary[:schema]
154
172
  puts 'schema: ' + schema.inspect if @debug
155
-
156
- @fields = schema[/\(([^\)]+)/,1].split(/ *, +/)
173
+
174
+ @fields = @schema[/\(([^\)]+)/,1].split(/ *, +/)
157
175
  puts 'fields: ' + @fields.inspect if @debug
158
-
176
+
177
+ @summary = summary
178
+
159
179
  a = doc.root.xpath('records/*').each do |node|
160
-
180
+
161
181
  h = Hash[@fields.map {|field| [field.to_sym, node.text(field).to_s] }]
162
- self.create h, id: nil
163
-
182
+ self.create h, id: nil, custom_attributes: node.attributes
183
+
164
184
  end
165
185
 
166
- @summary = summary
167
-
168
186
  end
169
187
 
170
188
  def save(file=@filepath)
171
-
189
+
172
190
  return unless file
173
191
  @filepath = file
174
-
192
+
175
193
  s = File.extname(file) == '.json' ? to_json() : to_xml()
176
194
  File.write file, s
177
195
  end
178
-
196
+
179
197
  def to_a()
180
198
  @records.map {|x| x[:body]}
181
199
  end
182
-
200
+
183
201
  def to_h()
184
-
202
+
185
203
  root_name = schema()[/^\w+/]
186
204
  record_name = schema()[/(?<=\/)[^\(]+/]
187
-
205
+
188
206
  h = {
189
207
  root_name.to_sym =>
190
208
  {
@@ -192,139 +210,167 @@ class DxLite
192
210
  records: @records.map {|h| {record_name.to_sym => h} }
193
211
  }
194
212
  }
195
-
213
+
196
214
  end
197
-
215
+
198
216
  def to_json(pretty: true)
199
217
  pretty ? JSON.pretty_generate(to_h()) : to_h()
200
218
  end
201
-
219
+
202
220
  def to_xml()
203
-
221
+
204
222
  root_name = schema()[/^\w+/]
205
223
  record_name = schema()[/(?<=\/)[^\(]+/]
206
-
224
+
207
225
  a = RexleBuilder.build do |xml|
208
-
226
+
209
227
  xml.send(root_name.to_sym) do
210
228
  xml.summary({}, @summary)
211
229
  xml.records do
212
-
230
+
213
231
  all().each do |x|
214
-
215
- 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}
216
234
  puts 'x.to_h: ' + x.to_h.inspect if @debug
217
235
  xml.send(record_name.to_sym, h, x.to_h)
218
-
236
+
219
237
  end
220
-
238
+
221
239
  end
222
240
  end
223
241
  end
224
242
 
225
- Rexle.new(a).xml pretty: true
226
-
227
-
243
+ Rexle.new(a).xml pretty: true
244
+
245
+
228
246
  end
229
-
247
+
230
248
  # Updates a record from an id and a hash containing field name and field value.
231
- # dynarex.update 4, name: Jeff, age: 38
232
-
249
+ # dynarex.update 4, name: Jeff, age: 38
250
+
233
251
  def update(id, obj)
234
-
252
+
235
253
  if @debug then
236
254
  puts 'inside update'.info
237
255
  puts ('id: ' + id.inspect).debug
238
256
  puts ('obj.class: ' + obj.class.inspect).debug
239
257
  end
240
-
258
+
241
259
  r = @records.find {|x| x[:id] == id}
242
-
260
+
243
261
  if r then
244
-
262
+
245
263
  r[:body].merge!(obj)
246
264
  save() if @autosave
247
-
265
+
248
266
  end
249
-
267
+
250
268
  end
251
-
269
+
252
270
  private
253
-
271
+
254
272
  def find_record(rec, value, x)
255
- 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
256
274
  end
257
-
275
+
258
276
  def make_methods()
259
-
277
+
260
278
  # for each summary item create get and set methods
261
-
279
+
262
280
  @summary.each do |key, value|
263
-
281
+
264
282
  define_singleton_method(key) { @summary[key] }
265
-
283
+
266
284
  define_singleton_method (key.to_s + '=').to_sym do |value|
267
285
  @summary[key] = value
268
- end
269
-
286
+ end
287
+
270
288
  end
271
-
289
+
272
290
  @fields = @summary[:schema][/(?<=\()[^\)]+/].split(',').map(&:strip)
273
291
 
274
292
  @fields.each do |x|
275
293
 
276
294
  define_singleton_method ('find_all_by_' + x).to_sym do |value|
277
-
295
+
278
296
  a = @records.select {|rec| find_record(rec[:body], value, x) }
279
-
297
+
280
298
  a.map do |h|
281
299
  RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
282
300
  end
283
-
301
+
284
302
  end
285
303
 
286
304
  define_singleton_method ('find_by_' + x).to_sym do |value|
287
-
305
+
288
306
  h = @records.find {|rec| find_record(rec[:body], value, x) }
289
307
  return nil unless h
290
-
291
- RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
292
-
308
+
309
+ RecordX.new(h[:body], self, h[:id], h[:created], h[:last_modified])
310
+
293
311
  end
294
312
 
295
313
  end
296
-
314
+
297
315
  end
298
-
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]
338
+ end
339
+
340
+ end
341
+
342
+ make_methods()
343
+ end
344
+
299
345
  def read(buffer)
300
-
346
+
301
347
  if buffer[0] == '<' then
302
-
348
+
303
349
  parse_xml buffer
304
-
350
+
305
351
  else
306
-
352
+
307
353
  h1 = JSON.parse(buffer, symbolize_names: true)
308
- #puts 'h1:' + h1.inspect if @debug
309
-
354
+ puts 'h1:' + h1.inspect if @debug
355
+
310
356
  h = h1[h1.keys.first]
311
-
357
+
312
358
  @summary = {}
313
-
359
+
314
360
  h[:summary].each do |key, value|
315
-
361
+
316
362
  if %i(recordx_type format_mask schema).include? key then
317
363
  @summary[key] = value
318
- else
364
+ else
319
365
  @summary[key.to_s] = value
320
366
  end
321
-
367
+
322
368
  end
323
-
369
+
324
370
  @records = h[:records].map {|x| x[x.keys.first]}
325
-
371
+
326
372
  end
327
-
373
+
328
374
  end
329
-
375
+
330
376
  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.3.4
4
+ version: 0.5.0
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
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwNjIwMDk1OTIyWhcN
15
- MjEwNjIwMDk1OTIyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCcnuff
17
- 5MVmDII05CloWme8XkTcCkGTFTCGqacPAa5803163oHfU0CovEbdSR8KNVXQ0mVz
18
- ZkE1kEi/xlAbZHKZTgJNjzXKcTfW0zNI/1l9Jyz59fjOUgO26oWgEJX1iJBUkzAx
19
- 1jHBvCGvAgKi1gmPovfrnPkXJ4e39Kklay4mrsfRO1qAkyfoUCn8TOc4/xVyB9UV
20
- zpSfryHT41gM3vUyVyfkLsC8St6oI2j6R45YJIL2Hz1UBZsFk8ICn8MKL84b+nyX
21
- YiW3BoOhB5x4M+tORhMqIYwSW///P3ztFVuZCoZsZm7KDlmZ5Q+kbtg2O6WJqOeX
22
- 2CLAag6UYpWUJd9SBDOOLvNAzdzKHOlD/tJQnHrLTJzNSQQZcCLa7xjAob2vooFi
23
- zO7nNoPnRb7MFAdnjEgIPra6GZ6BxSzeWKmkXX6vFCs8Uy8N0ijHyWg4NKDlgHzl
24
- VCS9RW6U/gIhciP3kabmxcu2R67I79UDJU4tf8fYN+7tZLfU7g5S0QLQfrsCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUDodJj5qi
26
- akKU2hOApwE0BzK8lGswJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
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
- BgkqhkiG9w0BAQsFAAOCAYEAAp+SekW1hEJtEVytkrrwQlx/7umkgPsiQS18ch7v
29
- sRZBRxLXwFdG0LLmqo1rP0vd+JMDq0DXZVR6bluBGp2NEsFD9XyBs7Rsz/+4SEQ4
30
- 4eLGxTkU8+expljNlWRAFZdyt1RPHbs0LScrjBZaVzfBJtLXLcl8CWhyqM4OPTHv
31
- R18J5Arlbd4O0PfYXQ08UtoSsNrqf77o24nPuXMXKMwPhmaCpuj0Lo4zBkha9EO8
32
- geBYBisigKBlddJirP391twfnfQS0Qx/j7LgkYgXAuD3Z0Ma1Z9E3HzuTvXernzM
33
- sECCiG3ji+1NriaIv8rb6mG/Zbdjv8ydoFAj+M+0qbE+ZARNlBHKI7F7lYQJc0cT
34
- vsTqpllA3ZpXxVzmfiJMahAv08eTnWbgCSRNbCm6mq6I4hyAiudbxcc+DPzLbrxx
35
- dwbAN6/wokoLVZAiMRG1vZlI6RhtSOTHvFHbfBE5JI9rhjRtui8yeV+t8iI8G4Zs
36
- 2NszuYzdlVfzlrUiPWY5jL9P
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-01-31 00:00:00.000000000 Z
38
+ date: 2022-02-04 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
- name: recordx
41
+ name: kvx
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0.5'
46
+ version: '1.0'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 0.5.5
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.5'
56
+ version: '1.0'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 0.5.5
59
+ version: 1.0.1
60
60
  - !ruby/object:Gem::Dependency
61
- name: rxfhelper
61
+ name: recordx
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '1.1'
66
+ version: '0.5'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 1.1.3
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: '1.1'
76
+ version: '0.5'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 1.1.3
79
+ version: 0.5.5
80
80
  description:
81
- email: james@jamesrobertson.eu
81
+ email: digital.robertson@gmail.com
82
82
  executables: []
83
83
  extensions: []
84
84
  extra_rdoc_files: []
metadata.gz.sig CHANGED
Binary file