json_record 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGE_LOG CHANGED
@@ -11,3 +11,7 @@
11
11
  1.0.3
12
12
  - Added before and after validation callbacks on EmbeddedDocument
13
13
  - Fixed bug where fields couldn't be set to false
14
+
15
+ 1.0.4
16
+ - Fixed bug with tracking changes when initializing an EmbeddedDocument.
17
+ - Removed tracking changes of keys that are EmbeddedDocuments
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 1.0.4
data/json_record.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{json_record}
8
- s.version = "1.0.3"
8
+ s.version = "1.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian Durand"]
12
- s.date = %q{2010-02-20}
12
+ s.date = %q{2010-02-22}
13
13
  s.email = %q{brian@embellishedvisions.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -22,8 +22,8 @@ module JsonRecord
22
22
  end
23
23
 
24
24
  # Write a field. The field param must be a FieldDefinition and the context should be the record
25
- # which is being read from. Track_changes indicates if changes to the object should be tracked.
26
- def write_attribute (field, val, track_changes, context)
25
+ # which is being read from.
26
+ def write_attribute (field, val, context)
27
27
  if field.multivalued?
28
28
  val = val.values if val.is_a?(Hash)
29
29
  json_attributes[field.name] = EmbeddedDocumentArray.new(field.type, context, val)
@@ -32,7 +32,7 @@ module JsonRecord
32
32
  converted_value = field.convert(val)
33
33
  converted_value.parent = context if converted_value.is_a?(EmbeddedDocument)
34
34
  unless old_value == converted_value
35
- if track_changes
35
+ unless field.type.include?(EmbeddedDocument) or Thread.current[:do_not_track_json_field_changes]
36
36
  changes = changed_attributes
37
37
  if changes.include?(field.name)
38
38
  changes.delete(field.name) if converted_value == changes[field.name]
@@ -84,7 +84,7 @@ module JsonRecord
84
84
  @json_attributes = {}
85
85
  attrs.each_pair do |name, value|
86
86
  field = schema.fields[name.to_s] || FieldDefinition.new(name, :type => value.class)
87
- write_attribute(field, value, false, self)
87
+ write_attribute(field, value, self)
88
88
  end
89
89
  end
90
90
 
@@ -156,8 +156,8 @@ module JsonRecord
156
156
  read_attribute(field, self)
157
157
  end
158
158
 
159
- def write_json_attribute (json_field_name, field, value, track_changes)
160
- write_attribute(field, value, track_changes, self)
159
+ def write_json_attribute (json_field_name, field, value)
160
+ write_attribute(field, value, self)
161
161
  end
162
162
 
163
163
  def changed_attributes
@@ -33,11 +33,17 @@ module JsonRecord
33
33
  unless @record[@name].blank?
34
34
  json = @record[@name]
35
35
  json = Zlib::Inflate.inflate(json) if @compressed
36
- ActiveSupport::JSON.decode(json).each_pair do |attr_name, attr_value|
37
- field = nil
38
- @schemas.each{|schema| field = schema.fields[attr_name]; break if field}
39
- field = FieldDefinition.new(attr_name, :type => attr_value.class) unless field
40
- write_attribute(field, attr_value, false, @record)
36
+ do_not_track_changes = Thread.current[:do_not_track_json_field_changes]
37
+ Thread.current[:do_not_track_json_field_changes] = true
38
+ begin
39
+ ActiveSupport::JSON.decode(json).each_pair do |attr_name, attr_value|
40
+ field = nil
41
+ @schemas.each{|schema| field = schema.fields[attr_name]; break if field}
42
+ field = FieldDefinition.new(attr_name, :type => attr_value.class) unless field
43
+ write_attribute(field, attr_value, @record)
44
+ end
45
+ ensure
46
+ Thread.current[:do_not_track_json_field_changes] = do_not_track_changes
41
47
  end
42
48
  end
43
49
  end
@@ -113,16 +113,18 @@ module JsonRecord
113
113
  def define_json_accessor (field, json_field_name)
114
114
  @klass.send(:define_method, field.name) {read_json_attribute(json_field_name, field)}
115
115
  @klass.send(:define_method, "#{field.name}?") {!!read_json_attribute(json_field_name, field)} if field.type == Boolean
116
- @klass.send(:define_method, "#{field.name}=") {|val| write_json_attribute(json_field_name, field, val, true)}
117
- @klass.send(:define_method, "#{field.name}_changed?") {self.send(:attribute_changed?, field.name)}
118
- @klass.send(:define_method, "#{field.name}_change") {self.send(:attribute_change, field.name)}
119
- @klass.send(:define_method, "#{field.name}_was") {self.send(:attribute_was, field.name)}
116
+ @klass.send(:define_method, "#{field.name}=") {|val| write_json_attribute(json_field_name, field, val)}
120
117
  @klass.send(:define_method, "#{field.name}_before_type_cast") {self.read_attribute_before_type_cast(field.name)}
118
+ unless field.type.include?(EmbeddedDocument)
119
+ @klass.send(:define_method, "#{field.name}_changed?") {self.send(:attribute_changed?, field.name)}
120
+ @klass.send(:define_method, "#{field.name}_change") {self.send(:attribute_change, field.name)}
121
+ @klass.send(:define_method, "#{field.name}_was") {self.send(:attribute_was, field.name)}
122
+ end
121
123
  end
122
124
 
123
125
  def define_many_json_accessor (field, json_field_name)
124
126
  @klass.send(:define_method, field.name) {self.read_json_attribute(json_field_name, field)}
125
- @klass.send(:define_method, "#{field.name}=") {|val| self.write_json_attribute(json_field_name, field, val, true)}
127
+ @klass.send(:define_method, "#{field.name}=") {|val| self.write_json_attribute(json_field_name, field, val)}
126
128
  end
127
129
  end
128
130
  end
@@ -93,8 +93,8 @@ module JsonRecord
93
93
  end
94
94
 
95
95
  # Write a field value to a JsonField
96
- def write_json_attribute (json_field_name, field, value, track_changes)
97
- json_fields[json_field_name].write_attribute(field, value, track_changes, self)
96
+ def write_json_attribute (json_field_name, field, value)
97
+ json_fields[json_field_name].write_attribute(field, value, self)
98
98
  end
99
99
 
100
100
  # Serialize the JSON in the record into JsonField objects.
@@ -36,17 +36,20 @@ describe JsonRecord::EmbeddedDocument do
36
36
  end
37
37
 
38
38
  it "should track changes to attributes" do
39
- trait = JsonRecord::Test::Trait.new
39
+ trait = JsonRecord::Test::Trait.new(:value => "val")
40
+ trait.value_changed?.should == true
41
+ trait.value_was.should == nil
42
+ trait.value_change.should == [nil, "val"]
40
43
  trait.name = "test"
41
44
  trait.name_was.should == nil
42
45
  trait.name_changed?.should == true
43
46
  trait.name_change.should == [nil, "test"]
44
- trait.changes.should == {"name" => [nil, "test"]}
47
+ trait.changes.should == {"value" => [nil, "val"], "name" => [nil, "test"]}
45
48
  trait.name = nil
46
49
  trait.name_changed?.should == false
47
50
  trait.name_was.should == nil
48
51
  trait.name_change.should == nil
49
- trait.changes.should == {}
52
+ trait.changes.should == {"value" => [nil, "val"]}
50
53
  end
51
54
 
52
55
  it "should convert to attributes to json" do
@@ -228,10 +228,19 @@ describe JsonRecord::Serialized do
228
228
  end
229
229
 
230
230
  it "should track changes on json attributes" do
231
- model = JsonRecord::Test::Model.create!(:name => "test name")
231
+ model = JsonRecord::Test::Model.new(:name => "test name", :primary_trait => {:name => "n1", :value => "v1"})
232
+ model.changes.should == {"name" => [nil, "test name"]}
233
+ model.primary_trait.changes.should == {"name" => [nil, "n1"], "value" => [nil, "v1"]}
234
+ model.save!
232
235
  model.changes.should == {}
236
+
237
+ model.reload
238
+ model.changes.should == {}
239
+ model.primary_trait.name.should == "n1"
233
240
  model.name = "new name"
234
241
  model.value = 1
242
+ model.primary_trait = {:name => "n2", :value => "v2"}
243
+
235
244
  model.changes.should == {"name" => ["test name", "new name"], "value" => [0, 1]}
236
245
  model.name_changed?.should == true
237
246
  model.name_was.should == "test name"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Durand
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-20 00:00:00 -06:00
12
+ date: 2010-02-22 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency