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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDJkNWY1ZGNjOTVhYWZlOTA0ODc0NDY5MzFlMjIzYjg1YzIzNDkzOQ==
4
+ YTEwY2YzOGQ2MTRkMzUxNTliNGQ3NWUzMWY1ZGVjNDJiMzVkN2FmZg==
5
5
  data.tar.gz: !binary |-
6
- ZDI3OTM3Y2YyMGVmZjc0YzI2MzJlMDZlZDQ0NTI0NzQyMDVmMWI2YQ==
6
+ NjVkMGQ5MDNmYmQyZDQ1MTU0NmQ1ZDgzZDczZmZkMWFiNzUxN2NhOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDQ0YTUxYjY1ZGZjMWQzNDg4Yzk4YWZlZjViYzIyOWIzZmI1OGY4NjM3ODQ2
10
- MTljZjc3NjExODkyNDNhMjU4OGZkNGJkZjYzZjI5ZWEzMWUwZGFjNjYyMjM2
11
- NjYwZTMyYjMzZDNlMTI4NDE1YTEzZjE4ZTA4NDI5MjM3ZWNhZjI=
9
+ YjIxZWJjODE3MDEzNGViMTJlMzQxYTRjODc5M2IxMmJlYTE0OWVjYzMxYjky
10
+ NThkMzMxYTQ4ZDBkZWE0NzlmYjhkNDY0NDgyNmVlZTI3MWUxYWQxYzUwN2Y1
11
+ ZTI5NTQyNmMxMmE4YmRhYjNhMTBjZTc0MzUxNDVjZDExMWEwZmM=
12
12
  data.tar.gz: !binary |-
13
- YzNhZmZkZGM1YjU5NDdlMDMwOTc5MTMwNGFhZjc5ZTc1YzVmZDYwZjYzYTk0
14
- ZmE5ZmFkYWI2YjU2NjBlNGQ1NjRjOWI4NTAyYTdkZjAzYzU3OTRiZjEyNjJj
15
- ODFhOGJiMWRjOTZhZDIyZjQ1MDQ2YTRhZjcxOWNjODg5MjVlNDc=
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.id = 55
281
- instance.name = "Polygon"
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 = "#{name}" unless String === name
29
+ name = property_definitions.name_from(name)
29
30
  @data[name]
30
31
  end
31
32
 
32
33
  def fetch(name)
33
- name = "#{name}" unless String === 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 = "#{name}" unless String === 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 = "#{name}" unless String === 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
@@ -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 = "#{name}" unless String === 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 = "#{name}" unless String === 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
- (! sonj_content.model_properties.include?(name_string) )
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 = [].tap do |definitions|
75
- definer = PropertiesDefiner.new( definitions )
76
- _property_initializations.each do |pi|
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
- _hard_model_dependencies.each do |d|
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
@@ -1,3 +1,3 @@
1
1
  module SonJay
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -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[ 'qqq' ] = 111
294
- model_instance[ :rrr ] = 222
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' => 111, 'rrr' => 222 )
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.sonj_content.extra[ 'qqq' ] = 111
301
- model_instance.sonj_content.extra[ :rrr ] = 222
302
- expect( model_instance[ :qqq ] ).to eq( 111 )
303
- expect( model_instance[ 'rrr' ] ).to eq( 222 )
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.0
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-04-29 00:00:00.000000000 Z
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