dynarex 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dynarex.rb +28 -11
- metadata +1 -1
data/lib/dynarex.rb
CHANGED
@@ -21,7 +21,11 @@ class Dynarex
|
|
21
21
|
def initialize(location)
|
22
22
|
open(location)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
|
+
def fields
|
26
|
+
@fields
|
27
|
+
end
|
28
|
+
|
25
29
|
# Returns the hash representation of the document summary.
|
26
30
|
|
27
31
|
def summary
|
@@ -151,11 +155,11 @@ EOF
|
|
151
155
|
# dynarex.update 4, name: Jeff, age: 38
|
152
156
|
|
153
157
|
def update(id, params={})
|
154
|
-
|
158
|
+
fields = capture_fields(params)
|
155
159
|
|
156
160
|
# for each field update each record field
|
157
|
-
record = XPath.first(@doc.root, "records/#{record_name}[@id=#{id.to_s}]")
|
158
|
-
fields.each {|k,v| record.elements[k.to_s].text = v if v}
|
161
|
+
record = XPath.first(@doc.root, "records/#{@record_name}[@id=#{id.to_s}]")
|
162
|
+
@fields.each {|k,v| record.elements[k.to_s].text = v if v}
|
159
163
|
record.add_attribute('last_modified', Time.now.to_s)
|
160
164
|
|
161
165
|
load_records
|
@@ -175,8 +179,8 @@ EOF
|
|
175
179
|
private
|
176
180
|
|
177
181
|
def hash_create(params={})
|
178
|
-
|
179
|
-
record = Element.new record_name
|
182
|
+
fields = capture_fields(params)
|
183
|
+
record = Element.new @record_name
|
180
184
|
fields.each do |k,v|
|
181
185
|
element = Element.new(k.to_s)
|
182
186
|
element.text = v if v
|
@@ -192,12 +196,9 @@ EOF
|
|
192
196
|
end
|
193
197
|
|
194
198
|
def capture_fields(params)
|
195
|
-
|
196
|
-
record_name, raw_fields = @schema.match(/(\w+)\(([^\)]+)/).captures
|
197
|
-
fields = Hash[raw_fields.split(',').map{|x| [x.strip.to_sym, nil]}]
|
198
|
-
|
199
|
+
fields = @fields.clone
|
199
200
|
fields.keys.each {|key| fields[key] = params[key] if params.has_key? key}
|
200
|
-
|
201
|
+
fields
|
201
202
|
end
|
202
203
|
|
203
204
|
|
@@ -253,6 +254,15 @@ EOF
|
|
253
254
|
buffer
|
254
255
|
end
|
255
256
|
|
257
|
+
def attach_record_methods()
|
258
|
+
@fields.keys.each do |field|
|
259
|
+
self.instance_eval(
|
260
|
+
%Q(def find_by_#{field}(s)
|
261
|
+
Hash[@fields.keys.zip(XPath.match(@doc.root, "records/*[#{field}='\#{s}']/*/text()").map &:to_s)]
|
262
|
+
end))
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
256
266
|
def open(s)
|
257
267
|
if s[/\(/] then # schema
|
258
268
|
buffer = dynarex_new s
|
@@ -269,7 +279,14 @@ EOF
|
|
269
279
|
@root_name = @doc.root.name
|
270
280
|
@summary = summary_to_h
|
271
281
|
@default_key = XPath.first(@doc.root, 'summary/default_key/text()')
|
282
|
+
|
283
|
+
@record_name, raw_fields = @schema.match(/(\w+)\(([^\)]+)/).captures
|
284
|
+
@fields = Hash[raw_fields.split(',').map{|x| [x.strip.to_sym, nil]}]
|
272
285
|
|
286
|
+
|
287
|
+
# load the record query handler methods
|
288
|
+
attach_record_methods
|
289
|
+
|
273
290
|
if XPath.match(@doc.root, 'records/*').length > 0 then
|
274
291
|
|
275
292
|
load_records
|