dynarex 0.9.4 → 0.9.5
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.
- data/lib/dynarex.rb +59 -52
- metadata +2 -2
data/lib/dynarex.rb
CHANGED
@@ -2,14 +2,13 @@
|
|
2
2
|
|
3
3
|
# file: dynarex.rb
|
4
4
|
|
5
|
-
require 'rexml/document'
|
6
5
|
require 'nokogiri'
|
7
6
|
require 'open-uri'
|
8
7
|
require 'builder'
|
9
8
|
require 'ostruct'
|
9
|
+
require 'rexle'
|
10
10
|
|
11
11
|
class Dynarex
|
12
|
-
include REXML
|
13
12
|
|
14
13
|
attr_accessor :format_mask, :delimiter, :schema
|
15
14
|
|
@@ -81,14 +80,15 @@ xsl_buffer =<<EOF
|
|
81
80
|
</xsl:stylesheet>
|
82
81
|
EOF
|
83
82
|
|
84
|
-
format_mask = XPath.first(@doc.root, 'summary/format_mask/text()').to_s
|
85
|
-
|
83
|
+
#format_mask = XPath.first(@doc.root, 'summary/format_mask/text()').to_s
|
84
|
+
format_mask = @doc.element('summary/format_mask/text()')
|
85
|
+
dynarex = Dynarex.new
|
86
86
|
|
87
|
-
s = %q(schema="companies/company(name, last_contacted, contact)" delimiter=" # ")
|
88
|
-
s.split(/(?=\w+\="[^"]+")/)
|
89
|
-
raw_a = s.scan(/\w+\="[^"]+"/)
|
90
|
-
a = raw_a.map{|x| r = x.split(/=/); [(r[0] + "=").to_sym, r[1][/^"(.*)"$/,1]] }
|
91
|
-
a.each{|name, value| dynarex.method(name).call(value)}
|
87
|
+
s = %q(schema="companies/company(name, last_contacted, contact)" delimiter=" # ")
|
88
|
+
s.split(/(?=\w+\="[^"]+")/)
|
89
|
+
raw_a = s.scan(/\w+\="[^"]+"/)
|
90
|
+
a = raw_a.map{|x| r = x.split(/=/); [(r[0] + "=").to_sym, r[1][/^"(.*)"$/,1]] }
|
91
|
+
a.each{|name, value| dynarex.method(name).call(value)}
|
92
92
|
|
93
93
|
xslt_format = format_mask.to_s.gsub(/\s(?=\[!\w+\])/,'<xsl:text> </xsl:text>').gsub(/\[!(\w+)\]/, '<xsl:value-of select="\1"/>')
|
94
94
|
xsl_buffer.sub!(/\[!regex_values\]/, xslt_format)
|
@@ -96,6 +96,7 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
96
96
|
xslt = Nokogiri::XSLT(xsl_buffer)
|
97
97
|
out = xslt.transform(Nokogiri::XML(@doc.to_s))
|
98
98
|
out.text
|
99
|
+
|
99
100
|
end
|
100
101
|
|
101
102
|
def to_xml
|
@@ -121,7 +122,8 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
121
122
|
header.scan(/\w+\="[^"]+\"/).map{|x| r = x.split(/=/); [(r[0] + "=").to_sym, r[1][/^"(.*)"$/,1]] }.each {|name, value| self.method(name).call(value)}
|
122
123
|
end
|
123
124
|
|
124
|
-
i = XPath.match(@doc.root, 'records/*/attribute::id').max_by(&:value).to_s.to_i
|
125
|
+
#i = XPath.match(@doc.root, 'records/*/attribute::id').max_by(&:value).to_s.to_i
|
126
|
+
i = @doc.xpath('records/*/attribute::id').max_by(&:value).to_s.to_i
|
125
127
|
t = @format_mask.to_s.gsub(/\[!(\w+)\]/, '(.*)').sub(/\[/,'\[').sub(/\]/,'\]')
|
126
128
|
|
127
129
|
lines = buffer.strip.split(/\r?\n|\r(?!\n)/).map {|x|x.match(/#{t}/).captures}
|
@@ -191,7 +193,7 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
191
193
|
fields = capture_fields(params)
|
192
194
|
|
193
195
|
# for each field update each record field
|
194
|
-
record =
|
196
|
+
record = @doc.element("records/#{@record_name}[@id=#{id.to_s}]")
|
195
197
|
fields.each {|k,v| record.elements[k.to_s].text = v if v}
|
196
198
|
record.add_attribute('last_modified', Time.now.to_s)
|
197
199
|
|
@@ -203,7 +205,7 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
203
205
|
# dyarex.delete 3 # deletes record with id 3
|
204
206
|
|
205
207
|
def delete(id)
|
206
|
-
node =
|
208
|
+
node = @doc.element("records/*[@id='#{id}']")
|
207
209
|
node.parent.delete node
|
208
210
|
load_records
|
209
211
|
self
|
@@ -211,44 +213,46 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
211
213
|
|
212
214
|
def sort_by!(&element_blk)
|
213
215
|
refresh_doc
|
214
|
-
a =
|
215
|
-
|
216
|
-
|
217
|
-
records = Element.new 'records'
|
216
|
+
a = @doc.xpath('records/*').sort_by &element_blk
|
217
|
+
@doc.delete('records')
|
218
|
+
|
219
|
+
records = Rexle::Element.new 'records'
|
218
220
|
a.each {|record| records.add record}
|
219
221
|
@doc.root.add records
|
222
|
+
|
220
223
|
load_records
|
221
224
|
self
|
222
225
|
end
|
223
226
|
|
224
227
|
def record(id)
|
225
|
-
h = Hash[
|
228
|
+
h = Hash[*@doc.xpath("records/*[@id='#{id}']/*").map {|x| [x.name, x.text]}.flatten]
|
226
229
|
OpenStruct.new h
|
227
230
|
end
|
228
231
|
|
229
232
|
def record_exists?(id)
|
230
|
-
|
233
|
+
!@doc.element("records/*[@id='#{id}']").nil?
|
231
234
|
end
|
232
235
|
|
233
236
|
private
|
234
237
|
|
235
238
|
def hash_create(params={}, id=nil)
|
236
239
|
fields = capture_fields(params)
|
237
|
-
record = Element.new @record_name
|
240
|
+
record = Rexle::Element.new @record_name
|
238
241
|
fields.each do |k,v|
|
239
|
-
element = Element.new(k.to_s)
|
242
|
+
element = Rexle::Element.new(k.to_s)
|
240
243
|
element.text = v if v
|
241
244
|
record.add element
|
242
245
|
end
|
243
246
|
|
244
247
|
unless id
|
245
|
-
ids =
|
248
|
+
ids = @doc.xpath('records/*/attribute::id').map(&:to_i)
|
246
249
|
id = ids.empty? ? (id || 1) : ids.max.succ
|
247
250
|
end
|
248
251
|
|
249
252
|
attributes = {id: id, created: Time.now.to_s, last_modified: nil}
|
250
253
|
attributes.each {|k,v| record.add_attribute(k.to_s, v)}
|
251
|
-
|
254
|
+
|
255
|
+
@doc.element('records').add record
|
252
256
|
end
|
253
257
|
|
254
258
|
def capture_fields(params)
|
@@ -279,7 +283,7 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
279
283
|
end
|
280
284
|
end
|
281
285
|
|
282
|
-
@doc =
|
286
|
+
@doc = Rexle.new buffer
|
283
287
|
buffer
|
284
288
|
|
285
289
|
end
|
@@ -317,29 +321,32 @@ a.each{|name, value| dynarex.method(name).call(value)}
|
|
317
321
|
@fields.each do |field|
|
318
322
|
self.instance_eval(
|
319
323
|
%Q(def find_by_#{field}(s)
|
320
|
-
Hash[@fields.zip(
|
324
|
+
Hash[@fields.zip(@doc.xpath("records/*[#{field}='\#{s}']/*/text()"))]
|
321
325
|
end))
|
322
326
|
end
|
323
327
|
end
|
324
328
|
|
325
329
|
def open(s)
|
326
|
-
|
330
|
+
|
331
|
+
if s.strip[/^</] then # xml
|
332
|
+
puts 'fuh'
|
333
|
+
buffer = s
|
334
|
+
elsif s[/\(/] # schema
|
335
|
+
puts 'duh'
|
327
336
|
buffer = dynarex_new s
|
328
337
|
elsif s[/^https?:\/\//] then # url
|
329
338
|
buffer = Kernel.open(s, 'UserAgent' => 'Dynarex-Reader').read
|
330
|
-
elsif s[/\</] # xml
|
331
|
-
buffer = s
|
332
339
|
else # local file
|
333
340
|
@local_filepath = s
|
334
341
|
buffer = File.open(s,'r').read
|
335
342
|
end
|
336
343
|
|
337
|
-
@doc =
|
344
|
+
@doc = Rexle.new buffer
|
338
345
|
@schema = @doc.root.text('summary/schema')
|
339
346
|
@root_name = @doc.root.name
|
340
347
|
@summary = summary_to_h
|
341
|
-
@default_key =
|
342
|
-
@format_mask =
|
348
|
+
@default_key = @doc.element('summary/default_key/text()')
|
349
|
+
@format_mask = @doc.element('summary/format_mask/text()')
|
343
350
|
|
344
351
|
@fields = @format_mask.to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym) if @format_mask
|
345
352
|
|
@@ -352,10 +359,12 @@ end))
|
|
352
359
|
@default_key = @fields[0] unless @default_key
|
353
360
|
# load the record query handler methods
|
354
361
|
attach_record_methods
|
362
|
+
else
|
363
|
+
@default_key = @doc.xpath('records/*/*').first.name
|
355
364
|
end
|
356
365
|
|
357
|
-
if
|
358
|
-
@record_name =
|
366
|
+
if @doc.xpath('records/*').length > 0 then
|
367
|
+
@record_name = @doc.element('records/*[1]').name
|
359
368
|
load_records
|
360
369
|
end
|
361
370
|
|
@@ -373,44 +382,42 @@ end))
|
|
373
382
|
#Returns a ready-only snapshot of records as a simple Hash.
|
374
383
|
|
375
384
|
def flat_records_to_h
|
376
|
-
|
377
|
-
|
378
|
-
r
|
379
|
-
r
|
385
|
+
@doc.xpath('records/*').map do |row|
|
386
|
+
row.xpath('*').inject({}) do |r,node|
|
387
|
+
r.merge node.name.to_s.to_sym => node.text
|
380
388
|
end
|
381
389
|
end
|
382
390
|
end
|
383
391
|
|
384
392
|
def records_to_h()
|
385
|
-
|
393
|
+
|
394
|
+
i = @doc.xpath('max(records/*/attribute::id)') || 0
|
386
395
|
|
387
|
-
|
388
|
-
|
396
|
+
@doc.xpath('records/*').inject({}) do |result,row|
|
397
|
+
|
389
398
|
created = Time.now.to_s
|
390
399
|
last_modified = ''
|
391
400
|
|
392
|
-
if row.
|
393
|
-
id = row.
|
401
|
+
if row.attributes['id'] then
|
402
|
+
id = row.attributes['id']
|
394
403
|
else
|
395
404
|
i += 1; id = i.to_s
|
396
405
|
end
|
397
|
-
created = row.
|
398
|
-
last_modified = row.
|
399
|
-
body =
|
400
|
-
r
|
401
|
-
r
|
406
|
+
created = row.attributes['created'] if row.attributes['created']
|
407
|
+
last_modified = row.attributes['last_modified'] if row.attributes['last_modified']
|
408
|
+
body = row.xpath('*').inject({}) do |r,node|
|
409
|
+
r.merge node.name.to_s => node.text
|
402
410
|
end
|
403
411
|
|
404
|
-
|
405
|
-
last_modified, body: body}]
|
412
|
+
result.merge body[@default_key] => {id: id, created: created, last_modified: last_modified, body: body}
|
406
413
|
end
|
407
|
-
|
414
|
+
|
408
415
|
end
|
409
416
|
|
410
417
|
def summary_to_h
|
411
|
-
|
412
|
-
|
413
|
-
r
|
418
|
+
|
419
|
+
@doc.xpath('summary/*').inject({}) do |r,node|
|
420
|
+
r.merge node.name.to_s.to_sym => node.text.to_s
|
414
421
|
end
|
415
422
|
end
|
416
423
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynarex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors: []
|
7
7
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-12-07 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|