data_active 0.0.4 → 0.0.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.
@@ -35,12 +35,13 @@ module DataActive
35
35
  if options.include? :update or options.include? :sync or options.include? :create
36
36
  assign_attributes_from current_node, :to => active_record
37
37
  if options.include? :fail_on_invalid and !active_record.valid?
38
- messages = active_record.errors.messages.map {|attribute, messages| "#{attribute} #{messages.map{|message| message }.join(', ')}"}.join(', ')
38
+ messages = active_record.errors.messages.map { |attribute, messages| "#{attribute} #{messages.map { |message| message }.join(', ')}" }.join(', ')
39
39
  raise "Found an invalid #{active_record.class.name} with the following errors: #{messages}. Source: #{current_node.to_s}"
40
40
  end
41
41
  end
42
42
 
43
43
  # Check through associations and apply sync appropriately
44
+ associations = self.reflect_on_all_associations
44
45
  self.reflect_on_all_associations.each do |association|
45
46
  foreign_key = foreign_key_from(association)
46
47
  klass = association.klass
@@ -69,25 +70,31 @@ module DataActive
69
70
  end
70
71
 
71
72
  when association.macro == :has_one
72
- pk_value = active_record.new_record? ? 0 : active_record.attributes[self.primary_key.to_s]
73
- single_objects = current_node.xpath("//#{self.name.underscore}[#{self.primary_key}=#{pk_value}]/#{association.name}")
74
73
  klass = association.klass
75
- record = klass.where(foreign_key => active_record.attributes[self.primary_key.to_s]).all
74
+ if active_record.new_record?
75
+ single_objects = current_node.xpath(".//#{association.name}")
76
+ else
77
+ record = klass.where(foreign_key => active_record.attributes[self.primary_key.to_s]).all
78
+ single_objects = current_node.xpath("//#{self.name.underscore}[#{self.primary_key}=#{active_record.attributes[self.primary_key.to_s]}]/#{association.name}")
79
+ end
80
+
76
81
  if single_objects.count == 1
77
82
  # Check to see if the already record exists
78
- if record.count == 1
79
- db_pk_value = record[0][klass.primary_key]
80
- xml_pk_value = Integer(single_objects[0].element_children.xpath("//#{self.name.underscore}/#{klass.primary_key}").text)
81
-
82
- if db_pk_value != xml_pk_value
83
- # Different record in xml
84
- if options.include?(:sync) or options.include?(:destroy)
85
- # Delete the one in the database
86
- klass.destroy(record[0][klass.primary_key])
83
+ if record.present?
84
+ if record.count == 1
85
+ db_pk_value = record[0][klass.primary_key]
86
+ xml_pk_value = Integer(single_objects[0].element_children.xpath("//#{self.name.underscore}/#{klass.primary_key}").text)
87
+
88
+ if db_pk_value != xml_pk_value
89
+ # Different record in xml
90
+ if options.include?(:sync) or options.include?(:destroy)
91
+ # Delete the one in the database
92
+ klass.destroy(record[0][klass.primary_key])
93
+ end
87
94
  end
95
+ elsif record.count > 1
96
+ raise "Too many records for one to one association in the database. Found #{record.count} records of '#{association.name}' for association with '#{self.name}'"
88
97
  end
89
- elsif record.count > 1
90
- raise "Too many records for one to one association in the database. Found #{record.count} records of '#{association.name}' for association with '#{self.name}'"
91
98
  end
92
99
 
93
100
  if options.include?(:create) or options.include?(:update) or options.include?(:sync)
@@ -102,9 +109,11 @@ module DataActive
102
109
  raise "Too many records for one to one association in the provided XML. Found #{single_objects.count} records of '#{association.name}' for association with '#{self.name}'"
103
110
  else
104
111
  # There are no records in the XML
105
- if record.count > 0 and options.include?(:sync) or options.include?(:destroy)
106
- # Found some in the database: destroy then
107
- klass.destroy_all("#{foreign_key} = #{active_record.attributes[self.primary_key.to_s]}")
112
+ if record.present?
113
+ if record.count > 0 and options.include?(:sync) or options.include?(:destroy)
114
+ # Found some in the database: destroy then
115
+ klass.destroy_all("#{foreign_key} = #{active_record.attributes[self.primary_key.to_s]}")
116
+ end
108
117
  end
109
118
  end
110
119
 
@@ -1,3 +1,3 @@
1
1
  module DataActive
2
- VERSION = "0.0.4"
2
+ VERSION = '0.0.5'
3
3
  end
@@ -6,7 +6,7 @@ gem 'rails', '3.2.6'
6
6
  # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
7
 
8
8
  gem 'sqlite3'
9
- gem 'data_active', '0.0.1'
9
+ gem 'data_active', '0.0.5'
10
10
 
11
11
  group :test do
12
12
  gem 'cucumber'
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.4
4
+ version: 0.0.5
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-25 00:00:00.000000000 Z
12
+ date: 2013-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -280,7 +280,7 @@ rubyforge_project: data_active
280
280
  rubygems_version: 1.8.22
281
281
  signing_key:
282
282
  specification_version: 3
283
- summary: data_active 0.0.4
283
+ summary: data_active 0.0.5
284
284
  test_files:
285
285
  - features/remove_records_missing_in_xml.feature
286
286
  - features/step_definitions/remove_records_missing_in_xml.rb