json_record 1.0.5 → 1.0.6

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/CHANGE_LOG CHANGED
@@ -17,4 +17,8 @@
17
17
  - Removed tracking changes of keys that are EmbeddedDocuments
18
18
 
19
19
  1.0.5
20
- - Fixed bug with initializing new EmbeddedDocumentArray with the proper parent when there is no data to deserialize.
20
+ - Fixed bug with initializing new EmbeddedDocumentArray with the proper parent when there is no data to deserialize.
21
+
22
+ 1.0.6
23
+ - Allow EmbeddedDocument.new to call all accessors and not just those defined in the JSON schema.
24
+ - Allow getting and setting json attributes with [] and []=
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.5
1
+ 1.0.6
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.5"
8
+ s.version = "1.0.6"
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-23}
12
+ s.date = %q{2010-02-24}
13
13
  s.email = %q{brian@embellishedvisions.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -84,7 +84,12 @@ 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, self)
87
+ writer = "#{name}=".to_sym
88
+ if respond_to?(writer)
89
+ send(writer, value)
90
+ else
91
+ write_attribute(field, value, self)
92
+ end
88
93
  end
89
94
  end
90
95
 
@@ -113,6 +118,18 @@ module JsonRecord
113
118
  changed.inject({}) {|h, attr| h[attr] = attribute_change(attr); h}
114
119
  end
115
120
 
121
+ # Get a field from the schema with the specified name.
122
+ def [] (name)
123
+ field = schema.fields[name.to_s]
124
+ read_attribute(field, self) if field
125
+ end
126
+
127
+ # Set a field from the schema with the specified name.
128
+ def []= (name, value)
129
+ field = schema.fields[name.to_s] || FieldDefinition.new(name, :type => value.class)
130
+ write_attribute(field, value, self)
131
+ end
132
+
116
133
  def to_json (*args)
117
134
  @json_attributes.to_json(*args)
118
135
  end
@@ -31,14 +31,18 @@ module JsonRecord
31
31
  end
32
32
 
33
33
  module ClassMethods
34
- # Get the field definition of the JSON field from the schema it is defined in.
34
+ # Get the json field and the field definition of the JSON field from the schema it is defined in.
35
35
  def json_field_definition (name)
36
- field = nil
37
36
  if json_serialized_fields
38
37
  name = name.to_s
39
- json_serialized_fields.values.flatten.each{|schema| field = schema.fields[name]; break if field}
38
+ json_serialized_fields.each_pair do |fname, schemas|
39
+ schemas.each do |schema|
40
+ field = schema.fields[name];
41
+ return [fname, field] if field
42
+ end
43
+ end
40
44
  end
41
- return field
45
+ return nil
42
46
  end
43
47
  end
44
48
 
@@ -47,6 +51,8 @@ module JsonRecord
47
51
  base.before_save :serialize_json_attributes
48
52
  base.alias_method_chain :reload, :serialized_json
49
53
  base.alias_method_chain :attributes, :serialized_json
54
+ base.alias_method_chain :read_attribute, :serialized_json
55
+ base.alias_method_chain :write_attribute, :serialized_json
50
56
  end
51
57
 
52
58
  # Get the JsonField objects for the record.
@@ -72,6 +78,26 @@ module JsonRecord
72
78
  return attrs
73
79
  end
74
80
 
81
+ def read_attribute_with_serialized_json (name)
82
+ name = name.to_s
83
+ json_field, field_definition = self.class.json_field_definition(name)
84
+ if field_definition
85
+ read_json_attribute(json_field, field_definition)
86
+ else
87
+ read_attribute_without_serialized_json(name)
88
+ end
89
+ end
90
+
91
+ def write_attribute_with_serialized_json (name, value)
92
+ name = name.to_s
93
+ json_field, field_definition = self.class.json_field_definition(name)
94
+ if field_definition
95
+ write_json_attribute(json_field, field_definition, value)
96
+ else
97
+ write_attribute_without_serialized_json(name, value)
98
+ end
99
+ end
100
+
75
101
  protected
76
102
 
77
103
  # Returns a hash of all the JsonField objects merged together.
@@ -87,12 +113,12 @@ module JsonRecord
87
113
  @json_field_names = json_serialized_fields.values.flatten.collect{|s| s.fields.keys}.flatten
88
114
  end
89
115
 
90
- # Read a field value from a JsonField
116
+ # Read a field value from a JsonField.
91
117
  def read_json_attribute (json_field_name, field)
92
118
  json_fields[json_field_name].read_attribute(field, self)
93
119
  end
94
120
 
95
- # Write a field value to a JsonField
121
+ # Write a field value to a JsonField.
96
122
  def write_json_attribute (json_field_name, field, value)
97
123
  json_fields[json_field_name].write_attribute(field, value, self)
98
124
  end
@@ -65,4 +65,22 @@ describe JsonRecord::EmbeddedDocument do
65
65
  (trait_1.hash == trait_2.hash).should == true
