data_active 0.0.1 → 0.0.2

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.
@@ -1,3 +1,3 @@
1
1
  module DataActive
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/data_active.rb CHANGED
@@ -19,84 +19,6 @@ module DataActive
19
19
  many_from root_node_in source_xml
20
20
  end
21
21
 
22
- def many_from(current_node)
23
- case
24
- when self.name.pluralize.underscore.eql?(current_node.name.underscore)
25
- many_from_rails_xml current_node
26
-
27
- when (current_node.name.eql?('dataroot') \
28
- and current_node.namespace_definitions.map { |ns| ns.href }.include?('urn:schemas-microsoft-com:officedata'))
29
- # Identified as data generated from Microsoft Access
30
- many_from_ms_xml current_node
31
-
32
- when self.name.underscore.eql?(current_node.name.underscore)
33
- raise "The supplied XML (#{current_node.name}) is a single instance of '#{self.name}'. Please use one_from_xml"
34
-
35
- else
36
- raise "The supplied XML (#{current_node.name}) cannot be mapped to this class (#{self.name})"
37
-
38
- end
39
- end
40
-
41
- def many_from_ms_xml(current_node)
42
- records = []
43
- recorded_ids = []
44
-
45
- current_node.element_children.each do |node|
46
- if self.name.underscore.eql?(node.name.underscore)
47
- record = self.one_from_xml(node, @data_active_options)
48
- if record
49
- recorded_ids << record[primary_key.to_sym]
50
- records << record
51
- end
52
- end
53
- end
54
-
55
- remove_records_not_in recorded_ids
56
-
57
- records
58
- end
59
-
60
- def many_from_rails_xml(current_node)
61
- records = []
62
- recorded_ids = []
63
-
64
- current_node.element_children.each do |node|
65
- record = self.one_from_xml(node, @data_active_options)
66
- if record
67
- recorded_ids << record[primary_key.to_sym]
68
- records << record
69
- end
70
- end
71
-
72
- remove_records_not_in recorded_ids
73
-
74
- records
75
- end
76
-
77
- def remove_records_not_in(recorded_ids)
78
- if @data_active_options.include?(:sync)
79
- if recorded_ids.length > 0
80
- self.destroy_all [self.primary_key.to_s + " not in (?)", recorded_ids.collect]
81
- end
82
- elsif @data_active_options.include?(:destroy)
83
- if recorded_ids.length > 0
84
- self.destroy_all [self.primary_key.to_s + " not in (?)", recorded_ids.collect]
85
- else
86
- self.destroy_all
87
- end
88
- end
89
- end
90
-
91
- def root_node_in(source_xml)
92
- if source_xml.is_a?(String)
93
- doc = Nokogiri::XML(source_xml)
94
- doc.children.first
95
- else
96
- source_xml
97
- end
98
- end
99
-
100
22
  def one_from_xml(source_xml, options = [])
101
23
  @data_active_options = options
102
24
 
@@ -108,8 +30,22 @@ module DataActive
108
30
 
109
31
  active_record = find_record_based_on(pk_node)
110
32
 
111
-
112
33
  unless active_record.nil?
34
+ # Process the attributes
35
+ if options.include? :update or options.include? :sync or options.include? :create
36
+ assign_attributes_from current_node, :to => active_record
37
+ end
38
+
39
+ # Save the record
40
+ if options.include? :sync
41
+ # Doing complete synchronisation with XML
42
+ active_record.save
43
+ elsif options.include?(:create) and active_record.new_record?
44
+ active_record.save
45
+ elsif options.include?(:update) and not active_record.new_record?
46
+ active_record.save
47
+ end
48
+
113
49
  # Check through associations and apply sync appropriately
114
50
  self.reflect_on_all_associations.each do |association|
115
51
  foreign_key = foreign_key_from(association)
@@ -184,21 +120,6 @@ module DataActive
184
120
  raise "unsupported association #{association.macro} for #{association.name } on #{self.name}"
185
121
  end
186
122
  end
187
-
188
- # Process the attributes
189
- if options.include? :update or options.include? :sync or options.include? :create
190
- assign_attributes_from current_node, :to => active_record
191
- end
192
-
193
- # Save the record
194
- if options.include? :sync
195
- # Doing complete synchronisation with XML
196
- active_record.save
197
- elsif options.include?(:create) and active_record.new_record?
198
- active_record.save
199
- elsif options.include?(:update) and not active_record.new_record?
200
- active_record.save
201
- end
202
123
  end
203
124
 
204
125
  active_record
@@ -207,17 +128,50 @@ module DataActive
207
128
  end
208
129
  end
209
130
 
210
- def foreign_key_from(association)
211
- if ActiveRecord::Reflection::AssociationReflection.method_defined? :foreign_key
212
- # Support for Rails 3.1 and later
213
- foreign_key = association.foreign_key
214
- elsif ActiveRecord::Reflection::AssociationReflection.method_defined? :primary_key_name
215
- # Support for Rails earlier than 3.1
216
- foreign_key = association.primary_key_name
131
+ private
132
+ def xml_node_matches_class(xml_node)
133
+ if xml_node.attributes['type'].blank?
134
+ xml_node.name.underscore == self.name.underscore
217
135
  else
218
- raise "Unsupported version of ActiveRecord. Unable to identify the foreign key."
136
+ xml_node.attributes['type'].value.underscore == self.name.underscore
137
+ end
138
+ end
139
+
140
+ def find_record_based_on(pk_node)
141
+ ar = nil
142
+ if pk_node
143
+ begin
144
+ ar = find pk_node.text
145
+ rescue
146
+ # No record exists, create a new one
147
+ if @data_active_options.include?(:sync) or @data_active_options.include?(:create)
148
+ ar = self.new
149
+ end
150
+ end
151
+ else
152
+ # No primary key value, must be a new record
153
+ if @data_active_options.include?(:sync) or @data_active_options.include?(:create)
154
+ ar = self.new
155
+ end
156
+ end
157
+ ar
158
+ end
159
+
160
+ def assign_attributes_from(current_node, options)
161
+ record = options[:to]
162
+
163
+ record.attributes.each do |name, value|
164
+ attribute_nodes = current_node.xpath name.to_s
165
+ if attribute_nodes.count == 1
166
+ if attribute_nodes[0].attributes['nil'].try(:value)
167
+ record[name] = nil
168
+ else
169
+ record[name] = attribute_nodes[0].text
170
+ end
171
+ elsif attribute_nodes.count > 1
172
+ raise "Found duplicate elements in xml for active record attribute '#{name}'"
173
+ end
219
174
  end
220
- foreign_key
221
175
  end
222
176
 
223
177
  def instances_for(association, options)
@@ -257,48 +211,94 @@ module DataActive
257
211
  results
258
212
  end
259
213
 
260
- def assign_attributes_from(current_node, options)
261
- record = options[:to]
214
+ def foreign_key_from(association)
215
+ if ActiveRecord::Reflection::AssociationReflection.method_defined? :foreign_key
216
+ # Support for Rails 3.1 and later
217
+ foreign_key = association.foreign_key
218
+ elsif ActiveRecord::Reflection::AssociationReflection.method_defined? :primary_key_name
219
+ # Support for Rails earlier than 3.1
220
+ foreign_key = association.primary_key_name
221
+ else
222
+ raise "Unsupported version of ActiveRecord. Unable to identify the foreign key."
223
+ end
224
+ foreign_key
225
+ end
262
226
 
