son_jay 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +12 -0
- data/features/json_parsing.feature +2 -2
- data/features/json_serialization.feature +2 -2
- data/lib/son_jay/object_model/properties/abstract.rb +7 -4
- data/lib/son_jay/object_model/property_definitions.rb +57 -0
- data/lib/son_jay/object_model.rb +9 -16
- data/lib/son_jay/version.rb +1 -1
- data/spec/object_model_spec.rb +19 -9
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTEwY2YzOGQ2MTRkMzUxNTliNGQ3NWUzMWY1ZGVjNDJiMzVkN2FmZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NjVkMGQ5MDNmYmQyZDQ1MTU0NmQ1ZDgzZDczZmZkMWFiNzUxN2NhOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YjIxZWJjODE3MDEzNGViMTJlMzQxYTRjODc5M2IxMmJlYTE0OWVjYzMxYjky
|
10
|
+
NThkMzMxYTQ4ZDBkZWE0NzlmYjhkNDY0NDgyNmVlZTI3MWUxYWQxYzUwN2Y1
|
11
|
+
ZTI5NTQyNmMxMmE4YmRhYjNhMTBjZTc0MzUxNDVjZDExMWEwZmM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2I5Y2ZmYjk3ZTA4NjBiNWFhNmRhNDNkMjgwYjEyY2YxZGM0MDAzNDEyODg3
|
14
|
+
YzM1ZGRhNWNmOTdhNTU1YjljMDQ2ZWY2Nzc3NWVhOGM5Y2ViODc0NzBmNGZk
|
15
|
+
NzA4YzNiNWY0MjRlNTEwZGNmYjdiYTQ0ODEyNjZiOTAwMzNmZjc=
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
### 0.4.1
|
2
|
+
* Enhamcements
|
3
|
+
* Add this CHANGELOG.md file
|
4
|
+
* Made feature scenarios more informative regarding bracket
|
5
|
+
operator behavior for defined properties when extra
|
6
|
+
properties are allowed.
|
7
|
+
* Bugs fixed
|
8
|
+
* Incorrect writing/reading of defined object-model properties
|
9
|
+
using index operators when extra properties are allowed.
|
10
|
+
|
11
|
+
### 0.4.0
|
12
|
+
* Last version without a change-log
|
@@ -254,5 +254,5 @@ Feature: Parsing data from JSON
|
|
254
254
|
instance = SimpleObjectModel.parse_json( json )
|
255
255
|
"""
|
256
256
|
Then the instance attributes and indexed properties are as follows:
|
257
|
-
| id | name | ['published'] | ['featured'] |
|
258
|
-
| 55 | "Polygon" | true | false |
|
257
|
+
| id | name | ['id'] | ['name'] | ['published'] | ['featured'] |
|
258
|
+
| 55 | "Polygon" | 55 | "Polygon" | true | false |
|
@@ -277,8 +277,8 @@ Feature: Serializing data to JSON
|
|
277
277
|
"""
|
278
278
|
When the instance's property values are assigned as:
|
279
279
|
"""
|
280
|
-
instance
|
281
|
-
instance.name
|
280
|
+
instance['id'] = 55
|
281
|
+
instance.name = "Polygon"
|
282
282
|
instance['published'] = true
|
283
283
|
instance['featured'] = false
|
284
284
|
"""
|
@@ -10,6 +10,7 @@ module SonJay
|
|
10
10
|
attr_reader :model_properties
|
11
11
|
|
12
12
|
def initialize(property_definitions)
|
13
|
+
@property_definitions = property_definitions
|
13
14
|
@data = {}
|
14
15
|
@model_properties = Set.new
|
15
16
|
property_definitions.each do |d|
|
@@ -25,19 +26,19 @@ module SonJay
|
|
25
26
|
]
|
26
27
|
|
27
28
|
def [](name)
|
28
|
-
name =
|
29
|
+
name = property_definitions.name_from(name)
|
29
30
|
@data[name]
|
30
31
|
end
|
31
32
|
|
32
33
|
def fetch(name)
|
33
|
-
name =
|
34
|
+
name = property_definitions.name_from(name)
|
34
35
|
@data.fetch(name)
|
35
36
|
rescue KeyError
|
36
37
|
raise PropertyNameError.new(name)
|
37
38
|
end
|
38
39
|
|
39
40
|
def []=(name, value)
|
40
|
-
name =
|
41
|
+
name = property_definitions.name_from(name)
|
41
42
|
raise PropertyNameError.new(name) unless @data.has_key?(name)
|
42
43
|
@data[name] = value
|
43
44
|
end
|
@@ -49,7 +50,7 @@ module SonJay
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def load_property(name, value)
|
52
|
-
name =
|
53
|
+
name = property_definitions.name_from(name)
|
53
54
|
if @data.has_key?( name )
|
54
55
|
load_defined_property name, value
|
55
56
|
else
|
@@ -84,6 +85,8 @@ module SonJay
|
|
84
85
|
raise NotImplementedError, "Subclass responsibility"
|
85
86
|
end
|
86
87
|
|
88
|
+
attr_reader :property_definitions
|
89
|
+
|
87
90
|
end
|
88
91
|
|
89
92
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module SonJay
|
4
|
+
class ObjectModel
|
5
|
+
|
6
|
+
class PropertyDefinitions
|
7
|
+
extend Forwardable
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
def self.from_initializations(property_initializations)
|
11
|
+
new.tap do |instance|
|
12
|
+
definer = PropertiesDefiner.new( instance )
|
13
|
+
property_initializations.each do |pi|
|
14
|
+
definer.instance_eval &pi
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@definitions = []
|
21
|
+
@names = Set.new
|
22
|
+
@name_symbol_to_string_map = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def <<(definition)
|
26
|
+
@definitions << definition
|
27
|
+
name = definition.name
|
28
|
+
@names << name
|
29
|
+
@name_symbol_to_string_map[name.to_sym] = name
|
30
|
+
end
|
31
|
+
|
32
|
+
def_delegators :@definitions, :each
|
33
|
+
|
34
|
+
def name_from(name)
|
35
|
+
case name
|
36
|
+
when String then name
|
37
|
+
when Symbol then @name_symbol_to_string_map.fetch(name, name)
|
38
|
+
else "#{name}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def include_name?(name)
|
43
|
+
name = name_from( name )
|
44
|
+
names.include?( name )
|
45
|
+
end
|
46
|
+
|
47
|
+
def hard_model_dependencies
|
48
|
+
map( &:model_class ).compact.uniq
|
49
|
+
end
|
50
|
+
|
51
|
+
def names
|
52
|
+
@names.freeze
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
data/lib/son_jay/object_model.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'set'
|
2
2
|
require 'son_jay/object_model/properties'
|
3
3
|
require 'son_jay/object_model/property_definition'
|
4
|
+
require 'son_jay/object_model/property_definitions'
|
4
5
|
require 'son_jay/object_model/properties_definer'
|
5
6
|
require 'son_jay/object_model/extra_data'
|
6
7
|
|
@@ -22,13 +23,13 @@ module SonJay
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def []=(name, value)
|
25
|
-
name =
|
26
|
+
name = self.class.property_definitions.name_from(name)
|
26
27
|
target = property_store_for( name )
|
27
28
|
target[ name ] = value
|
28
29
|
end
|
29
30
|
|
30
31
|
def [](name)
|
31
|
-
name =
|
32
|
+
name = self.class.property_definitions.name_from(name)
|
32
33
|
source = property_store_for( name )
|
33
34
|
source[ name ]
|
34
35
|
end
|
@@ -43,7 +44,7 @@ module SonJay
|
|
43
44
|
store = sonj_content
|
44
45
|
if (
|
45
46
|
self.class.extras_allowed? &&
|
46
|
-
(!
|
47
|
+
(! self.class.property_definitions.include_name?(name_string) )
|
47
48
|
) then
|
48
49
|
store = sonj_content.extra
|
49
50
|
end
|
@@ -71,16 +72,12 @@ module SonJay
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def _evaluate_property_definitions
|
74
|
-
@property_definitions =
|
75
|
-
|
76
|
-
|
77
|
-
definer.instance_eval &pi
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
75
|
+
@property_definitions = PropertyDefinitions.from_initializations(
|
76
|
+
_property_initializations
|
77
|
+
)
|
81
78
|
_validate_model_dependencies!
|
82
|
-
|
83
79
|
_apply_property_definitions property_definitions
|
80
|
+
@property_definitions
|
84
81
|
end
|
85
82
|
|
86
83
|
def _property_initializations
|
@@ -100,15 +97,11 @@ module SonJay
|
|
100
97
|
def _validate_model_dependencies!(dependants=Set.new)
|
101
98
|
raise InfiniteRegressError if dependants.include?(self)
|
102
99
|
dependants << self
|
103
|
-
|
100
|
+
property_definitions.hard_model_dependencies.each do |d|
|
104
101
|
next unless d.respond_to?( :_validate_model_dependencies!, true )
|
105
102
|
d.send :_validate_model_dependencies!, dependants
|
106
103
|
end
|
107
104
|
end
|
108
|
-
|
109
|
-
def _hard_model_dependencies
|
110
|
-
property_definitions.map( &:model_class ).compact.uniq
|
111
|
-
end
|
112
105
|
end
|
113
106
|
|
114
107
|
end
|
data/lib/son_jay/version.rb
CHANGED
data/spec/object_model_spec.rb
CHANGED
@@ -289,18 +289,28 @@ describe SonJay::ObjectModel do
|
|
289
289
|
end
|
290
290
|
end
|
291
291
|
|
292
|
-
it "allows name-index writing of arbitrary extra properties" do
|
293
|
-
model_instance[ '
|
294
|
-
model_instance[ :
|
292
|
+
it "allows name-index writing of both defined and arbitrary, extra properties" do
|
293
|
+
model_instance[ 'aaa' ] = 111
|
294
|
+
model_instance[ :bbb ] = 222
|
295
|
+
model_instance[ 'qqq' ] = 333
|
296
|
+
model_instance[ :rrr ] = 444
|
297
|
+
|
298
|
+
expect( model_instance.aaa ).to eq( 111 )
|
299
|
+
expect( model_instance.bbb ).to eq( 222 )
|
300
|
+
|
295
301
|
expect( model_instance.sonj_content.extra.to_h ).
|
296
|
-
to eq( 'qqq' =>
|
302
|
+
to eq( 'qqq' => 333, 'rrr' => 444 )
|
297
303
|
end
|
298
304
|
|
299
|
-
it "allows name-index reading of arbitrary extra properties" do
|
300
|
-
model_instance.
|
301
|
-
model_instance.
|
302
|
-
|
303
|
-
|
305
|
+
it "allows name-index reading of both defined and arbitrary, extra properties" do
|
306
|
+
model_instance.aaa = 111
|
307
|
+
model_instance.bbb = 222
|
308
|
+
model_instance.sonj_content.extra[ 'qqq' ] = 333
|
309
|
+
model_instance.sonj_content.extra[ :rrr ] = 444
|
310
|
+
expect( model_instance[ :aaa ] ).to eq( 111 )
|
311
|
+
expect( model_instance[ 'bbb' ] ).to eq( 222 )
|
312
|
+
expect( model_instance[ :qqq ] ).to eq( 333 )
|
313
|
+
expect( model_instance[ 'rrr' ] ).to eq( 444 )
|
304
314
|
end
|
305
315
|
|
306
316
|
it "serializes to a JSON object representation w/ properties and extras" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: son_jay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Jorgensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- .rspec
|
106
106
|
- .simplecov
|
107
107
|
- .travis.yml
|
108
|
+
- CHANGELOG.md
|
108
109
|
- Gemfile
|
109
110
|
- LICENSE.txt
|
110
111
|
- README.md
|
@@ -130,6 +131,7 @@ files:
|
|
130
131
|
- lib/son_jay/object_model/properties/properties_without_extra.rb
|
131
132
|
- lib/son_jay/object_model/properties_definer.rb
|
132
133
|
- lib/son_jay/object_model/property_definition.rb
|
134
|
+
- lib/son_jay/object_model/property_definitions.rb
|
133
135
|
- lib/son_jay/value_array.rb
|
134
136
|
- lib/son_jay/version.rb
|
135
137
|
- son_jay.gemspec
|