66
66
  end
67
67
 
68
+ it "should read json attributes with []" do
69
+ dimension = JsonRecord::Test::Dimension.new(:width => 100)
70
+ dimension[:width].should == 100
71
+ end
72
+
73
+ it "should be able to write json attributes with []=" do
74
+ dimension = JsonRecord::Test::Dimension.new
75
+ dimension[:width] = 100
76
+ dimension.width.should == 100
77
+ end
78
+
79
+ it "should set all accessors on initialize" do
80
+ dimension = JsonRecord::Test::Dimension.new(:width => 100, :height => :infinity, :unit => "meters")
81
+ dimension.width.should == 100
82
+ dimension.height.should == 1000000000
83
+ dimension.unit.should == "meters"
84
+ end
85
+
68
86
  end
@@ -9,11 +9,19 @@ describe JsonRecord::Serialized do
9
9
  JsonRecord::Test.drop_tables
10
10
  end
11
11
 
12
- it "should have accessors for json attributes" do
12
+ it "should have accessors for json attributes and not interfere with column attribute accessors" do
13
13
  model = JsonRecord::Test::Model.new
14
14
  model.name.should == nil
15
15
  model.name = "test"
16
16
  model.name.should == "test"
17
+ model[:name].should == "test"
18
+ model['name'].should == "test"
19
+ model[:name] = "new value"
20
+ model.name.should == "new value"
21
+ model.string_field = "a"
22
+ model.string_field.should == "a"
23
+ model[:string_field] = "b"
24
+ model[:string_field].should == "b"
17
25
  end
18
26
 
19
27
  it "should convert blank values to nil" do
@@ -145,6 +153,7 @@ describe JsonRecord::Serialized do
145
153
  "field_3"=>nil,
146
154
  "field_4"=>nil,
147
155
  "field_5"=>nil,
156
+ "unit_price"=>nil,
148
157
  "traits"=>[],
149
158
  "value"=>0,
150
159
  "strings"=>[],
@@ -393,9 +402,17 @@ describe JsonRecord::Serialized do
393
402
  end
394
403
 
395
404
  it "should get the json field definition for a field" do
396
- JsonRecord::Test::Model.json_field_definition(:value).name.should == "value"
397
- JsonRecord::Test::Model.json_field_definition("value").name.should == "value"
398
- JsonRecord::Test::Model.json_field_definition("nothing").should == nil
405
+ json_field, field = JsonRecord::Test::Model.json_field_definition(:value)
406
+ json_field.should == "json"
407
+ field.name.should == "value"
408
+
409
+ json_field, field = JsonRecord::Test::Model.json_field_definition("field_1")
410
+ json_field.should == "compressed_json"
411
+ field.name.should == "field_1"
412
+
413
+ json_field, field = JsonRecord::Test::Model.json_field_definition("nothing")
414
+ json_field.should == nil
415
+ field.should == nil
399
416
  end
400
417
 
401
418
  it "should validate uniqueness of embedded documents" do
@@ -442,4 +459,11 @@ describe JsonRecord::Serialized do
442
459
  trait.valid?.should == true
443
460
  trait.callbacks.should == [:before_validation, :after_validation]
444
461
  end
462
+
463
+ it "should allow overriding the attribute reader and writers" do
464
+ model = JsonRecord::Test::Model.new(:unit_price => :infinity)
465
+ model.unit_price.should == 1000000000
466
+ model.unit_price = 1.2253
467
+ model.unit_price.should == 1.23
468
+ end
445
469
  end
data/spec/test_models.rb CHANGED
@@ -43,6 +43,15 @@ module JsonRecord
43
43
  include JsonRecord::EmbeddedDocument
44
44
  schema.key :height, Integer, :required => true
45
45
  schema.key :width, Integer, :required => true
46
+ attr_accessor :unit
47
+
48
+ def height= (value)
49
+ if value == :infinity
50
+ self[:height] = 1000000000
51
+ else
52
+ self[:height] = value
53
+ end
54
+ end
46
55
  end
47
56
 
48
57
  class Model < ActiveRecord::Base
@@ -67,6 +76,17 @@ module JsonRecord
67
76
  schema.key :field_3, :in => ("A".."M")
68
77
  schema.key :field_4, :length => (4..15)
69
78
  schema.key :field_5, :length => {:minimum => 5}
79
+ schema.key :unit_price, Float
80
+ end
81
+
82
+ def unit_price
83
+ p = self[:price]
84
+ p.is_a?(Numeric) ? (p * 100).round / 100.0 : p
85
+ end
86
+
87
+ def unit_price= (value)
88
+ value = 1000000000 if value == :infinity
89
+ self[:price] = value
70
90
  end
71
91
  end
72
92
 
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.5
4
+ version: 1.0.6
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-23 00:00:00 -06:00
12
+ date: 2010-02-24 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency