dxlite 0.3.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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