son_jay 0.4.0 → 0.4.1
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.
- 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
|