263
- record.attributes.each do |name, value|
264
- attribute_nodes = current_node.xpath name.to_s
265
- if attribute_nodes.count == 1
266
- if attribute_nodes[0].attributes['nil'].try(:value)
267
- record[name] = nil
268
- else
269
- record[name] = attribute_nodes[0].text
270
- end
271
- elsif attribute_nodes.count > 1
272
- raise "Found duplicate elements in xml for active record attribute '#{name}'"
227
+ def root_node_in(source_xml)
228
+ if source_xml.is_a?(String)
229
+ doc = Nokogiri::XML(source_xml)
230
+ doc.children.first
231
+ else
232
+ source_xml
233
+ end
234
+ end
235
+
236
+ def remove_records_not_in(recorded_ids)
237
+ if @data_active_options.include?(:sync)
238
+ if recorded_ids.length > 0
239
+ self.destroy_all [self.primary_key.to_s + " not in (?)", recorded_ids.collect]
240
+ end
241
+ elsif @data_active_options.include?(:destroy)
242
+ if recorded_ids.length > 0
243
+ self.destroy_all [self.primary_key.to_s + " not in (?)", recorded_ids.collect]
244
+ else
245
+ self.destroy_all
273
246
  end
274
247
  end
275
248
  end
276
249
 
277
- def find_record_based_on(pk_node)
278
- ar = nil
279
- if pk_node
280
- begin
281
- ar = find pk_node.text
282
- rescue
283
- # No record exists, create a new one
284
- if @data_active_options.include?(:sync) or @data_active_options.include?(:create)
285
- ar = self.new
286
- end
250
+ def many_from_rails_xml(current_node)
251
+ records = []
252
+ recorded_ids = []
253
+
254
+ current_node.element_children.each do |node|
255
+ record = self.one_from_xml(node, @data_active_options)
256
+ if record
257
+ recorded_ids << record[primary_key.to_sym]
258
+ records << record
287
259
  end
288
- else
289
- # No primary key value, must be a new record
290
- if @data_active_options.include?(:sync) or @data_active_options.include?(:create)
291
- ar = self.new
260
+ end
261
+
262
+ remove_records_not_in recorded_ids
263
+
264
+ records
265
+ end
266
+
267
+ def many_from_ms_xml(current_node)
268
+ records = []
269
+ recorded_ids = []
270
+
271
+ current_node.element_children.each do |node|
272
+ if self.name.underscore.eql?(node.name.underscore)
273
+ record = self.one_from_xml(node, @data_active_options)
274
+ if record
275
+ recorded_ids << record[primary_key.to_sym]
276
+ records << record
277
+ end
292
278
  end
293
279
  end
294
- ar
280
+
281
+ remove_records_not_in recorded_ids
282
+
283
+ records
295
284
  end
296
285
 
297
- def xml_node_matches_class(xml_node)
298
- if xml_node.attributes['type'].blank?
299
- xml_node.name.underscore == self.name.underscore
300
- else
301
- xml_node.attributes['type'].value.underscore == self.name.underscore
286
+ def many_from(current_node)
287
+ case
288
+ when self.name.pluralize.underscore.eql?(current_node.name.underscore)
289
+ many_from_rails_xml current_node
290
+
291
+ when (current_node.name.eql?('dataroot') \
292
+ and current_node.namespace_definitions.map { |ns| ns.href }.include?('urn:schemas-microsoft-com:officedata'))
293
+ # Identified as data generated from Microsoft Access
294
+ many_from_ms_xml current_node
295
+
296
+ when self.name.underscore.eql?(current_node.name.underscore)
297
+ raise "The supplied XML (#{current_node.name}) is a single instance of '#{self.name}'. Please use one_from_xml"
298
+
299
+ else
300
+ raise "The supplied XML (#{current_node.name}) cannot be mapped to this class (#{self.name})"
301
+
302
302
  end
303
303
  end
304
304
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_active
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-12 00:00:00.000000000 Z
12
+ date: 2012-07-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -273,7 +273,7 @@ rubyforge_project: data_active
273
273
  rubygems_version: 1.8.22
274
274
  signing_key:
275
275
  specification_version: 3
276
- summary: data_active 0.0.1
276
+ summary: data_active 0.0.2
277
277
  test_files:
278
278
  - features/remove_records_missing_in_xml.feature
279
279
  - features/step_definitions/remove_records_missing_in_xml.rb